summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorCase Duckworth2022-08-18 23:05:52 -0500
committerCase Duckworth2022-08-18 23:07:16 -0500
commit7f65ca3467db4bc9ae6ac4cb28f5865d6d4581e2 (patch)
tree5536b0a33d1f0bc00151d4eb4d9e78d8e9086ffa
downloadfwendplanet-7f65ca3467db4bc9ae6ac4cb28f5865d6d4581e2.tar.gz
fwendplanet-7f65ca3467db4bc9ae6ac4cb28f5865d6d4581e2.zip
Initialize
-rw-r--r--.gitignore2
-rw-r--r--Makefile25
-rwxr-xr-xfwendplanet.sh17
-rwxr-xr-xfwendplanet_html.awk70
-rw-r--r--index.html4647
-rw-r--r--style.css117
6 files changed, 4878 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0e07134 --- /dev/null +++ b/.gitignore
@@ -0,0 +1,2 @@
1feeds/
2sfeedrc
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1fa687a --- /dev/null +++ b/Makefile
@@ -0,0 +1,25 @@
1URL = https://acdw.casa/fwends
2REPO = https://tildegit.org/casa/pages/raw/branch/main/opml/mug.of.opml
3OUTD = /var/www/acdw.casa/fwends/
4RC = sfeedrc
5FEEDS = feeds
6FILES = index.html style.css
7AGGREGATOR = ./fwendplanet.sh
8MAXAGE = 60
9
10.PHONY: publish
11publish: build
12 mkdir -p $(OUTD)
13 cp $(FILES) $(OUTD)
14
15.PHONY: build
16build: $(RC)
17 sfeed_update $(RC) || true
18 $(AGGREGATOR) $(FEEDS) $(MAXAGE) >index.html
19
20$(RC):
21 curl -L $(REPO) | sfeed_opml_import > $@
22 echo sfeedpath=$(FEEDS) >> $@
23
24
25
diff --git a/fwendplanet.sh b/fwendplanet.sh new file mode 100755 index 0000000..586f934 --- /dev/null +++ b/fwendplanet.sh
@@ -0,0 +1,17 @@
1#!/bin/sh
2# make fwendplanet
3
4curd="$PWD"
5
6cd "$1" || return 1
7
8if [ -n "$2" ]; then
9 old="$(($(date +%s) - ($2 * 24 * 3600)))"
10else
11 old=0
12fi
13
14awk -v old="$old" \
15 'BEGIN{FS="\t";OFS="\t";} int($1)>=old{$2="["FILENAME"] "$2;print}' * |
16 sort -k1,1rn |
17 "$curd/fwendplanet_html.awk"
diff --git a/fwendplanet_html.awk b/fwendplanet_html.awk new file mode 100755 index 0000000..c4ebe0e --- /dev/null +++ b/fwendplanet_html.awk
@@ -0,0 +1,70 @@
1#!/bin/awk -f
2# Convert sfeed(1) formatted files into an HTML webpage for fwends
3# Usage: sfeed_html.awk -- FILES...
4BEGIN {
5 TITLE = "fwend planet"
6 FS = "\t"
7}
8
9BEGIN {
10 print "<!DOCTYPE html>"
11 print "<html>"
12 print "<head>"
13 print "<meta charset=\"utf-8\">"
14 print "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">"
15 print "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">"
16 print "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
17 print "<title>" TITLE "</title>"
18 print "<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">"
19 print "</head>"
20 print "<body>"
21 print "<h1>fwend planet</h1>"
22}
23
24{
25 # Collect fields
26 timestamp = $1
27 title = $2
28 link = $3
29 content = unescape($4)
30 content_type = $5
31 id = $6
32 author = $7
33 enclosure = $8
34 category = $9
35 print "<details>"
36 print "<summary>" title "</summary>"
37 print "<div class=\"links\">"
38 print "<a href=\"" link "\">read original</a>"
39 if (enclosure) {
40 print "<a href=\"" enclosure "\">enclosure</a>"
41 }
42 print "</div>"
43 print "<div class=\"content\">" content "</div>"
44 print "<details class=\"info\"><summary>item information</summary>"
45 print "timestamp: " timestamp
46 print "title: " title
47 print "link: " link
48 print "content_type: " content_type
49 print "id: " id
50 print "author: " author
51 print "enclosure: " enclosure
52 print "category: " category
53 print "</details>"
54 print "</details>"
55}
56
57END {
58 print "<a href=\"mailto:fwends@me.acdw.net\">email acdw</a> if you have issues."
59 print "</body>"
60 print "</html>"
61}
62
63
64function unescape(t)
65{
66 gsub(/\\t/, "\t", t)
67 gsub(/\\n/, "\n", t)
68 gsub(/\\\\/, "\\", t)
69 return t
70}
diff --git a/index.html b/index.html new file mode 100644 index 0000000..7e58612 --- /dev/null +++ b/index.html
@@ -0,0 +1,4647 @@
1<!DOCTYPE html>
2<html>
3<head>
4<meta charset="utf-8">
5<meta http-equiv="X-UA-Compatible" content="IE=edge">
6<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
7<meta name="viewport" content="width=device-width, initial-scale=1">
8<title>fwend planet</title>
9<link rel="stylesheet" type="text/css" href="style.css">
10</head>
11<body>
12<h1>fwend planet</h1>
13<details>
14<summary>[linkbudz rss feed] ed is the standard editor</summary>
15<div class="links">
16<a href="https://tube.tchncs.de/w/g1ZKSzvDaqbpWQQgxGfW3z">read original</a>
17</div>
18<div class="content"><p><a href="https://tube.tchncs.de/w/g1ZKSzvDaqbpWQQgxGfW3z">ed is the standard editor</a></p>
19 <p>[https] posted by dozens on August 18, 2022</p></div>
20<details class="info"><summary>item information</summary>
21timestamp: 1660839707
22title: [linkbudz rss feed] ed is the standard editor
23link: https://tube.tchncs.de/w/g1ZKSzvDaqbpWQQgxGfW3z
24content_type: html
25id: dozens20220818162147
26author:
27enclosure:
28category: https
29</details>
30</details>
31<details>
32<summary>[linkbudz rss feed] Rhythm Nation causes a vulnerability</summary>
33<div class="links">
34<a href="https://nvd.nist.gov/vuln/detail/CVE-2022-38392">read original</a>
35</div>
36<div class="content"><p><a href="https://nvd.nist.gov/vuln/detail/CVE-2022-38392">Rhythm Nation causes a vulnerability</a></p>
37 <p>[https] posted by lucidiot on August 18, 2022</p></div>
38<details class="info"><summary>item information</summary>
39timestamp: 1660837077
40title: [linkbudz rss feed] Rhythm Nation causes a vulnerability
41link: https://nvd.nist.gov/vuln/detail/CVE-2022-38392
42content_type: html
43id: lucidiot20220818153757
44author:
45enclosure:
46category: https
47</details>
48</details>
49<details>
50<summary>[linkbudz rss feed] fwends!</summary>
51<div class="links">
52<a href="https://acdw.casa/fwends/">read original</a>
53</div>
54<div class="content"><p><a href="https://acdw.casa/fwends/">fwends!</a></p>
55 <p>[https] posted by acdw on August 18, 2022</p></div>
56<details class="info"><summary>item information</summary>
57timestamp: 1660835383
58title: [linkbudz rss feed] fwends!
59link: https://acdw.casa/fwends/
60content_type: html
61id: acdw20220818150943
62author:
63enclosure:
64category: https
65</details>
66</details>
67<details>
68<summary>[linkbudz rss feed] Why I left PINE64</summary>
69<div class="links">
70<a href="https://blog.brixit.nl/why-i-left-pine64/">read original</a>
71</div>
72<div class="content"><p><a href="https://blog.brixit.nl/why-i-left-pine64/">Why I left PINE64</a></p>
73 <p>[https] posted by lucidiot on August 18, 2022</p></div>
74<details class="info"><summary>item information</summary>
75timestamp: 1660829064
76title: [linkbudz rss feed] Why I left PINE64
77link: https://blog.brixit.nl/why-i-left-pine64/
78content_type: html
79id: lucidiot20220818132424
80author:
81enclosure:
82category: https
83</details>
84</details>
85<details>
86<summary>[(lambda (x) (create x))] Shiny New Lang</summary>
87<div class="links">
88<a href="https://lambdacreate.com/posts/39">read original</a>
89</div>
90<div class="content"><h2>Shiny New Lang</h2>
91<h3>Oooh shiny moments with Nim &middot; August 18th, 2022</h3>
92
93<p>I recently stumbled on the language <a href="https://nim-lang.org">Nim</a>. And while normally <a href="https://lambdacreate.com/static/images/memes/dinkleberg_python.jpg">I am wont to enjoy a space delineated language</a> I am really digging Nim. It's a little statically typed, statically compiling language. You can extend the built in libraries without thrashing them, which gives you a quasi-lispy hack-ability, and it's easy enough to read. Okay, maybe a little less easy to read than say Golang, but it's good enough, some {} wouldn't kill anyone. But seriously it's a cool little language!</p>
94
95<p>Probably more exciting than that though is that it's fast, and it builds wicked small binaries. The compiler is nice and verbose and errors out early, so you don't have to guess which of the 18 errors the compiler reported come from the one actual issue (lookin at you Golang). And it can do some weird things like compile to Javascript! I don't know when I'd use that, but I feel like that's got to be a pretty useful feature right?</p>
96
97<p>I kind of just dove right into Nim after reading the <a href="https://learnxinyminutes.com/docs/nim/">Learn Nim in Y Minutes</a> guide, it was good enough to start reading code, but I found myself quickly reading through the <a href="https://nim-lang.org/docs/tut1.html">official Nim tutorial</a> guides to get a better understanding of how the language works. It's just different enough that you sort of need to grok the literature that's out there, but once you do it's a breeze to work with. I ended up immediately rewriting my little battery percentage calculator for my Droid. See I had previously written a really quick on in Golang, but the binary for it is 1.9m, and I'm nearly the point where my poor Droid is running out of space. All of these 6MB+ Golang binaries (or the 30MB+ common lisp ones) that do really stupidly simple things are really unnecessary here. Sure 1.9M isn't a big deal, but, well just look I feel like I'm really not wasting space with Nim.</p>
98
99<div class="codeSnippet">
100 <pre><code>
101batt|>> du -h *-battery
1021.9M go-battery
10388K nim-battery
104</code></pre>
105</div>
106
107<p>Shaved off more than a megabyte! And it's also ever so fractionally faster than the Golang version too.</p>
108
109<div class="codeSnippet">
110 <pre><code>
111batt|>> time ./go-battery
11279%
113real 0m 0.03s
114user 0m 0.00s
115sys 0m 0.00s
116
117batt|>> time ./nim-battery
11879.0%
119real 0m 0.00s
120user 0m 0.00s
121sys 0m 0.00s
122 </code></pre>
123</div>
124
125<p>Think of what I'll do with that fractional second back and that whole 1MB of disk space! The possibilities are limitless! Err, I guess technically they're limited to 1MB and a part of a second, but in aggregate there's amazing things here I'm sure.</p>
126
127<p>Side by side, the Nim version ends up only being 15 lines of code, and the Golang version is 28. I'd say the Golang version is easier to read without knowing Golang though, it's kind of the intent of the language after all. But I can't be more pleased with this simple example.</p>
128
129<div class="codeSnippet">
130 <pre><code>
131package main
132/* Report droid battery, semi accurately-ish.
133 Author: Will Sinatra, License: GPLv3 */
134
135import (
136 "fmt"
137 "io/ioutil"
138 "log"
139 "strconv"
140)
141
142func main() {
143 max, min := 4351000, 3100000
144 /* this sys/class file returns the string "int\
145" instead of just int */
146 nowbyte, err := ioutil.ReadFile("/sys/class/power_supply/battery/voltage_now")
147
148 /*we have to truncate the \
149 with a slice of the array */
150 nowslice := nowbyte[0:7]
151 now, _ := strconv.Atoi(string(nowslice))
152
153 if err != nil {
154 log.Fatal(err)
155 }
156
157 perc := (100 - ((max - now) * 100)/(max - min))
158
159 fmt.Println(strconv.Itoa(perc)+"%")
160}
161 </code></pre>
162</div>
163
164<div class="codeSnippet">
165 <pre><code>
166import strutils, std/math
167
168#Expand proc & to concat float & strings
169proc `&` (f: float, s:string) : string = $f & s
170
171#calculate rough battery percentage from Droid4 voltage_now file
172proc batt() : float =
173 let
174 max = 4351000
175 min = 3100000
176 now = readFile("/sys/class/power_supply/battery/voltage_now").strip().parseInt()
177 perc = (100 - ((max - now) * 100) / (max - min))
178 return round(perc)
179
180echo batt() & "%"
181 </code></pre>
182</div>
183
184<p>Obviously the Golang version does do a little bit more than the Nim one, there's better error handling, but it's really not much different. This was a simple enough starting point for me to jump into a little bit of a larger small program to get a feeling for the library ecosystem. Nim comes with a package manager called nimble, and it works as you'd expect. It's pretty close to how Golang's packaging system works, though my experience with it thus far is utterly cursory. I didn't have to reach for a lot of community libraries because just like Golang Nim has a robust built selection of libraries. All of this just means that when I went to go make a multipart form upload POST helper for my paste service I didn't need to do anything crazy.</p>
185
186<div class="codeSnippet">
187 <pre><code>
188import os, httpclient, mimetypes, strutils
189#nim c -d:ssl -d:release lcp.nim
190
191#Paste a file to https://lambdacreate.com/paste
192proc lcp() : string =
193 var
194 client = newHttpClient()
195 data = newMultipartData()
196
197 #Set lexical variables for configuration & auth
198 let
199 mimes = newMimetypes() # <- Instantiates mimetypes
200 home = getEnv("HOME") # <- Grabs /home/username
201 conf = home & "/.config/lcp.conf" # <- Concats path to config file
202 crypt = readFile(conf).strip() # <- Extract crypt key for /paste auth
203
204 #If we get more or less than 1 argument error
205 if paramCount() < 1:
206 return "A file must be specified for upload"
207
208 if paramCount() > 1:
209 return "Only one file is expected."
210
211 #-F key="crypt"
212 data["key"] = $crypt
213 #-F upload=@file
214 data.addFiles({"upload": paramStr(1)}, mimeDb = mimes)
215
216 #http POST, strip new line on return
217 client.postContent("https://lambdacreate.com/paste", multipart=data).strip()
218
219echo lcp()
220 </code></pre>
221</div>
222
223<p>32 little lines of Nim later and I've got a function paste helper, and once it's compiled it comes out to a whopping 504K, absolutely minuscule. Especially considering I'm just importing whole libraries instead of picking out the functions I actually need to import into the program. Prior attempts to do this with Fennel failed miserably, I think primarily because I couldn't get luassl to format the POST payload correctly. But Nim? No problem, in fact the <a href="https://nim-lang.org/docs/httpclient.html">the official documentation for std/httpclient</a> describes exactly how to make a multi-part POST!</p>
224
225<p>Hopefully these little examples got you curious, or even better excited, to give Nim a try. For me this fits a really nice niche where I want a batteries included, very well documented language that will be fast and absolutely minuscule. I'll probably leave my prototyping to Golang, but Nim's definitely finding a home in my tool-chain, especially considering that after only a few hours of poking and very cursory reading I'm already rewriting some of my existing tools, I think I definitely had an "Ooh shiny" moment with Nim. And I tend to get very much stuck on those.</p></div>
226<details class="info"><summary>item information</summary>
227timestamp: 1660824000
228title: [(lambda (x) (create x))] Shiny New Lang
229link: https://lambdacreate.com/posts/39
230content_type: html
231id: https://lambdacreate.com/posts/39
232author:
233enclosure:
234category:
235</details>
236</details>
237<details>
238<summary>[lipu pi jan Niko] how I made Sheepspin (the NOVA 2022 wild compo winner)</summary>
239<div class="links">
240<a href="https://tilde.town/~nihilazo/log/sheepspin.html">read original</a>
241</div>
242<div class="content">This last weekend was the NOVA 2022 demoparty, which was really fun and a great time. I was involved in 5 productions at the party (both solo and group prods). Most were shitposts but my TIC-80 intro, Sheepspin, turned out to win the wild compo. I really didn&rsquo;t expect that but I got a few questions about how it worked and I figured I&rsquo;d do a little writeup of it. This won&rsquo;t be a complete deep dive into everything - there honestly isn&rsquo;t all that much to dive into - so I&rsquo;m going to go scene by scene1 and talk about what is most interesting in that scene, using code snippets and such.</div>
243<details class="info"><summary>item information</summary>
244timestamp: 1660780800
245title: [lipu pi jan Niko] how I made Sheepspin (the NOVA 2022 wild compo winner)
246link: https://tilde.town/~nihilazo/log/sheepspin.html
247content_type: html
248id: https://tilde.town/~nihilazo/log/sheepspin.html
249author:
250enclosure:
251category:
252</details>
253</details>
254<details>
255<summary>[linkbudz rss feed] Defmacro for C</summary>
256<div class="links">
257<a href="https://www.european-lisp-symposium.org/static/2014/selgrad.pdf">read original</a>
258</div>
259<div class="content"><p><a href="https://www.european-lisp-symposium.org/static/2014/selgrad.pdf">Defmacro for C</a></p>
260 <p>[https] posted by wsinatra on August 17, 2022</p></div>
261<details class="info"><summary>item information</summary>
262timestamp: 1660750368
263title: [linkbudz rss feed] Defmacro for C
264link: https://www.european-lisp-symposium.org/static/2014/selgrad.pdf
265content_type: html
266id: wsinatra20220817153248
267author:
268enclosure:
269category: https
270</details>
271</details>
272<details>
273<summary>[linkbudz rss feed] JavaScript PDP 11/70 emulator</summary>
274<div class="links">
275<a href="https://skn.noip.me/pdp11/pdp11.html">read original</a>
276</div>
277<div class="content"><p><a href="https://skn.noip.me/pdp11/pdp11.html">JavaScript PDP 11/70 emulator</a></p>
278 <p>[https] posted by m455 on August 17, 2022</p></div>
279<details class="info"><summary>item information</summary>
280timestamp: 1660704727
281title: [linkbudz rss feed] JavaScript PDP 11/70 emulator
282link: https://skn.noip.me/pdp11/pdp11.html
283content_type: html
284id: m45520220817025207
285author:
286enclosure:
287category: https
288</details>
289</details>
290<details>
291<summary>[linkbudz rss feed] tenpo ko: a universal timezone clock</summary>
292<div class="links">
293<a href="http://tilde.town/~dozens/tenpoko/">read original</a>
294</div>
295<div class="content"><p><a href="http://tilde.town/~dozens/tenpoko/">tenpo ko: a universal timezone clock</a></p>
296 <p>[http] posted by dozens on August 17, 2022</p></div>
297<details class="info"><summary>item information</summary>
298timestamp: 1660696023
299title: [linkbudz rss feed] tenpo ko: a universal timezone clock
300link: http://tilde.town/~dozens/tenpoko/
301content_type: html
302id: dozens20220817002703
303author:
304enclosure:
305category: http
306</details>
307</details>
308<details>
309<summary>[Brainshit] Big Mac Chicken</summary>
310<div class="links">
311<a href="https://brainshit.fr/read/315">read original</a>
312</div>
313<div class="content">McDonald's tente de déclencher une guerre civile en sortant une version poulet de son burger phare. Le Big Mac Chicken a la même taille décevante que le Big Mac, et comme le poulet a encore moins de goût que le bœuf, on sent ressortir encore plus la sauce Big Mac, ce qui pourrait faire plaisir à ses fans s'ils se décident à accepter qu'on puisse essayer d'innover sur leur burger. Tout comme le P'tit Wrap Bœuf Deluxe, c'est pas super intéressant, mais pas mauvais non plus. <strong>Meh / 7</strong></div>
314<details class="info"><summary>item information</summary>
315timestamp: 1660687200
316title: [Brainshit] Big Mac Chicken
317link: https://brainshit.fr/read/315
318content_type: html
319id: https://brainshit.fr/read/315
320author: neuron@brainshit.fr (Lucidiot)
321enclosure:
322category: Gastronomie
323</details>
324</details>
325<details>
326<summary>[linkbudz rss feed] Hank explains the new US climate law, and why we can be optimistic about it.</summary>
327<div class="links">
328<a href="https://www.youtube.com/watch?v=qw5zzrOpo2s">read original</a>
329</div>
330<div class="content"><p><a href="https://www.youtube.com/watch?v=qw5zzrOpo2s">Hank explains the new US climate law, and why we can be optimistic about it.</a></p>
331 <p>[https] posted by kindrobot on August 15, 2022</p></div>
332<details class="info"><summary>item information</summary>
333timestamp: 1660574445
334title: [linkbudz rss feed] Hank explains the new US climate law, and why we can be optimistic about it.
335link: https://www.youtube.com/watch?v=qw5zzrOpo2s
336content_type: html
337id: kindrobot20220815144045
338author:
339enclosure:
340category: https
341</details>
342</details>
343<details>
344<summary>[(lambda (x) (create x))] Auskultanto</summary>
345<div class="links">
346<a href="https://lambdacreate.com/posts/38">read original</a>
347</div>
348<div class="content"><h2>Auskultanto</h2>
349<h3>Prototyping things in Golang &middot; August, 15th, 2022</h3>
350
351<p>Over the past two years I've absolutely fallen in love with Golang. It's a great (not so little) language that Google has been shepherding, but really we have the brilliant minds behind Plan9 to thank for it. All of that might just upset some people, not everyone's a big G fan after all, but I don't mind when the tool fits the job. For me, that job is typically prototyping. In my line of work being able to move fast and get a function example or MVP out is a huge step, and the faster I can do it the better. Obviously I still want to be able to use that prototype, kick the tires and such what, but so long as I'm not worried about the size and to some degree the performance I will readily and happily reach for Golang.</p>
352
353<p>You might think to yourself, what does Golang have going that couldn't be accomplished in Python, or pretty much any language you could cherry pick out the list. And my answer to you would be nothing I suppose. But it has some bells and whistles which make me reach for it before the likes of Python. (And for those of you who know me, while I do actively avoid reaching for Python at all, it has its time and place too. Just not on my machines..). Anyways, those features. Golang's a lot like C, you can compile it down to a tiny static binary, a few megabytes in size. You can natively cross compile it to multiple different operating systems. The community and core libraries are absolutely bananas, nearly a library for anything you could need or want. And the compiler is so obtusely opinionated that you have to try to write buggy code!</p>
354
355<p>All of this makes it a joy to work with. I know that something I write in Golang can compile and run on Alpine Linux, or Ubuntu, or Arch, but also Windows or MacOS, and funnily enough even Plan9! And while that last one might seem silly, I frequently find myself utilizing the same tooling on my Plan9 terminals that I reach for when I have my droid. At $work I use it to quickly build backend services, little glue bits that extract and ex-filtrate data, or keep an eye on things that can't be tied into the larger monitoring picture. And I've even written a couple of silly HTTP monitoring/utility services like <a href="https://gitlab.com/durrendal/ATSRV.git">ATSRV</a>, <a href="https://gitlab.com/durrendal/PNTP">PNTP</a>, <a href="https://gitlab.com/durrendal/fServ.git">fServ</a>, and <a href="https://gitlab.com/durrendal/auskultanto">auskultanto</a>. In order that's a /proc info server, a poorman's NTP server, a file download/upload server, and a configurable status system. You get the picture I hope, you can kind of throw together these neat little micro services that can compile for anything, run anywhere, and due to the availability of the language's libraries be built in a somewhat trivial effort/timeframe.</p>
356
357<p>Once again, yes I could just do this with Fennel/Lua or Common Lisp, but it just isn't as fuss free. And as much as I love Common Lisp, the binaries end up being 30mb+, so I can't complain in the slightest about a 6mb Golang binary. Also, have you tried using Fennel on Plan9? It's stuck on an ancient version and needs some love before that's going to be a viable option.</p>
358
359<h3>Latest Prototype</h3>
360
361<p>My latest prototype utility is another HTTP micro server, it's a little configurable custom check system, meant to be thrown behind a load balancer like the AWS ALB so you can define a custom health check. Normally not a necessary step, but sometimes just checking to see if Apache is serving something at a path isn't enough, so auskultanto (listener in Esperanto) listens in for those little health checks and returns up to date information about, well, whatever you decide to configure really! Here let me show you.</p>
362
363<div class="codeSnippet">
364 <pre><code>
365~|>> curl http://127.0.0.1:8092/command?name=uptime
366{"Stdout":" 21:10:43 up 3:39, 0 users, load average: 1.17, 0.95, 1.17\
367","Stderr":"","Timestamp":"2022-08-15 21:10:43.007781982 -0400 EDT m=+23.979705812"}
368
369~|>> curl http://127.0.0.1:8092/service?name=sshd
370{"Stdout":" * status: started\
371","Stderr":"","Timestamp":"2022-08-15 21:11:44.101013183 -0400 EDT m=+85.072937013"}
372
373~|>> curl http://127.0.0.1:8092/script?name=test.sh
374{"Stdout":"neuromancer\
375","Stderr":"","Timestamp":"2022-08-15 21:11:59.156463623 -0400 EDT m=+100.128387453"}
376 </code></pre>
377</div>
378
379<p>Auskultanto exposes three endpoints, command, service, and script, and for each one it returns a little JSON blob with the stdout/stderr of the command chosen and a timestamp from the execution. Really simple, and pretty nifty! And you're probably thinking, this is absolutely horrible, it's remote code execution over HTTP! Well.. yes and no. Lets look at the config file.</p>
380
381<div class="codeSnippet">
382 <pre><code>
383Log: auskultanto.log
384ScriptDir: /var/auskultanto/scripts/
385Init: openrc
386# /service?name=sshd
387Services:
388 - sshd
389 - iptables
390# /command?name="netstat%20-tlpn"
391# /command?name=uptime
392Commands:
393 - uptime
394 - hostname
395 - netstat -tlpn
396# /script?name="test.sh"
397Scripts:
398 - test.sh
399 </code></pre>
400 </div>
401
402<p>Nothing crazy, but you'll note that under each endpoint we list out our valid checks, each as a single line under the endpoint. And while it might not stick out, it's perfectly fine to include multi argument commands such as netstat -tlpn, auskultanto will be happy to consume that. The only caveat is that you should escape your spaces with %20, it is a URL after all.</p>
403
404<p>Not too shabby for a prototype right? We can define a couple of simple commands, write a quick script, or look for a service status and then write a little match using the JSON output. But what happens if we run a command that isn't configured? Obviously with something like this the very first thing we should try is a /command?name=whoami, or maybe a /command?name=sudo%20whoami. And if those work, we definitely need to try a /command?name=sudo%20rm%20-rf$20/%2A right?</p>
405
406<p>Whenever an endpoint is queried, auskultanto records the endpoint, what the name of the request was, and then any error messages related to that event. And obviously a timestamp, because it wouldn't be much of a log otherwise would it? Here's the log from the example above:</p>
407
408<div class="codeSnippet">
409 <pre><code>
4102022/08/15 21:10:43 Queried: /command
4112022/08/15 21:10:43 Command key: uptime
4122022/08/15 21:11:43 Queried: /service
4132022/08/15 21:11:43 Service key: sshd
4142022/08/15 21:11:59 Queried: /script
4152022/08/15 21:11:59 Script key: test.sh
416 </code></pre>
417</div>
418
419<p>And this is what happens when we start trying to run things that aren't configured. Auskultanto isn't particularly fond of it. Lets try a whole bunch of unconfigured things!</p>
420
421<ul>
422 <li>/service?name=wildfly</li>
423 <li>/command?name=sudo%20whoami</li>
424 <li>/command?name=uptime%26%26whoami</li>
425 <li>/command?name=rm%20-rf%20/%2A</li>
426 <li>/script?name=test.sh%3B%20rm%20-rf%20/%2A</li>
427</ul>
428
429<div class="codeSnippet">
430 <pre><code>
4312022/08/15 21:31:03 Queried: /service
4322022/08/15 21:31:03 Service key: wildfly
4332022/08/15 21:31:03 wildfly is not a configured service.
4342022/08/15 21:31:24 Queried: /command
4352022/08/15 21:31:24 Command key: sudo whoami
4362022/08/15 21:31:24 sudo whoami is not a configured command
4372022/08/15 21:42:28 Queried: /command
4382022/08/15 21:42:28 Command key: uptime&&whoami
4392022/08/15 21:42:28 uptime&&whoami is not a configured command.
4402022/08/16 01:53:00 Queried: /command
4412022/08/16 01:53:00 Command key: rm -rf /*
4422022/08/16 01:53:00 rm -rf /* is not a configured command.
4432022/08/16 01:52:01 Queried: /script
4442022/08/16 01:52:01 Script key: test.sh; rm -rf /*
4452022/08/16 01:52:01 test.sh; rm -rf /* is not a configured script.
446 </code></pre>
447</div>
448
449<p>From the client side, when auskultanto doesn't recognize a command it silently logs the information like above, and doesn't return anything to the client. I may change this in the future, but my logic is that if there's no return people are less likely to poke at it. Adding more information, such as the requesting IP address is a solid next step for this little tool, so that iptables rules could be automated based on bad requests. If it ends up getting abused.</p>
450
451<p>Once again, this tool is just a prototype, something thrown together in a couple of hours to see if it can even be done. I'm proud of how resilient and flexible it seems right out the box. I'll continue to work at the idea and expand on the functionality in the future, but for now enjoy a toy monitoring system.</p></div>
452<details class="info"><summary>item information</summary>
453timestamp: 1660564800
454title: [(lambda (x) (create x))] Auskultanto
455link: https://lambdacreate.com/posts/38
456content_type: html
457id: https://lambdacreate.com/posts/38
458author:
459enclosure:
460category:
461</details>
462</details>
463<details>
464<summary>[RSRSSS] tilde whirl</summary>
465<div class="links">
466<a href="http://tilde.town/~dozens/podcast/rss.xml">read original</a>
467</div>
468<div class="content"><p>~dozens has started a podcast with tildeverse citizens as its guests. Since podcasts are fully backed by RSS, well there is an RSS feed available. I helped him iron out some details on the feed, since I had never toyed with RSS feeds for podcasts before and wanted to look at them a bit more in-depth. Maybe if I get enough experience helping <a href="https://casa.tildepages.org/" target="_blank">casakhstan</a> people set up their podcast feeds, I will write about it here…</p></div>
469<details class="info"><summary>item information</summary>
470timestamp: 1660564323
471title: [RSRSSS] tilde whirl
472link: http://tilde.town/~dozens/podcast/rss.xml
473content_type: html
474id: tilde-whirl
475author:
476enclosure:
477category: Feed|Podcast
478</details>
479</details>
480<details>
481<summary>[~lucidiot's wiki] tank</summary>
482<div class="links">
483<a href="https://envs.net/~lucidiot/tank.html">read original</a>
484</div>
485<div class="content"></div>
486<details class="info"><summary>item information</summary>
487timestamp: 1660550801
488title: [~lucidiot's wiki] tank
489link: https://envs.net/~lucidiot/tank.html
490content_type:
491id: https://envs.net/~lucidiot/tank.html
492author:
493enclosure:
494category:
495</details>
496</details>
497<details>
498<summary>[~lucidiot's wiki] notebooks</summary>
499<div class="links">
500<a href="https://envs.net/~lucidiot/notebooks.html">read original</a>
501</div>
502<div class="content"></div>
503<details class="info"><summary>item information</summary>
504timestamp: 1660542735
505title: [~lucidiot's wiki] notebooks
506link: https://envs.net/~lucidiot/notebooks.html
507content_type:
508id: https://envs.net/~lucidiot/notebooks.html
509author:
510enclosure:
511category:
512</details>
513</details>
514<details>
515<summary>[linkbudz rss feed] C Isn't A Programming Language Anymore</summary>
516<div class="links">
517<a href="https://gankra.github.io/blah/c-isnt-a-language/">read original</a>
518</div>
519<div class="content"><p><a href="https://gankra.github.io/blah/c-isnt-a-language/">C Isn't A Programming Language Anymore</a></p>
520 <p>[https] posted by dozens on August 15, 2022</p></div>
521<details class="info"><summary>item information</summary>
522timestamp: 1660528100
523title: [linkbudz rss feed] C Isn't A Programming Language Anymore
524link: https://gankra.github.io/blah/c-isnt-a-language/
525content_type: html
526id: dozens20220815014820
527author:
528enclosure:
529category: https
530</details>
531</details>
532<details>
533<summary>[linkbudz rss feed] 43beans</summary>
534<div class="links">
535<a href="https://www.youtube.com/watch?v=3V84Bi-mzQM">read original</a>
536</div>
537<div class="content"><p><a href="https://www.youtube.com/watch?v=3V84Bi-mzQM">43beans</a></p>
538 <p>[https] posted by acdw on August 14, 2022</p></div>
539<details class="info"><summary>item information</summary>
540timestamp: 1660490080
541title: [linkbudz rss feed] 43beans
542link: https://www.youtube.com/watch?v=3V84Bi-mzQM
543content_type: html
544id: acdw20220814151440
545author:
546enclosure:
547category: https
548</details>
549</details>
550<details>
551<summary>[dozens weed] 00030 re: [acdw] 2</summary>
552<div class="links">
553<a href="">read original</a>
554</div>
555<div class="content"><blockquote>
556 <p>I’ve subscribed to friends’ weeds (really dozens for now—hi dozens!) under a hidden link on my planet.acdw.net thing. I hope this is okay with everyone.</p>
557 </blockquote>
558 <p>Hi, acdw! Thanks for sharing your secret weed <del>alligator</del> aggregator. I’m glad that you have a way to read weeds now!</p>
559 <blockquote>
560 <p>Also read dozen’s bit on ed, the standard text editor. I also am using ed now! Thanks 12s. This is fun.</p>
561 </blockquote>
562 <p>Yess, I hope the ed craze sweeps the nation. Or at least the weedsphere. Glad you’re having fun. I might maybe have over-intellectualized what the writing process was like for me. It’s a slower more methodical process for me. This response, for example, I wanted to write out rather quickly. So I’m writing in vim.</p>
563 <p>The other thing that makes me interested in ed that I didn’t write about is using it for shell scripts. There are some examples in the <em>Ed Mastery</em> book about using ed to manipulate some files, which looked cool.</p>
564 <p>Something like this:</p>
565 <pre><code>for x in files do
566 ed $x &lt;&lt; EOE
567 1
568 i
569 BLA BLA BLA
570 .
571 wq
572 EOE
573 done</code></pre>
574 <blockquote>
575 <p>OH btw dozens you can rlwrap ed and it’s nice.</p>
576 </blockquote>
577 <p>I did use rlwrap! I like having command history for the most part. But yeah that does provide some better cursor control.</p>
578 <p>Whoa, just read the manpage on readline and it is much more configurable than I ever realized..</p></div>
579<details class="info"><summary>item information</summary>
580timestamp: 1660486377
581title: [dozens weed] 00030 re: [acdw] 2
582link:
583content_type: html
584id: Sun, 14 Aug 2022 10:12:57 -0400
585author: dozens sin leche
586enclosure:
587category:
588</details>
589</details>
590<details>
591<summary>[dozens weed] 00029 ed</summary>
592<div class="links">
593<a href="">read original</a>
594</div>
595<div class="content"><blockquote>
596 <p>ed is the standard editor</p>
597 </blockquote>
598 <p>Some time ago I read a blog post in which the author was describing their process for authoring content for the web. Specifically they were talking about their personal method of writing markdown.</p>
599 <p>The trick, they said, is to write paragraphs made of individual sentences (themselves made of words), each one on its own line. One sentence per line. Paragraphs separated by a blank line.</p>
600 <p>This trick works because writing one sentence per line means that for each line, there is only one sentence. You can easily reorder sentences, join them, etc. And you can more easily see the length of sentences, so that you can vary length. Follow a long sentence with a few shorter ones. Allow the reader to rest and relax. Reading long sentences is taxing, after all.</p>
601 <p>The thing that makes this work for composing thoughts is that markdown converters will turn all of your lines into a single HTML paragraph. Paragraphs in turn are separated by a blank line.</p>
602 <p>The process of writing and revising in this fashion is of course referred to as ‘line editing’. Which means that a ‘line editor’ must be uniquely suited to the task.</p>
603 <p>Which is why I am writing this post in a line editor named ed. Ed is the standard text editor.</p>
604 <hr />
605 <p>I have a little computing device that I refer to as a ‘typewriter’. It is essentially a keyboard and an e-ink display. It really is typewriter-esque.</p>
606 <p>When the device first came out, it had no editing capabilities whatsoever. Besides just backspacing and starting your thought over again. But it had no movable cursor. No way of moving through the text. It does now. But it didn’t then.</p>
607 <p>Its editing capabilties remain rudimentary. And writing in ed reminds me of it in a certain way.</p>
608 <p>I’ve used vim most of my life, and so I am very familiar and comfortable with modal editing. But using that typewriter, and using ed, makes me realize that I never fully engaged in modal <em>thinking</em> or modal <em>writing</em>. For so long as I had a visual editor, modality was a feature of the editor and not of my mind. I was able to continue to write and edit, to think and revise at the same time.</p>
609 <p>On the other hand, ed (and the typewriter) has afforded me my first experience with <em>internalized</em> modal editing. Now I experience a true separation of writing and thinking versus simuntaneous editing and revising.</p>
610 <p>I’ve already written elsewhere about how the typewriter lead me to adopt a “write now, revise later” workflow in which I just brain dumped, got the ideas out with little care for or attention to spelling or grammar. Editing and revising it for clarity, consiceness, and cohesion only came later, in a different setting and on the laptop.</p>
611 <p>Writing in ed gives me the same feeling. First and foremost come the thoughts, the feelings, the ideas. The act of wrangling thought into words. Later I’ll edit some lines.</p>
612 <p>So what is it really like to write in ed? It’s fine. I definitely recommend the one-sentence-per-line trick. You don’t want to be trying to edit a paragraph length line.</p>
613 <p>Writing is no real problem. It’s editing that can be tricky. There’s no real cursor control at all. You instead must rely on manual search and replace, which isn’t that bad at all in practice. Otherwise you can change the entire line and type it in over again.</p>
614 <p>Ultimately, I’d say any inconvenience is well worth the way it changes how you think.</p>
615 <hr />
616 <p>When ed was created, a lot of people worked on computers that were basically a keyboard and a printer. No monitor. The workflow included a lot of pencil and paper. You would write out your program ahead of time, and then type it into the computer, and see if it ran. While you were typing, you could have the computer print out the last couple of lines to see if you made an error or not. At the end of the day, it was common to print out the whole program and take it home and make corrections to it on paper. The next day you could come back to the program loaded up on the computer and make corrections to those lines with a line editor.</p>
617 <p>A line editor like ed.</p>
618 <p>That’s the story I told my partner when they asked me what I was writing about just now. I told them that this week I started using a text editor from the 1970s designed to be used with a headless computer with nothing but a printer for output. For fun.</p>
619 <p>Learning ed feels like discovering my ancestry. Like I said earlier, I have used vim pretty much my entire computing life. Many vim commands come directly from ed, via ex and vi. For example, search and replace, the global command, write and quit, global search and replace, search, join lines, read from or write to shell commands.</p>
620 <p>Here are some other things that ed pioneered, influenced, or popularized: or popularized:</p>
621 <ul>
622 <li><p>regular expressions</p></li>
623 <li><p>grep</p></li>
624 <li><p>sed</p></li>
625 <li><p>ex, vi, and vim</p></li>
626 </ul>
627 <hr />
628 <p>Does ed still deserve a place in modern computing and writing? I don’t know, maybe. It is refreshing in a certain way to write in ed. It’s about constraints. It is refreshing to write and revise this way in the same way it is to code for a fantasy console. Adhering to arbitrary constraints. Like writing haiku.</p>
629 <p>There is no vimrc to get distracted by. No config to waste time tweaking. All there is to do is just write. There is nothing else.</p>
630 <p>I do think that my little e-ink typewriter might be both more fun and more useful if I had the option to write and edit in ed. Now that I’ve spent some time with it, I do think that a line based editor is both more useful and more elegant than the primative character based editor it has.</p></div>
631<details class="info"><summary>item information</summary>
632timestamp: 1660443015
633title: [dozens weed] 00029 ed
634link:
635content_type: html
636id: Sat, 13 Aug 2022 22:10:15 -0400
637author: dozens sin leche
638enclosure:
639category:
640</details>
641</details>
642<details>
643<summary>[linkbudz rss feed] How can Santa keep his lists when the GDPR is around?</summary>
644<div class="links">
645<a href="https://worldbuilding.stackexchange.com/q/114033">read original</a>
646</div>
647<div class="content"><p><a href="https://worldbuilding.stackexchange.com/q/114033">How can Santa keep his lists when the GDPR is around?</a></p>
648 <p>[https] posted by lucidiot on August 13, 2022</p></div>
649<details class="info"><summary>item information</summary>
650timestamp: 1660432338
651title: [linkbudz rss feed] How can Santa keep his lists when the GDPR is around?
652link: https://worldbuilding.stackexchange.com/q/114033
653content_type: html
654id: lucidiot20220813231218
655author:
656enclosure:
657category: https
658</details>
659</details>
660<details>
661<summary>[Brainshit] Blog-Driven Development</summary>
662<div class="links">
663<a href="https://brainshit.fr/read/314">read original</a>
664</div>
665<div class="content">Une longue réflexion sur une pratique que j'ai commencé sans vraiment y penser depuis un an.</div>
666<details class="info"><summary>item information</summary>
667timestamp: 1660428000
668title: [Brainshit] Blog-Driven Development
669link: https://brainshit.fr/read/314
670content_type: html
671id: https://brainshit.fr/read/314
672author: neuron@brainshit.fr (Lucidiot)
673enclosure:
674category: Productivité
675</details>
676</details>
677<details>
678<summary>[linkbudz rss feed] writing an xml schema validator in… xml</summary>
679<div class="links">
680<a href="https://www.saxonica.com/papers/markupuk-2018mhk.pdf">read original</a>
681</div>
682<div class="content"><p><a href="https://www.saxonica.com/papers/markupuk-2018mhk.pdf">writing an xml schema validator in… xml</a></p>
683 <p>[https] posted by lucidiot on August 11, 2022</p></div>
684<details class="info"><summary>item information</summary>
685timestamp: 1660254767
686title: [linkbudz rss feed] writing an xml schema validator in… xml
687link: https://www.saxonica.com/papers/markupuk-2018mhk.pdf
688content_type: html
689id: lucidiot20220811215247
690author:
691enclosure:
692category: https
693</details>
694</details>
695<details>
696<summary>[linkbudz rss feed] A Picture of a Hot Dog</summary>
697<div class="links">
698<a href="https://www.pictureofhotdog.com/">read original</a>
699</div>
700<div class="content"><p><a href="https://www.pictureofhotdog.com/">A Picture of a Hot Dog</a></p>
701 <p>[https] posted by acdw on August 11, 2022</p></div>
702<details class="info"><summary>item information</summary>
703timestamp: 1660250944
704title: [linkbudz rss feed] A Picture of a Hot Dog
705link: https://www.pictureofhotdog.com/
706content_type: html
707id: acdw20220811204904
708author:
709enclosure:
710category: https
711</details>
712</details>
713<details>
714<summary>[linkbudz rss feed] ansi tarot art</summary>
715<div class="links">
716<a href="https://16colo.rs/pack/lbs-tarot/">read original</a>
717</div>
718<div class="content"><p><a href="https://16colo.rs/pack/lbs-tarot/">ansi tarot art</a></p>
719 <p>[https] posted by dozens on August 11, 2022</p></div>
720<details class="info"><summary>item information</summary>
721timestamp: 1660248227
722title: [linkbudz rss feed] ansi tarot art
723link: https://16colo.rs/pack/lbs-tarot/
724content_type: html
725id: dozens20220811200347
726author:
727enclosure:
728category: https
729</details>
730</details>
731<details>
732<summary>[linkbudz rss feed] IRC bot written in Retro Forth</summary>
733<div class="links">
734<a href="http://retroforth.org/examples/irc-bot.retro.html">read original</a>
735</div>
736<div class="content"><p><a href="http://retroforth.org/examples/irc-bot.retro.html">IRC bot written in Retro Forth</a></p>
737 <p>[http] posted by wsinatra on August 11, 2022</p></div>
738<details class="info"><summary>item information</summary>
739timestamp: 1660232892
740title: [linkbudz rss feed] IRC bot written in Retro Forth
741link: http://retroforth.org/examples/irc-bot.retro.html
742content_type: html
743id: wsinatra20220811154812
744author:
745enclosure:
746category: http
747</details>
748</details>
749<details>
750<summary>[linkbudz rss feed] Gemini Server written in Retro Forth</summary>
751<div class="links">
752<a href="http://retroforth.org/examples/atua-gemini.retro.html">read original</a>
753</div>
754<div class="content"><p><a href="http://retroforth.org/examples/atua-gemini.retro.html">Gemini Server written in Retro Forth</a></p>
755 <p>[http] posted by wsinatra on August 11, 2022</p></div>
756<details class="info"><summary>item information</summary>
757timestamp: 1660232253
758title: [linkbudz rss feed] Gemini Server written in Retro Forth
759link: http://retroforth.org/examples/atua-gemini.retro.html
760content_type: html
761id: wsinatra20220811153733
762author:
763enclosure:
764category: http
765</details>
766</details>
767<details>
768<summary>[linkbudz rss feed] apparently the basement allows you to turn your account into an IRC bouncer by setting an "always on" thingy to true??</summary>
769<div class="links">
770<a href="https://github.com/ergochat/ergo/blob/stable/docs/USERGUIDE.md#always-on">read original</a>
771</div>
772<div class="content"><p><a href="https://github.com/ergochat/ergo/blob/stable/docs/USERGUIDE.md#always-on">apparently the basement allows you to turn your account into an IRC bouncer by setting an "always on" thingy to true??</a></p>
773 <p>[https] posted by m455 on August 11, 2022</p></div>
774<details class="info"><summary>item information</summary>
775timestamp: 1660184500
776title: [linkbudz rss feed] apparently the basement allows you to turn your account into an IRC bouncer by setting an "always on" thingy to true??
777link: https://github.com/ergochat/ergo/blob/stable/docs/USERGUIDE.md#always-on
778content_type: html
779id: m45520220811022140
780author:
781enclosure:
782category: https
783</details>
784</details>
785<details>
786<summary>[linkbudz rss feed] the joy of smol projects</summary>
787<div class="links">
788<a href="https://schroer.ca/2022/04/10/the-joy-of-small-projects/">read original</a>
789</div>
790<div class="content"><p><a href="https://schroer.ca/2022/04/10/the-joy-of-small-projects/">the joy of smol projects</a></p>
791 <p>[https] posted by lucidiot on August 10, 2022</p></div>
792<details class="info"><summary>item information</summary>
793timestamp: 1660165621
794title: [linkbudz rss feed] the joy of smol projects
795link: https://schroer.ca/2022/04/10/the-joy-of-small-projects/
796content_type: html
797id: lucidiot20220810210701
798author:
799enclosure:
800category: https
801</details>
802</details>
803<details>
804<summary>[linkbudz rss feed] leprd.space: free web hosting for hobbyists</summary>
805<div class="links">
806<a href="https://leprd.space/">read original</a>
807</div>
808<div class="content"><p><a href="https://leprd.space/">leprd.space: free web hosting for hobbyists</a></p>
809 <p>[https] posted by m455 on August 10, 2022</p></div>
810<details class="info"><summary>item information</summary>
811timestamp: 1660117262
812title: [linkbudz rss feed] leprd.space: free web hosting for hobbyists
813link: https://leprd.space/
814content_type: html
815id: m45520220810074102
816author:
817enclosure:
818category: https
819</details>
820</details>
821<details>
822<summary>[Dozens and Dragons] Wicked Grin</summary>
823<div class="links">
824<a href="https://dozensanddragons.neocities.org/31.html">read original</a>
825</div>
826<div class="content">Lightweight Quickstart Rules for Seriously Fun Games</div>
827<details class="info"><summary>item information</summary>
828timestamp: 1660104000
829title: [Dozens and Dragons] Wicked Grin
830link: https://dozensanddragons.neocities.org/31.html
831content_type: html
832id: https://dozensanddragons.neocities.org/31.html
833author:
834enclosure:
835category:
836</details>
837</details>
838<details>
839<summary>[linkbudz rss feed] m455 finally made a CNAME to point friends.m455.casa to casa.tildepages.org! long live the commonhealth of casakhstan!</summary>
840<div class="links">
841<a href="https://friends.m455.casa/">read original</a>
842</div>
843<div class="content"><p><a href="https://friends.m455.casa/">m455 finally made a CNAME to point friends.m455.casa to casa.tildepages.org! long live the commonhealth of casakhstan!</a></p>
844 <p>[https] posted by m455 on August 09, 2022</p></div>
845<details class="info"><summary>item information</summary>
846timestamp: 1660060603
847title: [linkbudz rss feed] m455 finally made a CNAME to point friends.m455.casa to casa.tildepages.org! long live the commonhealth of casakhstan!
848link: https://friends.m455.casa/
849content_type: html
850id: m45520220809155643
851author:
852enclosure:
853category: https
854</details>
855</details>
856<details>
857<summary>[linkbudz rss feed] acdw has a new authoring tool and markup language!</summary>
858<div class="links">
859<a href="https://git.acdw.net/ht">read original</a>
860</div>
861<div class="content"><p><a href="https://git.acdw.net/ht">acdw has a new authoring tool and markup language!</a></p>
862 <p>[https] posted by m455 on August 09, 2022</p></div>
863<details class="info"><summary>item information</summary>
864timestamp: 1660010615
865title: [linkbudz rss feed] acdw has a new authoring tool and markup language!
866link: https://git.acdw.net/ht
867content_type: html
868id: m45520220809020335
869author:
870enclosure:
871category: https
872</details>
873</details>
874<details>
875<summary>[linkbudz rss feed] Gemini/Gopher simple intro</summary>
876<div class="links">
877<a href="https://thedorkweb.substack.com/p/gopher-gemini-and-the-smol-internet">read original</a>
878</div>
879<div class="content"><p><a href="https://thedorkweb.substack.com/p/gopher-gemini-and-the-smol-internet">Gemini/Gopher simple intro</a></p>
880 <p>[https] posted by wsinatra on August 08, 2022</p></div>
881<details class="info"><summary>item information</summary>
882timestamp: 1659979984
883title: [linkbudz rss feed] Gemini/Gopher simple intro
884link: https://thedorkweb.substack.com/p/gopher-gemini-and-the-smol-internet
885content_type: html
886id: wsinatra20220808173304
887author:
888enclosure:
889category: https
890</details>
891</details>
892<details>
893<summary>[linkbudz rss feed] EFF Defcon 30 appearances</summary>
894<div class="links">
895<a href="https://www.eff.org/deeplinks/2022/07/hacking-future-def-con-30">read original</a>
896</div>
897<div class="content"><p><a href="https://www.eff.org/deeplinks/2022/07/hacking-future-def-con-30">EFF Defcon 30 appearances</a></p>
898 <p>[https] posted by wsinatra on August 08, 2022</p></div>
899<details class="info"><summary>item information</summary>
900timestamp: 1659979886
901title: [linkbudz rss feed] EFF Defcon 30 appearances
902link: https://www.eff.org/deeplinks/2022/07/hacking-future-def-con-30
903content_type: html
904id: wsinatra20220808173126
905author:
906enclosure:
907category: https
908</details>
909</details>
910<details>
911<summary>[linkbudz rss feed] proposing a 'systems' lisp</summary>
912<div class="links">
913<a href="https://dustycloud.org/blog/guile-steel-proposal/">read original</a>
914</div>
915<div class="content"><p><a href="https://dustycloud.org/blog/guile-steel-proposal/">proposing a 'systems' lisp</a></p>
916 <p>[https] posted by dozens on August 08, 2022</p></div>
917<details class="info"><summary>item information</summary>
918timestamp: 1659963300
919title: [linkbudz rss feed] proposing a 'systems' lisp
920link: https://dustycloud.org/blog/guile-steel-proposal/
921content_type: html
922id: dozens20220808125500
923author:
924enclosure:
925category: https
926</details>
927</details>
928<details>
929<summary>[m455.casa] meet lol, my new website generator!</summary>
930<div class="links">
931<a href="https://m455.casa/posts/2022/meet-lol-my-new-website-generator.html">read original</a>
932</div>
933<div class="content"><h1>meet lol, my new website generator!</h1>
934<p>2022-08-08 00:00</p>
935<p>I've been pretty busy lately, so I haven't had a lot of time to explore
936computers, which is what I love doing. In the last few months, I've been trying
937to fight back against busyness by writing a new website generator after everyone
938goes to bed. I can't recommend doing this, because it gets exhausting after a
939while, but it gives me my kicks and makes me happy.</p>
940<p>My old website generator, <a href="https://git.m455.casa/wg">wg</a>, was a wrapper around
941Pandoc, and was written in <a href="https://fennel-lang.org/">Fennel</a>. I used separate
942fennel scripts to generate a list of posts and an RSS feed as post-thoughts to
943the website generator. Also, I didn't know about
944<a href="https://www.wireguard.com/">Wireguard</a> when I programmed <code>wg</code>. For those of you
945who don't know, Wireguard uses the command-line name <code>wg</code>, so it was best that I
946didn't compete with that haha.</p>
947<p>I still love Pandoc and Fennel, but I wanted to try to program something that
948had the following features:</p>
949<ul>
950<li>Uses a configuration file</li>
951<li>Copies the directory structure from the source directory to the build
952 directory</li>
953<li>Generates a list of posts from a directory that's specified in the configuration file</li>
954<li>Generates an RSS feed of the posts and their content.</li>
955<li>Replaces <code>{{variables}}</code> in Markdown files with values that are declared in
956 the configuration file</li>
957<li>Provides HTML and RSS templates</li></ul>
958<p>I also wanted an excuse to make a bigger programming project in <a href="https://call-cc.org/">Chicken
959Scheme</a> haha.</p>
960<p>I think what I'm most proud of for this project is that I was able to implement
961string templates. For example, the <code>{{im-an-example}}</code> in the text below would be
962replaced with the value that corresponds to the <code>im-an-example</code> key in a <code>config.scm</code>
963file.</p>
964<pre><code>Hey there, this a sentence, and my name is {{im-an-example}}.
965</code></pre>
966<p>Though, this wasn't that easy.</p>
967<p>First, I had to implement string replacement... Okay, okay, string replacement
968exists in Chicken Scheme using the <code>string-translate</code>, <code>string-translate*</code>,
969<code>irregex-replace</code>, or <code>irregex-replace/all</code> procedures, but where's the fun in
970using those? I don't get to build anything!</p>
971<p>My first step was to write a procedure that replaced the first occurrence of a
972string. I ended up using the <code>string-append</code>, <code>substring</code>, and <code>string-length</code>
973procedures to implement the following procedure:</p>
974<pre><code>(define (str-replace str from-str to-str)
975 (let ((from-index (string-contains str from-str)))
976 (if from-index
977 (string-append (substring str 0 from-index)
978 to-str
979 (substring str
980 (+ from-index (string-length from-str))
981 (string-length str)))
982 str)))
983</code></pre>
984<p>This isn't very useful if you plan on having several of the same placeholder
985values in one string, so I also needed to write a procedure to replace all
986occurrences of the string. It will drop into an infinite loop if I try to
987replace <code>l</code> with <code>ll</code>, but this is personal programming, not some software that
988needs to be battle tested, so I settled with my implementation below:</p>
989<pre><code>(define (str-replace-all str from-str to-str)
990 (let ((from-index (string-contains str from-str)))
991 (if from-index
992 (let ((rest-of-string (substring str
993 (+ from-index (string-length from-str))
994 (string-length str))))
995 (string-append (substring str 0 from-index)
996 to-str
997 (str-replace-all rest-of-string from-str to-str)))
998 str)))
999</code></pre>
1000<p>Next, I needed somehow to take a list of pairs, convert the first item in each
1001pair to a string, and then surround the string with <code>{{</code> and <code>}}</code>, so it
1002resembles one of the placeholder values that I mentioned earlier. After it
1003changed the first element in each pair, I then took the first element of each
1004pair, searched for it in the provided string, and then replaced it with the
1005second element, using the <code>str-replace-all</code> procedure to ensure all instances of
1006that placeholder were replaced.</p>
1007<p>I actually ended up having to split this algorithm into two procedures to keep
1008things maintainable for myself in case I needed to go back to fix or update the
1009code around this functionality. Here are those two procedures:</p>
1010<pre><code>(define (key-&gt;mustached-key pair)
1011 (if (pair? pair)
1012 (let* ((key (symbol-&gt;string (car pair)))
1013 (mustached-key (string-append &quot;{{&quot; key &quot;}}&quot;))
1014 (value (cadr pair)))
1015 `(,mustached-key ,value))
1016 pair))
1017
1018(define (string-populate str kv-replacements)
1019 (if (null? kv-replacements)
1020 str
1021 (let* ((mustached-keys (map key-&gt;mustached-key kv-replacements))
1022 (first-pair (car mustached-keys))
1023 (key (car first-pair))
1024 (val (cadr first-pair)))
1025 (string-populate
1026 (str-replace-all str key val)
1027 (cdr kv-replacements)))))
1028</code></pre>
1029<p>This ended up helping me get really good at quasiquoting in Scheme as well!</p>
1030<p>Apart from the <code>string-populate</code> procedure, and the core procedures that it's
1031built on, most of the other features aren't anything special, though I did enjoy
1032that I can just read arbitrary s-expressions from a string using Scheme's <code>read</code>
1033procedure. The <code>read</code> procedure made it super easy to read a configuration file
1034that was all s-expressions. For example, all I needed to do was load an
1035<a href="https://www.gnu.org/software/mit-scheme/documentation/stable/mit-scheme-ref/Association-Lists.html">alist</a>
1036in a file with the following procedure:</p>
1037<pre><code>(define (load-config-file)
1038 (if (file-exists? config-file)
1039 (with-input-from-file config-file read)
1040 #f))
1041</code></pre>
1042<p>This procedure returns a quoted alist, so I wrote the following helper procedure
1043to read it:</p>
1044<pre><code>(define (get alist key)
1045 (if (and (pair? alist)
1046 (pair? (car alist))
1047 (symbol? key))
1048 (cadr (assq key alist))
1049 alist))
1050</code></pre>
1051<p>Functional programming purists will hate me for this, but this then allowed me
1052set a globally mutated variable with <code>(set! config-data (load-config-file))</code>,
1053and then read the variable with a <code>(get config-data 'source-dir)</code>.</p>
1054<p>I've been using this method for reading and reloading configuration files for
1055other projects as well, so that was a great learning experience.</p>
1056<p>As for generating my list of posts and RSS feed, all I needed to do was parse
1057each Markdown file in a directory that's specified in the configuration file.
1058To make things easy, the title of a post was extracted from the first line of a
1059file, which should always be a Markdown H1 heading. I would then take the
1060Markdown heading, for example, <code># hey i'm a heading</code>, and remove the number sign
1061and space proceeding the number sign, leaving me with <code>hey i'm a heading</code>.</p>
1062<p>The remaining string would be used as the title for each post in the list of
1063posts page, and the title of each RSS item. The way I generated links for my
1064list of posts page was by converting the source path from, as an example,
1065<code>&lt;source-dir&gt;/path/to/post.md</code> to
1066<code>https://&lt;domain&gt;/path/to/post.html</code>.</p>
1067<p>Because dates are pretty important to RSS feeds, although not required, if
1068you're following the spec, I chose to put dates on the third line of each post,
1069in the format of <code>yyyy-mm-dd</code>, so I could convert <code>yyyy-mm-dd</code> to a number that
1070resembled <code>yyyymmdd</code>, and then reverse sort by each number, resulting in a
1071&quot;latest post first, oldest post last&quot; order.</p>
1072<p>To kind of finish this off, I think one of the major annoyances was converting
1073all fenced code blocks to use indentation instead, because Chicken Scheme's
1074lowdown egg replicates what the original Markdown parser does. That, and
1075replacing all of my Pandoc-centric Markdown stuff such as its Markdown version
1076of <code>&lt;div&gt;</code> blocks:</p>
1077<pre><code>:::{.im-a-class}
1078hey im a div
1079:::
1080</code></pre>
1081<p>The upside to using old school, feature-less Markdown is that the Markdown for
1082my website will work on most Markdown parsers I guess? Haha.</p>
1083<p>The downside to using the lowdown Markdown parser is that heading anchors aren't
1084generated, so all of my links to heading anchors are broken, but I got to have
1085fun with programming in Scheme at least? Plus, this isn't my professional
1086website, so things are allowed to be broken here, and I don't want to get rid of
1087old posts because they bring back good programming adventure memories for me.</p>
1088<p>I figured this blog could use a new post, so here it is!</p>
1089<p>Have a good one!</p>
1090<p>If you want to check out the source code for my new website generator, you can
1091view it <a href="https://git.m455.casa/lol">here</a>.</p></div>
1092<details class="info"><summary>item information</summary>
1093timestamp: 1659916800
1094title: [m455.casa] meet lol, my new website generator!
1095link: https://m455.casa/posts/2022/meet-lol-my-new-website-generator.html
1096content_type: html
1097id: https://m455.casa/posts/2022/meet-lol-my-new-website-generator.html
1098author:
1099enclosure:
1100category:
1101</details>
1102</details>
1103<details>
1104<summary>[RSRSSS] Gitea has most feeds, except the most important one</summary>
1105<div class="links">
1106<a href="">read original</a>
1107</div>
1108<div class="content"><p>While Gitea's 1.16.0 release <a href="https://github.com/go-gitea/gitea/pull/16002" target="_blank">added support for user feeds</a>, it was laching the feeds for repositories, organizations, releases and commits. The 1.17.0 release <a href="https://github.com/go-gitea/gitea/pull/19055" target="_blank">adds support for feeds on repositories</a> and <a href="https://github.com/go-gitea/gitea/pull/17714" target="_blank">adds support for feeds on organizations</a>, but the feed for releases, the most well-known and most commonly used feed on GitHub, is still missing.</p>
1109 <p>As mentioned earlier when I talked about the 1.16.0 release, the feeds are accessible either by setting the <code>Accept</code> header to <code>application/rss+xml</code> or <code>application/atom+xml</code> when requesting a user, an organization or a repository's URL, or by appending .rss or .atom to the username, repository name or organization name. Some examples:</p>
1110 <ul>
1111 <li>The <a href="https://tildegit.org/lucidiot.rss" target="_blank">RSS feed</a> and the <a href="https://tildegit.org/lucidiot.atom" target="_blank">Atom feed</a> for my account on <a href="https://tildegit.org" target="_blank">Tildegit</a>, the Gitea instance of the <a href="https://tildeverse.org" target="_blank">Tildeverse</a>;</li>
1112 <li>The <a href="https://tildegit.org/lucidiot/rsrsss.rss" target="_blank">RSS feed</a> and the <a href="https://tildegit.org/lucidiot/rsrsss.atom" target="_blank">Atom feed</a> for the repository hosting RSRSSS;</li>
1113 <li>The <a href="https://tildegit.org/casa.rss" target="_blank">RSS feed</a> and the <a href="https://tildegit.org/casa.atom" target="_blank">Atom feed</a> for the <a href="https://casa.tildepages.org" target="_blank">Commonhealth of Casakhstan</a>'s Gitea organization on Tildegit.</li>
1114 </ul>
1115 <p>I hope that we will see <a href="https://github.com/go-gitea/gitea/issues/19091" target="_blank">the feeds for releases</a> in the next release, so that Gitea adds the one missing feature to make package maintainers happy.</p>
1116 <p>By the way, <a href="https://tildegit.org/lucidiot/rsrsss.rss" target="_blank">the RSS feed for the RSRSSS repo</a> could be called the Really Simple RSRSSS Repository Syndication feed, or <abbr title="Really Simple Really Simple Really Simple Syndication Syndication Repository Syndication">RSRSRSSSRS</abbr>.</p></div>
1117<details class="info"><summary>item information</summary>
1118timestamp: 1659914883
1119title: [RSRSSS] Gitea has most feeds, except the most important one
1120link:
1121content_type: html
1122id: gitea-most-feeds
1123author:
1124enclosure:
1125category: Tip
1126</details>
1127</details>
1128<details>
1129<summary>[linkbudz rss feed] CISA 2021 Top Malware Strains</summary>
1130<div class="links">
1131<a href="https://www.cisa.gov/uscert/ncas/alerts/aa22-216a">read original</a>
1132</div>
1133<div class="content"><p><a href="https://www.cisa.gov/uscert/ncas/alerts/aa22-216a">CISA 2021 Top Malware Strains</a></p>
1134 <p>[https] posted by wsinatra on August 05, 2022</p></div>
1135<details class="info"><summary>item information</summary>
1136timestamp: 1659707012
1137title: [linkbudz rss feed] CISA 2021 Top Malware Strains
1138link: https://www.cisa.gov/uscert/ncas/alerts/aa22-216a
1139content_type: html
1140id: wsinatra20220805134332
1141author:
1142enclosure:
1143category: https
1144</details>
1145</details>
1146<details>
1147<summary>[linkbudz rss feed] How to surf the web</summary>
1148<div class="links">
1149<a href="https://sadgrl.online/cyberspace/surf-the-web.html">read original</a>
1150</div>
1151<div class="content"><p><a href="https://sadgrl.online/cyberspace/surf-the-web.html">How to surf the web</a></p>
1152 <p>[https] posted by mio on August 04, 2022</p></div>
1153<details class="info"><summary>item information</summary>
1154timestamp: 1659650190
1155title: [linkbudz rss feed] How to surf the web
1156link: https://sadgrl.online/cyberspace/surf-the-web.html
1157content_type: html
1158id: mio20220804215630
1159author:
1160enclosure:
1161category: https
1162</details>
1163</details>
1164<details>
1165<summary>[linkbudz rss feed] oh god, rss3 is coming</summary>
1166<div class="links">
1167<a href="https://blog.rss3.io/">read original</a>
1168</div>
1169<div class="content"><p><a href="https://blog.rss3.io/">oh god, rss3 is coming</a></p>
1170 <p>[https] posted by acdw on August 04, 2022</p></div>
1171<details class="info"><summary>item information</summary>
1172timestamp: 1659633296
1173title: [linkbudz rss feed] oh god, rss3 is coming
1174link: https://blog.rss3.io/
1175content_type: html
1176id: acdw20220804171456
1177author:
1178enclosure:
1179category: https
1180</details>
1181</details>
1182<details>
1183<summary>[linkbudz rss feed] Simple CA Tutorial</summary>
1184<div class="links">
1185<a href="https://jamielinux.com/docs/openssl-certificate-authority/introduction.html">read original</a>
1186</div>
1187<div class="content"><p><a href="https://jamielinux.com/docs/openssl-certificate-authority/introduction.html">Simple CA Tutorial</a></p>
1188 <p>[https] posted by wsinatra on August 04, 2022</p></div>
1189<details class="info"><summary>item information</summary>
1190timestamp: 1659621190
1191title: [linkbudz rss feed] Simple CA Tutorial
1192link: https://jamielinux.com/docs/openssl-certificate-authority/introduction.html
1193content_type: html
1194id: wsinatra20220804135310
1195author:
1196enclosure:
1197category: https
1198</details>
1199</details>
1200<details>
1201<summary>[linkbudz rss feed] Wazuh, an open source SIEM platform</summary>
1202<div class="links">
1203<a href="https://wazuh.com/">read original</a>
1204</div>
1205<div class="content"><p><a href="https://wazuh.com/">Wazuh, an open source SIEM platform</a></p>
1206 <p>[https] posted by wsinatra on August 03, 2022</p></div>
1207<details class="info"><summary>item information</summary>
1208timestamp: 1659557326
1209title: [linkbudz rss feed] Wazuh, an open source SIEM platform
1210link: https://wazuh.com/
1211content_type: html
1212id: wsinatra20220803200846
1213author:
1214enclosure:
1215category: https
1216</details>
1217</details>
1218<details>
1219<summary>[linkbudz rss feed] Google map hacks</summary>
1220<div class="links">
1221<a href="http://www.simonweckert.com/googlemapshacks.html">read original</a>
1222</div>
1223<div class="content"><p><a href="http://www.simonweckert.com/googlemapshacks.html">Google map hacks</a></p>
1224 <p>[http] posted by m455 on August 03, 2022</p></div>
1225<details class="info"><summary>item information</summary>
1226timestamp: 1659556751
1227title: [linkbudz rss feed] Google map hacks
1228link: http://www.simonweckert.com/googlemapshacks.html
1229content_type: html
1230id: m45520220803195911
1231author:
1232enclosure:
1233category: http
1234</details>
1235</details>
1236<details>
1237<summary>[linkbudz rss feed] cursed software bugs, with rss feed</summary>
1238<div class="links">
1239<a href="https://500mile.email/">read original</a>
1240</div>
1241<div class="content"><p><a href="https://500mile.email/">cursed software bugs, with rss feed</a></p>
1242 <p>[https] posted by lucidiot on August 03, 2022</p></div>
1243<details class="info"><summary>item information</summary>
1244timestamp: 1659546117
1245title: [linkbudz rss feed] cursed software bugs, with rss feed
1246link: https://500mile.email/
1247content_type: html
1248id: lucidiot20220803170157
1249author:
1250enclosure:
1251category: https
1252</details>
1253</details>
1254<details>
1255<summary>[linkbudz rss feed] We can't send email more than 500 miles</summary>
1256<div class="links">
1257<a href="https://web.mit.edu/jemorris/humor/500-miles">read original</a>
1258</div>
1259<div class="content"><p><a href="https://web.mit.edu/jemorris/humor/500-miles">We can't send email more than 500 miles</a></p>
1260 <p>[https] posted by wsinatra on August 03, 2022</p></div>
1261<details class="info"><summary>item information</summary>
1262timestamp: 1659546065
1263title: [linkbudz rss feed] We can't send email more than 500 miles
1264link: https://web.mit.edu/jemorris/humor/500-miles
1265content_type: html
1266id: wsinatra20220803170105
1267author:
1268enclosure:
1269category: https
1270</details>
1271</details>
1272<details>
1273<summary>[linkbudz rss feed] if you type in your pw, it will show as stars</summary>
1274<div class="links">
1275<a href="http://bash.org/?244321">read original</a>
1276</div>
1277<div class="content"><p><a href="http://bash.org/?244321">if you type in your pw, it will show as stars</a></p>
1278 <p>[http] posted by wsinatra on August 03, 2022</p></div>
1279<details class="info"><summary>item information</summary>
1280timestamp: 1659546000
1281title: [linkbudz rss feed] if you type in your pw, it will show as stars
1282link: http://bash.org/?244321
1283content_type: html
1284id: wsinatra20220803170000
1285author:
1286enclosure:
1287category: http
1288</details>
1289</details>
1290<details>
1291<summary>[linkbudz rss feed] RAID is not a policing method</summary>
1292<div class="links">
1293<a href="https://en.wikipedia.org/wiki/Standard_RAID_levels">read original</a>
1294</div>
1295<div class="content"><p><a href="https://en.wikipedia.org/wiki/Standard_RAID_levels">RAID is not a policing method</a></p>
1296 <p>[https] posted by wsinatra on August 03, 2022</p></div>
1297<details class="info"><summary>item information</summary>
1298timestamp: 1659533694
1299title: [linkbudz rss feed] RAID is not a policing method
1300link: https://en.wikipedia.org/wiki/Standard_RAID_levels
1301content_type: html
1302id: wsinatra20220803133454
1303author:
1304enclosure:
1305category: https
1306</details>
1307</details>
1308<details>
1309<summary>[linkbudz rss feed] the french police is not a backup.</summary>
1310<div class="links">
1311<a href="https://en.wikipedia.org/wiki/RAID_(French_police_unit)">read original</a>
1312</div>
1313<div class="content"><p><a href="https://en.wikipedia.org/wiki/RAID_(French_police_unit)">the french police is not a backup.</a></p>
1314 <p>[https] posted by lucidiot on August 03, 2022</p></div>
1315<details class="info"><summary>item information</summary>
1316timestamp: 1659533332
1317title: [linkbudz rss feed] the french police is not a backup.
1318link: https://en.wikipedia.org/wiki/RAID_(French_police_unit)
1319content_type: html
1320id: lucidiot20220803132852
1321author:
1322enclosure:
1323category: https
1324</details>
1325</details>
1326<details>
1327<summary>[Lowtech Radio Gazette] The Hardest Part</summary>
1328<div class="links">
1329<a href="https://lambdacreate.com/podcast/ltrg/1">read original</a>
1330<a href="https://lambdacreate.com/static/ltrg/ltrg-1.mp3">enclosure</a>
1331</div>
1332<div class="content"><h2>The Hardest Part</h2>
1333<h3>Is almost always starting &middot; August 3rd 2022</h3>
1334
1335<p>Imagine an embedded media player, right here. Pretty ain't it?</p>
1336
1337<p>I started a podcast, and after re-recording this episode at least a dozen times I've finally got something I can put out into the world! There's very little focus this episode, in fact I'd go so far as to say I spent 20 minutes rambling about how excited I am to actually be going forward with this crazy idea. But this is definitely the hardest part.</p>
1338
1339<p>I've rebuilt my website just to accommodate this new type of media, written helper tools and scripts to produce the audio, rss feeds, and recording. Everything from the first second to the "go live" publishing has been hand curated on my handy dandy droid4. And it's with all of these simple hacky glue bits that I've hacked together this episode for you. So sit back, and hopefully enjoy the first of many episodes of the Low Tech Radio Gazette!</p>
1340
1341<h3>What Our Listeners Are Saying</h3>
1342
1343<ul>
1344 <li>Frankenstein stream?</li>
1345 <li>Podcast transcript: *mumbling* is this thing on? *taps mic*</li>
1346 <li>Raw Steak Radicchio Baguette</li>
1347 <li>Coherence isn't exactly a priority for smol podcasts</li>
1348 <li>I think episode 1 is just wsinatra doing a podcast about making a podcast. mmmeta</li>
1349 <li>Well, it's not *that* meta so it's fine</li>
1350</ul>
1351
1352<h3>Admin Note</h3>
1353<p>If anyone listens and would like to give feedback, please reach out to me at wpsinatra@gmail.com. I'm very actively trying to refine the quality of the podcast, so constructive criticism is welcomed.</p></div>
1354<details class="info"><summary>item information</summary>
1355timestamp: 1659528000
1356title: [Lowtech Radio Gazette] The Hardest Part
1357link: https://lambdacreate.com/podcast/ltrg/1
1358content_type: html
1359id: ltrg-1
1360author:
1361enclosure: https://lambdacreate.com/static/ltrg/ltrg-1.mp3
1362category:
1363</details>
1364</details>
1365<details>
1366<summary>[linkbudz rss feed] a blog about plaintext</summary>
1367<div class="links">
1368<a href="https://plaintextproject.online/">read original</a>
1369</div>
1370<div class="content"><p><a href="https://plaintextproject.online/">a blog about plaintext</a></p>
1371 <p>[https] posted by lucidiot on August 03, 2022</p></div>
1372<details class="info"><summary>item information</summary>
1373timestamp: 1659509363
1374title: [linkbudz rss feed] a blog about plaintext
1375link: https://plaintextproject.online/
1376content_type: html
1377id: lucidiot20220803064923
1378author:
1379enclosure:
1380category: https
1381</details>
1382</details>
1383<details>
1384<summary>[linkbudz rss feed] smol Windows, Palm OS and OSX apps</summary>
1385<div class="links">
1386<a href="https://tinyapps.org/">read original</a>
1387</div>
1388<div class="content"><p><a href="https://tinyapps.org/">smol Windows, Palm OS and OSX apps</a></p>
1389 <p>[https] posted by lucidiot on August 03, 2022</p></div>
1390<details class="info"><summary>item information</summary>
1391timestamp: 1659509331
1392title: [linkbudz rss feed] smol Windows, Palm OS and OSX apps
1393link: https://tinyapps.org/
1394content_type: html
1395id: lucidiot20220803064851
1396author:
1397enclosure:
1398category: https
1399</details>
1400</details>
1401<details>
1402<summary>[linkbudz rss feed] Interneting is Hard - webdev tutorials for beginners</summary>
1403<div class="links">
1404<a href="https://www.internetingishard.com/">read original</a>
1405</div>
1406<div class="content"><p><a href="https://www.internetingishard.com/">Interneting is Hard - webdev tutorials for beginners</a></p>
1407 <p>[https] posted by mio on August 02, 2022</p></div>
1408<details class="info"><summary>item information</summary>
1409timestamp: 1659455230
1410title: [linkbudz rss feed] Interneting is Hard - webdev tutorials for beginners
1411link: https://www.internetingishard.com/
1412content_type: html
1413id: mio20220802154710
1414author:
1415enclosure:
1416category: https
1417</details>
1418</details>
1419<details>
1420<summary>[linkbudz rss feed] a 'quick and dirty' literate programming tool in awk</summary>
1421<div class="links">
1422<a href="https://acdw.casa/docawk/">read original</a>
1423</div>
1424<div class="content"><p><a href="https://acdw.casa/docawk/">a 'quick and dirty' literate programming tool in awk</a></p>
1425 <p>[https] posted by acdw on August 02, 2022</p></div>
1426<details class="info"><summary>item information</summary>
1427timestamp: 1659450727
1428title: [linkbudz rss feed] a 'quick and dirty' literate programming tool in awk
1429link: https://acdw.casa/docawk/
1430content_type: html
1431id: acdw20220802143207
1432author:
1433enclosure:
1434category: https
1435</details>
1436</details>
1437<details>
1438<summary>[linkbudz rss feed] Wikipedia is a quality resource</summary>
1439<div class="links">
1440<a href="https://en.wikipedia.org/wiki/Category:Wikipedia_slapping_templates">read original</a>
1441</div>
1442<div class="content"><p><a href="https://en.wikipedia.org/wiki/Category:Wikipedia_slapping_templates">Wikipedia is a quality resource</a></p>
1443 <p>[https] posted by lucidiot on August 01, 2022</p></div>
1444<details class="info"><summary>item information</summary>
1445timestamp: 1659380358
1446title: [linkbudz rss feed] Wikipedia is a quality resource
1447link: https://en.wikipedia.org/wiki/Category:Wikipedia_slapping_templates
1448content_type: html
1449id: lucidiot20220801185918
1450author:
1451enclosure:
1452category: https
1453</details>
1454</details>
1455<details>
1456<summary>[linkbudz rss feed] The free and healthy typeface for bread and butter use</summary>
1457<div class="links">
1458<a href="http://vollkorn-typeface.com/">read original</a>
1459</div>
1460<div class="content"><p><a href="http://vollkorn-typeface.com/">The free and healthy typeface for bread and butter use</a></p>
1461 <p>[http] posted by dozens on August 01, 2022</p></div>
1462<details class="info"><summary>item information</summary>
1463timestamp: 1659372207
1464title: [linkbudz rss feed] The free and healthy typeface for bread and butter use
1465link: http://vollkorn-typeface.com/
1466content_type: html
1467id: dozens20220801164327
1468author:
1469enclosure:
1470category: http
1471</details>
1472</details>
1473<details>
1474<summary>[linkbudz rss feed] Open letter to Google Security team from a librarian (warning: GDocs link)</summary>
1475<div class="links">
1476<a href="https://docs.google.com/document/d/1f6HPQbUjslcbjVHkJkAgYmQmBV3PRRHEcx4WL5rxuE8/preview">read original</a>
1477</div>
1478<div class="content"><p><a href="https://docs.google.com/document/d/1f6HPQbUjslcbjVHkJkAgYmQmBV3PRRHEcx4WL5rxuE8/preview">Open letter to Google Security team from a librarian (warning: GDocs link)</a></p>
1479 <p>[https] posted by acdw on August 01, 2022</p></div>
1480<details class="info"><summary>item information</summary>
1481timestamp: 1659370095
1482title: [linkbudz rss feed] Open letter to Google Security team from a librarian (warning: GDocs link)
1483link: https://docs.google.com/document/d/1f6HPQbUjslcbjVHkJkAgYmQmBV3PRRHEcx4WL5rxuE8/preview
1484content_type: html
1485id: acdw20220801160815
1486author:
1487enclosure:
1488category: https
1489</details>
1490</details>
1491<details>
1492<summary>[Brainshit] Les assistants Web de Windows XP</summary>
1493<div class="links">
1494<a href="https://brainshit.fr/read/308">read original</a>
1495</div>
1496<div class="content">À la découverte de quelques assistants très particuliers de Windows XP.</div>
1497<details class="info"><summary>item information</summary>
1498timestamp: 1659218400
1499title: [Brainshit] Les assistants Web de Windows XP
1500link: https://brainshit.fr/read/308
1501content_type: html
1502id: https://brainshit.fr/read/308
1503author: neuron@brainshit.fr (Lucidiot)
1504enclosure:
1505category: Informatique
1506</details>
1507</details>
1508<details>
1509<summary>[linkbudz rss feed] Simple Firewalls with iptables</summary>
1510<div class="links">
1511<a href="http://lambdacreate.com/posts/37">read original</a>
1512</div>
1513<div class="content"><p><a href="http://lambdacreate.com/posts/37">Simple Firewalls with iptables</a></p>
1514 <p>[http] posted by wsinatra on July 29, 2022</p></div>
1515<details class="info"><summary>item information</summary>
1516timestamp: 1659101991
1517title: [linkbudz rss feed] Simple Firewalls with iptables
1518link: http://lambdacreate.com/posts/37
1519content_type: html
1520id: wsinatra20220729133951
1521author:
1522enclosure:
1523category: http
1524</details>
1525</details>
1526<details>
1527<summary>[linkbudz rss feed] The Old School Computer Challenge Rules!</summary>
1528<div class="links">
1529<a href="https://dataswamp.org/~solene/2021-07-07-old-computer-challenge.html">read original</a>
1530</div>
1531<div class="content"><p><a href="https://dataswamp.org/~solene/2021-07-07-old-computer-challenge.html">The Old School Computer Challenge Rules!</a></p>
1532 <p>[https] posted by wsinatra on July 29, 2022</p></div>
1533<details class="info"><summary>item information</summary>
1534timestamp: 1659101724
1535title: [linkbudz rss feed] The Old School Computer Challenge Rules!
1536link: https://dataswamp.org/~solene/2021-07-07-old-computer-challenge.html
1537content_type: html
1538id: wsinatra20220729133524
1539author:
1540enclosure:
1541category: https
1542</details>
1543</details>
1544<details>
1545<summary>[linkbudz rss feed] Mess with DNS</summary>
1546<div class="links">
1547<a href="https://jvns.ca/blog/2021/12/15/mess-with-dns/">read original</a>
1548</div>
1549<div class="content"><p><a href="https://jvns.ca/blog/2021/12/15/mess-with-dns/">Mess with DNS</a></p>
1550 <p>[https] posted by wsinatra on July 29, 2022</p></div>
1551<details class="info"><summary>item information</summary>
1552timestamp: 1659101325
1553title: [linkbudz rss feed] Mess with DNS
1554link: https://jvns.ca/blog/2021/12/15/mess-with-dns/
1555content_type: html
1556id: wsinatra20220729132845
1557author:
1558enclosure:
1559category: https
1560</details>
1561</details>
1562<details>
1563<summary>[linkbudz rss feed] Quirky DNS overview</summary>
1564<div class="links">
1565<a href="https://jvns.ca/blog/2022/02/01/a-dns-resolver-in-80-lines-of-go/">read original</a>
1566</div>
1567<div class="content"><p><a href="https://jvns.ca/blog/2022/02/01/a-dns-resolver-in-80-lines-of-go/">Quirky DNS overview</a></p>
1568 <p>[https] posted by wsinatra on July 29, 2022</p></div>
1569<details class="info"><summary>item information</summary>
1570timestamp: 1659101292
1571title: [linkbudz rss feed] Quirky DNS overview
1572link: https://jvns.ca/blog/2022/02/01/a-dns-resolver-in-80-lines-of-go/
1573content_type: html
1574id: wsinatra20220729132812
1575author:
1576enclosure:
1577category: https
1578</details>
1579</details>
1580<details>
1581<summary>[linkbudz rss feed] Firecracker VM</summary>
1582<div class="links">
1583<a href="https://jvns.ca/blog/2021/01/23/firecracker--start-a-vm-in-less-than-a-second/">read original</a>
1584</div>
1585<div class="content"><p><a href="https://jvns.ca/blog/2021/01/23/firecracker--start-a-vm-in-less-than-a-second/">Firecracker VM</a></p>
1586 <p>[https] posted by wsinatra on July 29, 2022</p></div>
1587<details class="info"><summary>item information</summary>
1588timestamp: 1659100757
1589title: [linkbudz rss feed] Firecracker VM
1590link: https://jvns.ca/blog/2021/01/23/firecracker--start-a-vm-in-less-than-a-second/
1591content_type: html
1592id: wsinatra20220729131917
1593author:
1594enclosure:
1595category: https
1596</details>
1597</details>
1598<details>
1599<summary>[linkbudz rss feed] Recutils, GOOPS and virtual slots</summary>
1600<div class="links">
1601<a href="https://ane.iki.fi/lisp/goops-virtual-slots-and-ffi.html">read original</a>
1602</div>
1603<div class="content"><p><a href="https://ane.iki.fi/lisp/goops-virtual-slots-and-ffi.html">Recutils, GOOPS and virtual slots</a></p>
1604 <p>[https] posted by dozens on July 28, 2022</p></div>
1605<details class="info"><summary>item information</summary>
1606timestamp: 1659052448
1607title: [linkbudz rss feed] Recutils, GOOPS and virtual slots
1608link: https://ane.iki.fi/lisp/goops-virtual-slots-and-ffi.html
1609content_type: html
1610id: dozens20220728235408
1611author:
1612enclosure:
1613category: https
1614</details>
1615</details>
1616<details>
1617<summary>[linkbudz rss feed] Calendar handling with mutt</summary>
1618<div class="links">
1619<a href="https://dacav.roundhousecode.com/blog/2019-11/09-mutt-calendar-and-such.html">read original</a>
1620</div>
1621<div class="content"><p><a href="https://dacav.roundhousecode.com/blog/2019-11/09-mutt-calendar-and-such.html">Calendar handling with mutt</a></p>
1622 <p>[https] posted by wsinatra on July 28, 2022</p></div>
1623<details class="info"><summary>item information</summary>
1624timestamp: 1659030089
1625title: [linkbudz rss feed] Calendar handling with mutt
1626link: https://dacav.roundhousecode.com/blog/2019-11/09-mutt-calendar-and-such.html
1627content_type: html
1628id: wsinatra20220728174129
1629author:
1630enclosure:
1631category: https
1632</details>
1633</details>
1634<details>
1635<summary>[linkbudz rss feed] charmbracelet goodness for shell scripts without go</summary>
1636<div class="links">
1637<a href="https://github.com/charmbracelet/gum">read original</a>
1638</div>
1639<div class="content"><p><a href="https://github.com/charmbracelet/gum">charmbracelet goodness for shell scripts without go</a></p>
1640 <p>[https] posted by dozens on July 28, 2022</p></div>
1641<details class="info"><summary>item information</summary>
1642timestamp: 1659029764
1643title: [linkbudz rss feed] charmbracelet goodness for shell scripts without go
1644link: https://github.com/charmbracelet/gum
1645content_type: html
1646id: dozens20220728173604
1647author:
1648enclosure:
1649category: https
1650</details>
1651</details>
1652<details>
1653<summary>[linkbudz rss feed] AI Protein Folding? Nifty.</summary>
1654<div class="links">
1655<a href="https://www.deepmind.com/blog/alphafold-reveals-the-structure-of-the-protein-universe">read original</a>
1656</div>
1657<div class="content"><p><a href="https://www.deepmind.com/blog/alphafold-reveals-the-structure-of-the-protein-universe">AI Protein Folding? Nifty.</a></p>
1658 <p>[https] posted by marcus on July 28, 2022</p></div>
1659<details class="info"><summary>item information</summary>
1660timestamp: 1659017104
1661title: [linkbudz rss feed] AI Protein Folding? Nifty.
1662link: https://www.deepmind.com/blog/alphafold-reveals-the-structure-of-the-protein-universe
1663content_type: html
1664id: marcus20220728140504
1665author:
1666enclosure:
1667category: https
1668</details>
1669</details>
1670<details>
1671<summary>[linkbudz rss feed] Velocipedia - bicycles based on people's attempts to draw them from memory</summary>
1672<div class="links">
1673<a href="https://www.gianlucagimini.it/portfolio-item/velocipedia/">read original</a>
1674</div>
1675<div class="content"><p><a href="https://www.gianlucagimini.it/portfolio-item/velocipedia/">Velocipedia - bicycles based on people's attempts to draw them from memory</a></p>
1676 <p>[https] posted by mio on July 28, 2022</p></div>
1677<details class="info"><summary>item information</summary>
1678timestamp: 1659016198
1679title: [linkbudz rss feed] Velocipedia - bicycles based on people's attempts to draw them from memory
1680link: https://www.gianlucagimini.it/portfolio-item/velocipedia/
1681content_type: html
1682id: mio20220728134958
1683author:
1684enclosure:
1685category: https
1686</details>
1687</details>
1688<details>
1689<summary>[linkbudz rss feed] Zero to chiptune in one hour (2017)</summary>
1690<div class="links">
1691<a href="https://media.ccc.de/v/SHA2017-175-zero_to_chiptune_in_one_hour">read original</a>
1692</div>
1693<div class="content"><p><a href="https://media.ccc.de/v/SHA2017-175-zero_to_chiptune_in_one_hour">Zero to chiptune in one hour (2017)</a></p>
1694 <p>[https] posted by mio on July 28, 2022</p></div>
1695<details class="info"><summary>item information</summary>
1696timestamp: 1658972062
1697title: [linkbudz rss feed] Zero to chiptune in one hour (2017)
1698link: https://media.ccc.de/v/SHA2017-175-zero_to_chiptune_in_one_hour
1699content_type: html
1700id: mio20220728013422
1701author:
1702enclosure:
1703category: https
1704</details>
1705</details>
1706<details>
1707<summary>[linkbudz rss feed] The Ultimate Amiga 500 Talk: Amiga Hardware Design and Programming (2015)</summary>
1708<div class="links">
1709<a href="https://media.ccc.de/v/32c3-7468-the_ultimate_amiga_500_talk">read original</a>
1710</div>
1711<div class="content"><p><a href="https://media.ccc.de/v/32c3-7468-the_ultimate_amiga_500_talk">The Ultimate Amiga 500 Talk: Amiga Hardware Design and Programming (2015)</a></p>
1712 <p>[https] posted by mio on July 28, 2022</p></div>
1713<details class="info"><summary>item information</summary>
1714timestamp: 1658972022
1715title: [linkbudz rss feed] The Ultimate Amiga 500 Talk: Amiga Hardware Design and Programming (2015)
1716link: https://media.ccc.de/v/32c3-7468-the_ultimate_amiga_500_talk
1717content_type: html
1718id: mio20220728013342
1719author:
1720enclosure:
1721category: https
1722</details>
1723</details>
1724<details>
1725<summary>[linkbudz rss feed] The Ultimate Game Boy Talk (2016)</summary>
1726<div class="links">
1727<a href="https://media.ccc.de/v/33c3-8029-the_ultimate_game_boy_talk">read original</a>
1728</div>
1729<div class="content"><p><a href="https://media.ccc.de/v/33c3-8029-the_ultimate_game_boy_talk">The Ultimate Game Boy Talk (2016)</a></p>
1730 <p>[https] posted by mio on July 28, 2022</p></div>
1731<details class="info"><summary>item information</summary>
1732timestamp: 1658971950
1733title: [linkbudz rss feed] The Ultimate Game Boy Talk (2016)
1734link: https://media.ccc.de/v/33c3-8029-the_ultimate_game_boy_talk
1735content_type: html
1736id: mio20220728013230
1737author:
1738enclosure:
1739category: https
1740</details>
1741</details>
1742<details>
1743<summary>[linkbudz rss feed] Cosmopolitan C</summary>
1744<div class="links">
1745<a href="https://justine.lol/cosmopolitan/">read original</a>
1746</div>
1747<div class="content"><p><a href="https://justine.lol/cosmopolitan/">Cosmopolitan C</a></p>
1748 <p>[https] posted by acdw on July 27, 2022</p></div>
1749<details class="info"><summary>item information</summary>
1750timestamp: 1658946453
1751title: [linkbudz rss feed] Cosmopolitan C
1752link: https://justine.lol/cosmopolitan/
1753content_type: html
1754id: acdw20220727182733
1755author:
1756enclosure:
1757category: https
1758</details>
1759</details>
1760<details>
1761<summary>[linkbudz rss feed] The History of &</summary>
1762<div class="links">
1763<a href="https://www.merriam-webster.com/words-at-play/the-history-of-ampersand">read original</a>
1764</div>
1765<div class="content"><p><a href="https://www.merriam-webster.com/words-at-play/the-history-of-ampersand">The History of &</a></p>
1766 <p>[https] posted by acdw on July 27, 2022</p></div>
1767<details class="info"><summary>item information</summary>
1768timestamp: 1658933616
1769title: [linkbudz rss feed] The History of &
1770link: https://www.merriam-webster.com/words-at-play/the-history-of-ampersand
1771content_type: html
1772id: acdw20220727145336
1773author:
1774enclosure:
1775category: https
1776</details>
1777</details>
1778<details>
1779<summary>[linkbudz rss feed] TIC-80 byte jam</summary>
1780<div class="links">
1781<a href="https://media.ccc.de/v/mch2022-226-tic-80-byte-jam">read original</a>
1782</div>
1783<div class="content"><p><a href="https://media.ccc.de/v/mch2022-226-tic-80-byte-jam">TIC-80 byte jam</a></p>
1784 <p>[https] posted by mio on July 26, 2022</p></div>
1785<details class="info"><summary>item information</summary>
1786timestamp: 1658877880
1787title: [linkbudz rss feed] TIC-80 byte jam
1788link: https://media.ccc.de/v/mch2022-226-tic-80-byte-jam
1789content_type: html
1790id: mio20220726232440
1791author:
1792enclosure:
1793category: https
1794</details>
1795</details>
1796<details>
1797<summary>[linkbudz rss feed] Rocking the Web Bloat: Modern Gopher, Gemini and the Small Internet</summary>
1798<div class="links">
1799<a href="https://media.ccc.de/v/mch2022-83-rocking-the-web-bloat-modern-gopher-gemini-and-the-small-internet">read original</a>
1800</div>
1801<div class="content"><p><a href="https://media.ccc.de/v/mch2022-83-rocking-the-web-bloat-modern-gopher-gemini-and-the-small-internet">Rocking the Web Bloat: Modern Gopher, Gemini and the Small Internet</a></p>
1802 <p>[https] posted by mio on July 26, 2022</p></div>
1803<details class="info"><summary>item information</summary>
1804timestamp: 1658877076
1805title: [linkbudz rss feed] Rocking the Web Bloat: Modern Gopher, Gemini and the Small Internet
1806link: https://media.ccc.de/v/mch2022-83-rocking-the-web-bloat-modern-gopher-gemini-and-the-small-internet
1807content_type: html
1808id: mio20220726231116
1809author:
1810enclosure:
1811category: https
1812</details>
1813</details>
1814<details>
1815<summary>[linkbudz rss feed] plop a license in ur projects</summary>
1816<div class="links">
1817<a href="https://git.acdw.net/licensor/">read original</a>
1818</div>
1819<div class="content"><p><a href="https://git.acdw.net/licensor/">plop a license in ur projects</a></p>
1820 <p>[https] posted by acdw on July 26, 2022</p></div>
1821<details class="info"><summary>item information</summary>
1822timestamp: 1658867912
1823title: [linkbudz rss feed] plop a license in ur projects
1824link: https://git.acdw.net/licensor/
1825content_type: html
1826id: acdw20220726203832
1827author:
1828enclosure:
1829category: https
1830</details>
1831</details>
1832<details>
1833<summary>[linkbudz rss feed] A doctor for your Palm PDAs</summary>
1834<div class="links">
1835<a href="https://www.palmdr.com/cart/">read original</a>
1836</div>
1837<div class="content"><p><a href="https://www.palmdr.com/cart/">A doctor for your Palm PDAs</a></p>
1838 <p>[https] posted by wsinatra on July 26, 2022</p></div>
1839<details class="info"><summary>item information</summary>
1840timestamp: 1658864880
1841title: [linkbudz rss feed] A doctor for your Palm PDAs
1842link: https://www.palmdr.com/cart/
1843content_type: html
1844id: wsinatra20220726194800
1845author:
1846enclosure:
1847category: https
1848</details>
1849</details>
1850<details>
1851<summary>[linkbudz rss feed] rewrite it in rust, but in french</summary>
1852<div class="links">
1853<a href="https://github.com/bnjbvr/rouille">read original</a>
1854</div>
1855<div class="content"><p><a href="https://github.com/bnjbvr/rouille">rewrite it in rust, but in french</a></p>
1856 <p>[https] posted by lucidiot on July 26, 2022</p></div>
1857<details class="info"><summary>item information</summary>
1858timestamp: 1658864623
1859title: [linkbudz rss feed] rewrite it in rust, but in french
1860link: https://github.com/bnjbvr/rouille
1861content_type: html
1862id: lucidiot20220726194343
1863author:
1864enclosure:
1865category: https
1866</details>
1867</details>
1868<details>
1869<summary>[Brainshit] Trouver des synonymes en craquant un orteil</summary>
1870<div class="links">
1871<a href="https://brainshit.fr/read/312">read original</a>
1872</div>
1873<div class="content">Non, mon cerveau n'est pas en train de craquer. Enfin… pas cette fois.</div>
1874<details class="info"><summary>item information</summary>
1875timestamp: 1658786400
1876title: [Brainshit] Trouver des synonymes en craquant un orteil
1877link: https://brainshit.fr/read/312
1878content_type: html
1879id: https://brainshit.fr/read/312
1880author: neuron@brainshit.fr (Lucidiot)
1881enclosure:
1882category: Informatique
1883</details>
1884</details>
1885<details>
1886<summary>[Dozens and Dragons] It is Time To Plant The Beans</summary>
1887<div class="links">
1888<a href="https://dozensanddragons.neocities.org/30.html">read original</a>
1889</div>
1890<div class="content">actual play</div>
1891<details class="info"><summary>item information</summary>
1892timestamp: 1658721600
1893title: [Dozens and Dragons] It is Time To Plant The Beans
1894link: https://dozensanddragons.neocities.org/30.html
1895content_type: html
1896id: https://dozensanddragons.neocities.org/30.html
1897author:
1898enclosure:
1899category:
1900</details>
1901</details>
1902<details>
1903<summary>[lipu pi jan Niko] Minecraft 1.14 was a failure, but here's how to (maybe) improve it</summary>
1904<div class="links">
1905<a href="https://tilde.town/~nihilazo/log/minecraftvillage.html">read original</a>
1906</div>
1907<div class="content">Minecraft 1.14: Village and Pillage was meant to make villages actually interesting to players and increase their importance and make players actually care about them. But as we reach 1.19 and beyond, it’s clear that this didn’t work, and most players still don’t care about villages beyond being a place to pillage earlygame items, sleep the first few nights, and maybe trap a few villagers to use in farms. So why did it fail?</div>
1908<details class="info"><summary>item information</summary>
1909timestamp: 1658707200
1910title: [lipu pi jan Niko] Minecraft 1.14 was a failure, but here's how to (maybe) improve it
1911link: https://tilde.town/~nihilazo/log/minecraftvillage.html
1912content_type: html
1913id: https://tilde.town/~nihilazo/log/minecraftvillage.html
1914author:
1915enclosure:
1916category:
1917</details>
1918</details>
1919<details>
1920<summary>[Tilde Whirl Tildeverse Podcast] episode 9</summary>
1921<div class="links">
1922<a href="https://tilde.town/~dozens/podcast/2022-07-24-episode-9-tomasino.html">read original</a>
1923<a href="https://archive.org/download/tilderwhirl-S01E01/tildewhirl-s01e09.mp3">enclosure</a>
1924</div>
1925<div class="content"><h2 id="notes">notes</h2>
1926<p>look, it’s tomasino!</p>
1927<ul>
1928<li><a href="https://tomasino.org/" class="uri">https://tomasino.org/</a></li>
1929<li><a href="https://tilde.zone/@tomasino" class="uri">https://tilde.zone/@tomasino</a></li>
1930<li><a href="https://cosmic.voyage/" class="uri">https://cosmic.voyage/</a></li>
1931</ul>
1932<p>We talk about a great many things including, of course, tildes, and also vim vs. emacs, linux and bsd, gopher and gemini, games, minimalism, community, magic, and more!</p>
1933<!-- this episode's secret phrase is 'pepperoni pizza' //-->
1934<p>Your secret message for this episode is:</p>
1935<pre><code>zdv nhwb h uxd fe lfwb jnhejb dl mvbttfem xnfjn lfembct f nhwb aqhjbk kdxe hek xfeefem h efjb tvcacftb</code></pre>
1936<h2 id="segments">segments</h2>
1937<ul>
1938<li>poetry corner – pessimism is for lightweights
1939<ul>
1940<li><a href="http://www.salenagodden.co.uk/2018/01/happy-new-year-pessimism-is-for.html" class="uri">http://www.salenagodden.co.uk/2018/01/happy-new-year-pessimism-is-for.html</a></li>
1941<li><a href="https://blog.peakrill.com/2021/12/the-wonderist-character-class.html" class="uri">https://blog.peakrill.com/2021/12/the-wonderist-character-class.html</a></li>
1942</ul></li>
1943<li>science fun fact corner – crabs – <a href="https://xkcd.com/2314/" class="uri">https://xkcd.com/2314/</a></li>
1944<li>magic and divination – iching</li>
1945<li>story time – joneworlds chapters 21 - 25 – &lt;gemini://republic.circumlunar.space/users/joneworlds/2020-12-21-throwing-pumpkins.gmi&gt;</li>
1946<li>hey gamers! – finger rpg – <a href="gopher://gopher.black/0/games/systems/microrpg/challenge.txt" class="uri">gopher://gopher.black/0/games/systems/microrpg/challenge.txt</a></li>
1947<li>happy birthday</li>
1948<li>letters from our listeners – <a href="https://www.seriouseats.com/the-case-for-bad-coffee" class="uri">https://www.seriouseats.com/the-case-for-bad-coffee</a> <!-- didn't get to these ones
1949- [ ] a message from our sponsors
1950- [ ] see you in the funny papers
1951- [ ] mindfulness and meditation
1952- [ ] food and wine
1953// --></li>
1954</ul>
1955<h2 id="links">links</h2>
1956<p>Stuff we talked about on the show</p>
1957<ul>
1958<li><a href="http://sdf.org/" class="uri">http://sdf.org/</a></li>
1959<li><a href="https://kakoune.org/" class="uri">https://kakoune.org/</a></li>
1960<li><a href="https://colemak.com/" class="uri">https://colemak.com/</a></li>
1961<li><a href="https://first20hours.com/typing/" class="uri">https://first20hours.com/typing/</a></li>
1962<li><a href="https://linux.die.net/man/1/dash" class="uri">https://linux.die.net/man/1/dash</a></li>
1963<li><a href="https://gemini.circumlunar.space/" class="uri">https://gemini.circumlunar.space/</a></li>
1964<li><a href="https://gemlog.blue/" class="uri">https://gemlog.blue/</a></li>
1965<li><a href="https://fate-srd.com/fate-core" class="uri">https://fate-srd.com/fate-core</a></li>
1966<li><a href="https://evilhat.com/product/romance-in-the-air/" class="uri">https://evilhat.com/product/romance-in-the-air/</a></li>
1967<li>gemini://campaignwiki.org/play/ijirait</li>
1968<li><a href="gopher://gopher.black/1/cyoa" class="uri">gopher://gopher.black/1/cyoa</a></li>
1969<li><a href="https://archive.tilderadio.org/tomasino/" class="uri">https://archive.tilderadio.org/tomasino/</a></li>
1970<li><a href="https://archives.anonradio.net/i2018/index.html#tomasino" class="uri">https://archives.anonradio.net/i2018/index.html#tomasino</a></li>
1971<li><a href="https://cubicle7games.com/our-games/lone-wolf-adventure-game/" class="uri">https://cubicle7games.com/our-games/lone-wolf-adventure-game/</a></li>
1972<li><a href="https://www.ironswornrpg.com/" class="uri">https://www.ironswornrpg.com/</a></li>
1973<li><a href="https://en.wikipedia.org/wiki/Advanced_Fighting_Fantasy" class="uri">https://en.wikipedia.org/wiki/Advanced_Fighting_Fantasy</a></li>
1974<li><a href="https://noroadhome.itch.io/alone-among-the-stars" class="uri">https://noroadhome.itch.io/alone-among-the-stars</a></li>
1975<li><a href="https://armandah.itch.io/xenoarcheology" class="uri">https://armandah.itch.io/xenoarcheology</a></li>
1976<li><a href="gopher://gopher.black/1/explorations" class="uri">gopher://gopher.black/1/explorations</a></li>
1977<li><a href="https://divination.com/iching/lookup/" class="uri">https://divination.com/iching/lookup/</a></li>
1978<li><a href="https://archive.org/details/ichingclarifiedp00sect" class="uri">https://archive.org/details/ichingclarifiedp00sect</a></li>
1979<li><a href="https://xeiaso.net/blog/tarot-for-hackers-2019-07-24" class="uri">https://xeiaso.net/blog/tarot-for-hackers-2019-07-24</a></li>
1980<li><a href="https://xeiaso.net/blog/chaos-magick-debugging-2018-11-13" class="uri">https://xeiaso.net/blog/chaos-magick-debugging-2018-11-13</a></li>
1981</ul>
1982<h2 id="sources">sources</h2>
1983<p>birthday song</p>
1984<ul>
1985<li><a href="https://freemusicarchive.org/music/Happy_Birthday_Song_Contest/The_New_Birthday_Song_Contest/Faerie_Birthday_Wish/" class="uri">https://freemusicarchive.org/music/Happy_Birthday_Song_Contest/The_New_Birthday_Song_Contest/Faerie_Birthday_Wish/</a></li>
1986<li><a href="https://freesound.org/people/Victor_Natas/sounds/553481/" class="uri">https://freesound.org/people/Victor_Natas/sounds/553481/</a></li>
1987<li><a href="https://freesound.org/people/Victor_Natas/sounds/547053/" class="uri">https://freesound.org/people/Victor_Natas/sounds/547053/</a></li>
1988<li><a href="https://freesound.org/people/OllieOllie/sounds/262351/" class="uri">https://freesound.org/people/OllieOllie/sounds/262351/</a></li>
1989<li><a href="https://freesound.org/people/shelbyshark/sounds/512513/" class="uri">https://freesound.org/people/shelbyshark/sounds/512513/</a></li>
1990<li><a href="https://freesound.org/people/newlocknew/sounds/584952/" class="uri">https://freesound.org/people/newlocknew/sounds/584952/</a></li>
1991<li><a href="https://freesound.org/people/newlocknew/sounds/584953/" class="uri">https://freesound.org/people/newlocknew/sounds/584953/</a></li>
1992<li><a href="https://freesound.org/people/nomiqbomi/sounds/579259/" class="uri">https://freesound.org/people/nomiqbomi/sounds/579259/</a></li>
1993<li><a href="https://freesound.org/people/nomiqbomi/sounds/579258/" class="uri">https://freesound.org/people/nomiqbomi/sounds/579258/</a></li>
1994<li><a href="https://freesound.org/people/nomiqbomi/sounds/579265/" class="uri">https://freesound.org/people/nomiqbomi/sounds/579265/</a></li>
1995<li><a href="https://freesound.org/people/nomiqbomi/sounds/579266/" class="uri">https://freesound.org/people/nomiqbomi/sounds/579266/</a></li>
1996<li><a href="https://freesound.org/people/Victor_Natas/sounds/544897/" class="uri">https://freesound.org/people/Victor_Natas/sounds/544897/</a></li>
1997</ul></div>
1998<details class="info"><summary>item information</summary>
1999timestamp: 1658689932
2000title: [Tilde Whirl Tildeverse Podcast] episode 9
2001link: https://tilde.town/~dozens/podcast/2022-07-24-episode-9-tomasino.html
2002content_type: html
2003id: Thu, 24 July 2022 12:12:12 -0700
2004author:
2005enclosure: https://archive.org/download/tilderwhirl-S01E01/tildewhirl-s01e09.mp3
2006category:
2007</details>
2008</details>
2009<details>
2010<summary>[~lucidiot's wiki] Compiled Qt translations</summary>
2011<div class="links">
2012<a href="https://envs.net/~lucidiot/qm.html">read original</a>
2013</div>
2014<div class="content"></div>
2015<details class="info"><summary>item information</summary>
2016timestamp: 1658594619
2017title: [~lucidiot's wiki] Compiled Qt translations
2018link: https://envs.net/~lucidiot/qm.html
2019content_type:
2020id: https://envs.net/~lucidiot/qm.html
2021author:
2022enclosure:
2023category:
2024</details>
2025</details>
2026<details>
2027<summary>[~lucidiot's wiki] Agora Nomic</summary>
2028<div class="links">
2029<a href="https://envs.net/~lucidiot/agoranomic.html">read original</a>
2030</div>
2031<div class="content"></div>
2032<details class="info"><summary>item information</summary>
2033timestamp: 1658594498
2034title: [~lucidiot's wiki] Agora Nomic
2035link: https://envs.net/~lucidiot/agoranomic.html
2036content_type:
2037id: https://envs.net/~lucidiot/agoranomic.html
2038author:
2039enclosure:
2040category:
2041</details>
2042</details>
2043<details>
2044<summary>[(lambda (x) (create x))] Simple Iptables Firewalls</summary>
2045<div class="links">
2046<a href="https://lambdacreate.com/posts/37">read original</a>
2047</div>
2048<div class="content"><h2>Simple Iptables Firewalls</h2>
2049<h3>It doesn't have to be scary &middot; July 23rd, 2022</h3>
2050
2051<p>A while back I talked about documenting some of the things I've been learning from my LFCE studying, I think if I've gotten to a point where I feel comfortable writing about a topic then I'm likely prepared to test on that subject too. So let's talk a little bit about iptables!</p>
2052
2053<h3>What is it?</h3>
2054
2055<p>Iptables is simply a firewall software, and unfortunately it gets a reputation for being complicated and confusing. It's definitely not a point and click solution like you get with UFW or Firewalld, but it powers both of those solutions, so why shouldn't you learn it? Even something like Alpine's Awall is powered by iptables, and while I have a personal affinity for Awall, iptables is still the root; if you understand how it works it doesn't much matter what you're dealing with. You can easily figure out how a UFW, Firewalld, Awall, or any other iptables backed firewall software works, and that includes plenty of the off the shelf enterprise solutions out there. Mikrotik's for example work this way, and their custom tooling follows very closely alongside iptables.</p>
2056
2057<p>Additionally there are some really neat features you can leverage with iptables, such as rate-limiting by local user, much like you'd do inside of something like a Fortigate's NGFW. Nifty, and free!</p>
2058
2059<h3>My Droid's Firewall</h3>
2060
2061<p>Here's an example of a really simple workstation firewall. Characteristically its operation is simple, it allows any sort of outbound traffic, and only allows certain types of inbound traffic. I'd say this is likely the simplest and most relatable configuration to frame iptables with. Any laptop, desktop, or even something esoteric like the droid can be considered a workstation if you're working on it regularly. Typically you want anything you do on that system to be sanctioned outwards, but you want to more granularly control which ports are open and what can access the resources on your workstation. Unlike a server the expectation is that traffic originates outwards to multiple points, and inbound traffic is rare and should meet expected parameters.</p>
2062
2063<div class="codeSnippet">
2064 <pre><code>
2065*filter
2066:INPUT DROP [0:0]
2067:FORWARD DROP [0:0]
2068:OUTPUT ACCEPT [0:0]
2069#Route established and related traffic
2070-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
2071-A INPUT -i lo -j ACCEPT
2072#Allow SSH
2073-A INPUT -i wlan0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
2074-A INPUT -i wlan0 -p udp -m state --state NEW -m udp --dport 60000:61000 -j ACCEPT
2075#Allow Lapis Dev
2076-A INPUT -s 192.168.88.0/24 -i wlan0 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
2077#Allow fserv
2078-A INPUT -i wlan0 -p tcp -m state --state NEW -m tcp --dport 8090 -j ACCEPT
2079#Allow PNTP
2080-A INPUT -i wlan0 -p tcp -m state --state NEW -m tcp --dport 8091 -j ACCEPT
2081#Drop other unlisted input, drop forwards, accept output
2082-A INPUT -j DROP
2083-A FORWARD -j DROP
2084-A OUTPUT -j ACCEPT
2085COMMIT
2086 </code></pre>
2087</div>
2088
2089<p>Nice and short, maybe not as easy to grok as the pretty UFW output, but I promise it's not that bad either. These rules are in the format that iptables-save expects, you can pretty much append "sudo iptables" to any of the -A CHAIN rules there and it'll add that specific rule temporarily to your iptables ruleset in the specified chain.</p>
2090
2091<div class="codeSnippet">
2092 <pre><code>
2093*filter
2094:INPUT DROP [0:0]
2095:FORWARD DROP [0:0]
2096:OUTPUT ACCEPT [0:0]
2097 </code></pre>
2098</div>
2099
2100<p>At the very front we define our filter table it contains three chains by default, these chains essentially store our rules and let us think about our firewall in a consistent way. The default chains are pretty straight forward to work with, INPUT is anything coming into the firewall, FORWARD is anything that is going through our firewall, and OUTPUT is anything leaving the firewall. A quick glance at the full ruleset and you'll note that we use all three chains. Lets look at just the top and bottom of our ruleset to see those in action.</p>
2101
2102<div class="codeSnippet">
2103 <pre><code>
2104#Route established and related traffic
2105-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
2106-A INPUT -i lo -j ACCEPT
2107#Drop other unlisted input, drop forwards, accept output
2108-A INPUT -j DROP
2109-A FORWARD -j DROP
2110-A OUTPUT -j ACCEPT
2111COMMIT
2112 </code></pre>
2113</div>
2114
2115<p>Since iptables rules are processed from the top down (unless a JUMP to a specific chain is defined) it's easy to build out traffic exclusions. The tail end of the droid's ruleset is precisely this, you can read it as follows:</p>
2116
2117<ul>
2118 <li>Accept any traffic that is already ESTABLISHED or RELATED to existing traffic</li>
2119 <li>Accept any sort of input from our lo interface</li>
2120 <li>Drop any INPUT traffic that doesn't match accepted INPUT rules above</li>
2121 <li>Drop any FORWARD traffic that doesn't match accepted FORWARD rules above</li>
2122 <li>Accept ALL OUTPUT traffic coming from the system</li>
2123</ul>
2124
2125<p>So if our ruleset only defined these items it would ACCEPT any sort of OUTBOUND traffic, anything that uses the interface lo, and DROP any INBOUND or FORWARD packets, effectively blocking the outside world but allow our own traffic to tentatively find its way into the wild unknown. This is actually a solid baseline for a simple but effective firewall. But we can't just shut ourselves off from the world right? If you're like me you really need to be able to SSH into every system you own, or maybe you need to expose an HTTP port for testing a project.</p>
2126
2127<div class="codeSnippet">
2128 <pre><code>
2129#Allow SSH
2130-A INPUT -i wlan0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
2131 </code></pre>
2132</div>
2133
2134<p>Fortunately those use cases are easy to define, the above example can be read as follows. Append to the INPUT chain to allow any NEW traffic coming into interface wlan0 of packet type TCP bound for port 22. We specifically bind this to the NEW state because we allow ESTABLISHED and RELATED traffic at the top, so it's redundant to look for anything else to allow new SSH connections.</p>
2135
2136<div class="codeSnippet">
2137 <pre><code>
2138#Allow MOSH
2139-A INPUT -i wlan0 -p udp -m state --state NEW -m udp --dport 60000:61000 -j ACCEPT
2140 </code></pre>
2141</div>
2142
2143<p>Some applications require multiple ports to function, such as Mobile Shell or Mosh for short. That application looks for a UDP port inbetween 60000-61000, so we give out --dport arg a range of min:max to work with, but otherwise the rule is exactly the same as a the simpler SSH rule.</p>
2144
2145<div class="codeSnippet">
2146 <pre><code>
2147#Allow Lapis Dev
2148-A INPUT -s 192.168.88.0/24 -i wlan0 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
2149 </code></pre>
2150</div>
2151
2152<p>No perhaps we want to filter based on where traffic is coming from, for instance I like to run the Lapis application for my blog when I'm traveling. I can always access it on 127.0.0.1 because we allow all traffic from -i lo, but I don't need random strangers on a public wifi network to see my in-dev work. Adding a -s 192.168.88.0/24 restricts the INPUT to any addresses in that subnet. So anything on my home LAN can access that port, but nothing else. Obviously that's not perfect design, there easily could be a public wifi network that uses that subnet, as it's Mikrtoik's default DHCP address range. You should also consider your firewall a single layer in a multi-layer defence!</p>
2153
2154<p>The syntax is a little weird, but if you break each argument of the rule down it starts to make sense. Here's how I read these things.</p>
2155
2156<div class="codeSnippet">
2157 <pre><code>
2158-A INPUT
2159Append to chain INPUT
2160
2161-s 192.168.88.0/24
2162Any traffic with source IP of subnet 192.168.88.0/24
2163
2164-i wlan0
2165Inbound from interface wlan0
2166
2167-p tcp
2168That is TCP protocol traffic
2169
2170-m state --state NEW
2171And is NEW traffic
2172
2173-m tcp --dport 8080
2174Which is TCP traffic destined to port 8080
2175
2176-j ACCEPT
2177If all of that checks out, jump to the ACCEPT chain, and push the traffic through.
2178 </code></pre>
2179</div>
2180
2181<p>Phew, yeah there's a reason that people look at iptables and think "I can't make heds or tails of this" it's extremely verbose, and once you move out of simple usecases like this and into something like a full blown NATing firewall configuration it can be a little scary. But that verbosity is your friend! These rules state very explicitly what they do and do not do. And each flag can be read as a specific check that's performed on the traffic. I'm honestly very happy to have moved away from UFW for my systems and now maintain iptables rules for all of the systems in my homelab. The flat file configuration nature works perfectly for simple provisioning, and the full rulesets can be revisioned in git for long term maintenance.</p>
2182
2183<p>I'll revisit this topic sometime in the future so we can work through desigining a NATing firewall with iptables. There's a lot of dependent systems there too, so that will give us a chance to dig into DHCPD, and BIND at very least. I've got an idea in mind, it just needs to be fleshed out before I actually bring it to the blog.</p></div>
2184<details class="info"><summary>item information</summary>
2185timestamp: 1658577600
2186title: [(lambda (x) (create x))] Simple Iptables Firewalls
2187link: https://lambdacreate.com/posts/37
2188content_type: html
2189id: https://lambdacreate.com/posts/37
2190author:
2191enclosure:
2192category:
2193</details>
2194</details>
2195<details>
2196<summary>[linkbudz rss feed] Racket Summer #lang Party</summary>
2197<div class="links">
2198<a href="https://racket.discourse.group/t/summer-lang-party/1128">read original</a>
2199</div>
2200<div class="content"><p><a href="https://racket.discourse.group/t/summer-lang-party/1128">Racket Summer #lang Party</a></p>
2201 <p>[https] posted by elioat on July 22, 2022</p></div>
2202<details class="info"><summary>item information</summary>
2203timestamp: 1658454815
2204title: [linkbudz rss feed] Racket Summer #lang Party
2205link: https://racket.discourse.group/t/summer-lang-party/1128
2206content_type: html
2207id: elioat20220722015335
2208author:
2209enclosure:
2210category: https
2211</details>
2212</details>
2213<details>
2214<summary>[~mio_gemlog] Old Computer Challenge, July 10-17 2022</summary>
2215<div class="links">
2216<a href="gemini://tilde.town/~mio/log/2022-07-21-occ-2022.gmi">read original</a>
2217</div>
2218<div class="content"># Old Computer Challenge, July 10-17 2022
2219
2220The first time I heard about solene's Old Computer Challenge was through a great conversation with wsinatra as well as his detailed blog post at lambdacreate recounting his experience with the first challenge held the previous year. The rules in this year's challenge included 1 hour maximum of internet connectivity, in a nod to the days of dialup modem internet.
2221
2222The parameters:
2223
2224* Device: Asus Chromebook C201
2225 * RAM: 512M of 2G, soft-limited via earlyoom
2226 * CPU: 1 of 4 cores, soft-limited via ulimit CPU time (1m for 100% CPU)
2227 * OS: Alpine Linux
2228* Internet time limit: 1 hour, manually logged
2229* Exemptions:
2230 * Messaging/calls over a mobile device
2231 * IRC messaging over SSH (Day 3 onwards)
2232
2233My participation was mostly symbolic. Life caught up a few days before the challenge was set to start and I didn't get around to dusting off any cool old hardware for the occasion, but eventually decided to try it with my humble Chromebook that was already in use for almost 5 years, though its factory age is close to 9 years since its first release in 2013.
2234
2235One thing people might notice is none of the specifications were hard-limited. On day 1 I did a little searching for a way to limit the RAM and CPU usage on a per-user basis. The closest thing was cgroups, which was apparently managed by systemd, while Alpine used openrc. Settled on soft limits that would theoretically kick in if the resource bounds were exceeded for too long, though ideally usage would be reined in to not allow it to happen. It was also possible to enforce the connection time limit with a timer-controlled firewall, but for my purposes it seemed unnecessary. Manually noting how much time was used on certain online activities would offer some awareness to how and where I was spending the time.
2236
2237Overall I liked being able to jump in without a lot of preparation besides adding a new user and pulling in some config files to make it usable for the week. For the occasion I briefly thought about running a different Linux from a list of distros known to work on the Chromebook that I haven't tried yet and would probably do it for another day, but took the challenge to further check and adjust an approach towards lighter resource usage and exploring the smol web that I had been considering for some time. A few questions I had were:
2238
2239* What kind of internet experiences would I like to have?
2240* What, if anything, would I miss by computing with a predominantly terminal interface?
2241* Were there applications or activities I would have liked to do that were infeasible due to the resource limits?
2242
2243The exemptions to the internet time limit were made for social reasons. Some people would probably not count talk/messaging time on mobile devices, but the challenge mentioned the 1 hour was shared across all devices, so exceptions were noted in the parameters. My view of the limit was to show how the internet can be used resourcefully or in other positive ways, e.g. to connect people on different platforms and protocols, not to make people feel isolated as the week passed in part due to being unable to take calls or text their friends.
2244
2245=> https://dataswamp.org/~solene/2021-07-07-old-computer-challenge.html Old Computer Challenge
2246=> http://lambdacreate.com/posts/26 wsinatra's blog post at lambdacreate
2247=> https://dataswamp.org/~solene/2022-07-01-oldcomputerchallenge-v2-rtc.html this year's challenge
2248=> https://github.com/nikolas-n/GNU-Linux-on-Asus-C201-Chromebook list of distros known working on the Asus C201 Chromebook
2249
2250
2251## Day 1
2252
2253* Internet time: 45m
2254 * 20m - looked up resource limit settings, added system-wide fonts
2255 * 10m - downloaded podcasts from a mobile device
2256 * 10m - checked mail, prefetched RSS feeds, checked IRC
2257 * 5m - checked local fediverse
2258* RAM: 175M
2259* CPU: 0.30
2260
2261Since it was my first time doing the challenge, one initial thing to do was to take stock of current resource usage. According to `htop`, the most memory-consuming applications were:
2262
2263* Graphical web browser (114M - 733M) - cut out 733M by closing the browser with 10-15 tabs open. At least it was still usable with 1 tab open, ~114M with a static page and no Javascript.
2264* RSS feed reader (22M - 200M) - 80M a 150M db with entries accumulated over a few years and about 30 feeds, which after a few days open became 200M. 22M for a 6M db with the same number of feeds after moving the sqlite db and letting it recreate a new one.
2265* Display server and window manager (65M - 98M) - 98M with a few GUI apps open, dropped to 65M with only the terminal emulator open.
2266* IRC client (28M - 61M) - 61M with a Matrix plugin enabled, 28M without the plugin. The only other working CLI Matrix client found that supported end-to-end encryption does not yet support Space rooms and had a few cosmetic bugs. Running the flagship web UI client in a browser is not an option for the experiment, too resource-heavy. Skipped the Matrix plugin.
2267* Password manager (60M) - replaceable with a CLI version, but closed for now when not in use.
2268* PDF viewer (58M) - to be supplemented with a CLI version when reading text-only files.
2269* Clients that were usually offloaded to a SSH server: mail, RSS, IRC and Mastodon. Of those, RSS and Mastodon will be added to the computer to be counted in the baseline RAM usage.
2270
2271Baseline RAM usage was in the range of 146M - 181M using mainly CLI applications:
2272
2273* A multiplexer with a file manager, text editor, clients for Gemini, HTTPS web, RSS and Mastodon.
2274* A few utilities, e.g. SSH, NetworkManager, language input bus, process monitor.
2275
2276Including mail and IRC clients would increase the baseline usage by 40M (12M and 28M respectively) to around 221M, with all the applications mentioned running in the background. Given most of the clients require an internet connection to update content and the online time limit, a few like the RSS and Mastodon clients I might check once daily then close them when not in use to recover some RAM. Multiplexer sessions can group applications together and be re-launched with one command.
2277
2278CPU-wise, the list was shorter, mostly because the system had no video acceleration (which should be fixable by custom packaging video drivers), so even when I had time to play video games, the majority of modern titles wouldn't run well on it. (Text adventures were fine though, as was retro games emulation.) Applications that tapped noticeably into CPU were:
2279
2280* VLC (3.0-4.0) - consistently high load only when watching or decoding videos, using the CLI command to stream audio doesn't take much resources. Before the challenge, I already was streaming media mostly from mobile for a while, not minding the smaller screen, and didn't watch a lot of videos anyway.
2281* Web browser (0.2-1.2) - unsurprisingly, the web browser was also prone to CPU spikes, triggered by certain websites and consistently on pages with animated images. The simplest response was to avoid sites with known issues for the browser or to check them in a text-based browser like Lynx.
2282
2283Typically my internet time might begin with checking mail, RSS, IRC and sometimes the fediverse, the latter I could check a little more often after finding a TUI client that I could keep open for longer stretches. Due to the time limit, I switched to downloading podcasts in the background for later instead of streaming.
2284
2285Spent significantly less time in IRC, from roughly 1-2h to 5m. The client was left open and connected on a server, acting like a bouncer to save conversations in scrollback. Only logged the time actually reading and replying. Also had less time on the fediverse relative to other networks such as IRC. I like the idea of a decentralised social network, unfortunately I'm also very selective about what kind of posts I'd like to read or follow. It's also easier to have casual conversations on IRC in real-time that switch topics or go on at some length, and not worry about potentially overloading other people's timelines.
2286
2287Couldn't access the official Forth website from Lynx, got a `403 Forbidden` error. The web server probably misidentified it as a bot. Not a problem to load it in a GUI browser quickly to download the PDF book for offline reading, but did wonder how many other websites have a similar block.
2288
2289## Day 2
2290
2291* Internet time: 1h
2292 * 5m - downloaded podcasts
2293 * 5m - checked mail, prefetched RSS feeds and local fediverse timeline
2294 * 50m - checked IRC
2295* RAM: 130M - 275M
2296* CPU: 0.2 - 1.0
2297
2298Easily spent most of the internet hour conversing with people on IRC. One of the servers I lurk in, affectionately known as "casa" among the regulars, is typically quieter on weekends and livens up with banter during weekdays. In leaving after time was up I had to cut a conversation short and felt badly about it, as it wasn't compulsory and more an arbitrary personal choice stemming from the challenge. Decided to add IRC (currently connected over SSH anyway) as part of the messaging exemptions to the internet time limit, to take effect on day 3. For the remainder of the day, I wanted to see what else I would miss without internet access. It's great being able to connect with people anytime despite distance and timezones, and have all sorts of interesting, funny and productive conversations. Being on IRC with a friendly, mutually supportive crowd has a positive effect on my day and was an aspect of internet connectivity I'd like to keep.
2299
2300Would have to look for a way to download Gemini sites tomorrow. Ran out of internet time and wanted to download the Braxon stories by Joneworlds to continue reading offline after following the series over multiple episodes of the Tilde Whirl podcast.
2301
2302Another side effect of using up the internet time for the day was turning to other activities I had wanted to try for a while. Played a little solo tabletop tea shop sim called Whisling Wolf Café with the instructions PDF open on the screen and an Android app for dice rolls. The description estimated gameplay to be 10-20 minutes, though my first full game was 1.5 hours. It's easy to play, with short rounds that make it similarly easy to pause and resume.
2303
2304=> https://nightfall.city/x/republic.circumlunar.space/users/joneworlds/index.gmi Braxon
2305=> https://tilde.town/~dozens/podcast/ Tilde Whirl podcast
2306=> https://luckynewtgames.itch.io/whistling-wolf-cafe Whistling Wolf Café
2307
2308
2309## Day 3
2310
2311* Internet time: 50m
2312 * 10m - downloaded podcasts, mail and RSS
2313 * 30m - looked into saving Gemini content, downloaded PDF viewers
2314 * 10m - looked up tabletop games licensed under CC-BY/CC-BY-SA
2315* RAM: 146M - 454M
2316* CPU: 0.20 - 0.83
2317
2318Went looking for a download manager for the Gemini protocol and didn't find a suitable utility from the Gemini software list. The closest thing was gemini-fetch, which was more a library than a downloader like wget. One possibility was to use wget to fetch files from a Gemini proxy, but it was not as straightforward as pointing wget to a subdirectory under the proxy url (it reported the error `disallowed by robots.txt`, the `-e robots=off` flag didn't work). It might work by taking the list of URLs indexed by wget from the log output and then pass them back to wget inside a shell script loop to get each page separately. Fortunately in the case of Braxon, the author included an ebook of all the journal entries to date in a gopherhole, which could be downloaded from Lynx and saved the trouble of parsing the wget log.
2319
2320For viewing ebooks, I had been using a local build of Bookworm. The interface for managing its book collection is a bit buggy, but the viewer does work. A light option, if lack of formatting would be tolerable, was to convert to plain text, save or pipe it to a pager like `less` for reading:
2321
2322```
2323epub2txt file.epub - | less
2324epub2txt file.epub > file.txt
2325```
2326
2327The same idea could be used for text-only PDF files using pdftotext: `pdftotext file.pdf - | less`. However, I regularly browse PDFs that are a mix or entirely composed of images, which text conversion doesn't handle. In search of a lighter PDF viewer, I tried a few different applications with a 2-page text-only PDF and a 9-page image-based PDF, just two examples of files I might typically open. These were:
2328
2329* CorePDF - 40M to open both files. It sat between Zathura and Evince for number of features.
2330* Evince - 40M and 61M. By far the most featured of the viewers and one I've used for a few years, but it uses a little more memory. There is also a thumbnailer utility invoked by some file managers to generate PDF thumbnails, which was useful to have until it spiked in CPU usage to 100% handling files larger than about 80M.
2331* mupdf - 8M and 24M. (On Alpine, install the `mupdf-x11` package for the executable.) Navigating between pages seemed a bit smoother than CorePDF. Dragging with the right mouse button held down selected text to copy to the clipboard. It also happened to load the EPUB format, which was a welcome surprise to go with the ebook of stories. However, I later found it used more RAM with larger files — 156M for a 300-page ebook compared to 57M in Evince.
2332* Zathura - 25M, 30M-37M depending on the plugin used. Zathura supported viewing PDFs through two plugins, `zathura-pdf-poppler` or `zathura-pdf-mupdf`. Dragging with the left mouse button held down selected text but copied to the primary selection rather than the shared clipboard. Not sure if there's a way to configure it.
2333
2334Bookworm also supported PDFs and the RAM usage is close to Evince, but because it automatically added any opened files to its collection (regardless of whether it could actually render it), I preferred a separate PDF viewer.
2335
2336=> https://gemini.circumlunar.space/software/ Gemini software list
2337=> https://github.com/RangerMauve/gemini-fetch gemini-fetch
2338=> https://stackoverflow.com/questions/3570591/cli-pdf-viewer-for-linux using pdftotext
2339
2340
2341## Day 4
2342
2343* Internet time: 35m
2344 * 10m - downloaded podcasts, mail, RSS and fediverse timeline
2345 * 25m - looked up tabletop games under open game licensing
2346* RAM: 153M - 538M
2347* CPU: 0.10 - 1.39
2348
2349Used the GUI web browser a bit during a search and got up to 4 tabs open with static pages (about 329M) before exceeding resource limits and had to close additional tabs. The browser had a keybinding configured to save sessions, which can be restored if the browser abruptly closed or were terminated by earlyoom.
2350
2351Another category of applications I should probably check are graphics programs such as Inkscape. Previously had the application's memory usage shot up to 511M with a file open for 1-2 days. After making a simple cover design with it for a few hours, it gradually inched up to 196M from 114M with a blank document, which fortunately was still usable.
2352
2353Online searches felt slower to complete while checking the clock frequently to pace in the internet time available. For example, looking into the topic of tabletop games with open game licensing has taken two days so far with leads but somewhat scattered results. Following links took time and was more cumbersome to do with only 4 browser tabs open. Also reserved some internet minutes in case I needed access for something important, but was too tired by the end of the day to make use of the remaining time.
2354
2355## Day 5
2356
2357* Internet time: 55m
2358 * 10m - downloaded podcasts, mail, RSS and fediverse timeline
2359 * 10m - browsed links from the fediverse
2360 * 35m - looked up a few Gemini clients, browsed Gemini capsules
2361* RAM: 248M
2362* CPU: 0.17
2363
2364On the quest for a smol web client. Among the GUI browsers were Lagrange and Castor, which used 73M and 19M respectively with 1 window open. Both were good options visually, but I preferred a client with some keyboard operability. Of the CLI options, I liked Amfora's interface, with colours and tabs. The only drawback with its tabs was only the right-most tab could be closed currently, which was a bit annoying. Bombadillo had a webmode for http/https (disabled by default) that could make navigating between protocols more seamless. RAM usage was moderate, 30M (amfora) and 38M (bombadillo). Also wanted to try Asuka, but it was unavailable in the Alpine repos and I didn't get to packaging it locally.
2365
2366Read *Braxon* and a few other stories at Joneworlds. Just noticed I didn't know how to select and copy text in an EPUB file within mupdf, right-click dragging as in PDFs didn't work.
2367
2368=> https://github.com/makeworld-the-better-one/amfora Amfora
2369=> http://bombadillo.colorfield.space/ Bombadillo
2370=> https://git.sr.ht/~julienxx/asuka Asuka
2371
2372
2373## Day 6
2374
2375* Internet time: 1h
2376 * 5m - downloaded podcasts, mail, RSS and fediverse timeline
2377 * 35m - looked up licenses for tabletop game titles, checked a Gemini message board
2378 * 20m - browsed Gemini capsules
2379* RAM: 251M - 379M
2380* CPU: 0.22
2381
2382Followed the trail recommended by geminiquicksta.rt and found a link-aggregating message board. My initial impression of the smol web is of an ecosystem where people can focus on telling stories, reading and communicating without a load of elements all vying for attention at once and persistent tracking. There are still pockets of the HTTPS web that fill a similar role, but increasingly they seem to be a smaller part of a web dominated by large silos. For browsing in general, 20-30m time segments worked better for me, which provided time to do longer searches before moving to other tasks (context switching might take a bit of time).
2383
2384Also began reading *Starting Forth* with an interpreter open beside the book to try the examples in it.
2385
2386=> https://geminiquickst.art/ geminiquickst.art
2387=> gemini://geddit.glv.one/ Gemini message board
2388
2389
2390## Day 7
2391
2392* Internet time: 50m
2393 * 5m - downloaded podcasts, mail, RSS and fediverse timeline
2394 * 45m - looked up tabletop game licenses
2395* RAM: 257M - 573M
2396* CPU: 0.16 - 1.72
2397
2398Exceeded resource limits today. I forgot to launch the browser with Javascript disabled and usage spiked rapidly with 4 tabs open and the other CLI applications running in the background. Quickly got usage stats back within range again and was allowed 2 tabs with Javascript enabled. There are GUI browsers that use less memory, at the cost of pages not rendering fully and some basic interaction elements not working at all, or combined with crashes and instability. It's a bit like an internet kiosk except it only has one user. Trying to rein in my sarcasm here.
2399
2400## Day 8
2401
2402* Internet time: 50m
2403 * 5m - downloaded podcasts, mail, RSS and fediverse timeline
2404 * 30m - searched for a tabbed Gemini browser, tested another CLI browser
2405 * 10m - fetched dependencies to compile a package
2406 * 5m - looked up command flag options
2407* RAM: 208M - 343M
2408* CPU: 0.27 - 1.16
2409
2410A bit sad that I couldn't play in LeoCAD, a toy bricks CAD program — RAM use was a manageable 117M, but it would emit 348% CPU bursts when dragging parts from the parts selection window to the model view. It might work if I could hard-cap the CPU to 1.0. As it were, it would be too much like cheating.
2411
2412While looking through the list of Gemini clients on the official Gemini website, I came across Fafi and tried to compile it again. In the previous attempt the version of racket in the repos was too old (7.x) and according to one of the issue reports, the application needed racket >= 8.2. When the resulting executable ran, it would shortly exit with an error like this:
2413
2414```
2415class*: superclass does not provide an expected method for override
2416 override name: on-close-request
2417 class name: custom-tab-panel%
2418```
2419
2420In the meantime, racket had since been updated to 8.5 in the repos, so I retried a simple APKBUILD I had prepared earlier. Initially got an error, which may have been due to process termination for running out of memory:
2421
2422```
2423raco setup: making: <pkgs>/compiler-lib/compiler/commands
2424raco setup: in <pkgs>/compiler-lib/compiler/commands
2425raco setup: in <pkgs>/compiler-lib/compiler/private
2426SIGSEGV MAPERR si_code 1 fault on addr 0x207
2427Aborted (core dumped)
2428```
2429
2430Re-ran `abuild -r` and got a different error:
2431
2432```
2433Linking current directory as a package
2434Compiling bytecode... done.
2435Building executable...find-exe: can't find GRacket executable for variant 3m
2436```
2437
2438This issue seemed to be related to the racket compiler, not just Fafi. A workaround was to do:
2439
2440```
2441raco pkg install
2442raco exe --3m main.rkt
2443```
2444
2445This was probably missing optimisations or other things, but the resulting binary worked. Wasn't keen about the 212M it used with only 1 window open, but it looked very nice and a healthy ecosystem could use more choices.
2446
2447TIL w3m has buffers. This was very relevant to my search for a usable web browser that had multiple tabs/views. Would definitely take a closer look at w3m in the coming days.
2448
2449With internet time almost up for the day, played another solo tabletop game, this time A Day at the Crystal Market. Recently I've been looking at exploratory tabletop games that don't require a lot of materials to play (instructions, maybe a deck of playing cards and 1-2 d6). Hadn't been interested in tabletop games before, but seeing some of the smaller indie games helped me appreciate the wide variety of things that can be done with the genre beyond Dungeons & Dragons and rogue-like dungeon-trawling games.
2450
2451=> https://www.leocad.org/ LeoCAD
2452=> https://andregarzia.com/2020/08/fafi-browser-a-racket-based-gemini-client.html Fafi
2453=> https://todo.sr.ht/~soapdog/racket-gemini/7 racket-gemini issue #7
2454=> https://github.com/racket/racket/issues/3969 racket issue #3869
2455=> https://oakenboro.itch.io/a-day-at-the-crystal-market A Day at the Crystal Market
2456
2457
2458## Conclusion
2459
2460To revisit the questions I had on day 1:
2461
2462**What kind of internet experiences would I like to have?**
2463
2464At this point in time, I look for experiences more focused on people and expression.
2465
2466From the start, I wanted to set aside more time to explore the smol web because it's creative and interesting in their own ways, and not only as a refuge from the deteriorating usability of the mainstream web. Didn't get in as much Gopher/Gemini browsing as I'd like, with what should have been simple web searches having taken up a portion of the allotted hours. IRC would have filled up much of the allotted time (pleasantly) had I not caved to an exemption. A time limit certainly made me consider where or how to put time towards things I enjoy.
2467
2468Given the fairly small file sizes of many pages on the smol web, I think there was a missed opportunity for having a Gopher/Gemini application that could index and cache links up to 2-3 hops away, and be able to browse them offline later. It might already be possible with existing clients and I didn't know it then. Better preparation next time.
2469
2470**What, if anything, did I miss by computing with a predominantly terminal interface?**
2471
2472The main thing was viewing images, e.g. media attachments in fediverse timelines. Previously in tut, image attachments can be viewed with the default GUI image viewer via xdg-open, but I switched to toot for a while because tut stopped loading a significant chunk of thread replies, and lost poll voting and viewing media (faster than loading the toot URL in a GUI web browser) in the move. This being one of various inconveniences I'd like to rectify.
2473
2474Related to this was an undercurrent of slight dissatisfaction with the configuration, whereby either I haven't found the most suitable application with the features I'd like (while still being fairly light!), or the settings and hacks to have things work as desired. That being said, it still looks like a good direction, and re-discovering w3m makes me more optimistic about sorting out the rough edges eventually. In the past few days since the challenge, I adjusted the w3m configuration and with some warming up on the key bindings, it has improved my web browsing and reading enough to use concurrently with GUI browsers.
2475
2476**Were there applications or activities I would have liked to do that were infeasible due to the resource limits?**
2477
2478* 3D toy brick modelling, unless I could find another compatible open source application (CPU constraint)
2479* Playing some modern games (RAM constraint and lack of dedicated GPU)
2480* Compiling packages is still possible in some cases RAM permitting, but would take much longer than it currently does given weaker ARM processor
2481* Watching videos at a quality frame rate, and encoding videos (I don't do much of either at the moment so it's fine for now)
2482
2483Overall, it was a mildly unpleasant week for someone used to accessing the internet in short bursts anytime throughout the day to look up one thing or another and subsequently had to mentally plan ahead briefly to maximise the time blocks. However, it was also not a hard time, as there were plenty of other things I could do that didn't require an active internet connection. I wouldn't want to do this every day, but a week is roughly enough time to begin seeing patterns, including what worked and what didn't work so well, for future reference.</div>
2484<details class="info"><summary>item information</summary>
2485timestamp: 1658436720
2486title: [~mio_gemlog] Old Computer Challenge, July 10-17 2022
2487link: gemini://tilde.town/~mio/log/2022-07-21-occ-2022.gmi
2488content_type: plain
2489id: gemini://tilde.town/~mio/log/2022-07-21-occ-2022.gmi
2490author: mio
2491enclosure:
2492category:
2493</details>
2494</details>
2495<details>
2496<summary>[linkbudz rss feed] literate programming ish</summary>
2497<div class="links">
2498<a href="https://rtomayko.github.io/shocco/">read original</a>
2499</div>
2500<div class="content"><p><a href="https://rtomayko.github.io/shocco/">literate programming ish</a></p>
2501 <p>[https] posted by acdw on July 21, 2022</p></div>
2502<details class="info"><summary>item information</summary>
2503timestamp: 1658376499
2504title: [linkbudz rss feed] literate programming ish
2505link: https://rtomayko.github.io/shocco/
2506content_type: html
2507id: acdw20220721040819
2508author:
2509enclosure:
2510category: https
2511</details>
2512</details>
2513<details>
2514<summary>[blog __ ~ben] git diff-highlight</summary>
2515<div class="links">
2516<a href="https://tilde.team/~ben/blog/git-diff-highlight.html">read original</a>
2517</div>
2518<div class="content"><p>diff output from git can be hard to read. luckily there&rsquo;s a nice tool bundled with git that can help us out.</p>
2519<p>enter <a href="https://github.com/git/git/tree/master/contrib/diff-highlight">diff-highlight</a>, a little perl script found in git&rsquo;s contrib directory.</p>
2520<p>from its own documentation:</p>
2521<blockquote>
2522<p>[diff-highlight] post-processes the line-oriented diff, finds pairs of lines, and highlights the differening segments.</p>
2523</blockquote>
2524<p>diff-highlight is shipped in a default git install but it needs to be added to your $PATH. here&rsquo;s how to do it on debian:</p>
2525<pre><code>$ sudo make -C /usr/share/doc/git/contrib/diff-highlight
2526$ sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin/
2527</code></pre>
2528<p>now you can pipe git&rsquo;s diff output to to diff-highlight to get a better view of what actually changed.</p>
2529<pre><code>git diff | diff-highlight
2530</code></pre>
2531<p>optionally, you can configure git to use it all the time. add the following to your <code>~/.gitconfig</code>:</p>
2532<pre><code>[pager]
2533log = diff-highlight | less
2534show = diff-highlight | less
2535diff = diff-highlight | less
2536</code></pre>
2537<p>see the <a href="https://github.com/git/git/blob/master/contrib/diff-highlight/README">documentation</a> for more usage tips!</p></div>
2538<details class="info"><summary>item information</summary>
2539timestamp: 1658370190
2540title: [blog __ ~ben] git diff-highlight
2541link: https://tilde.team/~ben/blog/git-diff-highlight.html
2542content_type: html
2543id: https://tilde.team/~ben/blog/git-diff-highlight.html
2544author:
2545enclosure:
2546category:
2547</details>
2548</details>
2549<details>
2550<summary>[linkbudz rss feed] How to setup aescbc secstore on plan9</summary>
2551<div class="links">
2552<a href="https://9p.io/wiki/plan9/Using_aescbc_to_store_factotum_keys/index.html">read original</a>
2553</div>
2554<div class="content"><p><a href="https://9p.io/wiki/plan9/Using_aescbc_to_store_factotum_keys/index.html">How to setup aescbc secstore on plan9</a></p>
2555 <p>[https] posted by wsinatra on July 21, 2022</p></div>
2556<details class="info"><summary>item information</summary>
2557timestamp: 1658363172
2558title: [linkbudz rss feed] How to setup aescbc secstore on plan9
2559link: https://9p.io/wiki/plan9/Using_aescbc_to_store_factotum_keys/index.html
2560content_type: html
2561id: wsinatra20220721002612
2562author:
2563enclosure:
2564category: https
2565</details>
2566</details>
2567<details>
2568<summary>[linkbudz rss feed] Jenga tower dice alternate for sttrpgs</summary>
2569<div class="links">
2570<a href="https://itch.io/jam/wretched-jam/topic/796498/dice-substitute-for-jenga-towers">read original</a>
2571</div>
2572<div class="content"><p><a href="https://itch.io/jam/wretched-jam/topic/796498/dice-substitute-for-jenga-towers">Jenga tower dice alternate for sttrpgs</a></p>
2573 <p>[https] posted by wsinatra on July 21, 2022</p></div>
2574<details class="info"><summary>item information</summary>
2575timestamp: 1658363123
2576title: [linkbudz rss feed] Jenga tower dice alternate for sttrpgs
2577link: https://itch.io/jam/wretched-jam/topic/796498/dice-substitute-for-jenga-towers
2578content_type: html
2579id: wsinatra20220721002523
2580author:
2581enclosure:
2582category: https
2583</details>
2584</details>
2585<details>
2586<summary>[linkbudz rss feed] "Plan9 Desktop Guide!"</summary>
2587<div class="links">
2588<a href="https://pspodcasting.net/dan/blog/2019/plan9_desktop.html">read original</a>
2589</div>
2590<div class="content"><p><a href="https://pspodcasting.net/dan/blog/2019/plan9_desktop.html">"Plan9 Desktop Guide!"</a></p>
2591 <p>[https] posted by wsinatra on July 21, 2022</p></div>
2592<details class="info"><summary>item information</summary>
2593timestamp: 1658363062
2594title: [linkbudz rss feed] "Plan9 Desktop Guide!"
2595link: https://pspodcasting.net/dan/blog/2019/plan9_desktop.html
2596content_type: html
2597id: wsinatra20220721002422
2598author:
2599enclosure:
2600category: https
2601</details>
2602</details>
2603<details>
2604<summary>[linkbudz rss feed] HOT DRINKS</summary>
2605<div class="links">
2606<a href="https://www.youtube.com/watch?v=_ZXeFPpPJeI">read original</a>
2607</div>
2608<div class="content"><p><a href="https://www.youtube.com/watch?v=_ZXeFPpPJeI">HOT DRINKS</a></p>
2609 <p>[https] posted by acdw on July 20, 2022</p></div>
2610<details class="info"><summary>item information</summary>
2611timestamp: 1658345113
2612title: [linkbudz rss feed] HOT DRINKS
2613link: https://www.youtube.com/watch?v=_ZXeFPpPJeI
2614content_type: html
2615id: acdw20220720192513
2616author:
2617enclosure:
2618category: https
2619</details>
2620</details>
2621<details>
2622<summary>[linkbudz rss feed] gators lol</summary>
2623<div class="links">
2624<a href="https://twitter.com/GatorsDaily/status/1545215138332086274">read original</a>
2625</div>
2626<div class="content"><p><a href="https://twitter.com/GatorsDaily/status/1545215138332086274">gators lol</a></p>
2627 <p>[https] posted by acdw on July 19, 2022</p></div>
2628<details class="info"><summary>item information</summary>
2629timestamp: 1658259306
2630title: [linkbudz rss feed] gators lol
2631link: https://twitter.com/GatorsDaily/status/1545215138332086274
2632content_type: html
2633id: acdw20220719193506
2634author:
2635enclosure:
2636category: https
2637</details>
2638</details>
2639<details>
2640<summary>[linkbudz rss feed] paper airplane designs</summary>
2641<div class="links">
2642<a href="https://www.foldnfly.com/">read original</a>
2643</div>
2644<div class="content"><p><a href="https://www.foldnfly.com/">paper airplane designs</a></p>
2645 <p>[https] posted by dozens on July 19, 2022</p></div>
2646<details class="info"><summary>item information</summary>
2647timestamp: 1658198147
2648title: [linkbudz rss feed] paper airplane designs
2649link: https://www.foldnfly.com/
2650content_type: html
2651id: dozens20220719023547
2652author:
2653enclosure:
2654category: https
2655</details>
2656</details>
2657<details>
2658<summary>[linkbudz rss feed] nofetch, a new fetch tool by acdw</summary>
2659<div class="links">
2660<a href="https://git.acdw.net/nofetch/">read original</a>
2661</div>
2662<div class="content"><p><a href="https://git.acdw.net/nofetch/">nofetch, a new fetch tool by acdw</a></p>
2663 <p>[https] posted by acdw on July 18, 2022</p></div>
2664<details class="info"><summary>item information</summary>
2665timestamp: 1658180624
2666title: [linkbudz rss feed] nofetch, a new fetch tool by acdw
2667link: https://git.acdw.net/nofetch/
2668content_type: html
2669id: acdw20220718214344
2670author:
2671enclosure:
2672category: https
2673</details>
2674</details>
2675<details>
2676<summary>[p1k3::feed] monday, september 20, 2021</summary>
2677<div class="links">
2678<a href="https://p1k3.com/2021/9/20">read original</a>
2679</div>
2680<div class="content"><article><div class="entry"><h1>monday, september 20, 2021</h1>
2681
2682<p>it's always the last day of the festival<br />
2683you're always packing to go home</p>
2684
2685
2686
2687<p class="tags"><b>tags:</b> <a href="/topics/poem">topics/poem</a></p><p class="datestamp"><a href="/">p1k3</a> /
2688<a href="/2021/" title="2021">2021</a> /
2689<a href="/2021/9/" title="9">9</a> /
2690<a href="/2021/9/20/" title="20">20</a></p>
2691</div></article></div>
2692<details class="info"><summary>item information</summary>
2693timestamp: 1658176064
2694title: [p1k3::feed] monday, september 20, 2021
2695link: https://p1k3.com/2021/9/20
2696content_type: html
2697id: /2021/9/20
2698author:
2699enclosure:
2700category:
2701</details>
2702</details>
2703<details>
2704<summary>[linkbudz rss feed] WordPerfect ... for UNIX !</summary>
2705<div class="links">
2706<a href="https://lock.cmpxchg8b.com/wordperfect.html">read original</a>
2707</div>
2708<div class="content"><p><a href="https://lock.cmpxchg8b.com/wordperfect.html">WordPerfect ... for UNIX !</a></p>
2709 <p>[https] posted by acdw on July 18, 2022</p></div>
2710<details class="info"><summary>item information</summary>
2711timestamp: 1658173878
2712title: [linkbudz rss feed] WordPerfect ... for UNIX !
2713link: https://lock.cmpxchg8b.com/wordperfect.html
2714content_type: html
2715id: acdw20220718195118
2716author:
2717enclosure:
2718category: https
2719</details>
2720</details>
2721<details>
2722<summary>[(lambda (x) (create x))] Old School Computer Challenge 2022</summary>
2723<div class="links">
2724<a href="https://lambdacreate.com/posts/36">read original</a>
2725</div>
2726<div class="content"><h2>Old School Computer Challenge 2022</h2>
2727<h3>Revisiting the challenge a year later &middot; July 18th, 2022</h3>
2728
2729<p>It's that time of the year again, we've hit the Old School Computer challenge again! If you're not aware of what the OSC is, take a look at <a href="https://dataswamp.org/~solene/2022-07-01-oldcomputerchallenge-v2-rtc.html">Solene's blog for more information</a> but the gist of it is that for a week you're limiting your technological usage to a single core system with 512MB of RAM or less. Additionally this year we're tracking our network time, with a maximum of online time of 1 hour per day, to emulate that costly dial-up experience.</p>
2730
2731<p>I had a lot of fun doing this last year, it was really cool to put an old system to use, and I continued to use my Viliv as an IRC bot host after the end of the challenge. Unfortunately its battery died and I cannot for the life of me find a replacement, so it's back in the junk drawer for the time being. This year I'm rocking new old gear, and putting myself well outside of my comfort zone by running 9front a fork of Plan9 for the duration of the challenge. To add a fun twist to all of this, I'll be in Canada for the duration of the challenge with no backup systems, and no access to LTE. For better or worse I'm locked in on going as offline as is humanly possible here!</p>
2732
2733<h3>The Setup</h3>
2734
2735<p>Alright brass tacks first, I'm using an Acer Aspire One D255, that's a netbook from 2010 with an Intel Atom N550, 1GB of RAM, and a 32GB SSD. It has a full RJ45 port, VGA, 3 USB 2.0, and 2 3.5mm jacks, plus a 54mbps wlan nic. It's about 10in with a little 3/4 keyboard and a 1024x600 resolution (that super nice weird netbook res). That's enough ports and features to scare off an Apple hardware engineer! Right off the bat though you'll note that that Atom processor is a 4 thread CPU, and I've got 2x the RAM for the challenge. I'm restricting downwards using software limitations, but I think long term there may be room for this netbook in my travel kit.</p>
2736
2737<div id="imgContainer">
2738 <img src="https://lambdacreate.com/static/images/36/day0.jpg" alt="Post install prep">
2739</div>
2740
2741<h3>Day 0</h3>
2742
2743<p>Because I'm traveling during the challenge, I started the challenge a little early and spent the day prior to the challenge starting preparing for the system for the trip. While I blew entirely through my hour online limit immediately, it was somewhat necessary so that I could get the netbook working. Before doing this installation I had only done 2 Plan9 setups, both of them for CPU servers, which is somewhat different from setting up a traveling Terminal system. I also needed to get drivers because neither the wireless nic nor the rj45 nic worked out of the box. Between figuring out the installation, and getting networking, encryption, a local aescbc secstore for Factotum, and my git repos + some music synced I think it took me 4-5 hours total. More or less I immediately used up my allotment for the trip just to make sure I could run acme on a netbook. Oof, oh well it's day 0, we'll try for better during the trip! Lets dig into what was learned in that time.</p>
2744
2745<p>I'd of gotten very not far without the documentation the community has created and the man pages in 9Front. The information that's available is somewhat sparse, and very quirky, but it's that way because most of the information you're looking for is already in the man pages and is curated in a very professional way inside the OS itself. What's not in the guides is more personal flavor that's created by avid 9 users. I appreciate the communities hard work here, I got all of my bases covered thanks to their hard work. Here's everything I referenced online during the installation, in case anyone wants to consult the specifics for their own installation.</p>
2746
2747<ul>
2748 <li><a href="https://fqa.9front.org/fqa4.html#4.1">9Front FQA Installation Guide</a></li>
2749 <li><a href="https://fqa.9front.org/fqa4.html#4.4">9Front FQA Encryption Guide</a></li>
2750 <li><a href="https://fqa.9front.org/fqa6.html#6.2.2.1">Adding firmware blobs to 9Front</a></li>
2751 <li><a href="https://9lab.org/plan9/thinkpad-t420s/">Decryption prompt & wifi init at boot</a></li>
2752 <li><a href="https://9p.io/wiki/plan9/Using_aescbc_to_store_factotum_keys/index.html">Configuring aescbc secstore</a></li>
2753 <li><a href="https://pspodcasting.net/dan/blog/2019/plan9_desktop.html">Plan9 Desktop Guide</a></li>
2754 <li><a href="http://nopenopenope.net/posts/audio">Plan9 Audio Info</a></li>
2755 <li><a href="http://nopenopenope.net/posts/opus">Patching 9Front kernel to support OPUS media</a></li>
2756</ul>
2757
2758<p>Really the only piece of information that I had to piece together for myself was the plan9.ini configuration file, which fortunately I'm really familiar with configuring after setting up my CPU server. If you ever need to cripple your system for fun and profit, you just need to drop the following lines into your plan9.ini file. Accessing the plan9.ini is an exercise left up to the reader (hint: it's in the documentation linked above!). Specifically these arguments in order disable multi-thread support, set a limit of 1 cpu core, and set the maximum memory to 512M.</p>
2759
2760<div class="codeSnippet">
2761 <pre><code>
2762*nomp=1
2763*ncpu=1
2764*maxmem=512M
2765 </code></pre>
2766</div>
2767
2768<p>And then some other simple QoL scripts to make things a little easier on me day to day. For example I took inspiration from the wifi init script/decrytion prompt that 9labs came up with and found out I could just extend my $home/lib/profile script to additionally prompt to decrypt my aescbc secstore and then populate the Factotum during my login, which additionally meant that authentication to pre-existing wireless networks became as simple as passing the network name to the init script during the boot process! Here's the full terminal case from my profile, if you're familiar with plan9 you'll note that this is extremely minimal modification, but it's really just that easy, the initwifi command comes from 9labs.</p>
2769
2770<div class="codeSnippet">
2771 <pre><code>
2772case terminal
2773 if(! webcookies >[2]/dev/null)
2774 webcookies -f /tmp/webcookies
2775 webfs
2776 plumber
2777 echo -n accelerated > '#m/mousectl'
2778 echo -n 'res 3' > '#m/mousectl'
2779 prompt=('term% ' ' ')
2780 if(test -f $home/lib/fact.keys)
2781 auth/aescbc -d < $home/lib/fact.keys | read -m > /mnt/factotum/ctl
2782 initwifi
2783 fn term%{ $* }
2784 rio -i riostart
2785 </code></pre>
2786</div>
2787
2788<p>At the end of working through these I had a working system I could travel with, and I'm honestly quite happy that with just a few hours of work I had an encrypted system, with an offline secstore for my keys, working SSH out to my servers, a bunch of local git repos. Really everything I needed was right there in a nice secure installation. And it ran wicked fast despite having a software crippled configuration, well until you try and compile a new kernel. That took a good 30min, but I just won't do that until later on.</p>
2789
2790<p>Oh and if anyone is searching for how to SSH on Plan9, the syntax is a bit different, you need to do it this way.</p>
2791
2792<div class="codeSnippet">
2793 <pre><code>
2794ssh username@tcp!192.168.88.101!20022
2795 </code></pre>
2796</div>
2797
2798<h3>Day 1 - 2</h3>
2799
2800<p>Truthfully this day was very quiet. I was getting ready for the flight out. I was slammed at work, and when I actually had free time after work I spent it prepping. When I did use my netbook I tried to get IRC working, but was unable to get ircrc to connect to my friends ergo instance, I defaulted to just running weechat on a server for the interim. Having figured out Factotum and aescbc before starting the challenge meant that I could SSH in and out to all of my Linux boxes without fuss, which let me build and troubleshoot the installation of the new web engine on my blog. I have an LXD cluster at home and I worked "offline" as much as possible troubleshooting bugs in my Lapis application before using the the last of my time to actually push the changes live.</p>
2801
2802<p>The git workflow on plan9 is a little awkward. I find myself trying to type git add . when it's git/add file, and git/commit requires a file to be called with it so I constantly have to retype it. Despite this the workflow is very usable. I had no problems modifying etlua templates, Lua code, and even Fennel! I thought maybe I could test my fennel code on the netbook even, but the version of Fennel that's patched for 9 is 0.3.0, and we're on 1.1.0 currently, which won't work well. I might see if I can get the patches they added up-streamed to the official repo, it would be nice to have fennel available on Plan9.</p>
2803
2804<p>During this entire process, and previously on day 0, I found that the netbook heats up massively. The fan inside the netbook may be malfunctioning. Even running with software restrictions it puts out a ton of heat. And the brand-ish new 6 cell battery I have for it only lasts about 3 hours on a charge, and it takes 2hrs to give it that juice. I'm slightly worried this will hinder my ability to use it during travel. I'm flying from Boston > Montreal > Vancouver > Kelowna, so I've got a solid 12hrs of travel to deal with, and I'll want to actually use the netbook while I'm in flight. There's literally no better time to crank out a blog post than when you're strapped into a seat with absolutely zero distractions. And normally if I had my Droid with me I'd work on Sola a little bit, or maybe tkts, but since both of those projects are in Fennel it's a no go.</p>
2805
2806<p>Golang has better support though, so during day 2 I tried to compile that on the netbook. With the software restraints it quickly OOM'd the system and it crashed pretty hard. No harm done at all, but I won't be doing any Golang work. That said, software written in Golang that's compiled on Linux runs beautifully. I have a little HTTP file server + ingest-er called <a href="https://gitlab.com/durrendal/fServ.git">fServ</a> that runs beautifully on 9Front. I used it to transfer a couple of gigs of music and podcasts to the system from my NAS right before departing. I've got a 6am flight out, so last minute entertainment here!</p>
2807
2808<h3>Day 3</h3>
2809
2810<p>Finally traveling, and officially starting the hard part of the challenge. True to my word I left with only the plan9 netbook for my trip. I have my kobo with me, just in case, and obviously my cellphone, but without coverage in Canada this is pretty much it. My flight was canceled early, and I got shuffled around to a mid morning flight, unfortunately I was at the airport extremely early nonetheless. I got to watch the sunrise in Boston Logan. Fortunately since people are sparse that 4am I got prime seating at the gate and was able to plug in and crank out a blog post on using iptables. Oddly it was a very peaceful event. Despite my lack of sleep and frustration the muted color scheme of Plan9 was honestly very enjoyable. And working inside acme to write etlua is a breeze. No need for syntax highlighting or anything, just simple HTML and Lua.</p>
2811
2812<div id="imgContainer">
2813 <img src="https://lambdacreate.com/static/images/36/airport.jpg" alt="Cranking out a blog post on iptables before my flight!">
2814</div>
2815
2816<p>I kept with the blogging theme the rest of the trip. I was running on low fumes and didn't feel up to trying to actually tinker with the netbook. It's too much of a fuss to try and get airport wifi working on something like Plan9 since it requires a JavaScript webauth session, and I couldn't get netsurf running before my trip. I'm really not upset by this though, without a way to readily connect to the network I was able to just focus and be productive. I know once I find an easier to work with network I'll be able to push my offline changes to Gitlab and I might even be able to make that iptables post live during the trip.</p>
2817
2818<p>During that time I made ample use of zuke, it's a fantastic audio player, I find it very easy to work with and the man pages are extremely clear and concise. I had no fuss building curated playlists while I was in the middle of blogging. It worked equally well for listening to podcasts which made the leg out to Vancouver a little better. I also found a bug in my site management utility that's currently causing my RSS feeds to generate with broken date format strings. I think I would have found the broken section a little easier with syntax highlighting, but I think dark mode terminals would actually be harder on my eyes.</p>
2819
2820<p>What strikes me most thus far is that if your use case is simple, or very focused, then Plan9 gives you just enough tooling to get that work done. Nothing else to get in the way. Sure it can run a couple of simple emulators and doom, but things are a little bit out of the way. You have to hunt for them and that makes them that much more out of your reach. By not having an RSS feed to pull up and refresh 8 times, or IRC to lurk on, or a functioning web browser to fiddly about with my choices are very limited. I can use this system to connect to my CPU server at home potentially, or to my VPS or Tilde Town, or I can hunker down and be productive. Plus the color scheme is very honestly easy on the eyes. I've had my fair share of sleepless nights and long haul travels, but I when I'm dealing with that I typically can't stand to stare at a screen for too long. By comparison I find no issue with this netbook. Perhaps it's the light brightness of the old screen combined with the mellow color scheme, whatever it is I really like it.</p>
2821
2822<p>Oh by the way, Plan9 mile high club? Guarantee I'm the only person on this flight with such an eclectic rig.</p>
2823
2824<div id="imgContainer">
2825 <img src="https://lambdacreate.com/static/images/36/in_transit.jpg" alt="Mile high 9 club!">
2826</div>
2827
2828<p>The only other thing that's immediately notable is that this particular netbook gets absurdly hot, even when restricted to a single core it's uncomfortably hot! I had honestly forgotten what that was like, I have a Dell laptop with an intel core 2 duo in it during college that always felt like this. It was mildly uncomfortable keeping the netbook on my lap because of that. Thankfully as you can see it fits extremely well on the fold down tray (and the seat in front of me was leaned back so it was exta tight!), so no discomfort for me!</p>
2829
2830<h3>The Rest</h3>
2831
2832<p>And it turns out that after getting into Kelowna for my work trip I neither had much free time to participate in the OSC, nor any broken infrastructure to desperately attempt to fix with only a Plan9 netbook at hand. I'm somewhat upset that I didn't get to do much more with this little thing, but at the same time utterly thrilled that the challenge wasn't disruptive. It's all for the best though, I had absolutely no cell service once I was out in Kelowna, so even if I wanted to abandon the data challenge I couldn't.</p>
2833
2834<p>Instead of putting miles on the old netbook, I picked up Infinity Beach by Jack McDevitt and chewed through it in my spare time.</p>
2835
2836
2837<h3>Retrospect</h3>
2838
2839<p>I'm hopeful that this little challenge will pop back up next year. I've had a lot of fun with it both years. So much so that I'm wrapping up this blog post from my netbook despite having my droid readily at hand!</p>
2840
2841<p>There doesn't seem to be anything strange, to me, about traveling with old gear. I think all in this netbook cost me $50 inclusive of a set of new 6 cell batteries for it. It's cheap enough that if it gets broken, stolen, or lost that I won't be upset. Plan9 is quirky, but has the necessary security features to make me want to bring it abroad. And honestly when I travel the things I really want to do while in the air is blog. I enjoy writing these posts, and if I have an hour or two at a hotel it's very easy to crank out a blog post. Something very low resource, an electronic typewriter almost, is a welcomed addition to my collection. I certainly won't be shipping this netbook off to the junk pile now that the challenge is over!</p>
2842
2843<p>On Plan9 itself I think I'm still just getting comfortable with it. I don't think I'm very effective in it, not in the same sense that I am with Linux. I needed a lot of documentation, and some step by step guides to get to a point where I felt I could even commit to doing the challenge on this thing. I honestly love that, the feeling of something new and the child like wonder of learning about it piece by piece is a super fun experience. The entire OS really is well put together, the way that the Factotum works is particularly fascinating to me. And the fact that you can very quickly modify the system init via a simple RC script is a great idea, and feels very much like modifying .xinit scripts.</p>
2844
2845<p>I don't know that I would be able to do all of my programming on a Plan9 system, yet. I miss syntax highlighting, it really helps when looking at lisp code, but that's such a small complaint to have, I feel like I'm fishing for it. Acme is a great editor, eloquently designed, and extremely easy to use. I was immediately productive, and there's something to this mouse driven environment that does honestly work in a way that is both intuitive and easy to use. I've already caught myself trying to do mouse chords on my Ubuntu laptop at work, to a great amount of dismay. I would happily steal the entire Rio environment to use on Linux in a heartbeat, it really does just work.</p>
2846
2847<p>Anyways, this is getting a bit rambly I think. If you've read through and are on the edge of giving Plan9 a shot, I would say go for it. If you're curious you'll discover an interesting and unique environment to explore. If you're thinking about turning that ancient netbook into a usable system, Plan9 is a great fit for it too! And if you're here from the Old School Computer challenge, then thanks for the read and the awesome challenge again this year!</p></div>
2848<details class="info"><summary>item information</summary>
2849timestamp: 1658145600
2850title: [(lambda (x) (create x))] Old School Computer Challenge 2022
2851link: https://lambdacreate.com/posts/36
2852content_type: html
2853id: https://lambdacreate.com/posts/36
2854author:
2855enclosure:
2856category:
2857</details>
2858</details>
2859<details>
2860<summary>[Dozens and Dragons] Thousand Year Old Vampire</summary>
2861<div class="links">
2862<a href="https://dozensanddragons.neocities.org/29.html">read original</a>
2863</div>
2864<div class="content">game play and review</div>
2865<details class="info"><summary>item information</summary>
2866timestamp: 1658030400
2867title: [Dozens and Dragons] Thousand Year Old Vampire
2868link: https://dozensanddragons.neocities.org/29.html
2869content_type: html
2870id: https://dozensanddragons.neocities.org/29.html
2871author:
2872enclosure:
2873category:
2874</details>
2875</details>
2876<details>
2877<summary>[Brainshit] La version méconnue du texte bien connu, seconde partie</summary>
2878<div class="links">
2879<a href="https://brainshit.fr/read/307">read original</a>
2880</div>
2881<div class="content">Une expression régulière qui pourrait gagner un concours d'obfuscation.</div>
2882<details class="info"><summary>item information</summary>
2883timestamp: 1658008800
2884title: [Brainshit] La version méconnue du texte bien connu, seconde partie
2885link: https://brainshit.fr/read/307
2886content_type: html
2887id: https://brainshit.fr/read/307
2888author: neuron@brainshit.fr (Lucidiot)
2889enclosure:
2890category: Informatique
2891</details>
2892</details>
2893<details>
2894<summary>[linkbudz rss feed] static site hosting from tildegit repos</summary>
2895<div class="links">
2896<a href="https://tildepages.org/">read original</a>
2897</div>
2898<div class="content"><p><a href="https://tildepages.org/">static site hosting from tildegit repos</a></p>
2899 <p>[https] posted by dozens on July 16, 2022</p></div>
2900<details class="info"><summary>item information</summary>
2901timestamp: 1657979669
2902title: [linkbudz rss feed] static site hosting from tildegit repos
2903link: https://tildepages.org/
2904content_type: html
2905id: dozens20220716135429
2906author:
2907enclosure:
2908category: https
2909</details>
2910</details>
2911<details>
2912<summary>[linkbudz rss feed] writing and running a bbs on a Macintosh plus</summary>
2913<div class="links">
2914<a href="https://jcs.org/2022/07/15/kludge">read original</a>
2915</div>
2916<div class="content"><p><a href="https://jcs.org/2022/07/15/kludge">writing and running a bbs on a Macintosh plus</a></p>
2917 <p>[https] posted by elioat on July 15, 2022</p></div>
2918<details class="info"><summary>item information</summary>
2919timestamp: 1657898458
2920title: [linkbudz rss feed] writing and running a bbs on a Macintosh plus
2921link: https://jcs.org/2022/07/15/kludge
2922content_type: html
2923id: elioat20220715152058
2924author:
2925enclosure:
2926category: https
2927</details>
2928</details>
2929<details>
2930<summary>[~lucidiot's wiki] Channel Definition Format</summary>
2931<div class="links">
2932<a href="https://envs.net/~lucidiot/cdf.html">read original</a>
2933</div>
2934<div class="content"></div>
2935<details class="info"><summary>item information</summary>
2936timestamp: 1657877322
2937title: [~lucidiot's wiki] Channel Definition Format
2938link: https://envs.net/~lucidiot/cdf.html
2939content_type:
2940id: https://envs.net/~lucidiot/cdf.html
2941author:
2942enclosure:
2943category:
2944</details>
2945</details>
2946<details>
2947<summary>[p1k3::feed] Friday, July 15, 2022</summary>
2948<div class="links">
2949<a href="https://p1k3.com/2022/7/15">read original</a>
2950</div>
2951<div class="content"><article><div class="entry"><h1>Friday, July 15, 2022</h1>
2952
2953<p><a href="/2019/12/18">One from 2019</a>.</p>
2954
2955
2956
2957<p class="datestamp"><a href="/">p1k3</a> /
2958<a href="/2022/" title="2022">2022</a> /
2959<a href="/2022/7/" title="7">7</a> /
2960<a href="/2022/7/15/" title="15">15</a></p>
2961</div></article></div>
2962<details class="info"><summary>item information</summary>
2963timestamp: 1657869250
2964title: [p1k3::feed] Friday, July 15, 2022
2965link: https://p1k3.com/2022/7/15
2966content_type: html
2967id: /2022/7/15
2968author:
2969enclosure:
2970category:
2971</details>
2972</details>
2973<details>
2974<summary>[p1k3::feed] wednesday, december 18, 2019 - notes to a much younger self, to the extent that i can reconstruct him</summary>
2975<div class="links">
2976<a href="https://p1k3.com/2019/12/18">read original</a>
2977</div>
2978<div class="content"><article><div class="entry"><h1>wednesday, december 18, 2019</h1>
2979
2980<h2>notes to a much younger self, to the extent that i can reconstruct him</h2>
2981
2982<p><i>(posted wednesday, july 13, 2022)</i></p>
2983
2984<p>i'll start by saying that it's<br />
2985better after a while<br />
2986for you at least</p>
2987
2988<p>the dimensions of your<br />
2989life, they do expand</p>
2990
2991<p>it's worse, too, and<br />
2992sometimes for years on end</p>
2993
2994<p>there are things ahead<br />
2995that are going to destroy parts of you<br />
2996there are things ahead<br />
2997that are going to tear at the whole frame<br />
2998of the world you inhabit<br />
2999one of the things that life is<br />
3000is a series of losses<br />
3001that you never quite recover from</p>
3002
3003<p>and in all that,<br />
3004you're going to fuck up a lot<br />
3005you'll learn most of what you learn<br />
3006the hard way<br />
3007you'll fail altogether<br />
3008to learn far too much</p>
3009
3010<p>but all the same you'll make some friends,<br />
3011fall in love more than once<br />
3012and in more than one way<br />
3013wake up on some mornings<br />
3014to find yourself strong and able</p>
3015
3016<p>maybe fear will always be with you, and<br />
3017far too much of it<br />
3018but the walls that arise in your mind<br />
3019between you and some imagined truer self<br />
3020they fall away with time</p>
3021
3022<p>along, maybe, with the idea that<br />
3023there's any truer self to be found.</p>
3024
3025
3026<p class="tags"><b>tags:</b> <a href="/topics/poem">topics/poem</a></p><p class="datestamp"><a href="/">p1k3</a> /
3027<a href="/2019/" title="2019">2019</a> /
3028<a href="/2019/12/" title="12">12</a> /
3029<a href="/2019/12/18/" title="18">18</a></p>
3030</div></article></div>
3031<details class="info"><summary>item information</summary>
3032timestamp: 1657869250
3033title: [p1k3::feed] wednesday, december 18, 2019 - notes to a much younger self, to the extent that i can reconstruct him
3034link: https://p1k3.com/2019/12/18
3035content_type: html
3036id: /2019/12/18
3037author:
3038enclosure:
3039category:
3040</details>
3041</details>
3042<details>
3043<summary>[#fridaypostcard] pipe dreams</summary>
3044<div class="links">
3045<a href="http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg">read original</a>
3046<a href="http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg">enclosure</a>
3047</div>
3048<div class="content">pipe dreams<br />~rogbeer</div>
3049<details class="info"><summary>item information</summary>
3050timestamp: 1657853842
3051title: [#fridaypostcard] pipe dreams
3052link: http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg
3053content_type: html
3054id: http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg
3055author: rogbeer@tilde.town (rogbeer)
3056enclosure: http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg
3057category:
3058</details>
3059</details>
3060<details>
3061<summary>[Dozens and Dragons] Shoes in the Dark</summary>
3062<div class="links">
3063<a href="https://dozensanddragons.neocities.org/28.html">read original</a>
3064</div>
3065<div class="content">a postcard-sized ttrpg</div>
3066<details class="info"><summary>item information</summary>
3067timestamp: 1657684800
3068title: [Dozens and Dragons] Shoes in the Dark
3069link: https://dozensanddragons.neocities.org/28.html
3070content_type: html
3071id: https://dozensanddragons.neocities.org/28.html
3072author:
3073enclosure:
3074category:
3075</details>
3076</details>
3077<details>
3078<summary>[linkbudz rss feed] FizzBuzz in GNU make</summary>
3079<div class="links">
3080<a href="https://citizen428.net/blog/fizzbuzz-in-gnu-make/">read original</a>
3081</div>
3082<div class="content"><p><a href="https://citizen428.net/blog/fizzbuzz-in-gnu-make/">FizzBuzz in GNU make</a></p>
3083 <p>[https] posted by dozens on July 13, 2022</p></div>
3084<details class="info"><summary>item information</summary>
3085timestamp: 1657672683
3086title: [linkbudz rss feed] FizzBuzz in GNU make
3087link: https://citizen428.net/blog/fizzbuzz-in-gnu-make/
3088content_type: html
3089id: dozens20220713003803
3090author:
3091enclosure:
3092category: https
3093</details>
3094</details>
3095<details>
3096<summary>[Tilde Whirl Tildeverse Podcast] episode 8</summary>
3097<div class="links">
3098<a href="https://tilde.town/~dozens/podcast/2022-07-12-episode-8-eli.html">read original</a>
3099<a href="https://archive.org/download/tilderwhirl-S01E01/tildewhirl-s01e08.mp3">enclosure</a>
3100</div>
3101<div class="content"><h2 id="notes">notes</h2>
3102<p>Check out eli:</p>
3103<ul>
3104<li><a href="https://eli.li/" class="uri">https://eli.li/</a></li>
3105<li><a href="https://dog.estate/@eli_oat" class="uri">https://dog.estate/@eli_oat</a></li>
3106</ul>
3107<p>This is a super fun show! We talk about making the internet quieter and weirder, and games, and all kinds of stuff.</p>
3108<p>Check it out!</p>
3109<!-- this episode's secret phrase is 'quiet and weird' //-->
3110<p>Your secret message for this episode is:</p>
3111<pre><code>eofgq ytb mtj iofedwdj ntth ytb ht cg eod itjrh ethfy kdlfbvd ce icrr sfqd eod itjrh eofe sblo kdeedj f urfld fgh id frr gddh fv sblo odru fv id lfg nde</code></pre>
3112<figure>
3113<img src="assets/img/tildefold.jpg" alt="tildefold" /><figcaption aria-hidden="true">tildefold</figcaption>
3114</figure>
3115<figure>
3116<img src="assets/img/cryptid.jpg" alt="cryptid" /><figcaption aria-hidden="true">cryptid</figcaption>
3117</figure>
3118<h2 id="segments">segments</h2>
3119<ul>
3120<li>food and wine</li>
3121<li>letters from our listeners
3122<ul>
3123<li><a href="https://piepi.kindrobot.ca/" class="uri">https://piepi.kindrobot.ca/</a></li>
3124<li><a href="https://journal.miso.town/" class="uri">https://journal.miso.town/</a></li>
3125<li><a href="https://kiosk.nightfall.city/" class="uri">https://kiosk.nightfall.city/</a></li>
3126<li><a href="https://smol.pub/" class="uri">https://smol.pub/</a></li>
3127</ul></li>
3128<li>poetry corner
3129<ul>
3130<li><a href="https://www.theredhandfiles.com/god-is-love-but-love-gets-weird/" class="uri">https://www.theredhandfiles.com/god-is-love-but-love-gets-weird/</a></li>
3131<li><a href="http://www.spookyrusty.com/2022/07/cryptid-in-july-poetry-day-02-cactus-cat.html" class="uri">http://www.spookyrusty.com/2022/07/cryptid-in-july-poetry-day-02-cactus-cat.html</a></li>
3132<li><a href="https://en.wikipedia.org/wiki/Cactus_cat" class="uri">https://en.wikipedia.org/wiki/Cactus_cat</a></li>
3133</ul></li>
3134<li>see you in the funny papers</li>
3135<li>story corner – joneworlds chapters 15 - 20
3136<ul>
3137<li>goblin racing – <a href="https://nightfall.city/x/republic.circumlunar.space/users/joneworlds/2020-12-13-goblin-racing.gmi" class="uri">https://nightfall.city/x/republic.circumlunar.space/users/joneworlds/2020-12-13-goblin-racing.gmi</a></li>
3138</ul></li>
3139<li>hey gamers! – Let’s play Lisergia / Abenteuerspiel!
3140<ul>
3141<li><a href="https://terriblybeautiful.itch.io/abenteuerspiel" class="uri">https://terriblybeautiful.itch.io/abenteuerspiel</a></li>
3142<li><a href="https://capacle.itch.io/lisergia" class="uri">https://capacle.itch.io/lisergia</a></li>
3143</ul></li>
3144</ul>
3145<h2 id="links">links</h2>
3146<p>Stuff we talked about on the show</p>
3147<ul>
3148<li>tiny pomodoro timer: <a href="https://eli.li/2020/04/18/%F0%9F%8D%85-tiny-tomato-timer" class="uri">https://eli.li/2020/04/18/%F0%9F%8D%85-tiny-tomato-timer</a></li>
3149<li>my fennel ripoff of tiny pomodoro timer: <a href="https://tildegit.org/dozens/pomo" class="uri">https://tildegit.org/dozens/pomo</a></li>
3150<li>eli on breadpunk – <a href="https://breadpunk.club/~yeast/" class="uri">https://breadpunk.club/~yeast/</a></li>
3151<li>How to Build a Low-tech Website?, LOW←TECH MAGAZINE – <a href="https://solar.lowtechmagazine.com/2018/09/how-to-build-a-lowtech-website/" class="uri">https://solar.lowtechmagazine.com/2018/09/how-to-build-a-lowtech-website/</a></li>
3152<li>Super Vegan – <a href="https://supervegan.neocities.org/" class="uri">https://supervegan.neocities.org/</a></li>
3153<li>Retro Forth – <a href="http://retroforth.org/" class="uri">http://retroforth.org/</a></li>
3154<li>Guava! – <a href="https://txt.eli.li/pb/guava/" class="uri">https://txt.eli.li/pb/guava/</a> – <a href="https://git.sr.ht/~eli_oat/guava" class="uri">https://git.sr.ht/~eli_oat/guava</a></li>
3155<li><a href="https://search.marginalia.nu/" class="uri">https://search.marginalia.nu/</a></li>
3156<li><a href="https://wiby.me/" class="uri">https://wiby.me/</a></li>
3157<li><a href="https://indieweb.org/" class="uri">https://indieweb.org/</a></li>
3158<li><a href="https://miniflux.app/" class="uri">https://miniflux.app/</a></li>
3159<li><a href="https://codemadness.org/sfeed-simple-feed-parser.html" class="uri">https://codemadness.org/sfeed-simple-feed-parser.html</a></li>
3160<li><a href="https://txt.eli.li/pb/rss/feeds.html" class="uri">https://txt.eli.li/pb/rss/feeds.html</a></li>
3161<li><a href="https://rss.tildeverse.org" class="uri">https://rss.tildeverse.org</a></li>
3162<li><a href="https://github.com/jmdejong/daily_adventure" class="uri">https://github.com/jmdejong/daily_adventure</a></li>
3163<li><a href="http://tilde.town/~eli_oat/map/map.txt" class="uri">http://tilde.town/~eli_oat/map/map.txt</a></li>
3164<li>angband – <a href="https://rephial.org/" class="uri">https://rephial.org/</a></li>
3165<li>miscroscope – <a href="https://www.lamemage.com/microscope/" class="uri">https://www.lamemage.com/microscope/</a></li>
3166<li>the quiet year – <a href="https://buriedwithoutceremony.com/the-quiet-year" class="uri">https://buriedwithoutceremony.com/the-quiet-year</a></li>
3167<li>Project Xanadu! – <a href="https://en.wikipedia.org/wiki/Project_Xanadu" class="uri">https://en.wikipedia.org/wiki/Project_Xanadu</a></li>
3168<li>csvkit – <a href="https://csvkit.readthedocs.io/en/latest/index.html" class="uri">https://csvkit.readthedocs.io/en/latest/index.html</a></li>
3169</ul></div>
3170<details class="info"><summary>item information</summary>
3171timestamp: 1657653132
3172title: [Tilde Whirl Tildeverse Podcast] episode 8
3173link: https://tilde.town/~dozens/podcast/2022-07-12-episode-8-eli.html
3174content_type: html
3175id: Thu, 12 July 2022 12:12:12 -0700
3176author:
3177enclosure: https://archive.org/download/tilderwhirl-S01E01/tildewhirl-s01e08.mp3
3178category:
3179</details>
3180</details>
3181<details>
3182<summary>[linkbudz rss feed] james webb first images</summary>
3183<div class="links">
3184<a href="https://www.nasa.gov/webbfirstimages">read original</a>
3185</div>
3186<div class="content"><p><a href="https://www.nasa.gov/webbfirstimages">james webb first images</a></p>
3187 <p>[https] posted by acdw on July 12, 2022</p></div>
3188<details class="info"><summary>item information</summary>
3189timestamp: 1657648512
3190title: [linkbudz rss feed] james webb first images
3191link: https://www.nasa.gov/webbfirstimages
3192content_type: html
3193id: acdw20220712175512
3194author:
3195enclosure:
3196category: https
3197</details>
3198</details>
3199<details>
3200<summary>[linkbudz rss feed] relative vs absolute urls in rss content hell</summary>
3201<div class="links">
3202<a href="https://www.jessesquires.com/blog/2021/06/06/rss-feeds-jekyll-and-absolute-versus-relative-urls/">read original</a>
3203</div>
3204<div class="content"><p><a href="https://www.jessesquires.com/blog/2021/06/06/rss-feeds-jekyll-and-absolute-versus-relative-urls/">relative vs absolute urls in rss content hell</a></p>
3205 <p>[https] posted by m455 on July 12, 2022</p></div>
3206<details class="info"><summary>item information</summary>
3207timestamp: 1657592772
3208title: [linkbudz rss feed] relative vs absolute urls in rss content hell
3209link: https://www.jessesquires.com/blog/2021/06/06/rss-feeds-jekyll-and-absolute-versus-relative-urls/
3210content_type: html
3211id: m45520220712022612
3212author:
3213enclosure:
3214category: https
3215</details>
3216</details>
3217<details>
3218<summary>[~lucidiot's wiki] books</summary>
3219<div class="links">
3220<a href="https://envs.net/~lucidiot/books.html">read original</a>
3221</div>
3222<div class="content"></div>
3223<details class="info"><summary>item information</summary>
3224timestamp: 1657530341
3225title: [~lucidiot's wiki] books
3226link: https://envs.net/~lucidiot/books.html
3227content_type:
3228id: https://envs.net/~lucidiot/books.html
3229author:
3230enclosure:
3231category:
3232</details>
3233</details>
3234<details>
3235<summary>[linkbudz rss feed] web-based system administration for Unix</summary>
3236<div class="links">
3237<a href="https://www.webmin.com/demo.html">read original</a>
3238</div>
3239<div class="content"><p><a href="https://www.webmin.com/demo.html">web-based system administration for Unix</a></p>
3240 <p>[https] posted by m455 on July 11, 2022</p></div>
3241<details class="info"><summary>item information</summary>
3242timestamp: 1657515744
3243title: [linkbudz rss feed] web-based system administration for Unix
3244link: https://www.webmin.com/demo.html
3245content_type: html
3246id: m45520220711050224
3247author:
3248enclosure:
3249category: https
3250</details>
3251</details>
3252<details>
3253<summary>[linkbudz rss feed] stylish text generator (all of the early msn messenger nickname ascii art you need)</summary>
3254<div class="links">
3255<a href="https://www.webestools.com/stylish-text-generator-nickname-message-msn-facebook-windows-live-messenger-text-accents-effect-ascii-text.html">read original</a>
3256</div>
3257<div class="content"><p><a href="https://www.webestools.com/stylish-text-generator-nickname-message-msn-facebook-windows-live-messenger-text-accents-effect-ascii-text.html">stylish text generator (all of the early msn messenger nickname ascii art you need)</a></p>
3258 <p>[https] posted by m455 on July 11, 2022</p></div>
3259<details class="info"><summary>item information</summary>
3260timestamp: 1657511814
3261title: [linkbudz rss feed] stylish text generator (all of the early msn messenger nickname ascii art you need)
3262link: https://www.webestools.com/stylish-text-generator-nickname-message-msn-facebook-windows-live-messenger-text-accents-effect-ascii-text.html
3263content_type: html
3264id: m45520220711035654
3265author:
3266enclosure:
3267category: https
3268</details>
3269</details>
3270<details>
3271<summary>[Brainshit] La version méconnue du texte bien connu, première partie</summary>
3272<div class="links">
3273<a href="https://brainshit.fr/read/306">read original</a>
3274</div>
3275<div class="content">Le grand retour du terrible standard ISO.</div>
3276<details class="info"><summary>item information</summary>
3277timestamp: 1657490400
3278title: [Brainshit] La version méconnue du texte bien connu, première partie
3279link: https://brainshit.fr/read/306
3280content_type: html
3281id: https://brainshit.fr/read/306
3282author: neuron@brainshit.fr (Lucidiot)
3283enclosure:
3284category: Informatique
3285</details>
3286</details>
3287<details>
3288<summary>[ Oatmeal] </summary>
3289<div class="links">
3290<a href="https://eli.li/2022/07/10/%F0%9F%91%8B-oh-hai">read original</a>
3291</div>
3292<div class="content"><p>In reply to: <a href="https://tilde.town/~dozens/podcast/2022-07-12-episode-8-eli.html">episode 8</a></p>
3293<p><span class="small-caps">&#x1F44B;</span> Oh hai!</p>
3294<p>I was interviewed on a podcast!</p></div>
3295<details class="info"><summary>item information</summary>
3296timestamp: 1657482512
3297title: [ Oatmeal]
3298link: https://eli.li/2022/07/10/%F0%9F%91%8B-oh-hai
3299content_type: html
3300id: https://eli.li/2022/07/10/%F0%9F%91%8B-oh-hai
3301author:
3302enclosure:
3303category:
3304</details>
3305</details>
3306<details>
3307<summary>[ Oatmeal] </summary>
3308<div class="links">
3309<a href="https://eli.li/2022/07/9/2022-07-09-11-48-32">read original</a>
3310</div>
3311<div class="content"><p><img src="https://eli.li/_assets/_images/ios/F8755BC7-6B7E-4774-870E-A4FF74EB4F2F.png" class="u-photo" alt="Toddler holding a stuffy wanders by a community garden nestled into the edge of some woods."></p></div>
3312<details class="info"><summary>item information</summary>
3313timestamp: 1657381712
3314title: [ Oatmeal]
3315link: https://eli.li/2022/07/9/2022-07-09-11-48-32
3316content_type: html
3317id: https://eli.li/2022/07/9/2022-07-09-11-48-32
3318author:
3319enclosure:
3320category:
3321</details>
3322</details>
3323<details>
3324<summary>[ Oatmeal] </summary>
3325<div class="links">
3326<a href="https://eli.li/2022/07/9/this-is-also-something-people-keep-getting-wrong-about-markdown-as-originally-presented">read original</a>
3327</div>
3328<div class="content"><p>In reply to: <a href="https://idiomdrottning.org/a-simple-mess">A simple mess</a></p>
3329<blockquote>
3330<p>This is also something people keep getting wrong about Markdown as originally presented. Markdown isn&#x2019;t a format. It&#x2019;s a convenience tool that helps you write some of the boringest and commonest parts of <span class="small-caps">HTML</span> easier, and you can easily drop into more wonky <span class="small-caps">HTML</span> at any time.</p>
3331</blockquote>
3332<p>Yes yes yes yes yes yes!</p>
3333<p>Markdown isn&#x2019;t supposed to be a markup language unto itself. It is an intermediary format that usually targets <span class="small-caps">HTML</span> as it&#x2019;s final form.</p></div>
3334<details class="info"><summary>item information</summary>
3335timestamp: 1657370538
3336title: [ Oatmeal]
3337link: https://eli.li/2022/07/9/this-is-also-something-people-keep-getting-wrong-about-markdown-as-originally-presented
3338content_type: html
3339id: https://eli.li/2022/07/9/this-is-also-something-people-keep-getting-wrong-about-markdown-as-originally-presented
3340author:
3341enclosure:
3342category:
3343</details>
3344</details>
3345<details>
3346<summary>[linkbudz rss feed] Barrett's Privateers</summary>
3347<div class="links">
3348<a href="https://www.youtube.com/watch?v=ZIwzRkjn86w">read original</a>
3349</div>
3350<div class="content"><p><a href="https://www.youtube.com/watch?v=ZIwzRkjn86w">Barrett's Privateers</a></p>
3351 <p>[https] posted by acdw on July 08, 2022</p></div>
3352<details class="info"><summary>item information</summary>
3353timestamp: 1657313546
3354title: [linkbudz rss feed] Barrett's Privateers
3355link: https://www.youtube.com/watch?v=ZIwzRkjn86w
3356content_type: html
3357id: acdw20220708205226
3358author:
3359enclosure:
3360category: https
3361</details>
3362</details>
3363<details>
3364<summary>[#fridaypostcard] "GAME" designed by Leo Kupper</summary>
3365<div class="links">
3366<a href="http://ttm.sh/w8c.jpg">read original</a>
3367<a href="http://ttm.sh/w8c.jpg">enclosure</a>
3368</div>
3369<div class="content">"GAME" designed by Leo Kupper<br />~flowercorpse</div>
3370<details class="info"><summary>item information</summary>
3371timestamp: 1657311695
3372title: [#fridaypostcard] "GAME" designed by Leo Kupper
3373link: http://ttm.sh/w8c.jpg
3374content_type: html
3375id: http://ttm.sh/w8c.jpg
3376author: flowercorpse@tilde.town (flowercorpse)
3377enclosure: http://ttm.sh/w8c.jpg
3378category:
3379</details>
3380</details>
3381<details>
3382<summary>[linkbudz rss feed] SEA SHANTY RADIOOOOOO</summary>
3383<div class="links">
3384<a href="https://www.smshantyradio.com/">read original</a>
3385</div>
3386<div class="content"><p><a href="https://www.smshantyradio.com/">SEA SHANTY RADIOOOOOO</a></p>
3387 <p>[https] posted by acdw on July 08, 2022</p></div>
3388<details class="info"><summary>item information</summary>
3389timestamp: 1657308844
3390title: [linkbudz rss feed] SEA SHANTY RADIOOOOOO
3391link: https://www.smshantyradio.com/
3392content_type: html
3393id: acdw20220708193404
3394author:
3395enclosure:
3396category: https
3397</details>
3398</details>
3399<details>
3400<summary>[linkbudz rss feed] How to build a web app with Clack/Lack (Common Lisp)</summary>
3401<div class="links">
3402<a href="https://fukamachi.hashnode.dev/how-to-build-a-web-app-with-clack-and-lack-1">read original</a>
3403</div>
3404<div class="content"><p><a href="https://fukamachi.hashnode.dev/how-to-build-a-web-app-with-clack-and-lack-1">How to build a web app with Clack/Lack (Common Lisp)</a></p>
3405 <p>[https] posted by elioat on July 08, 2022</p></div>
3406<details class="info"><summary>item information</summary>
3407timestamp: 1657287327
3408title: [linkbudz rss feed] How to build a web app with Clack/Lack (Common Lisp)
3409link: https://fukamachi.hashnode.dev/how-to-build-a-web-app-with-clack-and-lack-1
3410content_type: html
3411id: elioat20220708133527
3412author:
3413enclosure:
3414category: https
3415</details>
3416</details>
3417<details>
3418<summary>[linkbudz rss feed] Apparently, a new search engine disgned with devs in mind.</summary>
3419<div class="links">
3420<a href="https://beta.sayhello.so/">read original</a>
3421</div>
3422<div class="content"><p><a href="https://beta.sayhello.so/">Apparently, a new search engine disgned with devs in mind.</a></p>
3423 <p>[https] posted by marcus on July 07, 2022</p></div>
3424<details class="info"><summary>item information</summary>
3425timestamp: 1657219689
3426title: [linkbudz rss feed] Apparently, a new search engine disgned with devs in mind.
3427link: https://beta.sayhello.so/
3428content_type: html
3429id: marcus20220707184809
3430author:
3431enclosure:
3432category: https
3433</details>
3434</details>
3435<details>
3436<summary>[linkbudz rss feed] a blog platform for hackers</summary>
3437<div class="links">
3438<a href="https://prose.sh/">read original</a>
3439</div>
3440<div class="content"><p><a href="https://prose.sh/">a blog platform for hackers</a></p>
3441 <p>[https] posted by acdw on July 07, 2022</p></div>
3442<details class="info"><summary>item information</summary>
3443timestamp: 1657217758
3444title: [linkbudz rss feed] a blog platform for hackers
3445link: https://prose.sh/
3446content_type: html
3447id: acdw20220707181558
3448author:
3449enclosure:
3450category: https
3451</details>
3452</details>
3453<details>
3454<summary>[linkbudz rss feed] a scheme primer</summary>
3455<div class="links">
3456<a href="https://spritely.institute/static/papers/scheme-primer.html">read original</a>
3457</div>
3458<div class="content"><p><a href="https://spritely.institute/static/papers/scheme-primer.html">a scheme primer</a></p>
3459 <p>[https] posted by mio on July 07, 2022</p></div>
3460<details class="info"><summary>item information</summary>
3461timestamp: 1657217609
3462title: [linkbudz rss feed] a scheme primer
3463link: https://spritely.institute/static/papers/scheme-primer.html
3464content_type: html
3465id: mio20220707181329
3466author:
3467enclosure:
3468category: https
3469</details>
3470</details>
3471<details>
3472<summary>[linkbudz rss feed] fraidycat: like RSS but more</summary>
3473<div class="links">
3474<a href="https://github.com/kickscondor/fraidycat">read original</a>
3475</div>
3476<div class="content"><p><a href="https://github.com/kickscondor/fraidycat">fraidycat: like RSS but more</a></p>
3477 <p>[https] posted by dozens on July 07, 2022</p></div>
3478<details class="info"><summary>item information</summary>
3479timestamp: 1657203690
3480title: [linkbudz rss feed] fraidycat: like RSS but more
3481link: https://github.com/kickscondor/fraidycat
3482content_type: html
3483id: dozens20220707142130
3484author:
3485enclosure:
3486category: https
3487</details>
3488</details>
3489<details>
3490<summary>[Dozens and Dragons] magic words</summary>
3491<div class="links">
3492<a href="https://dozensanddragons.neocities.org/27.html">read original</a>
3493</div>
3494<div class="content">bibliomantic generation of spells and grimories</div>
3495<details class="info"><summary>item information</summary>
3496timestamp: 1657166400
3497title: [Dozens and Dragons] magic words
3498link: https://dozensanddragons.neocities.org/27.html
3499content_type: html
3500id: https://dozensanddragons.neocities.org/27.html
3501author:
3502enclosure:
3503category:
3504</details>
3505</details>
3506<details>
3507<summary>[lipu pi jan Niko] some writing thoughts, and probably leaving gemini</summary>
3508<div class="links">
3509<a href="https://tilde.town/~nihilazo/log/onwriting.html">read original</a>
3510</div>
3511<div class="content">Starting a new post is hard. This seems to be a universally accepted fact among people who post stuff (except, maybe, the people who are actually good at it). When you have nothing but ideas and a blank page, and you want to somehow communicate those ideas, in a form that is readable and understandable.
3512A lot of writers have special tricks for starting posts - starting with research notes or a system like zettelkasten can be a good start, but is difficult for posts that are based on personal thoughts (like most things I personally write).</div>
3513<details class="info"><summary>item information</summary>
3514timestamp: 1657152000
3515title: [lipu pi jan Niko] some writing thoughts, and probably leaving gemini
3516link: https://tilde.town/~nihilazo/log/onwriting.html
3517content_type: html
3518id: https://tilde.town/~nihilazo/log/onwriting.html
3519author:
3520enclosure:
3521category:
3522</details>
3523</details>
3524<details>
3525<summary>[Brainshit] Bada Bing</summary>
3526<div class="links">
3527<a href="https://brainshit.fr/read/310">read original</a>
3528</div>
3529<div class="content">Un test de burger en pleine fête de la musique.</div>
3530<details class="info"><summary>item information</summary>
3531timestamp: 1657144800
3532title: [Brainshit] Bada Bing
3533link: https://brainshit.fr/read/310
3534content_type: html
3535id: https://brainshit.fr/read/310
3536author: neuron@brainshit.fr (Lucidiot)
3537enclosure:
3538category: Gastronomie
3539</details>
3540</details>
3541<details>
3542<summary>[bakersdozen gemlog] Thoughts On The Fourth Of July In The Year 2022</summary>
3543<div class="links">
3544<a href="gemini://breadpunk.club/~bakersdozen/gemlog/13.gmi">read original</a>
3545</div>
3546<div class="content"></div>
3547<details class="info"><summary>item information</summary>
3548timestamp: 1657129342
3549title: [bakersdozen gemlog] Thoughts On The Fourth Of July In The Year 2022
3550link: gemini://breadpunk.club/~bakersdozen/gemlog/13.gmi
3551content_type:
3552id: gemini://breadpunk.club/~bakersdozen/gemlog/13.gmi
3553author:
3554enclosure:
3555category:
3556</details>
3557</details>
3558<details>
3559<summary>[linkbudz rss feed] has this been posted yet?</summary>
3560<div class="links">
3561<a href="https://neal.fun/absurd-trolley-problems/">read original</a>
3562</div>
3563<div class="content"><p><a href="https://neal.fun/absurd-trolley-problems/">has this been posted yet?</a></p>
3564 <p>[https] posted by acdw on July 06, 2022</p></div>
3565<details class="info"><summary>item information</summary>
3566timestamp: 1657118195
3567title: [linkbudz rss feed] has this been posted yet?
3568link: https://neal.fun/absurd-trolley-problems/
3569content_type: html
3570id: acdw20220706143635
3571author:
3572enclosure:
3573category: https
3574</details>
3575</details>
3576<details>
3577<summary>[linkbudz rss feed] learn a language with forth!</summary>
3578<div class="links">
3579<a href="https://zserge.com/posts/too-many-forths/">read original</a>
3580</div>
3581<div class="content"><p><a href="https://zserge.com/posts/too-many-forths/">learn a language with forth!</a></p>
3582 <p>[https] posted by acdw on July 06, 2022</p></div>
3583<details class="info"><summary>item information</summary>
3584timestamp: 1657117491
3585title: [linkbudz rss feed] learn a language with forth!
3586link: https://zserge.com/posts/too-many-forths/
3587content_type: html
3588id: acdw20220706142451
3589author:
3590enclosure:
3591category: https
3592</details>
3593</details>
3594<details>
3595<summary>[ Oatmeal] Lamination for a lost explorer</summary>
3596<div class="links">
3597<a href="https://eli.li/2022/07/6/lamination-for-a-lost-explorer">read original</a>
3598</div>
3599<div class="content"><p>I remember the days when <a href="https://www.kickscondor.com">Kicks Condor</a> used to update regularly. I miss those days.</p>
3600<p>For a while every post seemed to unearth some new, yet weirder corner of the little internet (maybe not yet the smol web).</p>
3601<p>There are folks doing similar web archeology&#x2026;<a href="https://eli.li/tagged/link-log">I do some of it myself</a>&#x2026;but no one does it like Kicks was doing it; there was often a feeling of unknown, but ulterior motive behind the curation&#x2009;&#x2014;&#x2009;bits building towards a cohesive something.</p>
3602<p>Perhaps Kicks got lost in the web&#x2009;&#x2014;&#x2009;out there still?</p></div>
3603<details class="info"><summary>item information</summary>
3604timestamp: 1657116113
3605title: [ Oatmeal] Lamination for a lost explorer
3606link: https://eli.li/2022/07/6/lamination-for-a-lost-explorer
3607content_type: html
3608id: https://eli.li/2022/07/6/lamination-for-a-lost-explorer
3609author:
3610enclosure:
3611category:
3612</details>
3613</details>
3614<details>
3615<summary>[blog __ ~ben] sqlite3 for wordpress</summary>
3616<div class="links">
3617<a href="https://tilde.team/~ben/blog/sqlite3-for-wordpress.html">read original</a>
3618</div>
3619<div class="content"><h1 id="sqlite3-for-wordpress">sqlite3 for wordpress</h1>
3620<p>running wordpress with sqlite is quick, easy, and can be much less
3621system administration load as it eliminates the need for a separate
3622database process running.</p>
3623<p><a href="https://wptest.bhh.sh">this site</a> is currently running with sqlite using <a href="https://github.com/aaemnnosttv/wp-sqlite-db">aaemnnosttv&rsquo;s
3624drop-in</a>.</p>
3625<h2 id="set-it-up">set it up</h2>
3626<ul>
3627<li>download <a href="https://wordpress.org/latest.tar.gz">https://wordpress.org/latest.tar.gz</a></li>
3628<li>extract it into your webroot (something like <code>/var/www</code>)</li>
3629<li>download
3630<a href="https://github.com/aaemnnosttv/wp-sqlite-db/raw/master/src/db.php">db.php</a>
3631and add it to <code>/var/www/yoursite/wp-content/</code></li>
3632<li>follow the normal setup instructions but skip the database fields</li>
3633<li>profit????</li>
3634</ul>
3635<h2 id="nginx-config">nginx config</h2>
3636<p>adjust configs as needed. this is the live config for this site
3637wptest.bhh.sh.</p>
3638<p>snippets/ssl/bhh.sh just includes the block from certbot that points to
3639the right cert and key.</p>
3640<pre><code>server {
3641 listen 80;
3642 server_name wptest.bhh.sh;
3643 return 307 https://$server_name$request_uri;
3644}
3645
3646server {
3647 listen 443 ssl;
3648 server_name wptest.bhh.sh;
3649 include snippets/ssl/bhh.sh;
3650 index index.php index.html;
3651 root /var/www/wptest.bhh.sh;
3652 client_max_body_size 100M;
3653
3654 location / {
3655 try_files $uri $uri/ /index.php?$args;
3656 }
3657
3658 location = /favicon.ico {
3659 log_not_found off;
3660 access_log off;
3661 }
3662
3663 location = /robots.txt {
3664 allow all;
3665 log_not_found off;
3666 access_log off;
3667 }
3668
3669 location ~* wp-config.php {
3670 deny all;
3671 }
3672
3673 location ~ \.php$ {
3674 include snippets/fastcgi-php.conf;
3675 fastcgi_intercept_errors on;
3676 fastcgi_pass unix:/run/php/php7.4-fpm.sock;
3677 }
3678
3679 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
3680 expires max;
3681 log_not_found off;
3682 }
3683
3684 location ~ /\.ht {
3685 deny all;
3686 }
3687}
3688</code></pre></div>
3689<details class="info"><summary>item information</summary>
3690timestamp: 1657115580
3691title: [blog __ ~ben] sqlite3 for wordpress
3692link: https://tilde.team/~ben/blog/sqlite3-for-wordpress.html
3693content_type: html
3694id: https://tilde.team/~ben/blog/sqlite3-for-wordpress.html
3695author:
3696enclosure:
3697category:
3698</details>
3699</details>
3700<details>
3701<summary>[linkbudz rss feed] grug brain developer</summary>
3702<div class="links">
3703<a href="https://grugbrain.dev">read original</a>
3704</div>
3705<div class="content"><p><a href="https://grugbrain.dev">grug brain developer</a></p>
3706 <p>[https] posted by elioat on July 06, 2022</p></div>
3707<details class="info"><summary>item information</summary>
3708timestamp: 1657114822
3709title: [linkbudz rss feed] grug brain developer
3710link: https://grugbrain.dev
3711content_type: html
3712id: elioat20220706134022
3713author:
3714enclosure:
3715category: https
3716</details>
3717</details>
3718<details>
3719<summary>[linkbudz rss feed] html journal format</summary>
3720<div class="links">
3721<a href="https://journal.miso.town/">read original</a>
3722</div>
3723<div class="content"><p><a href="https://journal.miso.town/">html journal format</a></p>
3724 <p>[https] posted by dozens on July 05, 2022</p></div>
3725<details class="info"><summary>item information</summary>
3726timestamp: 1657040286
3727title: [linkbudz rss feed] html journal format
3728link: https://journal.miso.town/
3729content_type: html
3730id: dozens20220705165806
3731author:
3732enclosure:
3733category: https
3734</details>
3735</details>
3736<details>
3737<summary>[linkbudz rss feed] Genealogy of ELIZA programs</summary>
3738<div class="links">
3739<a href="https://sites.google.com/view/elizagen-org/the-original-eliza">read original</a>
3740</div>
3741<div class="content"><p><a href="https://sites.google.com/view/elizagen-org/the-original-eliza">Genealogy of ELIZA programs</a></p>
3742 <p>[https] posted by elioat on July 05, 2022</p></div>
3743<details class="info"><summary>item information</summary>
3744timestamp: 1657027698
3745title: [linkbudz rss feed] Genealogy of ELIZA programs
3746link: https://sites.google.com/view/elizagen-org/the-original-eliza
3747content_type: html
3748id: elioat20220705132818
3749author:
3750enclosure:
3751category: https
3752</details>
3753</details>
3754<details>
3755<summary>[(lambda (x) (create x))] Truly using Lapis</summary>
3756<div class="links">
3757<a href="https://lambdacreate.com/posts/35">read original</a>
3758</div>
3759<div class="content"><h2>Truly using Lapis</h2>
3760<h3>Rebuilding LambdaCreate's Internals &middot; July 5th, 2022</h3>
3761
3762<p>It feels like it's been a while since I've written anything for the blog, the last post has been up since I did my Tildewhirl interview back in April and there's been nothing but silence here since then. That's not because I haven't wanted to post, I started working on capturing some tkts development, and I've had a couple of friends ask for tutorials on using iptables and packaging things. I'm really excited to get that feedback and write those posts, I just haven't been able to!</p>
3763
3764<p>That begs the question, why not? Well the way that lambdacreate was designed initially was essentially me fumbling around with Lua and Lapis and just shoving everything that sort of worked into a docker container and calling it a day. The packages I relied on at the time weren't well maintained in Alpine, I really had no clue how to design a website let alone a somewhat dynamic web application, so I more or less hacked around these limitations using a bit of administrative magic and the result was the blog up until this point. It should look the same as before, but now we're way more functional! I no longer need to rebuild an x86_64 docker container just to post a new blog post, I can work solely with flat text files and lua and manage everything the old fashioned way. That's potentially what I should have done to begin with.</p>
3765
3766<p>See the biggest issue with the design was the creation of the container itself, like the last post explained, most of my computer is done on an old armv7 system. It's took weak to build containers, even if they're not cross compiled, heck I tried to get qemu to run on the droid just for the heck of it and it couldn't even handle launching a VM in a reasonable time frame. The point is, that tooling is just too heavy for what I use day to day. Previously that meant digging out a different computer, like my Asus netbook which has a N4000 Celeron in it, just to make an already written post live. If I'm traveling that means everything grinds to a halt and there's no posts because I typically only bring my droid with me out and about. Major pain.</p>
3767
3768<p>I guess what I'm trying to say is I de-over-engineered my blog, bye bye docker, hello old school administration! But that doesn't mean we've gone off the reserve and migrated to a static site generate, oh no, this is the same great Lua on Lapis dynamically generated content we started with, I'm just holding the tool correctly this time.</p>
3769
3770<h2>Redesigning the Site</h2>
3771
3772<p>If you're on mobile you'll probably need to scroll to the bottom of the page, otherwise I'm sure you noticed the changes on the right hand bar. I've added a number of new routes to the site to handle blog post, archiving, podcasts, and projects. Some of that is familiar, plenty of it is new, and some of it was supposed to work from the onset but it took me two years to properly implement. I'll let you click around and explore the changes to the site by yourself, lets talk about Lapis and how all of this works.</p>
3773
3774<h3>Routes in Lapis</h3>
3775
3776<p>In Lapis your web application is a collection of lua scripts that get executed by OpenResty. From a 1000ft view the core of that is a file called app.lua that Lapis loads with all of its various dependencies just like any lua runtime. Your routes leverage a Lapis internal called Lapis.Application which has an OO style implementation. All of this just means that your Lapis application is a collection of supporting lua libraries and app:function("route", "uri" function()) calls. Here's the index function for Lambdacreate, it'll make things clearer.</p>
3777
3778<div class="codeSnippet">
3779 <pre><code>
3780app:match("index", "/", function(self)
3781 --Table of last 10 blog posts
3782 self.archive = lcpost.getLast(10)
3783 --The last published post
3784 self.latest = lcpost.getPost(lcpost.getLatest())
3785 --Last update of published post
3786 self.timestamp = lcpost.getUpdated(lcpost.getLatest())
3787 self.shows = lcpod.getShows()
3788 --Table of projects
3789 self.projects = lcproj.getArchive()
3790 self.internal_layout = "index"
3791 return { render = true, layout = "layout" }
3792end)
3793 </code></pre>
3794</div>
3795
3796<p>When you visit https://lambdacreate.com the Lapis application matches the HTTP request to the "index" route, which triggers a cascade of functions to internally gather information. Note the self variable here, the function that the route triggers has a self = {} var, that we attach named values to. These self variables are accessible inside of the etlua templating engine, which is what we use to do something with all of this information. These templates are part of the layout variable in the return call, we return the output of the route function to Lapis, which renders the layout template with the values from self. In Lambdacreate I use a global layout.etlua file, and then an internal_layout self variable to change the inner content.</p>
3797
3798<p>This may make more sense if you look at the full template alongside the explanation, <a href="https://gitlab.com/durrendal/lambdacreate/-/blob/master/blog/views/layout.etlua">layout.etlua can be found here</a>, and <a href="https://gitlab.com/durrendal/lambdacreate/-/blob/master/blog/views/index.etlua">index.etlua can be found here</a>.</p>
3799
3800<p>Inside of layout.etlua we have a render function call that takes the value of the self.internal_layout and renders it's content. It essentially nests that etlua template into the layout.etlua template so the self variables are shared inside of that internally rendered template. Since self.internal_layout = "index", we render the body block of the website to the contents of the index template.</p>
3801
3802<div class="codeSnippet">
3803 <pre><code>
3804<section class='content'>
3805 < render("views." .. internal_layout) >
3806</section>
3807 </code></pre>
3808</div>
3809
3810<p>That index.etlua file looks like this in full, you can see we're calling even more templates to render inside of that, but you get the gist. Anything inside of self is referential inside of etlua. I had to convert the HTML tags to paranthesis, because it kept breaking my etlua template rendering. Hopefully it's clear enoug.</p>
3811
3812<div class="codeSnippet">
3813 <pre><code>
3814(div class="row")
3815 (div class="leftcolumn")
3816 (div class="post")
3817 (% render("views.posts." .. latest.id) %)
3818 (/div)
3819 (/div)
3820 (div class="rightcolumn")
3821 (div class="card")
3822 (h3)Bio(/h3)
3823 (% render("views.about") %)
3824 (/div)
3825 (div class="card")
3826 (h3)Recent Posts:(/h3)
3827 (ul class="list")
3828 (% for k, v in pairs(archive) do %)
3829 (% local route = "https://lambdacreate.com/posts/" .. v.id %)
3830 (li)(a href="(%= build_url(route, { key = v.id }) %)")(%= v.title )(/)(/li)
3831 (% end %)
3832 (/ul)
3833 (h3)(a href="(%= build_url('archive/post') )")Post Archive(/a)(/h3)
3834 (/div)
3835 (% render("views.shows") %)
3836 (% render("views.dev") %)
3837 (/div)
3838(/div)
3839 </code></pre>
3840</div>
3841
3842<p>What's really cool, is the Recent Posts segment, it's a lua function nested into the template itself. All it does is build a route by iterating over a table of information that gets passed by the self.archive variable. What this means is that the we only have to define the Recent Posts once as this function, every time we add a new post to the database the site will re-render the page the next time it's visited. No need to rebuild, reload, etc. Most of the templates that get rendered by layout or inside of index operate like this! We just need to know where to look.</p>
3843
3844<h3>Post/Podcast Generation</h3>
3845
3846<p>So now that you know a bit about the templates, you can probably guess that our blog posts (and podcast episodes!) are generated the same way, but where are we fetching all of this information from? Well previously we stored all of our post information in a file called posts.lua, and it was a big old lua table filled with keys and values. Things haven't changed too much from that design honestly, we're still passing all of the information needed to render a route to Lapis as a table, however we're storing and managing that information in an Sqlite3 database! Lets look at lcpost.getLast(10) in the index route.</p>
3847
3848<div class="codeSnippet">
3849 <pre><code>
3850--Return a table of the last X records
3851function lcpost.getLast(num)
3852 local db = sql.open("lc.db")
3853 local stmt = db:prepare("SELECT id,title FROM posts ORDER BY id DESC LIMIT :limit")
3854 local info = {}
3855 stmt:bind_names({limit = num})
3856 for row in stmt:nrows() do
3857 table.insert(info, row)
3858 end
3859 stmt:finalize()
3860 return info
3861end
3862 </code></pre>
3863</div>
3864
3865<p>That seems straight forward right? We select the id and title from our posts table, sort the output, and limit it to whatever variable we pass to the function. Then for each row returned from the SELECT we insert the values into a table called info and return it. The table we get from the select looks like this, and is what we iterate over in our Recent Posts route generation.</p>
3866
3867<div class="codeSnippet">
3868 <pre><code>
3869{
3870 { id = 35, title = "Truly using Lapis"},
3871 { id = 34, title = "The Infamous Droid"},
3872}
3873 </code></pre>
3874</div>
3875
3876<p>There's more complexity here than just hand typing a lua table, but the exact same logic and generation code works despite that complexity. The ability to coerce values into tables means we can more or less store things however we desire.</p>
3877
3878<p>That's pretty simple, etlua gives us an easy way to populate HTML wire-frames with dynamically changing data, and Lapis gives us a nice interface for passing that information inwards to the rendering service. This provides a really clean way of thinking about how the website works, based on the above you can infer that when your visit https://lambdacreate.com/post/1, that it does a SELECT from posts where id = 1; and then returns that table above to populate the template. Dead simple design.</p>
3879
3880<p>For the podcasts and archival information it gets a little bit more complicated, but I think you'll agree that it's still just as easy to understand. Here lets look at /archive routing, since it touches on the complexity of /podcast routing too.</p>
3881
3882<div class="codeSnippet">
3883 <pre><code>
3884--Blog posts/Podcast episode archive lists
3885app:match("/archive/:type(/:show)", function(self)
3886 if self.params.type == "post" then
3887 --Table of all posts
3888 self.archive = lcpost.getArchive()
3889 self.timestamp = {}
3890 self.internal_layout = "post_archive"
3891 return { render = true, layout = "layout" }
3892 elseif self.params.type == "podcast" then
3893 --Specified show information
3894 self.show = lcpod.getShow(self.params.show)
3895 --Table of all episodes in the show
3896 self.archive = lcpod.getArchive(self.params.show)
3897 self.timestamp = {}
3898 self.internal_layout = "podcast_archive"
3899 return { render = true, layout = "layout" }
3900 else
3901 --Redirect to e404 if the archive type doesn't exist
3902 return { redirect_to = self:url_for("404") }
3903 end
3904end)
3905 </code></pre>
3906</div>
3907
3908<p>Just like out index route, we use app:match to check the url of an HTTP request. Here that match is a little fuzzy, it'll match any of the following correctly.</p>
3909
3910<ul>
3911 <li><a href="https://lambdacreate.com/archive/post">https://lambdacreate.com/archive/post</a></li>
3912 <li><a href="https://lambdacreate.com/archive/podcast/droidcast">https://lambdacreate.com/archive/podcast/droidcast</a></li>
3913 <li><a href="https://lambdacreate.com/archive/podcast/lambdacast">https://lambdacreate.com/archive/podcast/lambdacast</a></li>
3914</ul>
3915
3916<p>Neat! We have one function that's capable of routing archival information for blog posts, and two different podcasts! If you try and go to /archive/podcast or /archive/podcast/something-that-doesnt-exist, it'll also force route you to a 404 page, so technically there's a fourth route hidden in there too. All of this works by matching the values passed in the url via the self.params value.</p>
3917
3918<p>In Lapis when you visit /archive/podcast/droidcast the values of the url are saved in self.params vars named as the values in the app:match(route) segment. So for the /archive function we have two named variables :type and :show. If you visits /archive/post, then self.params.types == "post", and for /archive/podcast/droidcast self.params.type == "podcast" and self.params.show == "droidcast". After that render is handled inside an if statement to direct the request to the right set of functions and render the correct templates.</p>
3919
3920<p>More simply, you can visualize it like this.</p>
3921
3922<div class="codeSnippet">
3923 <pre><code>
3924https://lambdacreate.com/archive/podcast/droidcast
3925-> self.params = { route = "archive", type = "podcast", show = "droidcast" }
3926 </code></pre>
3927</div>
3928
3929<h3>Building a Paste Service</h3>
3930
3931<p>Still with me? We're almost done, and if you're still reading then I think this is potentially the most interesting part of it all. To figure out how to get all of this to work correctly I've added a paste service to Lambdacreate. It's meant for internal use only (sorry!), but it has the most complicated route handling of anything else on the site.</p>
3932
3933<p>I'm going to focus on the Lapis routing, if you're curious about the lcauth script <a href="https://gitlab.com/durrendal/lambdacreate/-/blog/master/lcauth.lua">you can find it here.</a>For the purpose of discussing here, just know that it takes values passed via self.params and queries a database to determine if they exist, then returns true or false back to the Lapis application.</p>
3934
3935<div class="codeSnippet">
3936 <pre><code>
3937--Paste Service
3938--curl -v -F key="key" -F upload=@argtest.fnl https://lambdacreate.com/paste
3939app:match("paste", "/paste(/:file)", respond_to({
3940 GET = function(self)
3941 --This GET allows us to share the same name space as our POST
3942 --static/paste - nginx:nginx 0755
3943 --static/paste/file - nginx:nginx 0640
3944 return
3945 end,
3946 POST = function(self)
3947 --Check authorization of POST
3948 local authn = lcauth.validate(self.params.key)
3949 if authn == true then
3950 --Upload a file to paste directory
3951 local tmp = lcpaste.save(self.params.upload.content, self.params.upload.filename)
3952 --Return the paste url
3953 return {
3954 render = false,
3955 layout = false,
3956 self:build_url() .. "/paste/" .. tmp .. "\
3957"
3958 }
3959 else
3960 --Return access denied
3961 return {
3962 render = false,
3963 layout = false,
3964 "Access Denied\
3965"
3966 }
3967 end
3968 end,
3969}))
3970 </code></pre>
3971</div>
3972
3973<p>For /paste we have both GET and POST handling, everything else we've discussed has only has GET handling. Fortunately in Lapis they work exactly the same way, and we can use the same route functions to render both requests. It works more or less like this:</p>
3974
3975<div id="imgContainer">
3976 <img src="https://lambdacreate.com/static/images/35/lcpaste.png" alt="The paste function flow.">
3977</div>
3978
3979<p>When you visit https://lambdacreate.com/paste/something.txt, Lapis drops into the GET specific function and returns a route to /paste/something.txt, internally this is just a static file serve and directs to /static/paste/something.txt. Once something is pasted it's up there and accessible. I don't currently have an archive of pasted things, but I'm considering adding a paste type to the archive routing. Otherwise GET for /paste is boring, it's dead simple nginx static file serving.</p>
3980
3981<p>All the real magic happens in the POST function. When you POST to lambdacreate.com/paste it checks for the existence of a few values, first and foremost an authorization key. If that key is supplied and matches a good one in the database, then the actual lcpaste function is invoked and it pulls the file and the name of the file from self.params. Once the file is "pasted" a /paste/filename url is returned and you can view the file there. Otherwise if the key is bad, it returns an e404 and a Not Authorized message to the user, and nothing gets written to the site.</p>
3982
3983<p>I'm pretty excited about this new feature, it should mean that I'll be able to paste to lambdacreate from any of my devices all with their own unique key. If I ever need to remove authorization for a device then it becomes a simple matter of removing the authorization info from the database. Obviously there's nothing unique about that, but I like knowing that I can control when and if things get pasted while still being able to generally route any requests to those pasted files.</p>
3984
3985<h3>Fin</h3>
3986<p>Whew! I think that's about it! This has taken a little bit to get going, according to git I pushed the first commit in the series of these changes on May 18th, so about a month and a half of on and off work in mostly 1-2hr sessions to get this together. Feels really good since this has been something I've had to my TODO since I launched the blog a couple of years ago. Honestly rebuilding those docker containers got old fast. If you've read to the end thanks for sticking with me!</p>
3987
3988<p>If you're curious about Lapis and want to try it out, Leafo has some pretty amazing documentation <a href="https://leafo.net/lapis">here</a>, and I encourage you to take a look at <a href="https://github.com/karai17/lapis-chan">Karai17's Lapischan</a>, both of these are excellent resources for learning what Lapis can really do.</p></div>
3989<details class="info"><summary>item information</summary>
3990timestamp: 1657022400
3991title: [(lambda (x) (create x))] Truly using Lapis
3992link: https://lambdacreate.com/posts/35
3993content_type: html
3994id: https://lambdacreate.com/posts/35
3995author:
3996enclosure:
3997category:
3998</details>
3999</details>
4000<details>
4001<summary>[linkbudz rss feed] a Perl/CGI program that lets you access IRC from a web browser</summary>
4002<div class="links">
4003<a href="http://cgiirc.org/">read original</a>
4004</div>
4005<div class="content"><p><a href="http://cgiirc.org/">a Perl/CGI program that lets you access IRC from a web browser</a></p>
4006 <p>[http] posted by m455 on July 05, 2022</p></div>
4007<details class="info"><summary>item information</summary>
4008timestamp: 1656986746
4009title: [linkbudz rss feed] a Perl/CGI program that lets you access IRC from a web browser
4010link: http://cgiirc.org/
4011content_type: html
4012id: m45520220705020546
4013author:
4014enclosure:
4015category: http
4016</details>
4017</details>
4018<details>
4019<summary>[linkbudz rss feed] reference for escaping characters in xml documents</summary>
4020<div class="links">
4021<a href="https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents">read original</a>
4022</div>
4023<div class="content"><p><a href="https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents">reference for escaping characters in xml documents</a></p>
4024 <p>[https] posted by m455 on July 05, 2022</p></div>
4025<details class="info"><summary>item information</summary>
4026timestamp: 1656979687
4027title: [linkbudz rss feed] reference for escaping characters in xml documents
4028link: https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents
4029content_type: html
4030id: m45520220705000807
4031author:
4032enclosure:
4033category: https
4034</details>
4035</details>
4036<details>
4037<summary>[Brainshit] Extended Well-Known Text</summary>
4038<div class="links">
4039<a href="https://brainshit.fr/read/302">read original</a>
4040</div>
4041<div class="content">Je croyais en avoir fini avec mes expressions régulières, mais ce serait trop facile.</div>
4042<details class="info"><summary>item information</summary>
4043timestamp: 1656972000
4044title: [Brainshit] Extended Well-Known Text
4045link: https://brainshit.fr/read/302
4046content_type: html
4047id: https://brainshit.fr/read/302
4048author: neuron@brainshit.fr (Lucidiot)
4049enclosure:
4050category: Informatique
4051</details>
4052</details>
4053<details>
4054<summary>[linkbudz rss feed] Harder Drives (includes how to use ping has a block storage device)</summary>
4055<div class="links">
4056<a href="https://www.youtube.com/watch?v=JcJSW7Rprio">read original</a>
4057</div>
4058<div class="content"><p><a href="https://www.youtube.com/watch?v=JcJSW7Rprio">Harder Drives (includes how to use ping has a block storage device)</a></p>
4059 <p>[https] posted by kindrobot on July 03, 2022</p></div>
4060<details class="info"><summary>item information</summary>
4061timestamp: 1656868499
4062title: [linkbudz rss feed] Harder Drives (includes how to use ping has a block storage device)
4063link: https://www.youtube.com/watch?v=JcJSW7Rprio
4064content_type: html
4065id: kindrobot20220703171459
4066author:
4067enclosure:
4068category: https
4069</details>
4070</details>
4071<details>
4072<summary>[linkbudz rss feed] rss</summary>
4073<div class="links">
4074<a href="https://feddit.de/pictrs/image/9cf64a24-87ec-4f3a-b5f1-6dabf0e56d63.jpeg">read original</a>
4075</div>
4076<div class="content"><p><a href="https://feddit.de/pictrs/image/9cf64a24-87ec-4f3a-b5f1-6dabf0e56d63.jpeg">rss</a></p>
4077 <p>[https] posted by dozens on July 03, 2022</p></div>
4078<details class="info"><summary>item information</summary>
4079timestamp: 1656806726
4080title: [linkbudz rss feed] rss
4081link: https://feddit.de/pictrs/image/9cf64a24-87ec-4f3a-b5f1-6dabf0e56d63.jpeg
4082content_type: html
4083id: dozens20220703000526
4084author:
4085enclosure:
4086category: https
4087</details>
4088</details>
4089<details>
4090<summary>[ Oatmeal] </summary>
4091<div class="links">
4092<a href="https://eli.li/2022/07/2/2022-07-02-10-42-53">read original</a>
4093</div>
4094<div class="content"><p><img src="https://eli.li/_assets/_images/ios/IMG_0387.png" class="u-photo" alt="A toddler picks some snap peas with a stuffed hippo in tow."></p>
4095<p><span class="small-caps">&#x1F331;&#x1F99B;</span></p></div>
4096<details class="info"><summary>item information</summary>
4097timestamp: 1656772973
4098title: [ Oatmeal]
4099link: https://eli.li/2022/07/2/2022-07-02-10-42-53
4100content_type: html
4101id: https://eli.li/2022/07/2/2022-07-02-10-42-53
4102author:
4103enclosure:
4104category:
4105</details>
4106</details>
4107<details>
4108<summary>[linkbudz rss feed] linkbud went on too many dates</summary>
4109<div class="links">
4110<a href="https://git.m455.casa/linkbud/commit/?id=93a9b61963f6369fac04c765f98c635f9a0aecf6">read original</a>
4111</div>
4112<div class="content"><p><a href="https://git.m455.casa/linkbud/commit/?id=93a9b61963f6369fac04c765f98c635f9a0aecf6">linkbud went on too many dates</a></p>
4113 <p>[https] posted by m455 on July 01, 2022</p></div>
4114<details class="info"><summary>item information</summary>
4115timestamp: 1656693166
4116title: [linkbudz rss feed] linkbud went on too many dates
4117link: https://git.m455.casa/linkbud/commit/?id=93a9b61963f6369fac04c765f98c635f9a0aecf6
4118content_type: html
4119id: m45520220701163246
4120author:
4121enclosure:
4122category: https
4123</details>
4124</details>
4125<details>
4126<summary>[linkbudz rss feed] I'm never not going to post this</summary>
4127<div class="links">
4128<a href="https://www.youtube.com/watch?v=rv4wf7bzfFE">read original</a>
4129</div>
4130<div class="content"><p><a href="https://www.youtube.com/watch?v=rv4wf7bzfFE">I'm never not going to post this</a></p>
4131 <p>[https] posted by acdw on June 29, 2022</p></div>
4132<details class="info"><summary>item information</summary>
4133timestamp: 1656537802
4134title: [linkbudz rss feed] I'm never not going to post this
4135link: https://www.youtube.com/watch?v=rv4wf7bzfFE
4136content_type: html
4137id: acdw20220629212322
4138author:
4139enclosure:
4140category: https
4141</details>
4142</details>
4143<details>
4144<summary>[linkbudz rss feed] Databases and like, complicatedness</summary>
4145<div class="links">
4146<a href="https://www.twilio.com/blog/sqlite-postgresql-complicated">read original</a>
4147</div>
4148<div class="content"><p><a href="https://www.twilio.com/blog/sqlite-postgresql-complicated">Databases and like, complicatedness</a></p>
4149 <p>[https] posted by acdw on June 29, 2022</p></div>
4150<details class="info"><summary>item information</summary>
4151timestamp: 1656535907
4152title: [linkbudz rss feed] Databases and like, complicatedness
4153link: https://www.twilio.com/blog/sqlite-postgresql-complicated
4154content_type: html
4155id: acdw20220629205147
4156author:
4157enclosure:
4158category: https
4159</details>
4160</details>
4161<details>
4162<summary>[Dozens and Dragons] through the white forest to the house of the fae lord</summary>
4163<div class="links">
4164<a href="https://dozensanddragons.neocities.org/26.html">read original</a>
4165</div>
4166<div class="content">weird stuff happening in surreal places</div>
4167<details class="info"><summary>item information</summary>
4168timestamp: 1656388800
4169title: [Dozens and Dragons] through the white forest to the house of the fae lord
4170link: https://dozensanddragons.neocities.org/26.html
4171content_type: html
4172id: https://dozensanddragons.neocities.org/26.html
4173author:
4174enclosure:
4175category:
4176</details>
4177</details>
4178<details>
4179<summary>[p1k3::feed] Monday, June 27, 2022 - aphoristic noodling</summary>
4180<div class="links">
4181<a href="https://p1k3.com/2022/6/27">read original</a>
4182</div>
4183<div class="content"><article><div class="entry"><h1>Monday, June 27, 2022</h1>
4184
4185<h2>aphoristic noodling</h2>
4186
4187<p>I read <a href="https://www.baldurbjarnason.com/2021/100-things-every-web-developer-should-know/"
4188title="136 facts every web dev should know before they burn out and turn to landscape painting or nude modelling">this
4189post by Baldur Bjarnason</a>, listing "Everything I’ve learned about web development in the almost twenty-five years
4190I’ve been practising", and <a href="https://www.baldurbjarnason.com/2021/the-curious-case-of-the-crashing-conic-gradient/">this
4191followup</a>, which says:
4192
4193<blockquote>
4194
4195 <p>Some of the aphorisms ended up not-so-pithy, but it was overall a fun little
4196 experiment that I recommend: note down everything relevant about the craft that
4197 you can think of over the space of a week.</p>
4198
4199</blockquote>
4200
4201<p>I thought about this, and then I thought: Ok, what exactly is my craft? I
4202do computer shit. So I started a list about that, challenging myself to be
4203<i>descriptive</i> about things and not veer too far into pure advice.</p>
4204
4205<p>A year or so passed, and I noticed this post was still sitting in my "work
4206in progress" directory. I tried picking it back up and noticed how much
4207overlap it would have with other posts like these:</p>
4208
4209<ul>
4210 <li>2013: <a href="/2013/12/4/">on software</a></li>
4211 <li>2014: <a href="/2014/9/6/">language things</a></li>
4212 <li>2015: <a href="/2015/5/5/">YOUR CODE IS TOO COMPLICATED</a>
4213 <li>2019: <a href="/2019/10/5" title="sfe">this entry on the experience of working at SparkFun</a></li>
4214 <li>2021: <a href="/2021/7/21/">rules</a></li>
4215</ul>
4216
4217<p>This style of writing is basically catnip to people like me, whether it's of
4218much use to anyone else or not. This post ultimately felt like a dead end,
4219because instead of a blog post, it really wants to be some long document where
4220I collect all sorts of aphorisms, pithy quotes, eponymous laws, and so forth
4221about technical work and maybe just work generally. Maybe I'll start that
4222document one of these days.</p>
4223
4224<p class="centerpiece"> ✯ </p>
4225
4226<p>Anyway, that very partial and uneven list:</p>
4227
4228<ol>
4229
4230 <li>Caching is hard to think about and breaks often.
4231
4232 <li>Cleverness in code is generally a sign of danger.
4233
4234 <li>Business ruins everything.
4235
4236 <li>Some forms of interoperability are a trap.
4237
4238 <li>Bad ideas aren't limited to bad people.
4239
4240 <li>Good people aren't limited to good ideas.
4241
4242 <li>An aesthetic is not an ethic.
4243
4244 <li>The customer is usually wrong.
4245
4246 <li>If it's written in:
4247 <ul>
4248 <li>C: It'll work, but I should remember there's a buffer overflow or something.
4249 <li>PHP: It'll probably work, but there's an SQL injection vulnerability somewhere and the cool kids will be shitty about it being PHP.
4250 <li>Python: 50/50 whether it'll just barf stack traces into my terminal for non-obvious reasons.
4251 <li>Ruby: Decent chance I'll wind up reading the source code and cursing at clever Ruby programmers.
4252 <li>Haskell: It works, but I'm not smart enough to understand it.
4253 <li>Rust: Probably works, if they finished writing it. I'm not smart enough to understand the code.
4254 <li>Go: Total crapshoot, but either way I bet the CLI has a bunch of infuriatingly nested subcommands.
4255 <li>JavaScript: Life is too short to deal with whatever package management and runtime I'm supposed to use for this now.
4256 <li>Java: If I have to <i>find out</i> it's Java, I'm probably in trouble.
4257 </ul>
4258 </li>
4259
4260 <li>Lightweight markup languages are fundamentally in tension with the range
4261 of structures that their users will inevitably want to express.
4262
4263 <li>Design, marketing, and management are all real undertakings, but they are
4264 also aggressively self-reproducing ideological systems and political
4265 projects.
4266
4267 <li>Environments within which small tools can be combined to operate on
4268 simple abstractions are powerful. An environment might be what you think of
4269 as an operating system, a programming language, a database, or an
4270 application. All else being equal, the ones that can bridge to other
4271 environments are more powerful.
4272
4273 <li>There are few abstractions in computing more stable than filesystems,
4274 standard IO, text files, and the shell. Boring relational databases aren't
4275 too far behind, but the barriers to entry and data transfer are higher.
4276
4277 <li>Technology is at least as fashion-oriented as the sartorial choices of
4278 highschoolers, actors, and musicians. Changes are driven as much by a desire
4279 for difference from the perceived status quo as anything else.
4280
4281 <li>Technical politics are also organizational, labor, and identity politics.
4282 The currents of power they involve are illegible without taking those factors
4283 into account.
4284
4285 <li>There's no guarantee that your technical preferences will match up with
4286 the ideas, people, or power structures you find agreeable in other domains.
4287 (Or vice versa.)
4288
4289</ol>
4290
4291
4292<p class="tags"><b>tags:</b> <a href="/topics/technical">topics/technical</a>, <a href="/topics/work">topics/work</a></p><p class="datestamp"><a href="/">p1k3</a> /
4293<a href="/2022/" title="2022">2022</a> /
4294<a href="/2022/6/" title="6">6</a> /
4295<a href="/2022/6/27/" title="27">27</a></p>
4296</div></article></div>
4297<details class="info"><summary>item information</summary>
4298timestamp: 1656318192
4299title: [p1k3::feed] Monday, June 27, 2022 - aphoristic noodling
4300link: https://p1k3.com/2022/6/27
4301content_type: html
4302id: /2022/6/27
4303author:
4304enclosure:
4305category:
4306</details>
4307</details>
4308<details>
4309<summary>[Brainshit] Blockchain Nomic</summary>
4310<div class="links">
4311<a href="https://brainshit.fr/read/309">read original</a>
4312</div>
4313<div class="content">Une variante d'un jeu dont le but est de changer les règles, où les règles ne peuvent plus exactement être changées.</div>
4314<details class="info"><summary>item information</summary>
4315timestamp: 1656280800
4316title: [Brainshit] Blockchain Nomic
4317link: https://brainshit.fr/read/309
4318content_type: html
4319id: https://brainshit.fr/read/309
4320author: neuron@brainshit.fr (Lucidiot)
4321enclosure:
4322category: Réflexions
4323</details>
4324</details>
4325<details>
4326<summary>[ Oatmeal] </summary>
4327<div class="links">
4328<a href="https://eli.li/2022/06/26/2022-06-26-06-49-15">read original</a>
4329</div>
4330<div class="content"><p><img src="https://eli.li/_assets/_images/ios/23BA2FC9-DEFE-4C16-AE10-490F23250F1A.png" class="u-photo" alt="A large cat lying on the sill of an open window. "></p></div>
4331<details class="info"><summary>item information</summary>
4332timestamp: 1656240555
4333title: [ Oatmeal]
4334link: https://eli.li/2022/06/26/2022-06-26-06-49-15
4335content_type: html
4336id: https://eli.li/2022/06/26/2022-06-26-06-49-15
4337author:
4338enclosure:
4339category:
4340</details>
4341</details>
4342<details>
4343<summary>[ Oatmeal] </summary>
4344<div class="links">
4345<a href="https://eli.li/2022/06/25/after-giving-my-brain-bleed-time-to-heal-the-neurosurgeon-called-me-back-in-to-hospital-the-plan-was">read original</a>
4346</div>
4347<div class="content"><p>In reply to: <a href="https://eli.li/2022/05/22/that-one-time-when-buffy-the-vampire-slayer-maybe-saved-my-life">Oatmeal - That one time when Buffy the Vampire Slayer maybe saved my life?</a></p>
4348<p>After giving my brain bleed time to heal the neurosurgeon called me back in to hospital; the plan was to reassess, attempt to fix it using the minimally invasive technique that they tried once before, and if that didn&#x2019;t work, do something a bit more squidgy directly in my brain.</p>
4349<p>I&#x2019;ll be honest, the last option sounded totally and completely horrific to me and I was very much <strong>not</strong> wanting to have to go with the big ol&#x2019; brain surgery. While the doctors seemed confident with that option, they were upfront about the extra risks and that it was sort of the option of last resort.</p>
4350<p>Last week I went back in and, great news, they think they&#x2019;ve totally repaired my brain bleed using the minimally invasive method! I&#x2019;m slated for a diagnostic scan in the fall to double check, but, so far, everything is looking great. I spent a few more nights in <span class="small-caps">ICU</span> and was discharged directly to home where I&#x2019;ve been chillin&#x2019;.</p>
4351<p>All in all I&#x2019;m feeling super duper lucky, and, while this entire experience has been &#x2026; let&#x2019;s say a drag &#x2026; I know that it could have been <strong>far</strong> worse, and I hope to have it completely behind me soon. So far the main symptoms I&#x2019;ve faced are ringing ears, fatigue, a bit of difficulty focusing and multi-tasking, occasional low grade headaches, and, since the repair, I&#x2019;ve developed a lisp. The lisp is a result of the repair itself, and the neurosurgeon thinks that it will probably pass within a few months.</p>
4352<p>There are too many people to thank directly here, but to all those who&#x2019;ve supported me and my family throughout this bananas unexpected experience&#x2009;&#x2014;&#x2009;for realizes&#x2009;&#x2014;&#x2009;thank you so much. The words of support, well wishes, meals, help with kids and everything have been so deeply felt, and I honestly can&#x2019;t imagine how I would have navigated this without ya&#x2019;ll.</p>
4353<p>Hopefully this is my last health update for a long time, and I can go back to posting about forth now!</p></div>
4354<details class="info"><summary>item information</summary>
4355timestamp: 1656212772
4356title: [ Oatmeal]
4357link: https://eli.li/2022/06/25/after-giving-my-brain-bleed-time-to-heal-the-neurosurgeon-called-me-back-in-to-hospital-the-plan-was
4358content_type: html
4359id: https://eli.li/2022/06/25/after-giving-my-brain-bleed-time-to-heal-the-neurosurgeon-called-me-back-in-to-hospital-the-plan-was
4360author:
4361enclosure:
4362category:
4363</details>
4364</details>
4365<details>
4366<summary>[linkbudz rss feed] Mipui - open source collaborative grid map editor for tabletop games</summary>
4367<div class="links">
4368<a href="https://www.mipui.net/">read original</a>
4369</div>
4370<div class="content"><p><a href="https://www.mipui.net/">Mipui - open source collaborative grid map editor for tabletop games</a></p>
4371 <p>[https] posted by mio on June 25, 2022</p></div>
4372<details class="info"><summary>item information</summary>
4373timestamp: 1656168162
4374title: [linkbudz rss feed] Mipui - open source collaborative grid map editor for tabletop games
4375link: https://www.mipui.net/
4376content_type: html
4377id: mio20220625144242
4378author:
4379enclosure:
4380category: https
4381</details>
4382</details>
4383<details>
4384<summary>[linkbudz rss feed] Start all of your shell scripts with a comma</summary>
4385<div class="links">
4386<a href="https://rhodesmill.org/brandon/2009/commands-with-comma/">read original</a>
4387</div>
4388<div class="content"><p><a href="https://rhodesmill.org/brandon/2009/commands-with-comma/">Start all of your shell scripts with a comma</a></p>
4389 <p>[https] posted by m455 on June 24, 2022</p></div>
4390<details class="info"><summary>item information</summary>
4391timestamp: 1656080609
4392title: [linkbudz rss feed] Start all of your shell scripts with a comma
4393link: https://rhodesmill.org/brandon/2009/commands-with-comma/
4394content_type: html
4395id: m45520220624142329
4396author:
4397enclosure:
4398category: https
4399</details>
4400</details>
4401<details>
4402<summary>[linkbudz rss feed] directly query csv with sqlite</summary>
4403<div class="links">
4404<a href="https://til.simonwillison.net/sqlite/one-line-csv-operations">read original</a>
4405</div>
4406<div class="content"><p><a href="https://til.simonwillison.net/sqlite/one-line-csv-operations">directly query csv with sqlite</a></p>
4407 <p>[https] posted by dozens on June 22, 2022</p></div>
4408<details class="info"><summary>item information</summary>
4409timestamp: 1655929342
4410title: [linkbudz rss feed] directly query csv with sqlite
4411link: https://til.simonwillison.net/sqlite/one-line-csv-operations
4412content_type: html
4413id: dozens20220622202222
4414author:
4415enclosure:
4416category: https
4417</details>
4418</details>
4419<details>
4420<summary>[~lucidiot's wiki] forest</summary>
4421<div class="links">
4422<a href="https://envs.net/~lucidiot/forest.html">read original</a>
4423</div>
4424<div class="content"></div>
4425<details class="info"><summary>item information</summary>
4426timestamp: 1655877494
4427title: [~lucidiot's wiki] forest
4428link: https://envs.net/~lucidiot/forest.html
4429content_type:
4430id: https://envs.net/~lucidiot/forest.html
4431author:
4432enclosure:
4433category:
4434</details>
4435</details>
4436<details>
4437<summary>[trash cat tech chat] 004 - Matrix, part 2</summary>
4438<div class="links">
4439<a href="https://podcast.librepunk.club/tctc/004">read original</a>
4440<a href="https://podcast.librepunk.club/tctc/tctc_004_Matrix,-part-2.ogg">enclosure</a>
4441</div>
4442<div class="content"><p>trash cat (they/them) and Juliana (she/her) talk about Matrix. Part 2 of 2.</p>
4443<h2>Timestamps</h2>
4444<ul>
4445<li>0:00.000 [Theme]</li>
4446<li>0:08.943 What's it like using encryption on Matrix?</li>
4447<li>20:13.711 A brief note on OTF funding</li>
4448<li>20:40.788 Issues with Matrix</li>
4449<li>44:36.851 Our opinions on Matrix</li>
4450<li>50:13.580 [Outro]</li>
4451</ul>
4452<h2>Transcript</h2>
4453<h3>[Intro]</h3>
4454<p><strong>trash cat:</strong> You're listening to <em>trash cat tech chat</em>, a Librepunk podcast.</p>
4455<h3>What's it like using encryption on Matrix?</h3>
4456<p><strong>tc:</strong> If you want to know details about the cryptography, listen to the extra thing. But I want to talk about from a user perspective, what is it like using the cryptography, and how do we verify other users, and things like that.</p>
4457<p><strong>Juliana:</strong> Yeah. Obviously, it kind of starts at account registration 'cause that's when you, you know, initially create your identity, and by default, I think, everything is encrypted but not necessarily verified? I'm not sure exactly what the difference is.</p>
4458<p><strong>tc:</strong> Um, so, I think I know what you mean, but I want to give a little bit of clarification for the audience. What you mean, I think, is <em>conversations</em> that you have, messages that you send to other users in private rooms by default are encrypted.</p>
4459<p><strong>J:</strong> Yes. Which, for context, is the main... Most of the time I have had Matrix open, it has been for that purpose, regardless of client or whatever.</p>
4460<p><strong>tc:</strong> Yeah. So if you just like, start a new room with someone, most clients, at least Element, by default will make it encrypted, and you just don't have to do... You don't have to take any extra action to make it encrypted. It's just encrypted by default.</p>
4461<p><strong>J:</strong> And if you're in a room that's not encrypted, and you want to start it being encrypted, or if you want to verify an encrypted room, whatever that means, you can initiate a... I guess you'd call it a &quot;handshake&quot;. A verification session where you basically--</p>
4462<p><strong>tc:</strong> I wanna um... Small correction there: It's not... Okay, so there are two things going on that I think you're talking about, and one of them is there are rooms... Okay, so there are rooms and users, and those are different entities, and the way that we're going to interact with them is a little bit different and important to talk about. Okay? So...</p>
4463<p><strong>J:</strong> Okay.</p>
4464<p><strong>tc:</strong> And sorry for interrupting you, but like...</p>
4465<p><strong>J:</strong> No, yeah, I would rather you make sure we're saying the correct things. I mean, I... Part of the problem is, my clients are all in French, so I don't necessarily know exactly what's happening.</p>
4466<p><strong>tc:</strong> [<em>laughs</em>] Okay uh... So there are rooms. Everything on Matrix is a room. Kind of. In the sense that you have chats with individual people, like direct messages you might think about them as, are a room with the two of you in it. And group chats are also a room, just with more users in that room. So a room is kind of the basic entity of like, &quot;Here's where a conversation is happening.&quot; Rooms can be either encrypted or unencrypted. By default in major Matrix clients, by which I mostly mean Element, but also FluffyChat, I believe, does this. By default, when you make a new room, and it's a private room, which includes either a quote-unquote &quot;DM&quot;, direct message where like, it's you and one other person, so like, Alice and Bob together in a room that's just a private chat with them, or when you're making a room, you can mark it as private or public. By default when you make a private room, it will be encrypted. And you can also -- in a room that's not encrypted, you can turn on encryption, which is just like, a little toggle in the menu that says, &quot;This is going to be encrypted from here on.&quot; I said something earlier when we were talking about XMPP like &quot;I wanna talk about this later.&quot; One of the things that's interesting and noteworthy to me about the difference between XMPP and Matrix is at what level the encryption is specified. I think that's the way I want to phrase that. So in XMPP (and probably other things, I don't know) -- In XMPP, if you and I are having a conversation, there's no real, like, concept of a room. There are multi-user chats, which exist as like a room-type thing in XMPP, but if you and I are having a conversation, it's just like, my device is sending a message which then will get delivered to your device or devices on either or both ends. And I can enable encryption at the device level. So I can say, &quot;Okay, I want messages sent from my device to your device to be encrypted. But it's not, like, sort of specified on the server anywhere that &quot;Oh, this conversation happening is encrypted.&quot; It's just I am sending messages that are encrypted. With Matrix, it's like, an actual variable of the room that says, &quot;This room is encrypted.&quot;</p>
4467<p><strong>J:</strong> That is an interesting distinction.</p>
4468<p><strong>tc:</strong> Yeah. I'm not sure I have anything to say about it further than that. [<em>laughs</em>] But that is, that's how it works. The room... In Matrix, the room itself is encrypted or unencrypted. And if it's encrypted, then all clients are at least supposed to send encrypted messages in that room and not send unencrypted messages. So that's the first thing is &quot;Is encryption on or not?&quot; And then the second thing, which is what you were trying to talk about when I interrupted you, is verification, which is a separate matter from &quot;Is the room encrypted?&quot; And verification is... So basically, there's this big problem in cryptography. I think I talked about this... Yeah, I talked about this in the first episode with like, trust on first use and stuff. But there's this big problem in cryptography that is: How does Alice know she's actually talking to Bob? How does Bob know he's actually talking to Alice? And the answer is: At least in the context of Matrix what they do is they verify each other. Alice and Bob, out of band, in some, like, trusted -- ideally in-person they meet up and compare numbers. They compare their identity keys to say, &quot;Is the entity that I'm talking to digitally who claims to be Bob actually Bob? Is -- actually the person that I meet up with in-person that I know as Bob? And vice versa with Alice. And this is done on a <em>per-user</em> level. Mm, let me... Sorry, there are two things taht I want to say about that. [<em>laughs</em>]</p>
4469<p><strong>J:</strong> Go ahead.</p>
4470<p><strong>tc:</strong> I introduced you to talk, and then I'm just doing all the talking. But, uh... [<em>laughs</em>]</p>
4471<p><strong>J:</strong> I'm sorry that I don't have a better understanding.</p>
4472<p><strong>tc:</strong> It's okay! It's uh... But um, okay, so... Alice and Bob want to verify each other. So, in a system like XMPP, what this looks like is each of Alice's devices, each device has its own keys. It has its own identifier. And if, say, Alice has, you know, a laptop and a phone and a desktop computer, and Bob has a laptop and a phone, and they want all of the devices to be able to talk to each other, they have to -- and have that strong verification, they have to pairwise verify each pair of devices. So Alice's desktop to Bob's laptop, Alice's desktop to Bob's phone, Alice's desktop to Alice's laptop, Alice's desktop to Alice's phone, and so on. Every pair of devices needs to verify each other.</p>
4473<p><strong>J:</strong> Okay.</p>
4474<p><strong>tc:</strong> In like, OMEMO, in XMPP land. And that's terrible user experience. But that's the basic idea is they meet up, and they say, &quot;Okay, you know, do these numbers match up?&quot; And if they do, we mark them verified and say, &quot;Okay, we know that we are actually talking to each other.&quot; But it's a terrible user experience to have to do it manually. When Bob gets a new phone, suddenly Alice has to re-verify that device from all of her devices, each individually, and also Bob has to verify his new device with his old devices. And um... it's just a whole mess. Matrix does this really nice thing in this area, which is called &quot;cross-signing&quot;, which basically... When Alice starts... So, when Alice like, opens her first device on Matrix, whatever. Say when Alice starts running her second Matrix client, so she already set up on her laptop. Now she's setting up on her phone. Her laptop will ask her to verify the new device. And so she does that, and they do the cryptographic key verification -- which, I do want to talk about how that works, but right now I want to talk about like, what does it mean? They do the cryptographic device verification, and then Alice has verified that her own phone is the same device as her -- Sorry, they verify <em>each other</em>. Both devices verify each other. Alice has verified that her laptop and her phone are run by the same person, and when Bob goes to verify Alice, he can verify one of her devices as being &quot;Alice&quot; -- so, essentially, instead of verifying individual devices, you're verifying <em>people</em>. Bob verifies &quot;Alice&quot; as the owner of the laptop and <em>by extension</em> her phone. And then if Alice gets a new device, her -- say, adds her desktop as well, she verifies her desktop with one of her devices (she doesn't have to do it with all of them), and now her desktop is trusted by her other devices as part of the same identity, and by extension, Bob, and whoever else have already verified Alice's identity, can trust Alice's computer -- her desktop -- without any additional work. It's a much simpler, much easier system where you just, you verify <em>users</em> rather than individual devices, and you trust a user to manage their own devices properly, and it makes everything so much easier to use than, like, XMPP is.</p>
4475<p><strong>J:</strong> Yes.</p>
4476<p><strong>tc:</strong> So just to clarify, like, the difference between how you interact with users and how you interact with rooms... It's a little bit confusing because sometimes they look like the same thing in the interface, in particularly when you have, um -- [<em>sarcastic</em>] &quot;in particularly&quot; -- in particular when you have a DM, so to speak, a private room with just you and someone else. But, and I think this is important, what you're actually doing when you enable encryption is you're setting it for that room. Even if there are other rooms with that person in them, those might still be unencrypted. But just that room gets encrypted. And what you're doing when you're verifying is you're verifying the <em>user</em>, rather than the room. And so, you might be in a room -- Say, Alice, Bob, and Carol are all together in one room, and separate from that, Alice and Bob have another conversation that they're together in. Alice and Bob have verified each other, but Alice has not verified Carol. So, in the room with Alice, Bob, and Carol together, they can still use encryption, and Alice will still be verified with Bob within the context of that room, but they won't have that level of ver-- Alice won't have that level of verification with Carol. Does that distinction make sense?</p>
4477<p><strong>J:</strong> Yes, it does.</p>
4478<p><strong>tc:</strong> Okay.</p>
4479<p><strong>J:</strong> The interface to do this, to verify devices to each other, to verify users, to, you know, do all this, looks very similar, and it's very easy for a user to do. You just like, so when you log into a new device for the first time, you will be asked to either use a copy of, uh... I don't remember the exact terminology, of a key that you can download through a client.</p>
4480<p><strong>tc:</strong> The uh, in English, what it calls it is &quot;Secure Backup&quot;.</p>
4481<p><strong>J:</strong> Yes. You can use that to verify a device, or you can scan a QR code. So that's how I've mostly been doing it lately. Or you can do the emoji thing, which is where it shows you a list of emoji, you look at the emoji and see if they match, and if they do, you confirm on both devices that they match.</p>
4482<p><strong>tc:</strong> Yeah, and emoji verification is really nice. In like, XMPP/OMEMO land, we have scanning QR codes. That is a paradigm that exists. But if you're not in a situation where you can scan QR codes, you have to manually compare hexadecimal strings that represent public keys. And that's not a good time. But the other thing about that is with XMPP, because we don't have the cross-signing, and because we don't have the... all the various features that are nice with Matrix, with XMPP, you have to do both steps in the verification, by which I mean if Alice's phone and Bob's phone want to verify each other, Alice's phone must verify Bob's phone, and also, Bob's phone, which has a different fingerprint for verification, must verify Alice's phone. That wasn't the right way of saying that. Alice must verify Bob's fingerprint, and also, Bob must verify Alice's fingerprint. It's a 2-step process. Matrix simplifies it into a 1-step process, right? where you scan a single QR code that represents both parties, or you compare a single sequence of emoji that represents both parties, and then you've done both steps of the verification, rather than having to verify two different numbers.</p>
4483<p><strong>J:</strong> Yes. And this simple interface is used for everywhere that user verification is required, so it's super nice.</p>
4484<p><strong>tc:</strong> One complaint I have about Element and cross-signing and everything is the Element... the ability to do cross-signing is not exposed in a way that allows it to be done offline. So what that means is, if I -- So in, say, XMPP for example, let's say my only computer is a desktop computer, but I still want to verify with someone by meeting up in-person. Well, I can write down my fingerprint and then show it to them, and they can say &quot;Ah yes, I believe that this is you.&quot; You can do that in Matrix, but only per-device. You cannot do that with the cross-signing key. At least with Element, there is no interface to manually verify a cross-signing key, which is really obnoxious. [<em>laughs</em>]</p>
4485<p><strong>J:</strong> That is interesting. I hadn't thought about that. But yeah, that makes sense.</p>
4486<p><strong>tc:</strong> Like, there's no reason it <em>couldn't</em> be an option, to be clear. I mean, there's no technical reason you shouldn't be able to just write down your cross-signing key -- the public key -- and then show it to someone, and they open up a thing and say &quot;Yes, this matches. I want to sign this cross-signing key&quot; or whatever. There's no technical reason it can't be; it just is not implemented in a way that allows you to do that.</p>
4487<p><strong>J:</strong> It's kind of a shame.</p>
4488<p><strong>tc:</strong> It is. I hope that they fix that at some point.</p>
4489<p><strong>J:</strong> I'm trying to think if there's anything else I want to say about the sort of user interface to this.</p>
4490<p><strong>tc:</strong> At one point, I don't remember if I included this in the first episode or not, but you said when we were having that conversation, you talked about the -- I think I cut it -- you talked about um -- you said you like that it's... that it has both encrypted and unencrypted rooms, and you can enable encryption later from a room that starts unencrypted. Would you like to talk about that?</p>
4491<p><strong>J:</strong> Yeah, I guess so. So basically, the reason I like that is that a lot of people are not going to go out of their way to have encryption. So if I were to say, &quot;Hey, talk to me on this encrypted chat app&quot;, they might think &quot;Oh, encryption. This is going to be, you know, complicated, a pain in the butt. I don't want to do this.&quot; Whereas if I say, &quot;Just make an account and talk to me on this thing&quot;, they're not gonna have that pre-judgement that it's gonna be complicated. And then, because it actually makes encryption -- comparatively at least, I mean -- simple, it allows you to just like, start it up. Like, you could just be chatting with them one day and hit the button, and then they don't have to know what's going on. You hit the button, and you can just be like, &quot;Oh yeah, we're just verifying each other, and badda-bing badda-boom, you have encryption.&quot; It's a good way to avoid intimidating someone before they come into an encrypted chat, you know, situation.</p>
4492<p><strong>tc:</strong> Yeah, I get you. I do wanna clarify again, just that -- the difference between encryption happening in the room and verification. Like, those are different things.</p>
4493<p><strong>J:</strong> Yeah. So, I had a misunderstanding on that because I was using Fractal so much, so most of my rooms were not encrypted. And then when I switched to Element, I had to activate encryption on them, and to do that it requires you to verify at the same time.</p>
4494<p><strong>tc:</strong> On Element? It shouldn't require verification to turn on encryption.</p>
4495<p><strong>J:</strong> There was something I had to do. Or, maybe it was just that the other person had to agree to turning on encryption.</p>
4496<p><strong>tc:</strong> I don't think that's... right either. I think just anyone with like, admin permission or whatever level in a room can unilaterally enable encryption for the room, and then it can never be turned off again for that room. And like, that's the way that that works. And like, verification is good and everything, but it's not... Like, most rooms in Matrix, unless they're intentionally big public rooms, most rooms in Matrix are -- not with Fractal, but with Element or whatever -- are going to be encrypted, but you probably haven't verified the other users 'cause that's like, the default state.</p>
4497<p><strong>J:</strong> That's interesting. I wonder what was happening then. Huh.</p>
4498<p><strong>tc:</strong> I don't know... That's okay, though. [<em>laughs</em>] But yeah, you don't need to verify the people in a room to have an encrypted room, but without verifying them, a malicious server or something could just drop an extra device into the list of devices and then start reading your messages.</p>
4499<p><strong>J:</strong> Gotcha.</p>
4500<p><strong>tc:</strong> Yeah. Okay, anything else about the experience using encryption, cross-signing and everything... Anything else about that before we move on?</p>
4501<p><strong>J:</strong> I don't think so.</p>
4502<p><strong>tc:</strong> Okay.</p>
4503<h3>A brief note on OTF funding</h3>
4504<p><strong>tc:</strong> So, just very briefly I want to acknowledge, because in our first episode I talked about Signal getting funding from the Open Technology Fund, OTF, I want to acknowledge that libolm was audited in 2016, like I mentioned before. That audit was funded by the OTF as well. That's the entirety of what I had to say on that matter. I just thought it was worth mentioning since we talked about that.</p>
4505<p><strong>J:</strong> Yeah.</p>
4506<p><strong>tc:</strong> Cool.</p>
4507<h3>Issues with Matrix</h3>
4508<p><strong>tc:</strong> So then, the next thing I wanted to talk about was: What are some issues with Matrix? Both in terms of privacy and in terms of user experience, whatever, what are some problems with Matrix?</p>
4509<p><strong>J:</strong> Well, as our recent discussion may have shown, it's not exactly transparent everything that is going on.</p>
4510<p><strong>tc:</strong> Yeah, it's a little unclear sometimes. [<em>laughs</em>] And like, I think part of that also is just Matrix is so complicated. Like, if you try to follow development at all, there's a lot going on in the space, in Matrix specification development and in all the different pieces of software that do things related to Matrix. It's just really complicated.</p>
4511<p><strong>J:</strong> Does it need <em>need</em> to be that complicated to have the kind of features and functionalities that it does?</p>
4512<p><strong>tc:</strong> Um... I don't know. I don't know enough about it under-the-hood to really answer that question. One thing I can say personally is I don't care about all of the features that it does have. I would personally prefer something that's simpler and more just focused on privacy. But that's me, and that's not representative of everyone who uses or likes Matrix. I know a lot of people like a lot of the things about it, the ability to have large public rooms and bots and stuff like that.</p>
4513<p><strong>J:</strong> Yeah, I would tend towards your side on this too. I don't use like, voice chat. I don't use video chat on it. I might in the future because it's there, and that's convenient, but it's not the primary reason I'm using it. Large rooms are cool, again, because it's there, kind of, but if it were not... So, the main reason I'm involved in rooms is for projects I've collaborated on or like, communities I've been active in. So I'm in the Raspberry Pi room. I would probably not start a room myself just because that's not the chat paradigm I'm most comfortable with. I like talking to people one-on-one usually.</p>
4514<p><strong>tc:</strong> Yeah, same for me.</p>
4515<p><strong>J:</strong> And this ties in, I think... Honestly, from a user experience perspective, at least, I think Matrix's greatest weakness is it's trying really hard to be Discord, and I don't think that's necessarily a good idea.</p>
4516<p><strong>tc:</strong> I also feel like in general it's trying too hard to be everything. Like Matrix wants to adverti-- I mean, okay, so part of this is like, Matrix wants to advertise itself by all of the benefits of it, some of which are mutually exclusive. So like, Matrix wants to be known as, for example, a private messaging platform. Right? You have the end-to-end encryption, you have all the cool stuff there. Matrix also wants to be known as the one place to do all of your communication because you can bridge everything else to Matrix. But, as discussed before, those two things are incompatible with each other. You can't have both end-to-end and a bridged roo-- Sorry, end-to-end <em>encryption</em> and a bridged room from like, Matrix to Discord or whatever. And I feel like there's... Like also, if you look back at previous Matrix things, I think people... Like, Matrix didn't even used to be identifying itself as a chat platform as the primary thing. It was like, &quot;This is a protocol for being a store of information&quot; or something, &quot;and it can be used as that for instant messaging.&quot; I don't know, I feel like there's just... There's so much going on that it wants to be, and there's a lot of stuff built on Matrix that um... Like they're working on... There's some social media platform that's in the works that's built on top of Matrix or something like that, and...</p>
4517<p><strong>J:</strong> What?</p>
4518<p><strong>tc:</strong> Yeah, I'm trying to remember what it's called. I don't know. I think Krille Fear, who's the developer of FluffyChat, I think is involved with that, and there's an effort to bring stories functionality to Matrix.</p>
4519<p><strong>J:</strong> Oh no.</p>
4520<p><strong>tc:</strong> And like, all kinds of other things. I feel like Matrix wants to be everything, and I don't think that that's a good thing, personally.</p>
4521<p><strong>J:</strong> Yeah, I mean, I agree with you. I think this is... I saw someone talking about this the other day. Not everything needs a story, right? They were talking about, I think it was Duolingo has implemented a stories functionality, and it's like... Everything is trying to be social media now, and not everything needs to be social media. But because Matrix is trying to appeal to a mainstream audience, and, you know, these big products that everybody knows, Snapchat, Instagram, you know, whatever, have these features, it's something that most people are going to come to expect. And so in order to be a mainstream platform, Matrix has to look like all the mainstream platforms, and I think that's to its detriment.</p>
4522<p><strong>tc:</strong> Yeah, I agree. Some other issues with Matrix -- if you're okay moving on from the &quot;Matrix tries to be everything&quot;?</p>
4523<p><strong>J:</strong> Yeah.</p>
4524<p><strong>tc:</strong> Okay, some other issues that I have. Like, the whole idea of &quot;store everything forever&quot;, basically, is not something that I want. Actually, what I would want is by default everything to be ephemeral, and then optionally you can make things longer-lasting if you need to. Matrix, as far as I'm aware, still doesn't have any real mechanism for ephemeral messaging. You can delete, i.e., redact old messages, like existing messages, manually, but I don't think there's any way to have self-destructing messages or anything like that.</p>
4525<p><strong>J:</strong> Yeah, that would be a good thing to have. And it's interesting. The storing everything forever makes sense now when you mention that it was originally a store of any data. That's interesting but also not a great basis for a secure chat platform.</p>
4526<p><strong>tc:</strong> Yeah. And like, I mean, I run an XMPP server, and I run a Matrix server. And like, one of those, I have to worry about like, &quot;Oh, what if this&quot;, you know, &quot;takes up too much space on my server?&quot; And the other one -- XMPP, again, doesn't even store things long-term by default. You have to like -- I mean, all the modern clients tell it to do that at this point. But you have to <em>enable</em> settings. It's mod_mam, the message archive management. You have to <em>enable</em> message archive management to have your messages stored temporarily, and the reason you do that is for like, multi-device syncing purposes, not so that you have a long-term history on the server. HTTP fil-- Well, okay, I should step back. With XMPP, the way that files are usually implemented is you upload the file to the server where it gets stored in a specific place that it's accessible. Whatever. You upload the file to the server, and then you send a link to the file as an XMPP message to the recipient, and then their client downloads the file. Those files... And I'm speaking from the perspective of I run a Prosody XMPP server. That's what I'm used to. I'm not sure what ejabberd does. But those files get purged regularly by default. I think they only exist for like a week on the server by default, and then they get deleted. I think I have my server set to delete them after 48 hours because generally everyone's online all the time. Like, your phone is going to download the image or whatever I sent you in most cases within a few hours, at least when it's back online if it wasn't online. It doesn't need to be stored on the server after that.</p>
4527<p><strong>J:</strong> Yeah.</p>
4528<p><strong>tc:</strong> So I would prefer, both as a server operator and as a user of Matrix, I would want it to be much more ephemeral.</p>
4529<p><strong>J:</strong> Yeah, I think that's -- at least having the option for that is a good idea.</p>
4530<p><strong>tc:</strong> Yeah. And then one of the other things there, right? is you have like, if I'm on homeserver1, and you're on homeserver2, and we're in a room together... the basic model of Matrix is every device, every client and every server involved should sync the entire history of that room. So my devices, my server, your server, and your devices should all have a redundant copy of everything. You've got so many different servers -- in big rooms, you might have a bunch of different servers all participating in the same room, all duplicating the same data across everything.</p>
4531<p><strong>J:</strong> Yeah, I think it's a question of the model, I guess, of who has -- who is the -- what is the source of truth, I guess, for the record? Right? Whose job that is, whether that's the server or the client, I guess.</p>
4532<p><strong>tc:</strong> Yeah. And then because you've got all this data that's stored long-term and synced across everywhere and whatever, that requires as a server operator you to collect and store lots of metadata on all your users. Even if the messages are encrypted, you -- because of the way Matrix works, you effectively have to have records of every time a message was sent, from whom, to whom, etc. I wanna clarify a little bit: There's something in Synapse that you can do to try to auto-expire old messages. I've never been really clear on how effective that is, but I have mine set to auto-expire old messages after like, maybe it's a month, maybe it's longer. I don't remember. And I think, like I've seen in my client those go away after a certain amount of time, old messages. So there might be something like that that does kind of work, but it's, like, by default, I think you store things for at least a year. And it's, I don't know, not what I would prefer.</p>
4533<p><strong>J:</strong> I wonder if that might be -- So, okay, I look -- I feel like both of us are very interested in systems, and we're interested in slightly different systems. A big system for me is socials. Like, I'm a programmer. I'm interested in application development. I'm interested in how computers can help people talk to each other, get along, do things, right? And so, I'm interested in the intersection between the system of security and the system of society here. And so, I'm asking myself if perhaps there is like, a government reason -- a government regulation that would require a government using this platform to keep messages for that amount of time, and then that would be why Matrix would make this decision so that it is compliant for any potential government clients.</p>
4534<p><strong>tc:</strong> That would make sense, but I mean... That makes sense. That's probably at least part of it, and I know there are governments interested in using Matrix. Like, the German government is doing this initiative to get its medical communications infrastructure on Matrix or something like that. Actually, since I talked about funding before, the vodozemac, however that's pronounced, the Rust crypto library for Matrix -- the audit of that was funded in part by the German government as part of that initiative.</p>
4535<p><strong>J:</strong> Oh, that's super cool.</p>
4536<p><strong>tc:</strong> Yeah, so that makes sense to me, but I think it should be optional and easier to configure at the server level, you know?</p>
4537<p><strong>J:</strong> Yeah, a government actor is gonna have a lot of resources to make redundancy possible.</p>
4538<p><strong>tc:</strong> Yeah. So, I feel ways about that. And... Like, with XMPP, you can argue, &quot;XMPP creates a lot of metadata as well!&quot; or &quot;[insert given chat thing]&quot;</p>
4539<p><strong>J:</strong> Yeah, I mean, if you're wa-- I mean, fundamentally, if you're watching network traffic, you're going to be able to get a shit ton of metadata anyway.</p>
4540<p><strong>tc:</strong> Yeah, absolutely. But there's a difference between sort of at the protocol level essentially mandating that you store all this metadata, versus having the ability to store it and also having the ability not to store it longer than it's needed.</p>
4541<p><strong>J:</strong> Yeah.</p>
4542<p><strong>tc:</strong> Anyway, so that's a whole thing. Another thing I think is worth talking about is the whole centralization of the network. And it's hard, I think, to find... It's hard to <em>not</em> go with matrix.org, I feel like. All the major clients default you onto matrix.org...</p>
4543<p><strong>J:</strong> Yeah.</p>
4544<p><strong>tc:</strong> ...and then there are, like, lists of other servers that are -- that you can use. And you can run your own, but Synapse is not a good time, so it's not great running your own as an experience, so you generally end up wanting to use someone else's. And then like, &quot;Which ones are good?&quot; Well, matrix.org is kind of the only real recommendation you get from like... from Element or from FluffyChat or whatever. So if you go looking for other things, like, there exist some lists. How do you know which servers are good? Some of those lists are run by... let's say, right-wing-aligned people who... There's one list in particular that like... It describes some, I mean, it's -- it promotes like, right-wing servers like Kiwi Farms and stuff.</p>
4545<p><strong>J:</strong> Oof!</p>
4546<p><strong>tc:</strong> Yeah, but it like, it's <em>very clearly</em> written with a right-wing lens... like, extreme right-wing lens, if you know about any of the things that it promotes and can like, read between the lines. But one of the things that it says on this site is um... It has a little badge for servers that are... What's the phrase they use? It's like &quot;certified&quot; by matrix.org or something like that. And what they mean by that is servers that matrix.org has blocked because of like, abuse or whatever reasons.</p>
4547<p><strong>J:</strong> Wow. That's...</p>
4548<p><strong>tc:</strong> But if you don't know that, if you just pull up a random list, it looks like &quot;Oh, these are good servers to use.&quot; And I have had a friend share this link with me and say, &quot;Oh, look, these ones are recommended by matrix.org!&quot; or whatever, and like... and I had to be like, &quot;Yeah, okay... No.&quot; [<em>laughs</em>]</p>
4549<p><strong>J:</strong> For those who don't know, I just want to mention this real quick, Kiwi Farms is an anti-trans hate group that works through the internet to bully trans people and has a body count.</p>
4550<p><strong>tc:</strong> Yeah. And um... halogen.city is one I think we need to talk about because it's extremely not apparent if you just look at it. There's a server called halogen.city, and if you go to it, it's like, &quot;Here's a cool cyberpunk background. Here's some basic information about the server.&quot; It looks really nice. For a while, I was recommending it to friends because I was like, &quot;Hey, this looks nice. It appears to perform well.&quot; Whatever, like, what more do you need? And part of this is I think about it as, you know, I think of Matrix as being for one-on-one conversations, encrypted messaging. So like, it doesn't really matter that much which server you're using... from my perspective. But then like, other people, for whom that's not the primary way of thinking about it, they look at what rooms are available, and halogen.city lists a lot of like, right-wing, like, Nazi rooms and stuff like that. And like, oh, well, I didn't know this. I will stop recommending that to people. But it's like... it's not apparent. And you can go looking through the rooms that are publicly listed by a server, but it's not obvious. My point here is that choosing a server is hard, but also matrix.org, which is the default choice in like all cases is not a good choice. And I don't know how to reconcile those things.</p>
4551<p><strong>J:</strong> Yeah. There's even, when I was looking into setting up a Matrix server of my own, I came across discussions where people were talking about, you know, you might have a deployment like matrix.org that has, you know, thousands of rooms, some of which have tens of thousands of participants, and it's like, that's not practical for most people to kind of keep up with.</p>
4552<p><strong>tc:</strong> Yeah, absolutely. Like... [<em>disgruntled sound</em>] Yeah.</p>
4553<p><strong>J:</strong> But then, at the same time, you run into issues. The other night, when my friend was trying to set up an account, she was gonna set up an account on a friend of a friend's server, and it didn't support email verification, or like, putting in an email so you can recover your account. And that was a deal-breaker for her, so she had to use matrix.org.</p>
4554<p><strong>tc:</strong> Another thing -- this might have been -- this might be what you just said like a point ago -- if you're running, like if you're on some third-party... I hate to use that phrase, but like, matrix.org and not matrix.org. If you're on some non-matrix.org server that's just run by like, a person, you may not be <em>able</em> to join large groups. They may have disabled it -- like, the homeserver administrator may have disabled it. There is a setting in Synapse to uh... How do they say it? It's like &quot;Disallow rooms above a certain complexity&quot; or something like that. They may have disabled it, or it may be that if you just do this action, it will cause everyone on the server to have a terrible experience. If you just try to join like one of the big Matrix rooms or whatever on matrix.org. So you may kind of have to use matrix.org for those big rooms because otherwise it'll like, bring down your server or something. It's... [<em>sighs</em>]</p>
4555<p><strong>J:</strong> It's a frustrating situation. And I feel like if you had ephemerality of communications by default, that would not be as big of an issue.</p>
4556<p><strong>tc:</strong> Right, if you didn't have to sync everything when you first connect to a room. [<em>laughs</em>] Yeah.</p>
4557<p><strong>J:</strong> Also just deployment in general. So, it's federated, which means that it's theoretically possible to talk with anyone from any server, but there's a barrier to entry in the complexity of setting up and administrating a server. And from looking at it, it is not the most complex thing out there, but it is definitely not the simplest, so...</p>
4558<p><strong>tc:</strong> It's non-trivial, yeah. I don't know, I don't like running a Matrix server. [<em>laughs</em>] And I have run Dendrite in the past, and that was like, okay, but it's not complete. Like, performance-wise, it worked well at what it did. And this was a year or more ago, I think, so it probably has come a long way since then, but... And then you have like the relationship between Synapse and Dendrite where the developers keep doing more and more work on Synapse which makes it harder for Dendrite to catch up to Synapse so that it can become the new standard, the new reference.</p>
4559<p><strong>J:</strong> Yeah. And I think that fact, all the development that is going on continuously is also probably part of why, you know, those two -- both of those servers are made by the Matrix project. There's no third-party implementation of a Matrix server. All of these clients that are missing functionality, part of it is development goes so fast that it's hard to keep up.</p>
4560<p><strong>tc:</strong> Yeah, exactly. I think there are projects that are trying to do third-party Matrix servers, but they're like... they can't keep up, so like... I don't think there's anything complete enough to use... [<em>laughs</em>]</p>
4561<p><strong>J:</strong> Yeah. And so protocols like IRC are-- which, obviously not by default encrypted; you have to do external stuff for that -- or XMPP or whatever, it's older. It's stable. People know what they're getting. You know. You can use the same, like, plugins that you've been using for 10 or 15 years, and it's no issue.</p>
4562<p><strong>tc:</strong> And they were written in a time when people tried to write good software.</p>
4563<p><strong>J:</strong> Yeah. [<em>laughs</em>]</p>
4564<p><strong>tc:</strong> Like, running Prosody on a server (Prosody, XMPP server) is nothing, you know? It's really easy to do. It's technically not very difficult to set up, and it's really lightweight when it runs. There are a lot of XMPP clients that are very lightweight. They may not be as, you know, beautiful and Discord-like and whatever as Matrix. They may not be as appealing to that crowd. But like, I don't know. I really -- It's probably extremely obvious, but I really like XMPP and-- a lot more than Matrix. [<em>laughs</em>]</p>
4565<p><strong>J:</strong> Yeah, and I mean, especially for using it as a one-on-one chat platform, and Matrix just adds a lot of overhead that isn't needed for that use case.</p>
4566<p><strong>tc:</strong> Yeah. And like, I'm not gonna get into the whole thing, but -- go listen to the cryptography extra thing, but Matrix does this more complicated cryptography thing so that it can scale better, but it does that in <em>all</em> conversations, in all encrypted rooms. Even if it's just two participants in the room, it still uses the more complicated, less secure (I'm gonna say), but more scalable thing because it's so focused on like, &quot;This is a room&quot; rather than this is a one-on-one chat versus a group chat or something.</p>
4567<p><strong>J:</strong> Yeah.</p>
4568<p><strong>tc:</strong> I don't know.</p>
4569<h3>Our opinions on Matrix</h3>
4570<p><strong>tc:</strong> So, what is ultimately your conclusion, your takeaway? How do you ultimately feel about Matrix?</p>
4571<p><strong>J:</strong> Honestly, I feel like in situations where you need a group chat platform, and you want to use -- and you either want encryption or free software or both, it's just kind of your only choice, and um, that's a shame, but it's better than Discord, is what I always say.</p>
4572<p><strong>tc:</strong> Yeah. I mean, you can do it with XMPP, but it's not optimal with XMPP multi-user chats. I don't disagree. [<em>laughs</em>]</p>
4573<p><strong>J:</strong> Yeah.</p>
4574<p><strong>tc:</strong> I kind of think personally -- and I said this when we were recording the first episode, but it was part of the stuff that I cut -- basically, my take with Matrix is there's a lot that I dislike about it. There are a lot of issues and generally a lot of things that I... basically wish it was XMPP. But ultimately, at the end of the day, I think it meets this intersection of like... being decent, good enough at all the different things, which nothing else really is in that intersection. Like, Matrix... I don't like the clients, but they're usable. They're not bad. I take issue with Electron, but like... they're usable. People would probably be okay with them. There are some things that are a little unintuitive, but for the most part, like... it's not too bad. As a network, yes, it's very centralized on the matrix.org server, but it is federated. You can run your own server. You can join a friend's server. Whatever. It has its cool crypto stuff going on, which I like. Cryptography, to be clear.</p>
4575<p><strong>J:</strong> [<em>sarcastically</em>] Whoa, really?!</p>
4576<p><strong>tc:</strong> [<em>laughs</em>] Just, you know, I always feel like I need to clarify I'm not talking about cryptocurrencies. And unlike some other messengers, this thing does not incorporate a cryptocurrency into it, at least last I checked.</p>
4577<p><strong>J:</strong> If it does, we will find something else.</p>
4578<p><strong>tc:</strong> Yeah, that would not be good. Yeah, so you have reasonable level of privacy there with at least you get end-to-end encryption with forward secrecy and it's-- with deniable authentication, and like... the things you want. It has, uh... You can use it anonymously. You can sign up without any identifying information. Especially, depending on the server, some of them... I mean, it's per-server. They choose what they want to require. You can use it without a phone number. But also, you can optionally sign up... it's like, the vector.im, I think, service, but there's a service you can use to list you -- yourself on a registry based on your phone number or email address or whatever, so that people can automatically add you, which I don't -- I mean, I understand that that's a thing that people like, being able to kind of bootstrap their network of friends on a new network. I understand that that makes it a lot easier. That's not how I personally interact with things, and I like that there's the choice for that. I feel like I'm forgetting important things. It's free software. It's, you know, all that stuff. So I feel like it's not, like, <em>the best</em> at anything, but it's <em>generally</em> good enough all-around, and I think that this is the thing that might actually be, like, usable and friendly enough that people actually -- normal people might actually want to use it.</p>
4579<p><strong>J:</strong> Yeah, exactly.</p>
4580<p><strong>tc:</strong> So, in this conversation about messaging, which is very much influenced by network effects. What are -- What people are using is what is useful, right? In that conversation, I think that Matrix plays an important role because I think it has a lot of potential to get people actually using it in a general sense, not just for niche use cases, and consequently, I think it's an important project.</p>
4581<p><strong>J:</strong> I think that's a very nuanced and thorough analysis of the situation, and I agree.</p>
4582<p><strong>tc:</strong> I also feel like it's worth mentioning that you and I arranged to talk on this show using Matrix. I mean, we've been talking on both Matrix and the Fediverse, but... we are both Matrix users...</p>
4583<p><strong>J:</strong> Yes.</p>
4584<p><strong>tc:</strong> ...and we have been using that with each other for this show.</p>
4585<p><strong>J:</strong> And it's my main chat platform. It's -- I've managed to get all but one of the people I talk to regularly onto it, and as soon as I get that last person on there, I am deleting Discord forever!</p>
4586<p><strong>tc:</strong> Nice! XMPP is still and probably will always be my primary thing, but Matrix is overall, I think, good. Despite all the many complaints I have with it, overall, I think it's good. And I think that's where I'll leave that.</p>
4587<p><strong>J:</strong> Yeah.</p>
4588<h3>[Outro]</h3>
4589<p><strong>tc:</strong> You've reached the end of this episode of <em>trash cat tech chat</em>. Check out the show notes for links and other information. This podcast is licensed under a Creative Commons Attribution-ShareAlike 4.0 license. Music by Karl Casey @ White Bat Audio.</p>
4590<h2>Links</h2>
4591<ul>
4592<li><a href="https://matrix.org/blog/2016/11/21/matrixs-olm-end-to-end-encryption-security-assessment-released-and-implemented-cross-platform-on-riot-at-last/">Matrix’s ‘Olm’ End-to-end Encryption security assessment released - and implemented cross-platform on Riot at last!</a></li>
4593<li><a href="https://minestrix.henri2h.fr/">MinesTRIX</a> (&quot;A privacy focused social media based on matrix&quot;)</li>
4594<li><a href="https://matrix.org/blog/2022/05/16/independent-public-audit-of-vodozemac-a-native-rust-reference-implementation-of-matrix-end-to-end-encryption/">Independent public audit of Vodozemac, a native Rust reference implementation of Matrix end-to-end encryption</a></li>
4595</ul>
4596<h2>Credits</h2>
4597<p>Music by <a href="https://karlcasey.bandcamp.com/">Karl Casey</a> @ <a href="https://whitebataudio.com/">White Bat Audio</a></p></div>
4598<details class="info"><summary>item information</summary>
4599timestamp: 1655867272
4600title: [trash cat tech chat] 004 - Matrix, part 2
4601link: https://podcast.librepunk.club/tctc/004
4602content_type: html
4603id: https://podcast.librepunk.club/tctc/004
4604author:
4605enclosure: https://podcast.librepunk.club/tctc/tctc_004_Matrix,-part-2.ogg
4606category:
4607</details>
4608</details>
4609<details>
4610<summary>[linkbudz rss feed] Running Doom on a chip from a $15 smart lamp</summary>
4611<div class="links">
4612<a href="https://uk.pcmag.com/games/133930/you-can-run-doom-on-a-chip-from-a-15-ikea-smart-lamp">read original</a>
4613</div>
4614<div class="content"><p><a href="https://uk.pcmag.com/games/133930/you-can-run-doom-on-a-chip-from-a-15-ikea-smart-lamp">Running Doom on a chip from a $15 smart lamp</a></p>
4615 <p>[https] posted by mio on June 21, 2022</p></div>
4616<details class="info"><summary>item information</summary>
4617timestamp: 1655774852
4618title: [linkbudz rss feed] Running Doom on a chip from a $15 smart lamp
4619link: https://uk.pcmag.com/games/133930/you-can-run-doom-on-a-chip-from-a-15-ikea-smart-lamp
4620content_type: html
4621id: mio20220621012732
4622author:
4623enclosure:
4624category: https
4625</details>
4626</details>
4627<details>
4628<summary>[linkbudz rss feed] Old-school blogging, retro computers, and decentralisation</summary>
4629<div class="links">
4630<a href="https://andregarzia.com/2022/05/Old-school-blogging-retro-computers-and-decentralisation.html">read original</a>
4631</div>
4632<div class="content"><p><a href="https://andregarzia.com/2022/05/Old-school-blogging-retro-computers-and-decentralisation.html">Old-school blogging, retro computers, and decentralisation</a></p>
4633 <p>[https] posted by m455 on June 20, 2022</p></div>
4634<details class="info"><summary>item information</summary>
4635timestamp: 1655733653
4636title: [linkbudz rss feed] Old-school blogging, retro computers, and decentralisation
4637link: https://andregarzia.com/2022/05/Old-school-blogging-retro-computers-and-decentralisation.html
4638content_type: html
4639id: m45520220620140053
4640author:
4641enclosure:
4642category: https
4643</details>
4644</details>
4645<a href="mailto:fwends@me.acdw.net">email acdw</a> if you have issues.
4646</body>
4647</html>
diff --git a/style.css b/style.css new file mode 100644 index 0000000..299b98b --- /dev/null +++ b/style.css
@@ -0,0 +1,117 @@
1body {
2 font-size: 14pt;
3 line-spacing: 1.4;
4}
5
6img {
7 max-width: 100%;
8}
9
10pre,
11code {
12 overflow: scroll;
13}
14
15details {
16 margin: 1ch;
17 max-width: 78ch;
18 margin: auto;
19 padding: 1ch;
20 position: relative;
21}
22
23details[open] {
24 border: 1px solid;
25 border-radius: 1ch;
26 min-height: 4.2em;
27}
28
29summary {
30 display: block;
31 padding: 1ch;
32 margin: -1ch;
33 font: 12pt monospace;
34}
35
36.info {
37 font: 10pt monospace;
38 position: absolute;
39 right: 0;
40 bottom: 1px;
41 border-radius: 1ch;
42}
43.info summary {
44 font: inherit;
45 text-align: right;
46}
47
48summary:hover {
49 text-transform: uppercase;
50 border-radius: 1ch;
51}
52
53.links {
54 float: right;
55}
56
57.content {
58 margin: 2ch;
59}
60
61a {
62 text-decoration: none;
63 padding: 2px;
64}
65
66a:link,
67a:visited {
68 color: inherit;
69}
70
71@media screen and (prefers-color-scheme: light) {
72 body {
73 background: white;
74 color: black;
75 }
76 details {
77 background: #ddd;
78 }
79 details[open] {
80 background: #bbb;
81 }
82 a:link {
83 background: cyan;
84 }
85 a:hover,
86 summary:hover {
87 background: yellow;
88 }
89 pre,
90 code {
91 background: #eee;
92 }
93}
94
95@media screen and (prefers-color-scheme: dark) {
96 body {
97 background: #002222;
98 color: #dee;
99 }
100 details {
101 background: #220000;
102 }
103 details[open] {
104 background: #333;
105 }
106 a:link {
107 background: #002244;
108 }
109 a:hover,
110 summary:hover {
111 background: brown;
112 }
113 pre,
114 code {
115 background: #111;
116 }
117}