<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="
http://www.w3.org/2005/Atom">
<link rel="self" href="
gopher://vernunftzentrum.de/0/ckeen/alilipona.atom"></link>
<author>
<name>C-Keen</name>
</author>
<title>ali li pona</title>
<id>urn:uuid:a7d07c54-aa91-11ec-986d-560001fa5fa4</id>
<updated>2022-03-23T11:11:50+01:00</updated>
<entry>
<title>2022-03-23 - literature clock (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2022-03-23-literature-clock.md"/>
<id>urn:uuid:a8400cb8-aa91-11ec-bbcb-560001fa5fa4</id>
<updated>2022-03-23T00:00:00+01:00</updated>
<content> 2022-03-23
___l_i_t_e_r_a_t_u_r_e__c_l_o_c_k____________________________________
I have been marvelling at the literature clock [0] idea for quite a
while. Then I found the source code [1] and thought whether that
could be done in a small shell script.
Turns out it does:
```
#!/usr/bin/env bash
URL="
https://raw.githubusercontent.com/JohannesNE/literature-clock/master/litclock_annotated.csv"
time_file+=$HOME/.litclock_annotated.csv
if [ ! -f "$time_file" ]; then
curl $URL -o "$time_file"
fi
while true;
do
clear
awk 'BEGIN {
FS = "|";
results=0;
srand();
time = strftime("%H:%M") };
$0~time{
sub($2, "\033[1m"$2"\033[0m",$3);
res[results++]=$3"\n\n"$4" -- "$5 };
END {
l=int(rand()*results);
print res[l]}' "$time_file" | fmt
sleep 10;
done
```
I am sure it can be done a bit cleaner but it works for me right now.
Tell me about it!
___References________________________________________________________
[0]:
https://literature-clock.jenevoldsen.com/
[1]:
https://github.com/JohannesNE/literature-clock</content>
</entry>
<entry>
<title>2020-11-09 - Living on the floor (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2020-11-09-Living-on-the-floor.md"/>
<id>urn:uuid:a85a1630-aa91-11ec-aa08-560001fa5fa4</id>
<updated>2020-11-09T00:00:00+01:00</updated>
<content> 2020-11-09
___L_i_v_i_n_g__o_n__t_h_e__f_l_o_o_r________________________________
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
essential.
Thanks!
C-Keen</content>
</entry>
<entry>
<title>2019-12-18 - More smalltalk more gopher (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2019-12-18-More-smalltalk-more-gopher.md"/>
<id>urn:uuid:a86726d6-aa91-11ec-977f-560001fa5fa4</id>
<updated>2019-12-18T00:00:00+01:00</updated>
<content> 2019-12-18
___M_o_r_e__s_m_a_l_l_t_a_l_k__m_o_r_e__g_o_p_h_e_r__________________
Hey! I am still alive! And I have been going on onto some adventures
in smalltalk land. First of all, I have published an updated version
of squeaky[0] that includes some bug fixes like unbreaking displaying
images 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
saving the contents on some web DAV server.
Squeaky uses one page per gopher request. Previously new pages would
have been inserted in the back which made navigating weird when
you'd expect the forward and back buttons to behave like in a web
browser.
Instead of just moving back the BookMorph would show you previous
pages which means that you keep scrolling over pages you have visited
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
page' feature.
Thanks for reading and stay tuned for more gopher love!
___References________________________________________________________
[0]:
gopher://vernunftzentrum.de:70/9/ckeen/gopher-smalltalk/Gopher-ck.4.mcz</content>
</entry>
<entry>
<title>2019-05-05 - On building an audio player (~4 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2019-05-05-On-building-an-audio-player.md"/>
<id>urn:uuid:a8739c9a-aa91-11ec-981f-560001fa5fa4</id>
<updated>2019-05-05T00:00:00+01:00</updated>
<content> 2019-05-05
___O_n__b_u_i_l_d_i_n_g__a_n__a_u_d_i_o__p_l_a_y_e_r_________________
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
plays are high in demand. But all these digital media need to be
played somehow.
So the idea has been to use a media playing device that blends well
into 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
hastily bought Raspberry Pi 3 B+ already around I decided to use it.
But how should I design the interface? I have seen ideas of using
rfid tokens embedded in a 'cover card' that the child can hold on to
the player to make it select the media but that seems wasteful to me.
I don't want to add yet another physical item to the chain, also the
cards would probably get lost soon.
So I decided for a visual media selection mechanism by offering an
image 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
provide good tactile feedback, also it is not obvious that there is
something available to act on. Hence buttons were added. Big, arcade
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
is an actual knob stuck on a rotary encoder.
I have used an adafruit speaker bonnet and a pair of small 3W stereo
speakers that go with it to handle the actual audio output. The device
is 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
power switch which can turn on the device by grounding one pin on the
switch and turn itself off by rasing another PWR pin. I have reused
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
player and pull the PWR pin. Diodes prevent current from going the
wrong way.
The display is a 3,4" HDMI display by waveshare which came in a
reasonable size and prize ratio.
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
holes for the Raspberry Pi's USB/Network ports were a bit too tiny,
so I had to file both manually to make them fit.
The player software itself has been a breeze to write. It's a
smallish python script using pygame for image display and audio
playing. Upon start it scans a media directory for cover images,
which can be selected and the audio is played.
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
dictionary.
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.
I have used the gpiozero library for easy access and its callback
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
with the when_pressed event type. After a lo debugging session I
have discovered that I can circumvent the whole issue by using the
when_held event and configuring a small holding timeout. Now all
the buttons are properly debounced and show exactly the effect I
would have expected from when_pressed in the first place. What a
relief as the release date was near!
For the moment the device's wifi has been left turned on for
syncthing source code and media files automagically. Once the source
has stabilized I will probably add a auto load of media via usb and
disable wifi.
I will release the files as they stabilise under a CC-BY-NC-SA license
available under link below
Stay tuned, I will put up pictures of the finished device when I wake
up again.
___References_________________________________________________________</content>
</entry>
<entry>
<title>2019-02-04 - Programming arduinos without an IDE (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2019-02-04-Programming-arduinos-without-an-IDE.md"/>
<id>urn:uuid:a88c9056-aa91-11ec-8409-560001fa5fa4</id>
<updated>2019-02-04T00:00:00+01:00</updated>
<content> 2019-02-04
___P_r_o_g_r_a_m_m_i_n_g__a_r_d_u_i_n_o_s__w_i_t_h_o_u_t__a_n__I_D_E_
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
with a BSDMakefile and the toolchain and you could just run make /
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
package has been updated 'recently' to newer core libs. But the
makefile has been purged too!
After some poking I found the commit message of the port stating that
it 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:
'''
ARDMK_DIR=/usr/local/share/arduino-makefile
BOARD_TAG = uno
ARDUINO_LIBS = FastLED
USER_LIB_PATH = /home/ckeen/arduino/libs/
MONITOR_BAUDRATE = 115200
MONITOR_PORT = /dev/cuaU0
include ${ARDMK_DIR}/Arduino.mk
'''
And I have cloned the fastled lib into my $HOME/arduino/libs before.
In the directory beside the makefile a single .ino file is needed and
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)
I can live with both and developing has been a charm with it!
___References________________________________________________________</content>
</entry>
<entry>
<title>2018-12-21 - the most embarrassing admin mistake (~3 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-12-21-the-most-embarrassing-admin-mistake.md"/>
<id>urn:uuid:a893ef2c-aa91-11ec-8958-560001fa5fa4</id>
<updated>2018-12-21T00:00:00+01:00</updated>
<content> 2018-12-21
___t_h_e__m_o_s_t__e_m_b_a_r_r_a_s_s_i_n_g__a_d_m_i_n__m_i_s_t_a_k_e_
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].
Initially I have used digital ocean as my hoster. I have written a
small shell script that periodically try to ping the host and run
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
it 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
shop's order form, mails would not arrive and no connection attempts
were visible in the logs.
My test script didn't show any problem, the server was always
reachable. This has changed.
Yesterday a mail I have send would bounce and my script would
complain. While checking into the issue I have noticed that the
script cecks only with:
nc mail.example.com 25 | head -n1 | grep grep -q ^220.*OpenSMTPD
So this would check whatever the nameserver resolves it to. BUT this
server has ipv4 and ipv6 connectivity and corresponding MX entries in
its 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!
I have found out, that vultr.com blocks port 25 unless you ask
support to lift the ban due to spam! This has been in there for OVER
A YEAR without me noticing it. So I asked support to lift the ban
which they did eventually after I declined to provide a photocopy of
my national ID (which is illegal unless explicitly required by law
here). Still no connectivity.
I wondered. Then I remembered having set up gray listing on the host
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
when something does not work. Also ipv6 is doing pretty good in the
realms of email I would have expected more problems than the
occasionally missing email. Also don't forget about your firewall
settings. Check everything with a ports scanner.
That's all folks. This is my most embarrassing admin story of the
year.
___References________________________________________________________
[0]:
http://pestilenz.org/~ckeen/blog/posts/opensmtpd.html</content>
</entry>
<entry>
<title>2018-12-11 - Miscellaneous update (~3 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-12-11-Miscellaneous-update.md"/>
<id>urn:uuid:a8b6b7fa-aa91-11ec-a3cc-560001fa5fa4</id>
<updated>2018-12-11T00:00:00+01:00</updated>
<content> 2018-12-11
___M_i_s_c_e_l_l_a_n_e_o_u_s__u_p_d_a_t_e____________________________
Dear reader!
I have been silent for too long. But there has been a lot going on in
my life since the last posts. For one I have intensified my under-
standing of toki pona.
I even managed to get out some poetry, which I will collect at [0].
The current two poems are:
```
jan lili mi
jan lili mi utala.
jan lili mi pona.
jan lili mi pana sona.
sina tawa seme.
sina lukin ala lukin e ma pona.
sina kama lon ni.
jan lili mi o lape.
ali li pona.
2018-12-10
***
pipi lili
pipi lili li kama ni
ona li moku e kili
kili li ike
nanpa wan sike
la pipi lili li moli
2018-10-25
```
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
illegal activity under copyright law and others I will do it in
private.
Another thing is that I have been keeping a looong reading list
waiting, so I will now take books and reading material to work and
use my lunch break to get done some reading. The work place features
some nice couch like reading spots and I should make use of them.
I meant to take part in the excellent scifi project of tomasino [2].
But I don't have the time and energy to do a lot for that
unfortunately.
Programming wise I have been further exploring and writing my
personal finance tracker in smalltalk. The working title for that is
'Muffin' and as soon as I learn how to publish monticello packages, I
will put them on this server so you can read along if you like.
It is based on a Morphic toolkit called Pheno[3] from the HPI SWA
group. I like its looks so far and it is easily customizable.
I also seem to have groked the Dependency model and so one can see
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
runner, debugger and editor for that.
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
account.
The effects on that? Well I have found other resellers that will not
require any prepayments, bills upon delivery, package delivery
persons seem to handle packets with more care if they don't have
'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.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-10-22 - Print if you need an envelope (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-10-22-Print-if-you-need-an-envelope.md"/>
<id>urn:uuid:a8bcd702-aa91-11ec-81a6-560001fa5fa4</id>
<updated>2018-10-22T00:00:00+01:00</updated>
<content> 2018-10-22
___P_r_i_n_t__i_f__y_o_u__n_e_e_d__a_n__e_n_v_e_l_o_p_e______________
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.
I occasionally run out of envelopes myself or need to send stuff from
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
inkscape and saved it on this server in case I need an envelope.
Please do help yourself!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-10-19 - Improvements to smalltalk gopher (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-10-19-Improvements-to-smalltalk-gopher.md"/>
<id>urn:uuid:a8c29cd2-aa91-11ec-b7d1-560001fa5fa4</id>
<updated>2018-10-19T00:00:00+01:00</updated>
<content> 2018-10-19
___I_m_p_r_o_v_e_m_e_n_t_s__t_o__s_m_a_l_l_t_a_l_k__g_o_p_h_e_r______
Hey! I have been exploring Smalltalk a little bit more and found some
weird legacy stuff, one being internal encoding. Turns out that
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.
I have also included a subclass for a SocksSocket that will route
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
stuff, set LC_ALL and it will get enabled in the VM... It is buried
in the man page and it took me a while to find that.
___References________________________________________________________
[0]:
gopher://vernunftzentrum.de/1/ckeen/gopher-smalltalk</content>
</entry>
<entry>
<title>2018-09-21 - Georg Nees' Schotter for CHICKEN (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-09-21-Georg-Nees---Schotter-in-CHICKEN-Scheme.md"/>
<id>urn:uuid:a8ff0b72-aa91-11ec-add3-560001fa5fa4</id>
<updated>2018-09-21T00:00:00+01:00</updated>
<content> 2018-09-21
___G_e_o_r_g__N_e_e_s'_-__S_c_h_o_t_t_e_r__for__C_H_I_C_K_E_N________
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
down and wrote a CHICKEN Scheme version[3]. This outputs an A3
formatted pdf, looking differently each run.
It requires CHICKEN 5 and a recent cairo egg...
Our friend from the shoestringfoundation[3] wrote a version in
postscript.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-09-21 - Another Smalltalk journey (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-09-21-Another-Smalltalk-journey.md"/>
<id>urn:uuid:a904fa0a-aa91-11ec-86b3-560001fa5fa4</id>
<updated>2018-09-21T00:00:00+01:00</updated>
<content> 2018-09-21
___A_n_o_t_h_e_r__S_m_a_l_l_t_a_l_k__j_o_u_r_n_e_y___________________
I have spent the last weeks with another visit to the land of
Smalltalk. As I have described earlier[0] Smalltalk is a really
interesting OO langugage with its own eco system.
This time I have been choosing Squeak[1] as my platform in
preparation of a little talk[2] I gave at my local computer club.
Thanks to krono[3] for all the help and codezeilen[4] for helping out
with my patches.
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
display gopher sites as a BookMorph and is able to render images as
well.
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
whose original intent has been to do interactive books and
presentations.
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
rest of the 2-3 days of time went into diagnosing resizing /
scrolling bugs which have been mitigated by moving to BookMorph.
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
initial set of classes, this time refactored as a Smalltalk model. I
want to do it with the model/viewer paradigm as I hope to gain some
insights 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!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-08-23 - Hosting my own social media instance (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-08-23-Hosting-my-own-social-media-instance.md"/>
<id>urn:uuid:a91d6cb6-aa91-11ec-8868-560001fa5fa4</id>
<updated>2018-08-23T00:00:00+01:00</updated>
<content> 2018-08-23
___H_o_s_t_i_n_g__m_y__o_w_n__s_o_c_i_a_l__m_e_d_i_a__i_n_s_t_a_n_c_e_
Since a couple of days this domain also hosts a social media instance
for the ActivityPub Federation. The specific implementation is pleroma
which does include a gopher frontend to the timelines on port 9999.
I will open this for vernunftzentrum.de residents. ATM there's no public
registration. If you want an account just ping me and I'll get you
started.
I have beem planning to do this for quite a while now and I finally found
the time to do it. Installing pleroma has been a breeze, it needs little
resources and seems overall a bit easier to manage than all this node.js
stuff out there.
I will resume regular posting on gopher here. Stay tuned.</content>
</entry>
<entry>
<title>2018-07-11 - A call for input (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-07-11-A-call-for-input.md"/>
<id>urn:uuid:a97ba916-aa91-11ec-9bbe-560001fa5fa4</id>
<updated>2018-07-11T00:00:00+01:00</updated>
<content> 2018-07-11
___A__c_a_l_l__f_o_r__i_n_p_u_t______________________________________
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
has been born soon after I learned about zines, mostly from the
secure scuttlebutt network (which is a whole story in itself). So one
thing that I would love to do is to gently introduce the reading
human to the gopher as a medium, as a user and finally as a content
creator.
Yes this probably is a long term project and I will be moving *very*
slowly. But it is a multiple issue project which I plan to do as
physical things (and then rescan them or smth).
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
piece that drew you into the gopher world. Send me the piece that got
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.
I cannot make any promisses whether all of the stuff will be included
in 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!
YT</content>
</entry>
<entry>
<title>2018-07-10 - How to fold a zine (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-07-10-How-to-fold-a-zine.md"/>
<id>urn:uuid:a992542c-aa91-11ec-8ad1-560001fa5fa4</id>
<updated>2018-07-10T00:00:00+01:00</updated>
<content> 2018-07-10
___H_o_w__t_o__f_o_l_d__a__z_i_n_e___________________________________
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
sheet of paper and a pair of scissors. No glue or staples needed.
I went with a A3 paper sheet, this will result in getting 8 a5 sized
zine pages.
So take the A3 paper:
+---------------------------------+
| |
| |
| |
| |
| |
| |
| |
+---------------------------------+
fold it in half on the short side:
+---------------------------------+
| | |
| | |
| v |
|=================================|
| |
| |
| |
+---------------------------------+
so it looks like this:
|=================================|
| |
| |
| |
+---------------------------------+
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
it should look like a cross:
A
= =
V
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
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!
If you like to have more tipps on how to structure your zine, have
a look at the zine tips[0] on this server! Also have a look at the
zine wiki[1]!
___References________________________________________________________
[0]:
gopher://vernunftzentrum.de/0/ckeen/zinetips.txt
[1]:
http://www.zinewiki.com/Main_Page</content>
</entry>
<entry>
<title>2018-06-14 - Freeing a Lenovo X200 (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-06-14-Freeing-a-Lenovo-X200.md"/>
<id>urn:uuid:a9b85456-aa91-11ec-8723-560001fa5fa4</id>
<updated>2018-06-14T00:00:00+01:00</updated>
<content> 2018-06-14
___F_r_e_e_i_n_g__a__L_e_n_o_v_o__X_2_0_0____________________________
I finally got around to flash libreboot[0] on a used Lenovo X200.
This laptop is a bit dated by modern standards but it is roughly the
same class as my T61 I have atm, so I don't feel too set back. Since
the battery is dying on my current one, getting the replacement up to
speed becomes more urgent.
So what's libreboot? It is a distribution of coreboot, a free BIOS
implementation 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
in that it disables the spy chip aka Management Engine (ME) by
default and contains no proprietary blobs.
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
device's MAC address. It will work without modification but then
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.
I installed OpenBSD on it and Xorg, suspend and resume works. The
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
disk encryption is currently not possible. I will have to thing about
securing that later.
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
get out a cable connection until the first boot.
The X200 is now running on a SSD and it is super quiet, light and
handy. I am already in love with it.
___References________________________________________________________
[0]:
https://libreboot.org/
[1]:
https://libreboot.org/docs/install/rpi_setup.html
[2]:
https://libreboot.org/docs/install/x200_external.html</content>
</entry>
<entry>
<title>2018-06-13 - The Timeless Way of Building (~5 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-06-13-The-Timeless-Way-of-Building.md"/>
<id>urn:uuid:a9c36576-aa91-11ec-861b-560001fa5fa4</id>
<updated>2018-06-13T00:00:00+01:00</updated>
<content> 2018-06-13
___T_h_e__T_i_m_e_l_e_s_s__W_a_y__o_f__B_u_i_l_d_i_n_g_______________
During my vacation I came to read Christopher Alexanders excellent
book "The Timeless Way of Building"[0]. It describes (the following
is oversimplified) a generative way of describing architecture so
that the built results are places where people enjoy being in, they
get used in the intended way and have a 'quality withouth a name'
attached to them that make them beautiful, practical and enjoyable.
In contrast most modern architecture seems to be ugly, uninhabitable,
boring, depressing. One reason for this according to Alexander is the
missing connection between the architect's pattern langugage and the
people inhabitating, building and using ta house or town.
Old buildings seem to connect all people involved to create a thing
that's unique and built specifically to meet the needs and
requirements for its inhabitants and the location. This is done by
interpreting 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
generative patterns that create inherently good things over to
software. And that's where we see them as 'design patterns'.
I find that metaphor a bit stretching but it seems Alexander got
invited 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
pattern language other qualities should be present at the same time.
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
with. Software is not written for a single purpose (other than to
generate revenue in most cases...) and hardly with the user in mind.
And noone really cares about the generated whole. Maye in closed
systems like Apples this was more dominant than in others (iPhone UIs
come to mind). But with ubiquitous web interfaces this is not the
case anymore.
Also another pattern langugage rule that's violated with software
patterns is: They have to be simple and widerspread known and can be
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
will most likely fail in this regard.
Maybe they are too low level. Hardly anyone trying to get work done
with a piece of software cares about the singleton factory facade
underneath.
Also Alexander argues that to test a pattern language one should
generate designs (or 'play out' designs) from the language and
evaluate those to fitness of the requirements. I am not aware of any
methodology in SW design that does this. SW patterns are somewhat
passed around as the given solution to a problem but there's no way
to check whether the whole design will make sense.
We need an easier language to describe our designs and design
decisions. We need morally sound software. Software that service
people, do not betray them and are clear in what they do.
I still think a pattern language is helpful to specify and argue
about design in software. How should a language like this look like?
Who should be formulating the requirements?
I think programmers will need to close the loop and distance between
them and the users. This has been said many times of course and
people are arguing whether everyone needs to be a programmer.
I think that's a bit of an exaggeration. Not everyone needs to be a
programmer. But everyone should be able to discuss design and this
includes 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
house / barn looks like for them. The builder can handle the
necessary technical details and choose the tooling but the outcome
would be inspectable and also up for discussion.
I think a way to accomplish this is to abandon a lot of stock
software and return to building tiny pieces tailored to individual's
needs. If needs change tools must change too. Like moving into
another building or rebuilding a house to fit the new needs of a
growing or shrinking family.
I have no idea how this would work in practise, but let's build
small, working things for people we know and care about. That may
contribute to a better software world too.
___References________________________________________________________
[0]:
gopher://gopherpedia.com/0/The%20Timeless%20Way%20of%20Building
[1]:
http://www.patternlanguage.com/leveltwo/archivesframe.htm?/leveltwo/../archives/ieee/ieee.htm</content>
</entry>
<entry>
<title>2018-05-14 - Opening up for residents (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-05-14-Opening-up-for-residents.md"/>
<id>urn:uuid:a9d59d9a-aa91-11ec-919f-560001fa5fa4</id>
<updated>2018-05-14T00:00:00+01:00</updated>
<content> 2018-05-14
___O_p_e_n_i_n_g__u_p__f_o_r__r_e_s_i_d_e_n_t_s______________________
Hi all!
I will open up this gopher server for all interested beings. This
does include:
* 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
will arrange the delivery. If you have no clue what this means, ask
and I will walk you through the necessary tiny steps.
Enjoy!</content>
</entry>
<entry>
<title>2018-05-14 - Handwriting (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-05-14-Handwriting.md"/>
<id>urn:uuid:a9dbcf26-aa91-11ec-98d5-560001fa5fa4</id>
<updated>2018-05-14T00:00:00+01:00</updated>
<content> 2018-05-14
___H_a_n_d_w_r_i_t_i_n_g_____________________________________________
In the last days I have been thinking a lot about my handwriting. I
have never had a pretty handwirting in elementary school and it got
worse around 5th/6th grade.
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
relearning -- my handwriting. Otherwise this tool is not usable to me
at all.
Where does all this interest to handwriting stem from all of a
sudden? Well I restarted taking notes again. To make these notes
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
slows me down or is not readable (even by myself!).
So I will work out and retrain my handwriting. I already have found
some useful resources. 'Writing in italics' is about the closest I
have found on the internet that resembles a fluid handwriting style.
I do not want to mimick any printed or 'block' letters. I want my
writing to be fluid and neat and readable.
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
penmanship template papers to print out for the excercises [3] and
for your notebook[4].
So I invite you -- my dear reader -- to join me on this journey of
improving the handwriting.
___References________________________________________________________
[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/</content>
</entry>
<entry>
<title>2018-04-27 - Holymoly fixes (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-27-Holymoly-fixes.md"/>
<id>urn:uuid:aa2f9a84-aa91-11ec-b13b-560001fa5fa4</id>
<updated>2018-04-27T00:00:00+01:00</updated>
<content> 2018-04-27
___H_o_l_y_m_o_l_y__f_i_x_e_s________________________________________
The past few days have seen me committing a couple of fixes to
holymoly[0], the CHICKEN Scheme gopher client that supports tunneling
through a SOCKS5 proxy (tested with tor).
The most embarassing mistake I made has been fixed just today. The
sympthoms of the bug would manifest only when connecting to
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
properly flush the selector string out.
So thank you all for listening to my whining, I can carry on to make
holymoly usable for everyone now...
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-04-17 - Setting music sheets (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-17-Setting-music-sheets.md"/>
<id>urn:uuid:aa3729f2-aa91-11ec-8371-560001fa5fa4</id>
<updated>2018-04-17T00:00:00+01:00</updated>
<content> 2018-04-17
___S_e_t_t_i_n_g__m_u_s_i_c__s_h_e_e_t_s_____________________________
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
has the appeal of using scheme as it's internal language and that of
plugins but the learning curve appeared to be quite steep to me and I
was working under pressure. I have found a simpler way of entering my
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
have found my copy of it together with the sheets in an old backup.
Unfortunately modern C compilers have been a bit too picky and it
seems there has been a bug hiding unnoticed in all these decades that
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
suggests[3].
I have fixed it up and will serve it here[4] for further reference.
As an example have a look at 'The rocky road to dublin'[5] in the
gallery[6].
Sorry for the earworm...
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-04-13 - Re:1436con (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-13-Re:1436con.md"/>
<id>urn:uuid:aa4056e4-aa91-11ec-a837-560001fa5fa4</id>
<updated>2018-04-13T00:00:00+01:00</updated>
<content> 2018-04-13
___R_e_:_1_4_3_6_c_o_n_______________________________________________
The fine folks solderpunk and tomasino have brought up the idea for a
virtual 'conference' on gopher. In his latest post[0] tomasino
proposed having a CFP period and then a place where people would drop
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
gopher itself. Having this under a 'con' label could put up enough
time pressure to produce something that's worth discussing on a
broader audience or to bring more people together that previously
didn't know about each other.
I think we need more documentation on how people run their services,
new application ideas and admin advice, etc…
I am looking forward to having something like this. I guess,
tomasino, you should just announce a CFP and we spread the word :)
For the record, the name should be 1436con, providing content since
1436…
___References________________________________________________________
[0]:
gopher://gopher.black:70/1/phlog/20180412-port-70-or-1436con</content>
</entry>
<entry>
<title>2018-04-09 - Dealing with rogue crawlers (~3 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-09-Dealing-with-rogue-crawlers.md"/>
<id>urn:uuid:aa462934-aa91-11ec-9f35-560001fa5fa4</id>
<updated>2018-04-09T00:00:00+01:00</updated>
<content> 2018-04-09
___D_e_a_l_i_n_g__w_i_t_h__r_o_g_u_e__c_r_a_w_l_e_r_s________________
Today I got hit by a crawler that thinks indexing all of my stagit
repo pages is a good idea.
Now I am unsure about the usefulness of a robots.txt file, if someone
wants to access a selector or all of them, fine by me. Unless my data
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
implementing 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
hours
* 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:
'''pf.conf
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:
'''shell
# 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
gopher server.
The CGI:
'''shell
#!/bin/ksh
grep "$REMOTE_ADDR" /var/gopher/greylist > /dev/null
if [ "$?" -ne "0" ]; then
echo "$REMOTE_ADDR" >> /var/gopher/greylist
else
sed -i.bak "s,$REMOTE_ADDR,,g" /var/gopher/greylist
echo "$REMOTE_ADDR" >> /var/gopher/blacklist
fi
doas /sbin/update-pf 2>/dev/null
gopher-tarpit
'''
Gopher tarpit is just a dump slowly sending program, you can use
anything really. Adjust the server settings to your need please.
It sends some selectors pointing to the cgi again:
'''c
#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"
".\r\n";
int
main (int argc, char **argv)
{
size_t l = strlen(message);
for (int i=0; i<l; i++) {
putchar(message[i]);
fflush(stdout);
sleep(1);
}
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:
'''shell
#!/bin/ksh
pfctl -t spammers-black -T replace -f /var/gopher/blacklist
'''
'''doas.conf
permit nopass :_geomyidae cmd /sbin/update-pf
'''
With that you hit up the rogue crawler, let's free the ip again:
'''shell
pfctl -t spammers-black -T expire 7200
'''
Put that in a cronjob. Adjust the time value to taste.
So this sums it up for this little proof of concept. Please don't
deploy this 1:1. I encourage you to make an educated decision whether
it really is necessary. If it is, you now hold the seed for a cure to
your problems.
I would like to thank __20h__ for cross checking the text (modulo the
pf commands). All mistakes are mine.
Thanks for reading!
_____________________________________________________________________</content>
</entry>
<entry>
<title>2018-04-06 - Irc client improvements (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-06-Irc-client-improvements.md"/>
<id>urn:uuid:aa543254-aa91-11ec-95a8-560001fa5fa4</id>
<updated>2018-04-06T00:00:00+01:00</updated>
<content> 2018-04-06
___I_r_c__c_l_i_e_n_t__i_m_p_r_o_v_e_m_e_n_t_s_______________________
I have added user name tracking to my fork of irc.c[0], so now it
should properly display JOIN and PART messages.
I have been using this more and more and come to like it. I hope I
can stop the feature creep soon though :)
___References________________________________________________________
[0]:
gopher://vernunftzentrum.de:70/1/ckeen/repos/irc/log.gph</content>
</entry>
<entry>
<title>2018-04-05 - Plan 9 nuggets The rc shell (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-05-Plan-9-nuggets---The-rc-shell.md"/>
<id>urn:uuid:aa5e4c80-aa91-11ec-b807-560001fa5fa4</id>
<updated>2018-04-05T00:00:00+01:00</updated>
<content> 2018-04-05
___P_l_a_n__9__n_u_g_g_e_t_s__-__T_h_e__r_c__s_h_e_l_l_______________
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.
I like it a lot due to:
* 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 ^
operator.
* 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:
'''rc
fn read{
$1=‘{awk ’{print;exit}’}
}
'''
All this and more can be found in the rc paper[1] describing the
whole syntax. I think the saner quoting rules make scripts less error
prone and the pipe syntax enables easy scripting with networking
tools like ii[2]. There is a port to modern unix available[3] just
remember to pass the '--enable-edit=' option to configure. Yes, it
uses autotools. Oh the irony...
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-04-05 - Ed Mastery: A review (~3 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-05-Ed-Mastery:-A-review.md"/>
<id>urn:uuid:aa7f2b26-aa91-11ec-b32a-560001fa5fa4</id>
<updated>2018-04-05T00:00:00+01:00</updated>
<content> 2018-04-05
___E_d__M_a_s_t_e_r_y_:__A__r_e_v_i_e_w______________________________
"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
reading the 1st edition of 'Absolute OpenBSD' which was one of the
first books giving a detailed description of how to run OpenBSD
properly.
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.
I got the paper edition or the book for normal people. As I have been
following Michael on mastodon I think the backstory to it is this: He
has been receiving negative feedback on deliberately choosing female
pronouns in his examples for one of his last books. (It may have
been even pronouns with randomly chosen gender, I do not remember
correctly).
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 small percentage of the retail price is donated to a Soroptimist
International chapter.
So all shenanigans aside, let's get to the book: The tone is set
slightly preacherous and exaggerating as shown on the introductory
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
right? Right?!
While I do not know Michael has written this book, I use ed(1) now to
get this post into my file system (and off my chest). Ed *is* usable
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.
I would recommend Michael's 13th IT mastery book to anyone interested
in the concepts that drive a lot of unix machinery we now take for
granted: grep (the name comes from ed's command combo g/re/p), sed,
diff (has a flag to output an ed script for changing file a into file
b) and many others including my beloved sam.
The book's price is probably cheaper than your lunch at work, fun to
read and I wholehartedly recommend it.
Go and get Ed Mastery!
P.S.: I usually never give out recommendations to buy stuff online,
I am in no way affiliated with Michael W Lucas nor do I get any
compensation for this post (apart from scolding that I get it all
wrong).
___References________________________________________________________
[0]:
https://www.michaelwlucas.com/tools/ed</content>
</entry>
<entry>
<title>2018-04-04 - Less logging (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-04-Less-logging.md"/>
<id>urn:uuid:aa88ea76-aa91-11ec-b431-560001fa5fa4</id>
<updated>2018-04-04T00:00:00+01:00</updated>
<content> 2018-04-04
___L_e_s_s__l_o_g_g_i_n_g____________________________________________
I have added a stats tool[0] containing another awk[1] script for
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
get to know what kind of post is most interesting to you dear reader.
At the same time I don't want to keep too much data about you. I
don't care when and how you access this gopher server. I don't care
what you paste here. As long as everything runs smooth there's no
reason for me to know that.
To make this process transparent, I have added a logging policy
document[2] at the root of this gopher service.
Let me know what you think!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-04-03 - VCalendar handling in mutt (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-04-03-VCalendar-handling-in-mutt.md"/>
<id>urn:uuid:aa8fbb80-aa91-11ec-80d6-560001fa5fa4</id>
<updated>2018-04-03T00:00:00+01:00</updated>
<content> 2018-04-03
___V_C_a_l_e_n_d_a_r__h_a_n_d_l_i_n_g__i_n__m_u_t_t__________________
My coworkers use outlook a lot to handle meeting dates. This is
particular annoying for me as I use mutt at work and need to make
sense of the gibberish that a VCALENDAR attachment is.
Today I got so annoyed that I wrote a little awk script:
'''awk
#!/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
'''
Ignore that html part, that's getting piped through lynx.
And in my mailcap I added:
'''mailcap
text/calendar; vcalendar2txt %s; copiousoutput
'''
The copiousoutput part tells mutt that it is non-interactive (amongst
potential flooding it with output), so without that the auto_view
will not work.
The awk script is a bit ugly, I guess one could move the redundant
parts into its own function.
How do you deal with the enterprise IT horrors?</content>
</entry>
<entry>
<title>2018-03-30 - IRC minimalism (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-30-IRC-minimalism.md"/>
<id>urn:uuid:ab000df4-aa91-11ec-80a2-560001fa5fa4</id>
<updated>2018-03-30T00:00:00+01:00</updated>
<content> 2018-03-30
___I_R_C__m_i_n_i_m_a_l_i_s_m________________________________________
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.
Irc.c does not keep a nick name list per channel to keep bookkeeping
simple. This has the immediate downside that you don't get to see
nick changes in the right window and you don't see people leaving due
to QUIT messages.
I am not sure I want to 'fix' this by adding the overhead of member
lists in channels (yet).
I did add a weird fix for OFTC networks however. Servers on that
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
reader -- knows why? Let me know!
___References________________________________________________________
[0]:
gopher://vernunftzentrum.de:70/1/ckeen/repos/irc/log.gph</content>
</entry>
<entry>
<title>2018-03-29 - Posting guidelines (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-29-Posting-guidelines.md"/>
<id>urn:uuid:ab3063b4-aa91-11ec-8afc-560001fa5fa4</id>
<updated>2018-03-29T00:00:00+01:00</updated>
<content> 2018-03-29
___P_o_s_t_i_n_g__g_u_i_d_e_l_i_n_e_s________________________________
I have spent tonight writing up an initial document for bitreich's
'posting guidelines' in their gopher tutorial section[0]. I think such
information 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
with irc.c have been successful so far. The only feature I am still
missing is highlighting and maybe search. The latter could be done by
an external tool, Maybe I should use a special "channel" window for
script interactions...
___References________________________________________________________
[0]:
gopher://bitreich.org:70/1/tutorials
[1]:
gopher://vernunftzentrum.de/0/ckeen/tmp/publishing-guideline.txt</content>
</entry>
<entry>
<title>2018-03-28 - Minimalistic irc (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-28-Minimalistic-irc.md"/>
<id>urn:uuid:ab7a073a-aa91-11ec-8fff-560001fa5fa4</id>
<updated>2018-03-28T00:00:00+01:00</updated>
<content> 2018-03-28
___M_i_n_i_m_a_l_i_s_t_i_c__i_r_c____________________________________
I have come to the point where I don't understand the config of my
IRC client anymore. IRC should really be simpler. And I have detected
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.
I have come across irc.c by c9x[1] and I really like it. I have spent
today's little time to hack in topic support and nick changing
support. The only thing that's left on this account is the 'This nick
is 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
small enough to read through it and add some missing features.
The official feature list is:
infinite scrollback;
automatic reconnection;
utf8 support (inputting is still to do);
line editing (emacs like keybindings);
activity markers;
logging;
terminal resizes (inside an xterm).
I added:
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
section here.
So long!
___References________________________________________________________
[0]:
https://tools.suckless.org/sic/
[1]:
https://c9x.me/irc/</content>
</entry>
<entry>
<title>2018-03-27 - Gophermaps and item types (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-27-Gophermaps-and-item-types.md"/>
<id>urn:uuid:ab8c016a-aa91-11ec-adff-560001fa5fa4</id>
<updated>2018-03-27T00:00:00+01:00</updated>
<content> 2018-03-27
___G_o_p_h_e_r_m_a_p_s__a_n_d__i_t_e_m__t_y_p_e_s____________________
While reading through my phlogroll[0] I noticed that some authors
misuse the menu item for whole posts. The text is written with
informational ('i') items, while the links are regular selectors. At
first I thought: "Well this is nice, people can just follow the
referenced links." But after some more thoughs I think that it is a
bad idea in general.
This is probably the equivalent of using tables for layouting the
page in HTML. It will deteriorate the usefulness and semantics of a
directory item. That is a directory item is just a summary or certain
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
hierarchy which should be adapted to the task. Information should be
easy to find and navigation should be simple.
In its most exaggerated form a gophermap makes the reader jump
through dozens of basically empty hierarchy directory listings before
reading content. The phlog that has years -> months -> posts
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
stays the same! To recycle the phlog example once more: Moving posts
to archive pages is just a modification in the directory entries, no
selector has to change! References from other gopher servers will
still work as expected!
Now as I said in another post[1] crawlers should traverse and index
directory entries. What happens if such an indexer sees such a
disguised menu/post?
Therefore I have decided to keep simple files as my post items. I can
write them up in any markup I choose and clients such as VF-1 can
simply grep for URIs (or your script can).
Keep it with the spirit of RFC-1436. Keep it simple!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-25 - Gopher crawlers and robots.txt (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-25-Gopher-crawlers-and-robots.txt.md"/>
<id>urn:uuid:ab96faa2-aa91-11ec-b7a1-560001fa5fa4</id>
<updated>2018-03-25T00:00:00+01:00</updated>
<content> 2018-03-25
___G_o_p_h_e_r__c_r_a_w_l_e_r_s__a_n_d__r_o_b_o_t_s_._t_x_t__________
Fellow gopher poster kichimi[0] has started a little online
discussion about open gopher proxies hitting his server hard with
invalid requests. If I understood the situation correctly this
happes a lot through a google crawler hitting these proxy sites and
generating invalid requests for each selector (favicon, index.html,
�)
I agree with him, that these broken proxies are a bad idea. If you
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.
I don't think that crawling as such is harmful, if done within
(rate) limits. I have learned that even veronica obeys a robots.txt[1].
I am not sure I want to disallow crawling on this server. Maybe
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
such a nice huge vintage software[2] collection like kichimi has.
Also I think for gopher, menu crawling is the way to go. There's no
point in ruining a server's bandwidth by downloading all binary media
files. After all we build human scale software here[3] and all the
human metadata should be either in the selector already, or the
surrounding info entries.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-24 - Toki pona spell checking (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-24-Toki-pona-spell-checking.md"/>
<id>urn:uuid:aba825ac-aa91-11ec-9256-560001fa5fa4</id>
<updated>2018-03-24T00:00:00+01:00</updated>
<content> 2018-03-24
___T_o_k_i__p_o_n_a__s_p_e_l_l__c_h_e_c_k_i_n_g______________________
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
pona wordlist to a unix spell checker like aspell/hunspell. And it
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].
Enjoy!
___References________________________________________________________
[0]:
https://www.suares.com/index.php?page_id=25&news_id=233
[1]:
gopher://vernunftzentrum.de/9/ckeen/files/tokipona.tgz</content>
</entry>
<entry>
<title>2018-03-23 - Converging to a Plan9 ui (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-23-Converging-to-a-Plan9-ui.md"/>
<id>urn:uuid:abaf866c-aa91-11ec-a897-560001fa5fa4</id>
<updated>2018-03-23T00:00:00+01:00</updated>
<content> 2018-03-23
___C_o_n_v_e_r_g_i_n_g__t_o__a__P_l_a_n_9__u_i_______________________
Today I have added a small patch to my sam installation that fixes
pasting[0] between sam instances. Also Rob King has fixed[1] some
issues with locking sam instances.
Triggered by rain[2] I stole the old rio mouse pointers and put them
into 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
initial idea has been to replace the more closed vortex poker PCB and
reuse the switches and casing. But this PCB has 'underglow', so I
would need some kind of acrylic casing to be able to enjoy that fancy
nonsense.
I still have not decided what to do there.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-22 - Phlog feedback (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-22-Phlog-feedback.md"/>
<id>urn:uuid:abb6088e-aa91-11ec-8660-560001fa5fa4</id>
<updated>2018-03-22T00:00:00+01:00</updated>
<content> 2018-03-22
___P_h_l_o_g__f_e_e_d_b_a_c_k________________________________________
Yesterday's post has been broken due to the handling of selectors in
geomyidae. I accidentally (or not) added a dot to the end of my post
file so it contained '..'. This in turn resulted in geomyidae
rejecting the selector silently. This is done to prevent directory
traversal attacks. I have fixed my post file name and sent a patch
that fixes the behaviour upstream to _20h_.
UPDATE:______________________________________________________________
After a little discussion we settled on a small patch that
will return an error when a client asks for a selector containing
'..'. 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.
Thanks!</content>
</entry>
<entry>
<title>2018-03-22 - Now on gopher campaign (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-22-Now-on-gopher-campaign.md"/>
<id>urn:uuid:abbbecb8-aa91-11ec-af74-560001fa5fa4</id>
<updated>2018-03-22T00:00:00+01:00</updated>
<content> 2018-03-22
___N_o_w__o_n__g_o_p_h_e_r__c_a_m_p_a_i_g_n__________________________
I am getting ambitious today. To advocate using gopher again for
mundane things such as getting your content to your readers in a
simple no-nonsense fashion. To make this easier I did a quick 'Now on
gopher!' "logo"[0][1].
Go ahead and use this on your (old) http blog, (anti-)social media
and so forth. Spread the gopher goodness. Get people to make
wonderful things. Aid someone in setting up their own gopher server.
Go phorth!
___References________________________________________________________
[0]:
gopher://vernunftzentrum.de/g/ckeen/media/nowongopher.gif
[1]:
gopher://vernunftzentrum.de/0/ckeen/media/nowongopher.txt</content>
</entry>
<entry>
<title>2018-03-21 - I've lived in emacs,now I am leaving (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-21-I-have-lived-in-emacs-Now-I-am-leaving.md"/>
<id>urn:uuid:abf3f6d0-aa91-11ec-89d6-560001fa5fa4</id>
<updated>2018-03-21T00:00:00+01:00</updated>
<content> 2018-03-21
___I_'_v_e__l_i_v_e_d__i_n__e_m_a_c_s,_n_o_w__I__a_m__l_e_a_v_i_n_g__
I have been a vim user for years, I have been an emacs user for
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!</content>
</entry>
<entry>
<title>2018-03-20 - On sharing in the maker community (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-20-On-sharing-in-the-maker-community.md"/>
<id>urn:uuid:abf9e630-aa91-11ec-8402-560001fa5fa4</id>
<updated>2018-03-20T00:00:00+01:00</updated>
<content> 2018-03-20
___O_n__s_h_a_r_i_n_g__i_n__t_h_e__m_a_k_e_r__c_o_m_m_u_n_i_t_y______
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
generated from. In the aftermath of my word clock workshop I am still
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
have been documented[1] I almost accidentally have stumbled over it.
And I wonder why that is. I come from a SW hacker background and here
sharing your source code is ubiquitous. For HW tinkerers it seems
more natural to share compiled hex dumps or blobs.
Please do not do that. It is harmful. Not only do you leave the
people building your stuff in the dark about its innards, it
discourages the ability to repair the things you have built yourself!
Also the future you may forget the exact steps on how you created
your files, so documenting that and *sharing* that ensures that your
idea will still be alive tomorrow. With an open mindset this is at
least possible.
I am no free software zealot, but I do see the merits of licenses
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
stuff.
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.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-19 - My phlogging routine (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-19-My-phlogging-routine.md"/>
<id>urn:uuid:ac06c17a-aa91-11ec-aed1-560001fa5fa4</id>
<updated>2018-03-19T00:00:00+01:00</updated>
<content> 2018-03-19
___M_y__p_h_l_o_g_g_i_n_g__r_o_u_t_i_n_e_____________________________
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
process.
The indices and the atom feed get recreated. A new post is born!</content>
</entry>
<entry>
<title>2018-03-19 - Build a new wordclock (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-19-Build-a-new-wordclock.md"/>
<id>urn:uuid:ac12cbb4-aa91-11ec-b925-560001fa5fa4</id>
<updated>2018-03-19T00:00:00+01:00</updated>
<content> 2018-03-19
___B_u_i_l_d__a__n_e_w__w_o_r_d_c_l_o_c_k____________________________
Yesterday I got a day off usual chores and joined a 'word clock'
workshop at my local fablab. This has been a nice and relaxing
afternoon and the result after 5 hours of soldering, cutting and
talking to the others I hold a nice word clock in my hand.
In case you don't know what a word clock is: It's a clock where the
time is displayed using words that are lit through leds behind a
stenciled frame. The ones we have built are similar to this one[0].
Mine has RGB leds and a RTC and is controlled via a IR remote.
It still has some downsides though: I don't like having to set the
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.
___References________________________________________________________
[0]:
http://www.instructables.com/id/Word-Clock-2/
[1]:
https://en.wikipedia.org/wiki/DCF77</content>
</entry>
<entry>
<title>2018-03-19 - Atom feed for this phlog (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-19-Atom-feed-for-this-phlog.md"/>
<id>urn:uuid:ac26b1d8-aa91-11ec-9e65-560001fa5fa4</id>
<updated>2018-03-19T00:00:00+01:00</updated>
<content> 2018-03-19
___A_t_o_m__f_e_e_d__f_o_r__t_h_i_s__p_h_l_o_g_______________________
Phlogger sysdharma[0] has mentioned that there are no update feeds in
the phlogosphere. This has already been countered by jynx[1] listing
some phlogs that do feature a feed mechanism. So I wondered how hard
it is to generate an atom feed for a reader.
Of course it turns out that it is not difficult at all. A small shell
script later and this phlog now features an atom feed[2] for all
posts. As I am not using a RSS/Atom feedreader much these days,
please let me know if said feed does work for you. The W3C validator
tells me, that it's a valid feed, so it should be ok. Ironically
their validator works with http URIs only...
I still like moku-pona[3] better due to its generation of a gopher
menu, but maybe moku-pona can make use of this feed mechnanism?
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-17 - Continuity (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-17-Continuity.md"/>
<id>urn:uuid:ac75c868-aa91-11ec-8d39-560001fa5fa4</id>
<updated>2018-03-17T00:00:00+01:00</updated>
<content> 2018-03-17
___C_o_n_t_i_n_u_i_t_y_______________________________________________
I continued to work on my toki pona skills and rehearsed the sitelen
pona sets as well as compound words. I hope I can recall them
quickly enough to do some real writing soon!
ale li pona!
mi tawa!</content>
</entry>
<entry>
<title>2018-03-16 - Sitelen pona toki pona glyphs (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-16-Sitelen-pona---toki-pona-glyphs.md"/>
<id>urn:uuid:ac7be176-aa91-11ec-8041-560001fa5fa4</id>
<updated>2018-03-16T00:00:00+01:00</updated>
<content> 2018-03-16
___S_i_t_e_l_e_n__p_o_n_a__-__t_o_k_i__p_o_n_a__g_l_y_p_h_s__________
toki!
So since last time, I posted about toki pona[0] not a lot has
happened. Although RussSharek[1] does his best to entertain all of us
with new toki pona treasures he finds on the web. Today he has showed
me new groups on memrise for learning toki pona. And by accident I
started the sitelen pona learning course. After a couple of hours I
can now read the original toki pona writing system as created by toki
ponas inventor Sonja Lang.
I hear you. Yes, it is an artificial writing system for an invented
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].
I have to say that learning the sitelen pona glyphs has been a lot
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.
If you don't know toki pona yet and have a rainy weekend to spare, I
dare you to have a look at it. It's remarkably easy to learn plus you
get the real philosophical challenge afterwards. What's the right
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
possible ambiguity, while retaining that ambiguity at the same time.
mi tawa!
___References________________________________________________________
[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/</content>
</entry>
<entry>
<title>2018-03-15 - The lack of layout (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-15-The-lack-of-layout.md"/>
<id>urn:uuid:ac8277d4-aa91-11ec-9ca1-560001fa5fa4</id>
<updated>2018-03-15T00:00:00+01:00</updated>
<content> 2018-03-15
___T_h_e__l_a_c_k__o_f__l_a_y_o_u_t__________________________________
After yesterdays post[0] I have received feedback[1] on mastodon
pointing to some effort to develop a new kind of hypertext / image /
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,
what the advantages over using any other markup langugage are. After
all one can serve HTML documents over gopher just fine. Or one can
resort to reST or markdown or anything else. The latter two also
allow one to add pictures to text and with meta info one could also
hint at the desired fonts a client should use, while degrading
gracefully and being still readable in their text-only form.
So if you come up with another markup, maybe checking whether it is
still readable without a fancy renderer is a good litmus test whether
you are adding value or just ballooning old features into a new
shape.
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.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-15 - Post tooling improved (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-15-Post-tooling-improved.md"/>
<id>urn:uuid:ac89965e-aa91-11ec-9baa-560001fa5fa4</id>
<updated>2018-03-15T00:00:00+01:00</updated>
<content> 2018-03-15
___P_o_s_t__t_o_o_l_i_n_g__i_m_p_r_o_v_e_d___________________________
I have now rewritten my scripts to generate an index and an archive.
The key is a listpost script that outputs gophermap entries for each
post. This list is taken as is for the archive and trimmed to the
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
still work.
I hope I did not upset your aggregators and all works as desired.
Thanks for reading and all the best!</content>
</entry>
<entry>
<title>2018-03-14 - What about a simple degrading web (~4 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-14-What-about-a-simple-degrading-web.md"/>
<id>urn:uuid:ac90260e-aa91-11ec-b876-560001fa5fa4</id>
<updated>2018-03-14T00:00:00+01:00</updated>
<content> 2018-03-14
___W_h_a_t__a_b_o_u_t__a__s_i_m_p_l_e__d_e_g_r_a_d_i_n_g__w_e_b______
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.
It is hard to understand due to the conflation of several distinct
things. First of all there's 'the web'. A conglomerate of separate
servers that serve documents and provide backchannels.
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
have been written, running partly on the server but more and more on
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
program.
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
site has usually little to no influence on the type of ad shown on
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
send data to arbitrary sources might pose a risk to some users and
will harm their anonymity.
So I do think, that there are legitimate reasons to switch off
javascript by default. And there are websites that still function
properly without javascript. Amazon still works without JS, ebay has
been working without JS but stopped to lately. And I guess a lot of
sites will just assume javascript to be available.
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
device I want to select CSS as I please as well, yes. A lot of CSS is
hard to read, hard to read in a dark setting, I prefer using my own
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
serve meaningful documents and not serving software. And it is not
just because of a couple of misbehaving website, it is because of the
majority of players don't serve my interests and don't respect my
privacy.
So I guess I'll go and fetch my books now...
___References________________________________________________________
[0]:
https://playvicious.social/@Are0h/99678576709515025</content>
</entry>
<entry>
<title>2018-03-13 - The funny + gopher menu item (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-13-The-funny-+-gopher-menu-item.md"/>
<id>urn:uuid:ac9ecba0-aa91-11ec-9edb-560001fa5fa4</id>
<updated>2018-03-13T00:00:00+01:00</updated>
<content> 2018-03-13
___T_h_e__f_u_n_n_y__+__g_o_p_h_e_r__m_e_n_u__i_t_e_m________________
This is a short note about the '+' mirror menu item in rfc1436. I was
stunned to learn that there's no modern client implementing this.
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...</content>
</entry>
<entry>
<title>2018-03-12 - Sam questions (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-12-Sam-questions.md"/>
<id>urn:uuid:acadf51c-aa91-11ec-9349-560001fa5fa4</id>
<updated>2018-03-12T00:00:00+01:00</updated>
<content> 2018-03-12
___S_a_m__q_u_e_s_t_i_o_n_s__________________________________________
After reading the sam tutorial again to improve my sam foo, I opened
up deadpixie's sam[0] clone's issue page on github.
I got stunned by a request[1] for the beginning of line address
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?
I could not find a trace about this in the deadpixie source so I have
cloned the plan9port repo[4] to be sure. Nothing. Then I checked the
9front[5] sources, also nil.
I am scratching my head now. Where did this command come from? I am
still searching for it. The reporting user has gone silent, so I'll
know tomorrow maybe.
If you have got any hints please let me know!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-11 - On smalltalk (~4 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-11-On-smalltalk.md"/>
<id>urn:uuid:acbbdbdc-aa91-11ec-9ad5-560001fa5fa4</id>
<updated>2018-03-11T00:00:00+01:00</updated>
<content> 2018-03-11
___O_n__s_m_a_l_l_t_a_l_k____________________________________________
I always have felt being left out of the OO programming community.
All these pattern talks and the Java/C++ code I have to deal with at
work made me question this programming paradigm. But I wanted to dig
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
syntax, that it fits on a postcard[1] (text preview here[10]). The
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
while it is running!
Besides the simple language code smalltalk consists of two additional
parts: An extensive class library providing most of the functionality
that others would count to a language itself: compiler, interpreter,
debugger...
And the other part is the *graphical* UI environment. All of these
run inside a VM image, which means that you can change something save
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
which hosts several different smalltalk systems:
opensmalltalk-vm[2]. On this VM there runs pharo[3], which
is the most complete and streamlined systems out there, squeak[4] which
is the 'original' smalltalk system comming from Xerox PARC
newspeak which is a totally new langugage with an emphasis on
security and mobile computing and my favourite: Cuis[5].
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
has just ~500 classes, whereas pharo clocks in with 1500+...
If you don't care about graphical environments then there's also
GNU smalltalk[6] and 'a little smalltalk'[7] both are independent
implementations that come with their own VM and instruction set.
Most of the smalltalk books are legally available for download. I
recommend the 'blue book'[8] written by Adele Goldberg, one of the
first smalltalk instructors and programmers. She has also managed the
release of the first smalltalk and designed a lot of the system
parts. The pharo book site[9] contains lots of nice stuff to read.
I may tell you about my work with smalltalk in another post :)
What I like about it so far: The codebrowser, live debugging and
browsability. The codebrowser is the essential development tool on
smalltalk. It allows editing and browsing of the classes and methods
in a system. It allows quickly searching and finding
senders/receivers of a message and is therefore the main tool to
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
inspect all aspects of the system life. Want to know what a
particular button does? Just click on it in a special way and open up
that class's browser window.
As you can see this changes the way in one edits code. Also pharo and
squeak contain one of the first refactoring browsers written. Want to
change some aspect of a method? Just tell the editor and it will take
care that the whole system is consistent.
I will leave you with this incomplete view for now and encourage you
to do your own exploring.
Happy hacking!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-10 - A few weeks with a simple language (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-10-A-few-weeks-with-a-simple-language.md"/>
<id>urn:uuid:acce7b02-aa91-11ec-bee4-560001fa5fa4</id>
<updated>2018-03-10T00:00:00+01:00</updated>
<content> 2018-03-10
___A__f_e_w__w_e_e_k_s__w_i_t_h__a__s_i_m_p_l_e__l_a_n_g_u_a_g_e_____
I don't know exaclty how I got introduced to toki pona[0] -- the 'simple
language'. I think I can blame Alex Schroeder for it on mastodon. It
has been some time in February and since my work days have been a bit
slow I decided to have a look. The idea was intriguing: Learning a
small -- well tiny -- language[1] with ~120 words[2] and very little
grammar, no tenses.
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
has a bit of a mayan style to it and it really looks beautiful.
mi tawa!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-09 - Editing gopher posts with sam (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-09-Editing-gopher-posts-with-sam.md"/>
<id>urn:uuid:acd4b51c-aa91-11ec-b3d7-560001fa5fa4</id>
<updated>2018-03-09T00:00:00+01:00</updated>
<content> 2018-03-09
___E_d_i_t_i_n_g__g_o_p_h_e_r__p_o_s_t_s__w_i_t_h__s_a_m_____________
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
steroids as it features a powerful command language while providing a
graphical interface and it is really really fast with a lot of open
files.
Until today I have totally neglected another neat feature of sam:
remote editing. This works like this: sam is split between an editor
part (sam) and a terminal frontend (samterm). Both communicate via a
simple unix domain socket. This socket can be created by a small
wrapper program forwarding everything through ssh(1) to a sam
instance 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
I/O is convenient for laggy connections too. I have to have a deeper
look into the source code to understand the wire protocol!
Note that there are incompatibilities within sam versions around, so
if 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'.
In deadpixie's fork CTRL-K switches focus from the command window to
the text window so that saves you reaching for the mouse for simple
commands.
For advanced editing (I am still getting comfortable with it myself)
see the sam cheatsheet[1].
The entries get formatted with selecting the text body and issuing
the command '|fmt -w 69' in the command window. That pipes the
selection to the external command and replaces the connection with
the output of said command.
There is so much more to be said about sam. But there are better
descriptions around: The paper[2] and a tutorial[3].
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-08 - A mixed bag of random improvements (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-08-A-mixed-bag-of-random-improvements.md"/>
<id>urn:uuid:ad178ac2-aa91-11ec-8b54-560001fa5fa4</id>
<updated>2018-03-08T00:00:00+01:00</updated>
<content> 2018-03-08
___A__m_i_x_e_d__b_a_g__o_f__r_a_n_d_o_m__i_m_p_r_o_v_e_m_e_n_t_s____
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
image[0] which can be found in my new media gallery section[1].
I like the idea to roughly check stuff before downloading it so I
added a little ASCII preview. The preview has been done with the
excellent jp2a[2] tool which I strongly recommend for this type of
thing.
On another note I have been playing with tmux[3] and its panes and
pane layout. I have found tmuxinator[4] that's supposed to automate
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
issuing tmux commands just like tmuxinator does.
Also on the holymoly gopher client side, I have fixed[5] a silly bug
with selectors that contain tildes such as this one[6].
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
difficulties to use deadpixie's fork[8] with the remote frontend. I
will have to investigate this further.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-07 - A little progress on holymoly (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-07-A-little-progress-on-holymoly.md"/>
<id>urn:uuid:ad1e4326-aa91-11ec-b928-560001fa5fa4</id>
<updated>2018-03-07T00:00:00+01:00</updated>
<content> 2018-03-07
___A__l_i_t_t_l_e__p_r_o_g_r_e_s_s__o_n__h_o_l_y_m_o_l_y_____________
I have managed to work a little on the holymoly[0] gopher client
today. The tiny patches include a little formatting change by
indenting all output by three spaces and marking selectors with
' > '.
Also the gopher uri is now shown on the status line when it is
highlighted.
The client is still lacking a cached history which would allow faster
hierarchy traversals and it needs some kind of link bulk selection
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.
Plus I'd like to add downloading stuff, the current download handler
is crap and needs to go.
So many things to do and so little time :-)
___References________________________________________________________
[0]:
gopher://vernunftzentrum.de:70/1/ckeen/repos/holymoly
[1]:
https://tools.suckless.org/dmenu/
[2]:
https://github.com/solderpunk/VF-1</content>
</entry>
<entry>
<title>2018-03-06 - On the gopher community (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-06-On-the-gopher-community.md"/>
<id>urn:uuid:ad246b2a-aa91-11ec-aac9-560001fa5fa4</id>
<updated>2018-03-06T00:00:00+01:00</updated>
<content> 2018-03-06
___O_n__t_h_e__g_o_p_h_e_r__c_o_m_m_u_n_i_t_y________________________
_!____!____!____!____!____!____!____!____!____!____!____!____!____!__
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
post[0] about 'What makes gopher special' for me. My thanks go to
kvothe[2] and jynx[3] for their thoughtful additions. We seem to
have an overlap in our observations which is reassuring for me. I
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
in subculture evolution'[4]. That's quite a mouthful but apart
from the sociopath twist in that story it shows that communities
have a life cycle. They start out small and when they grow, their
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
gopher will stay as it is for a long time. This is mostly due to 2
reasons.
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
I seem to, but that's just me)
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
seems a lofty goal everyone touts about but rarely implements at
work.
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
given.
This all does not seem too thoughtful to me now as I read it again,
but I will leave this with you anyway.
Cheers!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-05 - What makes gopher special for me (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-05-What-makes-gopher-special-for-me.md"/>
<id>urn:uuid:ad2b0dea-aa91-11ec-91db-560001fa5fa4</id>
<updated>2018-03-05T00:00:00+01:00</updated>
<content> 2018-03-05
___W_h_a_t__m_a_k_e_s__g_o_p_h_e_r__s_p_e_c_i_a_l__f_o_r__m_e________
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
got me thinking and these are my reasons why I think gopher is
interesting:
It is simple: There are no fancy frameworks to learn, the programs
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
it yourself attitude. Almost noone is a consumer of some 'publishing'
platform, everyone is making it up as they go. And for the people
that keep on using it you can see a lot of unique and different
styles in creating and presenting content.
So not only in terms of protocols, complexity and software but also
in 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
web how it could have been for people.
So, I ask you, dear reader: What does gopher mean to you?
___References________________________________________________________
[0]:
https://social.nasqueron.org/@deadsuperhero/99630052661982090</content>
</entry>
<entry>
<title>2018-03-05 - Posting tools revisited (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-05-Posting-tools-revisited.md"/>
<id>urn:uuid:ad4d63ea-aa91-11ec-9587-560001fa5fa4</id>
<updated>2018-03-05T00:00:00+01:00</updated>
<content> 2018-03-05
___P_o_s_t_i_n_g__t_o_o_l_s__r_e_v_i_s_i_t_e_d_______________________
In an earlier[0] post I mentioned that I am doing the posting
manually. However now, that I seem to settle on one post format, I
have been using two little helper scripts ([1] and [2]) to create
my posting templates and updating the index. Nothing special but
it lowers the bar to write something for the phlog even more. Also
I have learned something about the printf(1) command which I haven't
used that much in the past.
The scripts are probably buggy and really just tailored to my needs,
so be careful and take them as inspiration only.
If you need something more powerful, you are probably better off
using tomasino's burrow[3].
I am not quite there yet, one simple thing at a time.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-04 - Hosting code (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-04-hosting-code.md"/>
<id>urn:uuid:ad83d2a4-aa91-11ec-bbdb-560001fa5fa4</id>
<updated>2018-03-04T00:00:00+01:00</updated>
<content> 2018-03-04
___H_o_s_t_i_n_g__c_o_d_e____________________________________________
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
repo is worth cloning.
Stagit uses a post-receive hook on the repositories to update the
gopher pages, so these are static, which is a feature I like but
it won't be good for inspecting the history of the linux kernel
repository. On the other hand if you do want to do this get a
pristine checkout yourself.
It turned out that my inital directory layout was a bit too cumbersome
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
work now, so if it still does not work for you, then it's time to
drop me a note!
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
will resume hacking on the gopher client again.
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-03 - On gopher clients (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-03-on-gopher-clients.md"/>
<id>urn:uuid:adb1fbf2-aa91-11ec-8bf2-560001fa5fa4</id>
<updated>2018-03-03T00:00:00+01:00</updated>
<content> 2018-03-03
___O_n__g_o_p_h_e_r__c_l_i_e_n_t_s___________________________________
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].
It is written in python and made for easy browsing using the keyboard
in 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.
It lacked a lot of features like downloading files, bookmarks and
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
implement some missing feature on a daily basis. This way I should
get a nicer client by the end of the week.
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
display by deleting some debugging output.
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!
___References________________________________________________________
[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</content>
</entry>
<entry>
<title>2018-03-02 - Installing a pastebin for gopher (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-02-pastebin.md"/>
<id>urn:uuid:adb82036-aa91-11ec-85b1-560001fa5fa4</id>
<updated>2018-03-02T00:00:00+01:00</updated>
<content> 2018-03-02
___I_n_s_t_a_l_l_i_n_g__a__p_a_s_t_e_b_i_n__f_o_r__g_o_p_h_e_r_______
As of today this server features a pastebin service located [here][0].
It runs off a modified [fiche][1] implementation. I shall provide
my patches after I have cleaned them up a bit.
UPDATE: My patches for fiche are available in [its own repo][2] now.
Pastes are kept for 24 hours and the service is non tor only.
I would like to see it available for tor also. I know that there
are plenty of pastebins out there, also for gopher but why not set
up another one
What do you think?
___References________________________________________________________
[0]:
gopher://vernunftzentrum.de:70/1/paste.gph
[1]:
https://github.com/solusipse/fiche.git
[2]:
gopher://vernunftzentrum.de/1/ckeen/repos/fiche</content>
</entry>
<entry>
<title>2018-03-01 - Running a secure gopher server (~3 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-03-01-secure-gopher.md"/>
<id>urn:uuid:adddbfe4-aa91-11ec-b6de-560001fa5fa4</id>
<updated>2018-03-01T00:00:00+01:00</updated>
<content> 2018-03-01
___R_u_n_n_i_n_g__a__s_e_c_u_r_e__g_o_p_h_e_r__s_e_r_v_e_r___________
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.
In essence this proposal wants to preserve backwards compatibility
where clients will speculatively throw a TLS handshake at a gopher
service. If that succeeds certificates get exchanged, encryption will
get negotiated etc.
A legacy server (one that does not provide TLS) will see the TLS
handshake and will respond with an error message. The client will
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
detects protocol handshakes by regexps and forwards them to the
appropriate port. The original intent for this tool is to allow ssh
and tls served on the same port. What a nice hack!
In the gopher scenario this could be used to divert the connection to
another port where stunnel will happily establish a TLS connection
and forward the payloads to the gopher server. If there is no TLS
handshake the connection would go directly to the gopher server.
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.
In the proposal for initial connections a new 'gophers://' URI is
proposed to distinguish the user's intent. However after the first
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
goal.
Further discussions on the list center around used port schemes and
whether a separate port would be enough to expect encrypted
connections. This argument does not take into account that a lot of
servers are already running on some non standard port and that the
protocol itself is indifferent about that.
As for the downgrade attacks one could imagine a scheme were
fingerprints for servers are stored in DNS records for a server
similar to [RFC4255][3], which specifies this for ssh key
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.
I am not sure how this will turn out. I get the feeling though that
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
provide encrypted and authenticated end-to-end connections plus give
some anonymity properties.
But it is nice to see efforts in improving gopher!
___References_______________________________________________________
[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!</content>
</entry>
<entry>
<title>2018-02-28 - How I post on gopher (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-02-28-blogging-manually.md"/>
<id>urn:uuid:adfc3ad2-aa91-11ec-ace5-560001fa5fa4</id>
<updated>2018-02-28T00:00:00+01:00</updated>
<content> 2018-02-28
___H_o_w__I__p_o_s_t__o_n__g_o_p_h_e_r_______________________________
I thought I would need some type of automation when posting on
gopher. So far it turns out that opening an editor and just type
the post, add the link to the index page is just too simple to beat.
I actually check in the files into git to have it transferable
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
really just adding noise. Noise in producing content, noise in
transferring content and noise in consuming content. With gopher
people still create formatting that's pleasing within the limit of
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.
It feels like the 80ies all over again.
But I like it that way.</content>
</entry>
<entry>
<title>2018-02-27 - Browse this server anonymously (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-02-27-onion-gopher.md"/>
<id>urn:uuid:ae0d6852-aa91-11ec-90c4-560001fa5fa4</id>
<updated>2018-02-27T00:00:00+01:00</updated>
<content> 2018-02-27
___B_r_o_w_s_e__t_h_i_s__s_e_r_v_e_r__a_n_o_n_y_m_o_u_s_l_y__________
I have added a [hidden service][0] to this gopher server. You can
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
does not allow connections to port 70.
Please do leave feedback through the advertised channels.
Enjoy!
___Referrences_______________________________________________________
[0]:
gopher://j73ayflmpldqrpuo.onion</content>
</entry>
<entry>
<title>2018-02-27 - Adding a phlogroll to this gopher (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-02-27-moku-pona.md"/>
<id>urn:uuid:ae13d566-aa91-11ec-a73c-560001fa5fa4</id>
<updated>2018-02-27T00:00:00+01:00</updated>
<content> 2018-02-27
___A_d_d_i_n_g__a__p_h_l_o_g_r_o_l_l__t_o__t_h_i_s__g_o_p_h_e_r______
I always want to read more on gopher and while a huge amount of it
is 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
script called 'moku pona', which is a gopher aggregator written in
perl.
All I had to do, was to install the Modern::Perl URI and Net::Server
modules from packages.
I added a little script to convert the output to geomyidae's gopher
index files:
'''
#!/bin/ksh
$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
'''
It is not the nicest thing on earth but it works and gets the job
done. I update this once a day. If you are missing on the list,
please contact me at the [usual places][3], I will read everything I can.
Thanks!
___References________________________________________________________
[0]:
gopher://gopher.club
[1]:
gopher://sdf.org
[2]:
gopher://alexschroeder.ch
[3]:
gopher://vernunftzentrum.de/1/ckeen/index.gph</content>
</entry>
<entry>
<title>2018-02-27 - Editing ACME style again (~1 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-02-27-ma.md"/>
<id>urn:uuid:ae55c0b6-aa91-11ec-b6c4-560001fa5fa4</id>
<updated>2018-02-27T00:00:00+01:00</updated>
<content> 2018-02-27
___E_d_i_t_i_n_g__A_C_M_E_-_s_t_y_l_e__a_g_a_i_n_____________________
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
straigt at work and I loved it. I somehow came back using emacs and
it stayed that way. But using the keyboard to navigate through
source code or to cut and paste pieces of text has always annoyed
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]
simplicity, but could not get used to using its editing langugage
so far.
So the time has come for ma, let's see how this will work out.
Mi tawa.
___References________________________________________________________
[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/</content>
</entry>
<entry>
<title>2018-02-26 - Making your own keyboard (~8 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-02-26-Making-your-own-keyboard.md"/>
<id>urn:uuid:ae7b8f6c-aa91-11ec-8779-560001fa5fa4</id>
<updated>2018-02-26T00:00:00+01:00</updated>
<content> 2018-02-26
___M_a_k_i_n_g__y_o_u_r__o_w_n__k_e_y_b_o_a_r_d______________________
I got my first mechanical keyboard 1 and a half years ago. I got me
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
customisations.
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
source designs available to choose from.
___What's_in_a_keyboard?_____________________________________________
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
which is an advanced topic if you want to build a board yourself.
Another parameter for switches are the forces need to activate the
switch and whether there is a tactile or audible actuation point. To
distinguish them the switches are referred to by color.
- Linears: Red, Black - Tactile: Brown, Clears - Clicky: Blues
So far I have tried blues, reds, clears and browns. Blacks are on a
prototype. Also note that Cherry clones may have different color
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
shop or get a keyswitch tester, which is a 4x4 numpad like case that
includes 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
parts.
- 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
prevent ghosting effects. The microcontroller used on mosed boards
is a cheap and easily available Atmega32U4, which contains a USB
controller that will do the communication for us. If you want a
wireless board there are bluetooth enabled Atmega boards that can do
the comms for you.
If you don't want to wire the keyboard matrix yourself you can get a
PCB. There are quite a few open source designs for PCBs out there
that require you to solder on the switches, diodes and a cheap
controller (Atmega32U4 in one of its dev board variants). Or you buy
presoldered PCBs as a kit.
I did hand-wire most of my built boards, it turns out that it is easy
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
stabilizer so it might be a sturdier build.
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
still one of my favourite daily drivers.
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.
I have seen a clone with usb mini connectors as well! Or you can get
the Teensy which is of better quality but also twice the price of an
arduino clone.
___How_does_a_keyboard_actually_work?________________________________
Electronically a keyboard is a simple circuit consisting of a lot of
switches and a microcontroller. The microcontroller checks which of
the switches are pressed and generates a scancode for the operating
system. This scancode is then translated to a key event depending on
the selected layout of the OS.
Now since a microcontroller does not have one input pin for each
individual 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
has been pressed.
Now as electricity is a funny thing the effect of ghosting may be a
problem when certain combinations of keys are pressed in the matrix.
For a better explanation see here[]. To prevent this diodes are
soldered in either rowwise or columnwise. The firmware on the
controller needs to know this to scan the pins in the right
direction.
That's all there is to it! The rest of the magic happens in a big
state machine on the microcontroller.
___Tooling___________________________________________________________
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
controller.
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.
___Lessons___________________________________________________________
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
it 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
humbling experience. Also expect to fix broken stuff, even act as if
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
see whether I can fix it".
If you get annoyed at some failure, back off, do something different,
have a break. Then think about your options.
I guess this is all a good general approach to things but during this
activity with physical things (which I don't do often enough) this
all became clearer to me.
___Farewell__________________________________________________________
So I hope now you have some starting point to get your own first
build done. Let me know how it went!</content>
</entry>
<entry>
<title>2018-02-26 - How I prepare my coffee (~2 min. read)</title>
<link href="
gopher://vernunftzentrum.de/1//ckeen/phlog/2018-02-26-How-I-prepare-my-coffee.md"/>
<id>urn:uuid:ae8753e2-aa91-11ec-911c-560001fa5fa4</id>
<updated>2018-02-26T00:00:00+01:00</updated>
<content> 2018-02-26
___H_o_w__I__p_r_e_p_a_r_e__m_y__c_o_f_f_e_e_________________________
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
reader -- at all. So YMMV!
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
grinder. There are several out there for varying price ranges. All
I can tell is get one you can hold well and preferably one made
with a metal casing. I had troubles with plastic ones and hat to
return two of them after 5 months.
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
will not get you as good as results.
The brewing method varies for me depending on the beans and the
available dishes and time.
I use ~14g coffee for a 300ml cup, let the water sit a little after
boiling and proceed in pouring the water slowly over the ground
beans.
I prefer the french press when there are visitors, because you can
easily get 3-4 cups out of ours.
There is a whole nerdy subculture that's obsessed with the right
grinder settings, coffee:water settings and so on. It is easy to
get lost there, so stick to basics first.
As an introduction I visited a local coffee roaster and there someone
showed me how fine the coffee grounds need to be in general. This
has helped me a lot in getting the right coarseness.
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?
___References________________________________________________________
[0]:
gopher://alexschroeder.ch/02018-02-16_Coffee</content>
</entry>
</feed>