C-Keen ali li pona urn:uuid:a7d07c54-aa91-11ec-986d-560001fa5fa4 2022-03-23T11:11:50+01:00 2022-03-23 - literature clock (~1 min. read) urn:uuid:a8400cb8-aa91-11ec-bbcb-560001fa5fa4 2022-03-23T00:00:00+01:00 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 2020-11-09 - Living on the floor (~1 min. read) urn:uuid:a85a1630-aa91-11ec-aa08-560001fa5fa4 2020-11-09T00:00:00+01:00 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 2019-12-18 - More smalltalk more gopher (~2 min. read) urn:uuid:a86726d6-aa91-11ec-977f-560001fa5fa4 2019-12-18T00:00:00+01:00 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 2019-05-05 - On building an audio player (~4 min. read) urn:uuid:a8739c9a-aa91-11ec-981f-560001fa5fa4 2019-05-05T00:00:00+01:00 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_________________________________________________________ 2019-02-04 - Programming arduinos without an IDE (~2 min. read) urn:uuid:a88c9056-aa91-11ec-8409-560001fa5fa4 2019-02-04T00:00:00+01:00 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________________________________________________________ 2018-12-21 - the most embarrassing admin mistake (~3 min. read) urn:uuid:a893ef2c-aa91-11ec-8958-560001fa5fa4 2018-12-21T00:00:00+01:00 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 2018-12-11 - Miscellaneous update (~3 min. read) urn:uuid:a8b6b7fa-aa91-11ec-a3cc-560001fa5fa4 2018-12-11T00:00:00+01:00 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 2018-10-22 - Print if you need an envelope (~1 min. read) urn:uuid:a8bcd702-aa91-11ec-81a6-560001fa5fa4 2018-10-22T00:00:00+01:00 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 2018-10-19 - Improvements to smalltalk gopher (~1 min. read) urn:uuid:a8c29cd2-aa91-11ec-b7d1-560001fa5fa4 2018-10-19T00:00:00+01:00 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 2018-09-21 - Georg Nees' Schotter for CHICKEN (~1 min. read) urn:uuid:a8ff0b72-aa91-11ec-add3-560001fa5fa4 2018-09-21T00:00:00+01:00 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 2018-09-21 - Another Smalltalk journey (~2 min. read) urn:uuid:a904fa0a-aa91-11ec-86b3-560001fa5fa4 2018-09-21T00:00:00+01:00 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 2018-08-23 - Hosting my own social media instance (~1 min. read) urn:uuid:a91d6cb6-aa91-11ec-8868-560001fa5fa4 2018-08-23T00:00:00+01:00 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. 2018-07-11 - A call for input (~2 min. read) urn:uuid:a97ba916-aa91-11ec-9bbe-560001fa5fa4 2018-07-11T00:00:00+01:00 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 2018-07-10 - How to fold a zine (~2 min. read) urn:uuid:a992542c-aa91-11ec-8ad1-560001fa5fa4 2018-07-10T00:00:00+01:00 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 2018-06-14 - Freeing a Lenovo X200 (~2 min. read) urn:uuid:a9b85456-aa91-11ec-8723-560001fa5fa4 2018-06-14T00:00:00+01:00 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 2018-06-13 - The Timeless Way of Building (~5 min. read) urn:uuid:a9c36576-aa91-11ec-861b-560001fa5fa4 2018-06-13T00:00:00+01:00 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 2018-05-14 - Opening up for residents (~1 min. read) urn:uuid:a9d59d9a-aa91-11ec-919f-560001fa5fa4 2018-05-14T00:00:00+01:00 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! 2018-05-14 - Handwriting (~2 min. read) urn:uuid:a9dbcf26-aa91-11ec-98d5-560001fa5fa4 2018-05-14T00:00:00+01:00 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/ 2018-04-27 - Holymoly fixes (~1 min. read) urn:uuid:aa2f9a84-aa91-11ec-b13b-560001fa5fa4 2018-04-27T00:00:00+01:00 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 2018-04-17 - Setting music sheets (~2 min. read) urn:uuid:aa3729f2-aa91-11ec-8371-560001fa5fa4 2018-04-17T00:00:00+01:00 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 2018-04-13 - Re:1436con (~1 min. read) urn:uuid:aa4056e4-aa91-11ec-a837-560001fa5fa4 2018-04-13T00:00:00+01:00 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 2018-04-09 - Dealing with rogue crawlers (~3 min. read) urn:uuid:aa462934-aa91-11ec-9f35-560001fa5fa4 2018-04-09T00:00:00+01:00 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! _____________________________________________________________________ 2018-04-06 - Irc client improvements (~1 min. read) urn:uuid:aa543254-aa91-11ec-95a8-560001fa5fa4 2018-04-06T00:00:00+01:00 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 2018-04-05 - Plan 9 nuggets The rc shell (~2 min. read) urn:uuid:aa5e4c80-aa91-11ec-b807-560001fa5fa4 2018-04-05T00:00:00+01:00 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 2018-04-05 - Ed Mastery: A review (~3 min. read) urn:uuid:aa7f2b26-aa91-11ec-b32a-560001fa5fa4 2018-04-05T00:00:00+01:00 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 2018-04-04 - Less logging (~1 min. read) urn:uuid:aa88ea76-aa91-11ec-b431-560001fa5fa4 2018-04-04T00:00:00+01:00 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 2018-04-03 - VCalendar handling in mutt (~1 min. read) urn:uuid:aa8fbb80-aa91-11ec-80d6-560001fa5fa4 2018-04-03T00:00:00+01:00 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? 2018-03-30 - IRC minimalism (~1 min. read) urn:uuid:ab000df4-aa91-11ec-80a2-560001fa5fa4 2018-03-30T00:00:00+01:00 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 2018-03-29 - Posting guidelines (~1 min. read) urn:uuid:ab3063b4-aa91-11ec-8afc-560001fa5fa4 2018-03-29T00:00:00+01:00 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 2018-03-28 - Minimalistic irc (~1 min. read) urn:uuid:ab7a073a-aa91-11ec-8fff-560001fa5fa4 2018-03-28T00:00:00+01:00 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/ 2018-03-27 - Gophermaps and item types (~2 min. read) urn:uuid:ab8c016a-aa91-11ec-adff-560001fa5fa4 2018-03-27T00:00:00+01:00 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 2018-03-25 - Gopher crawlers and robots.txt (~2 min. read) urn:uuid:ab96faa2-aa91-11ec-b7a1-560001fa5fa4 2018-03-25T00:00:00+01:00 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 2018-03-24 - Toki pona spell checking (~1 min. read) urn:uuid:aba825ac-aa91-11ec-9256-560001fa5fa4 2018-03-24T00:00:00+01:00 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 2018-03-23 - Converging to a Plan9 ui (~1 min. read) urn:uuid:abaf866c-aa91-11ec-a897-560001fa5fa4 2018-03-23T00:00:00+01:00 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 2018-03-22 - Phlog feedback (~1 min. read) urn:uuid:abb6088e-aa91-11ec-8660-560001fa5fa4 2018-03-22T00:00:00+01:00 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! 2018-03-22 - Now on gopher campaign (~1 min. read) urn:uuid:abbbecb8-aa91-11ec-af74-560001fa5fa4 2018-03-22T00:00:00+01:00 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 2018-03-21 - I've lived in emacs,now I am leaving (~1 min. read) urn:uuid:abf3f6d0-aa91-11ec-89d6-560001fa5fa4 2018-03-21T00:00:00+01:00 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! 2018-03-20 - On sharing in the maker community (~2 min. read) urn:uuid:abf9e630-aa91-11ec-8402-560001fa5fa4 2018-03-20T00:00:00+01:00 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 2018-03-19 - My phlogging routine (~1 min. read) urn:uuid:ac06c17a-aa91-11ec-aed1-560001fa5fa4 2018-03-19T00:00:00+01:00 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! 2018-03-19 - Build a new wordclock (~1 min. read) urn:uuid:ac12cbb4-aa91-11ec-b925-560001fa5fa4 2018-03-19T00:00:00+01:00 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 2018-03-19 - Atom feed for this phlog (~1 min. read) urn:uuid:ac26b1d8-aa91-11ec-9e65-560001fa5fa4 2018-03-19T00:00:00+01:00 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 2018-03-17 - Continuity (~1 min. read) urn:uuid:ac75c868-aa91-11ec-8d39-560001fa5fa4 2018-03-17T00:00:00+01:00 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! 2018-03-16 - Sitelen pona toki pona glyphs (~2 min. read) urn:uuid:ac7be176-aa91-11ec-8041-560001fa5fa4 2018-03-16T00:00:00+01:00 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/ 2018-03-15 - The lack of layout (~2 min. read) urn:uuid:ac8277d4-aa91-11ec-9ca1-560001fa5fa4 2018-03-15T00:00:00+01:00 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 2018-03-15 - Post tooling improved (~1 min. read) urn:uuid:ac89965e-aa91-11ec-9baa-560001fa5fa4 2018-03-15T00:00:00+01:00 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! 2018-03-14 - What about a simple degrading web (~4 min. read) urn:uuid:ac90260e-aa91-11ec-b876-560001fa5fa4 2018-03-14T00:00:00+01:00 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 2018-03-13 - The funny + gopher menu item (~1 min. read) urn:uuid:ac9ecba0-aa91-11ec-9edb-560001fa5fa4 2018-03-13T00:00:00+01:00 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... 2018-03-12 - Sam questions (~1 min. read) urn:uuid:acadf51c-aa91-11ec-9349-560001fa5fa4 2018-03-12T00:00:00+01:00 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 2018-03-11 - On smalltalk (~4 min. read) urn:uuid:acbbdbdc-aa91-11ec-9ad5-560001fa5fa4 2018-03-11T00:00:00+01:00 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 2018-03-10 - A few weeks with a simple language (~2 min. read) urn:uuid:acce7b02-aa91-11ec-bee4-560001fa5fa4 2018-03-10T00:00:00+01:00 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 2018-03-09 - Editing gopher posts with sam (~2 min. read) urn:uuid:acd4b51c-aa91-11ec-b3d7-560001fa5fa4 2018-03-09T00:00:00+01:00 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 2018-03-08 - A mixed bag of random improvements (~2 min. read) urn:uuid:ad178ac2-aa91-11ec-8b54-560001fa5fa4 2018-03-08T00:00:00+01:00 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 2018-03-07 - A little progress on holymoly (~1 min. read) urn:uuid:ad1e4326-aa91-11ec-b928-560001fa5fa4 2018-03-07T00:00:00+01:00 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 2018-03-06 - On the gopher community (~2 min. read) urn:uuid:ad246b2a-aa91-11ec-aac9-560001fa5fa4 2018-03-06T00:00:00+01:00 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 2018-03-05 - What makes gopher special for me (~1 min. read) urn:uuid:ad2b0dea-aa91-11ec-91db-560001fa5fa4 2018-03-05T00:00:00+01:00 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 2018-03-05 - Posting tools revisited (~1 min. read) urn:uuid:ad4d63ea-aa91-11ec-9587-560001fa5fa4 2018-03-05T00:00:00+01:00 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 2018-03-04 - Hosting code (~2 min. read) urn:uuid:ad83d2a4-aa91-11ec-bbdb-560001fa5fa4 2018-03-04T00:00:00+01:00 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 2018-03-03 - On gopher clients (~2 min. read) urn:uuid:adb1fbf2-aa91-11ec-8bf2-560001fa5fa4 2018-03-03T00:00:00+01:00 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 2018-03-02 - Installing a pastebin for gopher (~1 min. read) urn:uuid:adb82036-aa91-11ec-85b1-560001fa5fa4 2018-03-02T00:00:00+01:00 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 2018-03-01 - Running a secure gopher server (~3 min. read) urn:uuid:adddbfe4-aa91-11ec-b6de-560001fa5fa4 2018-03-01T00:00:00+01:00 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! 2018-02-28 - How I post on gopher (~1 min. read) urn:uuid:adfc3ad2-aa91-11ec-ace5-560001fa5fa4 2018-02-28T00:00:00+01:00 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. 2018-02-27 - Browse this server anonymously (~1 min. read) urn:uuid:ae0d6852-aa91-11ec-90c4-560001fa5fa4 2018-02-27T00:00:00+01:00 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 2018-02-27 - Adding a phlogroll to this gopher (~1 min. read) urn:uuid:ae13d566-aa91-11ec-a73c-560001fa5fa4 2018-02-27T00:00:00+01:00 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 2018-02-27 - Editing ACME style again (~1 min. read) urn:uuid:ae55c0b6-aa91-11ec-b6c4-560001fa5fa4 2018-02-27T00:00:00+01:00 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/ 2018-02-26 - Making your own keyboard (~8 min. read) urn:uuid:ae7b8f6c-aa91-11ec-8779-560001fa5fa4 2018-02-26T00:00:00+01:00 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! 2018-02-26 - How I prepare my coffee (~2 min. read) urn:uuid:ae8753e2-aa91-11ec-911c-560001fa5fa4 2018-02-26T00:00:00+01:00 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