summary refs log tree commit diff stats
path: root/index.html
blob: 7e58612ded7e13d1aa20f503574717d22d5ed6f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>fwend planet</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>fwend planet</h1>
<details>
<summary>[linkbudz rss feed] ed is the standard editor</summary>
<div class="links">
<a href="https://tube.tchncs.de/w/g1ZKSzvDaqbpWQQgxGfW3z">read original</a>
</div>
<div class="content"><p><a href="https://tube.tchncs.de/w/g1ZKSzvDaqbpWQQgxGfW3z">ed is the standard editor</a></p>
                <p>[https] posted by dozens on August 18, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660839707
title: [linkbudz rss feed] ed is the standard editor
link: https://tube.tchncs.de/w/g1ZKSzvDaqbpWQQgxGfW3z
content_type: html
id: dozens20220818162147
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Rhythm Nation causes a vulnerability</summary>
<div class="links">
<a href="https://nvd.nist.gov/vuln/detail/CVE-2022-38392">read original</a>
</div>
<div class="content"><p><a href="https://nvd.nist.gov/vuln/detail/CVE-2022-38392">Rhythm Nation causes a vulnerability</a></p>
                <p>[https] posted by lucidiot on August 18, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660837077
title: [linkbudz rss feed] Rhythm Nation causes a vulnerability
link: https://nvd.nist.gov/vuln/detail/CVE-2022-38392
content_type: html
id: lucidiot20220818153757
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] fwends!</summary>
<div class="links">
<a href="https://acdw.casa/fwends/">read original</a>
</div>
<div class="content"><p><a href="https://acdw.casa/fwends/">fwends!</a></p>
                <p>[https] posted by acdw on August 18, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660835383
title: [linkbudz rss feed] fwends!
link: https://acdw.casa/fwends/
content_type: html
id: acdw20220818150943
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Why I left PINE64</summary>
<div class="links">
<a href="https://blog.brixit.nl/why-i-left-pine64/">read original</a>
</div>
<div class="content"><p><a href="https://blog.brixit.nl/why-i-left-pine64/">Why I left PINE64</a></p>
                <p>[https] posted by lucidiot on August 18, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660829064
title: [linkbudz rss feed] Why I left PINE64
link: https://blog.brixit.nl/why-i-left-pine64/
content_type: html
id: lucidiot20220818132424
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[(lambda (x) (create x))] Shiny New Lang</summary>
<div class="links">
<a href="https://lambdacreate.com/posts/39">read original</a>
</div>
<div class="content"><h2>Shiny New Lang</h2>
<h3>Oooh shiny moments with Nim &middot; August 18th, 2022</h3>

<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>

<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>

<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>

<div class="codeSnippet">
  <pre><code>
batt|>> du -h *-battery
1.9M    go-battery
88K     nim-battery
</code></pre>
</div>

<p>Shaved off more than a megabyte! And it's also ever so fractionally faster than the Golang version too.</p>

<div class="codeSnippet">
  <pre><code>
batt|>> time ./go-battery
79%
real    0m 0.03s
user    0m 0.00s
sys     0m 0.00s

batt|>> time ./nim-battery
79.0%
real    0m 0.00s
user    0m 0.00s
sys     0m 0.00s
  </code></pre>
</div>

<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>

<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>

<div class="codeSnippet">
  <pre><code>
package main
/* Report droid battery, semi accurately-ish.
   Author: Will Sinatra, License: GPLv3 */

import (
	"fmt"
	"io/ioutil"
	"log"
	"strconv"
)

func main() {
	max, min := 4351000, 3100000
	/* this sys/class file returns the string "int\
" instead of just int */
	nowbyte, err := ioutil.ReadFile("/sys/class/power_supply/battery/voltage_now")

	/*we have to truncate the \
 with a slice of the array */
	nowslice := nowbyte[0:7]
	now, _ := strconv.Atoi(string(nowslice))
	
	if err != nil {
		log.Fatal(err)
	}

	perc := (100 - ((max - now) * 100)/(max - min))

	fmt.Println(strconv.Itoa(perc)+"%")
}
  </code></pre>
</div>

<div class="codeSnippet">
  <pre><code>
import strutils, std/math

#Expand proc & to concat float & strings
proc `&` (f: float, s:string) : string = $f & s

#calculate rough battery percentage from Droid4 voltage_now file
proc batt() : float =
  let
    max = 4351000
    min = 3100000
    now = readFile("/sys/class/power_supply/battery/voltage_now").strip().parseInt()
    perc = (100 - ((max - now) * 100) / (max - min))
  return round(perc)

echo batt() & "%"
  </code></pre>
</div>

<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>

<div class="codeSnippet">
  <pre><code>
import os, httpclient, mimetypes, strutils
#nim c -d:ssl -d:release lcp.nim

#Paste a file to https://lambdacreate.com/paste
proc lcp() : string =
  var
    client = newHttpClient()
    data = newMultipartData()

  #Set lexical variables for configuration & auth
  let
    mimes = newMimetypes()            #  <- Instantiates mimetypes
    home = getEnv("HOME")             #  <- Grabs /home/username
    conf = home & "/.config/lcp.conf" #  <- Concats path to config file
    crypt = readFile(conf).strip()    #  <- Extract crypt key for /paste auth

  #If we get more or less than 1 argument error
  if paramCount() < 1:
    return "A file must be specified for upload"

  if paramCount() > 1:
    return "Only one file is expected."

  #-F key="crypt"
  data["key"] = $crypt
  #-F upload=@file
  data.addFiles({"upload": paramStr(1)}, mimeDb = mimes)

  #http POST, strip new line on return
  client.postContent("https://lambdacreate.com/paste", multipart=data).strip()

echo lcp()
  </code></pre>
</div>

<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>

<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>
<details class="info"><summary>item information</summary>
timestamp: 1660824000
title: [(lambda (x) (create x))] Shiny New Lang
link: https://lambdacreate.com/posts/39
content_type: html
id: https://lambdacreate.com/posts/39
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[lipu pi jan Niko] how I made Sheepspin (the NOVA 2022 wild compo winner)</summary>
<div class="links">
<a href="https://tilde.town/~nihilazo/log/sheepspin.html">read original</a>
</div>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1660780800
title: [lipu pi jan Niko] how I made Sheepspin (the NOVA 2022 wild compo winner)
link: https://tilde.town/~nihilazo/log/sheepspin.html
content_type: html
id: https://tilde.town/~nihilazo/log/sheepspin.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] Defmacro for C</summary>
<div class="links">
<a href="https://www.european-lisp-symposium.org/static/2014/selgrad.pdf">read original</a>
</div>
<div class="content"><p><a href="https://www.european-lisp-symposium.org/static/2014/selgrad.pdf">Defmacro for C</a></p>
                <p>[https] posted by wsinatra on August 17, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660750368
title: [linkbudz rss feed] Defmacro for C
link: https://www.european-lisp-symposium.org/static/2014/selgrad.pdf
content_type: html
id: wsinatra20220817153248
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] JavaScript PDP 11/70 emulator</summary>
<div class="links">
<a href="https://skn.noip.me/pdp11/pdp11.html">read original</a>
</div>
<div class="content"><p><a href="https://skn.noip.me/pdp11/pdp11.html">JavaScript PDP 11/70 emulator</a></p>
                <p>[https] posted by m455 on August 17, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660704727
title: [linkbudz rss feed] JavaScript PDP 11/70 emulator
link: https://skn.noip.me/pdp11/pdp11.html
content_type: html
id: m45520220817025207
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] tenpo ko: a universal timezone clock</summary>
<div class="links">
<a href="http://tilde.town/~dozens/tenpoko/">read original</a>
</div>
<div class="content"><p><a href="http://tilde.town/~dozens/tenpoko/">tenpo ko: a universal timezone clock</a></p>
                <p>[http] posted by dozens on August 17, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660696023
title: [linkbudz rss feed] tenpo ko: a universal timezone clock
link: http://tilde.town/~dozens/tenpoko/
content_type: html
id: dozens20220817002703
author: 
enclosure: 
category: http
</details>
</details>
<details>
<summary>[Brainshit] Big Mac Chicken</summary>
<div class="links">
<a href="https://brainshit.fr/read/315">read original</a>
</div>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1660687200
title: [Brainshit] Big Mac Chicken
link: https://brainshit.fr/read/315
content_type: html
id: https://brainshit.fr/read/315
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Gastronomie
</details>
</details>
<details>
<summary>[linkbudz rss feed] Hank explains the new US climate law, and why we can be optimistic about it.</summary>
<div class="links">
<a href="https://www.youtube.com/watch?v=qw5zzrOpo2s">read original</a>
</div>
<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>
                <p>[https] posted by kindrobot on August 15, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660574445
title: [linkbudz rss feed] Hank explains the new US climate law, and why we can be optimistic about it.
link: https://www.youtube.com/watch?v=qw5zzrOpo2s
content_type: html
id: kindrobot20220815144045
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[(lambda (x) (create x))] Auskultanto</summary>
<div class="links">
<a href="https://lambdacreate.com/posts/38">read original</a>
</div>
<div class="content"><h2>Auskultanto</h2>
<h3>Prototyping things in Golang &middot; August, 15th, 2022</h3>

<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>

<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>

<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>

<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>

<h3>Latest Prototype</h3>

<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>

<div class="codeSnippet">
  <pre><code>
~|>> curl http://127.0.0.1:8092/command?name=uptime
{"Stdout":" 21:10:43 up  3:39,  0 users,  load average: 1.17, 0.95, 1.17\
","Stderr":"","Timestamp":"2022-08-15 21:10:43.007781982 -0400 EDT m=+23.979705812"}

~|>> curl http://127.0.0.1:8092/service?name=sshd
{"Stdout":" * status: started\
","Stderr":"","Timestamp":"2022-08-15 21:11:44.101013183 -0400 EDT m=+85.072937013"}

~|>> curl http://127.0.0.1:8092/script?name=test.sh
{"Stdout":"neuromancer\
","Stderr":"","Timestamp":"2022-08-15 21:11:59.156463623 -0400 EDT m=+100.128387453"}
  </code></pre>
</div>

<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>

<div class="codeSnippet">
  <pre><code>
Log: auskultanto.log
ScriptDir: /var/auskultanto/scripts/
Init: openrc
# /service?name=sshd
Services:
  - sshd
  - iptables
# /command?name="netstat%20-tlpn"
# /command?name=uptime
Commands:
  - uptime
  - hostname
  - netstat -tlpn
# /script?name="test.sh"
Scripts:
  - test.sh
  </code></pre>
 </div>
  
<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>

<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>

<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>

<div class="codeSnippet">
  <pre><code>
2022/08/15 21:10:43 Queried: /command
2022/08/15 21:10:43 Command key: uptime
2022/08/15 21:11:43 Queried: /service
2022/08/15 21:11:43 Service key: sshd
2022/08/15 21:11:59 Queried: /script
2022/08/15 21:11:59 Script key: test.sh
  </code></pre>
</div>

<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>

<ul>
  <li>/service?name=wildfly</li>
  <li>/command?name=sudo%20whoami</li>
  <li>/command?name=uptime%26%26whoami</li>
  <li>/command?name=rm%20-rf%20/%2A</li>
  <li>/script?name=test.sh%3B%20rm%20-rf%20/%2A</li>
</ul>

<div class="codeSnippet">
  <pre><code>
2022/08/15 21:31:03 Queried: /service
2022/08/15 21:31:03 Service key: wildfly
2022/08/15 21:31:03 wildfly is not a configured service.
2022/08/15 21:31:24 Queried: /command
2022/08/15 21:31:24 Command key: sudo whoami
2022/08/15 21:31:24 sudo whoami is not a configured command
2022/08/15 21:42:28 Queried: /command
2022/08/15 21:42:28 Command key: uptime&&whoami
2022/08/15 21:42:28 uptime&&whoami is not a configured command.
2022/08/16 01:53:00 Queried: /command
2022/08/16 01:53:00 Command key: rm -rf /*
2022/08/16 01:53:00 rm -rf /* is not a configured command.
2022/08/16 01:52:01 Queried: /script
2022/08/16 01:52:01 Script key: test.sh; rm -rf /*
2022/08/16 01:52:01 test.sh; rm -rf /* is not a configured script.
  </code></pre>
</div>

<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>

<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>
<details class="info"><summary>item information</summary>
timestamp: 1660564800
title: [(lambda (x) (create x))] Auskultanto
link: https://lambdacreate.com/posts/38
content_type: html
id: https://lambdacreate.com/posts/38
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[RSRSSS] tilde whirl</summary>
<div class="links">
<a href="http://tilde.town/~dozens/podcast/rss.xml">read original</a>
</div>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1660564323
title: [RSRSSS] tilde whirl
link: http://tilde.town/~dozens/podcast/rss.xml
content_type: html
id: tilde-whirl
author: 
enclosure: 
category: Feed|Podcast
</details>
</details>
<details>
<summary>[~lucidiot's wiki] tank</summary>
<div class="links">
<a href="https://envs.net/~lucidiot/tank.html">read original</a>
</div>
<div class="content"></div>
<details class="info"><summary>item information</summary>
timestamp: 1660550801
title: [~lucidiot's wiki] tank
link: https://envs.net/~lucidiot/tank.html
content_type: 
id: https://envs.net/~lucidiot/tank.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[~lucidiot's wiki] notebooks</summary>
<div class="links">
<a href="https://envs.net/~lucidiot/notebooks.html">read original</a>
</div>
<div class="content"></div>
<details class="info"><summary>item information</summary>
timestamp: 1660542735
title: [~lucidiot's wiki] notebooks
link: https://envs.net/~lucidiot/notebooks.html
content_type: 
id: https://envs.net/~lucidiot/notebooks.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] C Isn't A Programming Language Anymore</summary>
<div class="links">
<a href="https://gankra.github.io/blah/c-isnt-a-language/">read original</a>
</div>
<div class="content"><p><a href="https://gankra.github.io/blah/c-isnt-a-language/">C Isn't A Programming Language Anymore</a></p>
                <p>[https] posted by dozens on August 15, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660528100
title: [linkbudz rss feed] C Isn't A Programming Language Anymore
link: https://gankra.github.io/blah/c-isnt-a-language/
content_type: html
id: dozens20220815014820
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] 43beans</summary>
<div class="links">
<a href="https://www.youtube.com/watch?v=3V84Bi-mzQM">read original</a>
</div>
<div class="content"><p><a href="https://www.youtube.com/watch?v=3V84Bi-mzQM">43beans</a></p>
                <p>[https] posted by acdw on August 14, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660490080
title: [linkbudz rss feed] 43beans
link: https://www.youtube.com/watch?v=3V84Bi-mzQM
content_type: html
id: acdw20220814151440
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[dozens weed] 00030 re: [acdw] 2</summary>
<div class="links">
<a href="">read original</a>
</div>
<div class="content"><blockquote>
          <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>
          </blockquote>
          <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>
          <blockquote>
          <p>Also read dozen’s bit on ed, the standard text editor. I also am using ed now! Thanks 12s. This is fun.</p>
          </blockquote>
          <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>
          <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>
          <p>Something like this:</p>
          <pre><code>for x in files do
            ed $x &lt;&lt; EOE
            1
            i
            BLA BLA BLA
            .
            wq
            EOE
          done</code></pre>
          <blockquote>
          <p>OH btw dozens you can rlwrap ed and it’s nice.</p>
          </blockquote>
          <p>I did use rlwrap! I like having command history for the most part. But yeah that does provide some better cursor control.</p>
          <p>Whoa, just read the manpage on readline and it is much more configurable than I ever realized..</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660486377
title: [dozens weed] 00030 re: [acdw] 2
link: 
content_type: html
id: Sun, 14 Aug 2022 10:12:57 -0400
author: dozens sin leche
enclosure: 
category: 
</details>
</details>
<details>
<summary>[dozens weed] 00029 ed</summary>
<div class="links">
<a href="">read original</a>
</div>
<div class="content"><blockquote>
          <p>ed is the standard editor</p>
          </blockquote>
          <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>
          <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>
          <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>
          <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>
          <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>
          <p>Which is why I am writing this post in a line editor named ed. Ed is the standard text editor.</p>
          <hr />
          <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>
          <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>
          <p>Its editing capabilties remain rudimentary. And writing in ed reminds me of it in a certain way.</p>
          <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>
          <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>
          <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>
          <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>
          <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>
          <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>
          <p>Ultimately, I’d say any inconvenience is well worth the way it changes how you think.</p>
          <hr />
          <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>
          <p>A line editor like ed.</p>
          <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>
          <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>
          <p>Here are some other things that ed pioneered, influenced, or popularized: or popularized:</p>
          <ul>
          <li><p>regular expressions</p></li>
          <li><p>grep</p></li>
          <li><p>sed</p></li>
          <li><p>ex, vi, and vim</p></li>
          </ul>
          <hr />
          <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>
          <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>
          <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>
<details class="info"><summary>item information</summary>
timestamp: 1660443015
title: [dozens weed] 00029 ed
link: 
content_type: html
id: Sat, 13 Aug 2022 22:10:15 -0400
author: dozens sin leche
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] How can Santa keep his lists when the GDPR is around?</summary>
<div class="links">
<a href="https://worldbuilding.stackexchange.com/q/114033">read original</a>
</div>
<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>
                <p>[https] posted by lucidiot on August 13, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660432338
title: [linkbudz rss feed] How can Santa keep his lists when the GDPR is around?
link: https://worldbuilding.stackexchange.com/q/114033
content_type: html
id: lucidiot20220813231218
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Brainshit] Blog-Driven Development</summary>
<div class="links">
<a href="https://brainshit.fr/read/314">read original</a>
</div>
<div class="content">Une longue réflexion sur une pratique que j'ai commencé sans vraiment y penser depuis un an.</div>
<details class="info"><summary>item information</summary>
timestamp: 1660428000
title: [Brainshit] Blog-Driven Development
link: https://brainshit.fr/read/314
content_type: html
id: https://brainshit.fr/read/314
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Productivité
</details>
</details>
<details>
<summary>[linkbudz rss feed] writing an xml schema validator in… xml</summary>
<div class="links">
<a href="https://www.saxonica.com/papers/markupuk-2018mhk.pdf">read original</a>
</div>
<div class="content"><p><a href="https://www.saxonica.com/papers/markupuk-2018mhk.pdf">writing an xml schema validator in… xml</a></p>
                <p>[https] posted by lucidiot on August 11, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660254767
title: [linkbudz rss feed] writing an xml schema validator in… xml
link: https://www.saxonica.com/papers/markupuk-2018mhk.pdf
content_type: html
id: lucidiot20220811215247
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] A Picture of a Hot Dog</summary>
<div class="links">
<a href="https://www.pictureofhotdog.com/">read original</a>
</div>
<div class="content"><p><a href="https://www.pictureofhotdog.com/">A Picture of a Hot Dog</a></p>
                <p>[https] posted by acdw on August 11, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660250944
title: [linkbudz rss feed] A Picture of a Hot Dog
link: https://www.pictureofhotdog.com/
content_type: html
id: acdw20220811204904
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] ansi tarot art</summary>
<div class="links">
<a href="https://16colo.rs/pack/lbs-tarot/">read original</a>
</div>
<div class="content"><p><a href="https://16colo.rs/pack/lbs-tarot/">ansi tarot art</a></p>
                <p>[https] posted by dozens on August 11, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660248227
title: [linkbudz rss feed] ansi tarot art
link: https://16colo.rs/pack/lbs-tarot/
content_type: html
id: dozens20220811200347
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] IRC bot written in Retro Forth</summary>
<div class="links">
<a href="http://retroforth.org/examples/irc-bot.retro.html">read original</a>
</div>
<div class="content"><p><a href="http://retroforth.org/examples/irc-bot.retro.html">IRC bot written in Retro Forth</a></p>
                <p>[http] posted by wsinatra on August 11, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660232892
title: [linkbudz rss feed] IRC bot written in Retro Forth
link: http://retroforth.org/examples/irc-bot.retro.html
content_type: html
id: wsinatra20220811154812
author: 
enclosure: 
category: http
</details>
</details>
<details>
<summary>[linkbudz rss feed] Gemini Server written in Retro Forth</summary>
<div class="links">
<a href="http://retroforth.org/examples/atua-gemini.retro.html">read original</a>
</div>
<div class="content"><p><a href="http://retroforth.org/examples/atua-gemini.retro.html">Gemini Server written in Retro Forth</a></p>
                <p>[http] posted by wsinatra on August 11, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660232253
title: [linkbudz rss feed] Gemini Server written in Retro Forth
link: http://retroforth.org/examples/atua-gemini.retro.html
content_type: html
id: wsinatra20220811153733
author: 
enclosure: 
category: http
</details>
</details>
<details>
<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>
<div class="links">
<a href="https://github.com/ergochat/ergo/blob/stable/docs/USERGUIDE.md#always-on">read original</a>
</div>
<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>
                <p>[https] posted by m455 on August 11, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660184500
title: [linkbudz rss feed] apparently the basement allows you to turn your account into an IRC bouncer by setting an "always on" thingy to true??
link: https://github.com/ergochat/ergo/blob/stable/docs/USERGUIDE.md#always-on
content_type: html
id: m45520220811022140
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] the joy of smol projects</summary>
<div class="links">
<a href="https://schroer.ca/2022/04/10/the-joy-of-small-projects/">read original</a>
</div>
<div class="content"><p><a href="https://schroer.ca/2022/04/10/the-joy-of-small-projects/">the joy of smol projects</a></p>
                <p>[https] posted by lucidiot on August 10, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660165621
title: [linkbudz rss feed] the joy of smol projects
link: https://schroer.ca/2022/04/10/the-joy-of-small-projects/
content_type: html
id: lucidiot20220810210701
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] leprd.space: free web hosting for hobbyists</summary>
<div class="links">
<a href="https://leprd.space/">read original</a>
</div>
<div class="content"><p><a href="https://leprd.space/">leprd.space: free web hosting for hobbyists</a></p>
                <p>[https] posted by m455 on August 10, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660117262
title: [linkbudz rss feed] leprd.space: free web hosting for hobbyists
link: https://leprd.space/
content_type: html
id: m45520220810074102
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Dozens and Dragons] Wicked Grin</summary>
<div class="links">
<a href="https://dozensanddragons.neocities.org/31.html">read original</a>
</div>
<div class="content">Lightweight Quickstart Rules for Seriously Fun Games</div>
<details class="info"><summary>item information</summary>
timestamp: 1660104000
title: [Dozens and Dragons] Wicked Grin
link: https://dozensanddragons.neocities.org/31.html
content_type: html
id: https://dozensanddragons.neocities.org/31.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<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>
<div class="links">
<a href="https://friends.m455.casa/">read original</a>
</div>
<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>
                <p>[https] posted by m455 on August 09, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660060603
title: [linkbudz rss feed] m455 finally made a CNAME to point friends.m455.casa to casa.tildepages.org! long live the commonhealth of casakhstan!
link: https://friends.m455.casa/
content_type: html
id: m45520220809155643
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] acdw has a new authoring tool and markup language!</summary>
<div class="links">
<a href="https://git.acdw.net/ht">read original</a>
</div>
<div class="content"><p><a href="https://git.acdw.net/ht">acdw has a new authoring tool and markup language!</a></p>
                <p>[https] posted by m455 on August 09, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1660010615
title: [linkbudz rss feed] acdw has a new authoring tool and markup language!
link: https://git.acdw.net/ht
content_type: html
id: m45520220809020335
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Gemini/Gopher simple intro</summary>
<div class="links">
<a href="https://thedorkweb.substack.com/p/gopher-gemini-and-the-smol-internet">read original</a>
</div>
<div class="content"><p><a href="https://thedorkweb.substack.com/p/gopher-gemini-and-the-smol-internet">Gemini/Gopher simple intro</a></p>
                <p>[https] posted by wsinatra on August 08, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659979984
title: [linkbudz rss feed] Gemini/Gopher simple intro
link: https://thedorkweb.substack.com/p/gopher-gemini-and-the-smol-internet
content_type: html
id: wsinatra20220808173304
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] EFF Defcon 30 appearances</summary>
<div class="links">
<a href="https://www.eff.org/deeplinks/2022/07/hacking-future-def-con-30">read original</a>
</div>
<div class="content"><p><a href="https://www.eff.org/deeplinks/2022/07/hacking-future-def-con-30">EFF Defcon 30 appearances</a></p>
                <p>[https] posted by wsinatra on August 08, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659979886
title: [linkbudz rss feed] EFF Defcon 30 appearances
link: https://www.eff.org/deeplinks/2022/07/hacking-future-def-con-30
content_type: html
id: wsinatra20220808173126
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] proposing a 'systems' lisp</summary>
<div class="links">
<a href="https://dustycloud.org/blog/guile-steel-proposal/">read original</a>
</div>
<div class="content"><p><a href="https://dustycloud.org/blog/guile-steel-proposal/">proposing a 'systems' lisp</a></p>
                <p>[https] posted by dozens on August 08, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659963300
title: [linkbudz rss feed] proposing a 'systems' lisp
link: https://dustycloud.org/blog/guile-steel-proposal/
content_type: html
id: dozens20220808125500
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[m455.casa] meet lol, my new website generator!</summary>
<div class="links">
<a href="https://m455.casa/posts/2022/meet-lol-my-new-website-generator.html">read original</a>
</div>
<div class="content"><h1>meet lol, my new website generator!</h1>
<p>2022-08-08 00:00</p>
<p>I've been pretty busy lately, so I haven't had a lot of time to explore
computers, which is what I love doing. In the last few months, I've been trying
to fight back against busyness by writing a new website generator after everyone
goes to bed. I can't recommend doing this, because it gets exhausting after a
while, but it gives me my kicks and makes me happy.</p>
<p>My old website generator, <a href="https://git.m455.casa/wg">wg</a>, was a wrapper around
Pandoc, and was written in <a href="https://fennel-lang.org/">Fennel</a>. I used separate
fennel scripts to generate a list of posts and an RSS feed as post-thoughts to
the website generator. Also, I didn't know about
<a href="https://www.wireguard.com/">Wireguard</a> when I programmed <code>wg</code>. For those of you
who don't know, Wireguard uses the command-line name <code>wg</code>, so it was best that I
didn't compete with that haha.</p>
<p>I still love Pandoc and Fennel, but I wanted to try to program something that
had the following features:</p>
<ul>
<li>Uses a configuration file</li>
<li>Copies the directory structure from the source directory to the build
  directory</li>
<li>Generates a list of posts from a directory that's specified in the configuration file</li>
<li>Generates an RSS feed of the posts and their content.</li>
<li>Replaces <code>{{variables}}</code> in Markdown files with values that are declared in
  the configuration file</li>
<li>Provides HTML and RSS templates</li></ul>
<p>I also wanted an excuse to make a bigger programming project in <a href="https://call-cc.org/">Chicken
Scheme</a> haha.</p>
<p>I think what I'm most proud of for this project is that I was able to implement
string templates. For example, the <code>{{im-an-example}}</code> in the text below would be
replaced with the value that corresponds to the <code>im-an-example</code> key in a <code>config.scm</code>
file.</p>
<pre><code>Hey there, this a sentence, and my name is {{im-an-example}}.
</code></pre>
<p>Though, this wasn't that easy.</p>
<p>First, I had to implement string replacement... Okay, okay, string replacement
exists in Chicken Scheme using the <code>string-translate</code>, <code>string-translate*</code>,
<code>irregex-replace</code>, or <code>irregex-replace/all</code> procedures, but where's the fun in
using those? I don't get to build anything!</p>
<p>My first step was to write a procedure that replaced the first occurrence of a
string. I ended up using the <code>string-append</code>, <code>substring</code>, and <code>string-length</code>
procedures to implement the following procedure:</p>
<pre><code>(define (str-replace str from-str to-str)
  (let ((from-index (string-contains str from-str)))
    (if from-index
      (string-append (substring str 0 from-index)
                     to-str
                     (substring str
                                (+ from-index (string-length from-str))
                                (string-length str)))
      str)))
</code></pre>
<p>This isn't very useful if you plan on having several of the same placeholder
values in one string, so I also needed to write a procedure to replace all
occurrences of the string. It will drop into an infinite loop if I try to
replace <code>l</code> with <code>ll</code>, but this is personal programming, not some software that
needs to be battle tested, so I settled with my implementation below:</p>
<pre><code>(define (str-replace-all str from-str to-str)
  (let ((from-index (string-contains str from-str)))
    (if from-index
      (let ((rest-of-string (substring str
                                       (+ from-index (string-length from-str))
                                       (string-length str))))
        (string-append (substring str 0 from-index)
                       to-str
                       (str-replace-all rest-of-string from-str to-str)))
      str)))
</code></pre>
<p>Next, I needed somehow to take a list of pairs, convert the first item in each
pair to a string, and then surround the string with <code>{{</code> and <code>}}</code>, so it
resembles one of the placeholder values that I mentioned earlier. After it
changed the first element in each pair, I then took the first element of each
pair, searched for it in the provided string, and then replaced it with the
second element, using the <code>str-replace-all</code> procedure to ensure all instances of
that placeholder were replaced.</p>
<p>I actually ended up having to split this algorithm into two procedures to keep
things maintainable for myself in case I needed to go back to fix or update the
code around this functionality. Here are those two procedures:</p>
<pre><code>(define (key-&gt;mustached-key pair)
  (if (pair? pair)
    (let* ((key (symbol-&gt;string (car pair)))
           (mustached-key (string-append &quot;{{&quot; key &quot;}}&quot;))
           (value (cadr pair)))
    `(,mustached-key ,value))
    pair))

(define (string-populate str kv-replacements)
  (if (null? kv-replacements)
    str
    (let* ((mustached-keys (map key-&gt;mustached-key kv-replacements))
           (first-pair (car mustached-keys))
           (key (car first-pair))
           (val (cadr first-pair)))
      (string-populate
        (str-replace-all str key val)
        (cdr kv-replacements)))))
</code></pre>
<p>This ended up helping me get really good at quasiquoting in Scheme as well!</p>
<p>Apart from the <code>string-populate</code> procedure, and the core procedures that it's
built on, most of the other features aren't anything special, though I did enjoy
that I can just read arbitrary s-expressions from a string using Scheme's <code>read</code>
procedure. The <code>read</code> procedure made it super easy to read a configuration file
that was all s-expressions. For example, all I needed to do was load an
<a href="https://www.gnu.org/software/mit-scheme/documentation/stable/mit-scheme-ref/Association-Lists.html">alist</a>
in a file with the following procedure:</p>
<pre><code>(define (load-config-file)
  (if (file-exists? config-file)
    (with-input-from-file config-file read)
    #f))
</code></pre>
<p>This procedure returns a quoted alist, so I wrote the following helper procedure
to read it:</p>
<pre><code>(define (get alist key)
  (if (and (pair? alist)
           (pair? (car alist))
           (symbol? key))
    (cadr (assq key alist))
    alist))
</code></pre>
<p>Functional programming purists will hate me for this, but this then allowed me
set a globally mutated variable with <code>(set! config-data (load-config-file))</code>,
and then read the variable with a <code>(get config-data 'source-dir)</code>.</p>
<p>I've been using this method for reading and reloading configuration files for
other projects as well, so that was a great learning experience.</p>
<p>As for generating my list of posts and RSS feed, all I needed to do was parse
each Markdown file in a directory that's specified in the configuration file.
To make things easy, the title of a post was extracted from the first line of a
file, which should always be a Markdown H1 heading. I would then take the
Markdown heading, for example, <code># hey i'm a heading</code>, and remove the number sign
and space proceeding the number sign, leaving me with <code>hey i'm a heading</code>.</p>
<p>The remaining string would be used as the title for each post in the list of
posts page, and the title of each RSS item. The way I generated links for my
list of posts page was by converting the source path from, as an example,
<code>&lt;source-dir&gt;/path/to/post.md</code> to
<code>https://&lt;domain&gt;/path/to/post.html</code>.</p>
<p>Because dates are pretty important to RSS feeds, although not required, if
you're following the spec, I chose to put dates on the third line of each post,
in the format of <code>yyyy-mm-dd</code>, so I could convert <code>yyyy-mm-dd</code> to a number that
resembled <code>yyyymmdd</code>, and then reverse sort by each number, resulting in a
&quot;latest post first, oldest post last&quot; order.</p>
<p>To kind of finish this off, I think one of the major annoyances was converting
all fenced code blocks to use indentation instead, because Chicken Scheme's
lowdown egg replicates what the original Markdown parser does. That, and
replacing all of my Pandoc-centric Markdown stuff such as its Markdown version
of <code>&lt;div&gt;</code> blocks:</p>
<pre><code>:::{.im-a-class}
hey im a div
:::
</code></pre>
<p>The upside to using old school, feature-less Markdown is that the Markdown for
my website will work on most Markdown parsers I guess? Haha.</p>
<p>The downside to using the lowdown Markdown parser is that heading anchors aren't
generated, so all of my links to heading anchors are broken, but I got to have
fun with programming in Scheme at least? Plus, this isn't my professional
website, so things are allowed to be broken here, and I don't want to get rid of
old posts because they bring back good programming adventure memories for me.</p>
<p>I figured this blog could use a new post, so here it is!</p>
<p>Have a good one!</p>
<p>If you want to check out the source code for my new website generator, you can
view it <a href="https://git.m455.casa/lol">here</a>.</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659916800
title: [m455.casa] meet lol, my new website generator!
link: https://m455.casa/posts/2022/meet-lol-my-new-website-generator.html
content_type: html
id: https://m455.casa/posts/2022/meet-lol-my-new-website-generator.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[RSRSSS] Gitea has most feeds, except the most important one</summary>
<div class="links">
<a href="">read original</a>
</div>
<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>
        <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>
        <ul>
          <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>
          <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>
          <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>
        </ul>
        <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>
        <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>
<details class="info"><summary>item information</summary>
timestamp: 1659914883
title: [RSRSSS] Gitea has most feeds, except the most important one
link: 
content_type: html
id: gitea-most-feeds
author: 
enclosure: 
category: Tip
</details>
</details>
<details>
<summary>[linkbudz rss feed] CISA 2021 Top Malware Strains</summary>
<div class="links">
<a href="https://www.cisa.gov/uscert/ncas/alerts/aa22-216a">read original</a>
</div>
<div class="content"><p><a href="https://www.cisa.gov/uscert/ncas/alerts/aa22-216a">CISA 2021 Top Malware Strains</a></p>
                <p>[https] posted by wsinatra on August 05, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659707012
title: [linkbudz rss feed] CISA 2021 Top Malware Strains
link: https://www.cisa.gov/uscert/ncas/alerts/aa22-216a
content_type: html
id: wsinatra20220805134332
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] How to surf the web</summary>
<div class="links">
<a href="https://sadgrl.online/cyberspace/surf-the-web.html">read original</a>
</div>
<div class="content"><p><a href="https://sadgrl.online/cyberspace/surf-the-web.html">How to surf the web</a></p>
                <p>[https] posted by mio on August 04, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659650190
title: [linkbudz rss feed] How to surf the web
link: https://sadgrl.online/cyberspace/surf-the-web.html
content_type: html
id: mio20220804215630
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] oh god, rss3 is coming</summary>
<div class="links">
<a href="https://blog.rss3.io/">read original</a>
</div>
<div class="content"><p><a href="https://blog.rss3.io/">oh god, rss3 is coming</a></p>
                <p>[https] posted by acdw on August 04, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659633296
title: [linkbudz rss feed] oh god, rss3 is coming
link: https://blog.rss3.io/
content_type: html
id: acdw20220804171456
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Simple CA Tutorial</summary>
<div class="links">
<a href="https://jamielinux.com/docs/openssl-certificate-authority/introduction.html">read original</a>
</div>
<div class="content"><p><a href="https://jamielinux.com/docs/openssl-certificate-authority/introduction.html">Simple CA Tutorial</a></p>
                <p>[https] posted by wsinatra on August 04, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659621190
title: [linkbudz rss feed] Simple CA Tutorial
link: https://jamielinux.com/docs/openssl-certificate-authority/introduction.html
content_type: html
id: wsinatra20220804135310
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Wazuh, an open source SIEM platform</summary>
<div class="links">
<a href="https://wazuh.com/">read original</a>
</div>
<div class="content"><p><a href="https://wazuh.com/">Wazuh, an open source SIEM platform</a></p>
                <p>[https] posted by wsinatra on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659557326
title: [linkbudz rss feed] Wazuh, an open source SIEM platform
link: https://wazuh.com/
content_type: html
id: wsinatra20220803200846
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Google map hacks</summary>
<div class="links">
<a href="http://www.simonweckert.com/googlemapshacks.html">read original</a>
</div>
<div class="content"><p><a href="http://www.simonweckert.com/googlemapshacks.html">Google map hacks</a></p>
                <p>[http] posted by m455 on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659556751
title: [linkbudz rss feed] Google map hacks
link: http://www.simonweckert.com/googlemapshacks.html
content_type: html
id: m45520220803195911
author: 
enclosure: 
category: http
</details>
</details>
<details>
<summary>[linkbudz rss feed] cursed software bugs, with rss feed</summary>
<div class="links">
<a href="https://500mile.email/">read original</a>
</div>
<div class="content"><p><a href="https://500mile.email/">cursed software bugs, with rss feed</a></p>
                <p>[https] posted by lucidiot on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659546117
title: [linkbudz rss feed] cursed software bugs, with rss feed
link: https://500mile.email/
content_type: html
id: lucidiot20220803170157
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] We can't send email more than 500 miles</summary>
<div class="links">
<a href="https://web.mit.edu/jemorris/humor/500-miles">read original</a>
</div>
<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>
                <p>[https] posted by wsinatra on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659546065
title: [linkbudz rss feed] We can't send email more than 500 miles
link: https://web.mit.edu/jemorris/humor/500-miles
content_type: html
id: wsinatra20220803170105
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] if you type in your pw, it will show as stars</summary>
<div class="links">
<a href="http://bash.org/?244321">read original</a>
</div>
<div class="content"><p><a href="http://bash.org/?244321">if you type in your pw, it will show as stars</a></p>
                <p>[http] posted by wsinatra on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659546000
title: [linkbudz rss feed] if you type in your pw, it will show as stars
link: http://bash.org/?244321
content_type: html
id: wsinatra20220803170000
author: 
enclosure: 
category: http
</details>
</details>
<details>
<summary>[linkbudz rss feed] RAID is not a policing method</summary>
<div class="links">
<a href="https://en.wikipedia.org/wiki/Standard_RAID_levels">read original</a>
</div>
<div class="content"><p><a href="https://en.wikipedia.org/wiki/Standard_RAID_levels">RAID is not a policing method</a></p>
                <p>[https] posted by wsinatra on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659533694
title: [linkbudz rss feed] RAID is not a policing method
link: https://en.wikipedia.org/wiki/Standard_RAID_levels
content_type: html
id: wsinatra20220803133454
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] the french police is not a backup.</summary>
<div class="links">
<a href="https://en.wikipedia.org/wiki/RAID_(French_police_unit)">read original</a>
</div>
<div class="content"><p><a href="https://en.wikipedia.org/wiki/RAID_(French_police_unit)">the french police is not a backup.</a></p>
                <p>[https] posted by lucidiot on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659533332
title: [linkbudz rss feed] the french police is not a backup.
link: https://en.wikipedia.org/wiki/RAID_(French_police_unit)
content_type: html
id: lucidiot20220803132852
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Lowtech Radio Gazette] The Hardest Part</summary>
<div class="links">
<a href="https://lambdacreate.com/podcast/ltrg/1">read original</a>
<a href="https://lambdacreate.com/static/ltrg/ltrg-1.mp3">enclosure</a>
</div>
<div class="content"><h2>The Hardest Part</h2>
<h3>Is almost always starting &middot; August 3rd 2022</h3>

<p>Imagine an embedded media player, right here. Pretty ain't it?</p>

<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>

<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>

<h3>What Our Listeners Are Saying</h3>

<ul>
  <li>Frankenstein stream?</li>
  <li>Podcast transcript: *mumbling* is this thing on? *taps mic*</li>
  <li>Raw Steak Radicchio Baguette</li>
  <li>Coherence isn't exactly a priority for smol podcasts</li>
  <li>I think episode 1 is just wsinatra doing a podcast about making a podcast. mmmeta</li>
  <li>Well, it's not *that* meta so it's fine</li>
</ul>

<h3>Admin Note</h3>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1659528000
title: [Lowtech Radio Gazette] The Hardest Part
link: https://lambdacreate.com/podcast/ltrg/1
content_type: html
id: ltrg-1
author: 
enclosure: https://lambdacreate.com/static/ltrg/ltrg-1.mp3
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] a blog about plaintext</summary>
<div class="links">
<a href="https://plaintextproject.online/">read original</a>
</div>
<div class="content"><p><a href="https://plaintextproject.online/">a blog about plaintext</a></p>
                <p>[https] posted by lucidiot on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659509363
title: [linkbudz rss feed] a blog about plaintext
link: https://plaintextproject.online/
content_type: html
id: lucidiot20220803064923
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] smol Windows, Palm OS and OSX apps</summary>
<div class="links">
<a href="https://tinyapps.org/">read original</a>
</div>
<div class="content"><p><a href="https://tinyapps.org/">smol Windows, Palm OS and OSX apps</a></p>
                <p>[https] posted by lucidiot on August 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659509331
title: [linkbudz rss feed] smol Windows, Palm OS and OSX apps
link: https://tinyapps.org/
content_type: html
id: lucidiot20220803064851
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Interneting is Hard - webdev tutorials for beginners</summary>
<div class="links">
<a href="https://www.internetingishard.com/">read original</a>
</div>
<div class="content"><p><a href="https://www.internetingishard.com/">Interneting is Hard - webdev tutorials for beginners</a></p>
                <p>[https] posted by mio on August 02, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659455230
title: [linkbudz rss feed] Interneting is Hard - webdev tutorials for beginners
link: https://www.internetingishard.com/
content_type: html
id: mio20220802154710
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] a 'quick and dirty' literate programming tool in awk</summary>
<div class="links">
<a href="https://acdw.casa/docawk/">read original</a>
</div>
<div class="content"><p><a href="https://acdw.casa/docawk/">a 'quick and dirty' literate programming tool in awk</a></p>
                <p>[https] posted by acdw on August 02, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659450727
title: [linkbudz rss feed] a 'quick and dirty' literate programming tool in awk
link: https://acdw.casa/docawk/
content_type: html
id: acdw20220802143207
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Wikipedia is a quality resource</summary>
<div class="links">
<a href="https://en.wikipedia.org/wiki/Category:Wikipedia_slapping_templates">read original</a>
</div>
<div class="content"><p><a href="https://en.wikipedia.org/wiki/Category:Wikipedia_slapping_templates">Wikipedia is a quality resource</a></p>
                <p>[https] posted by lucidiot on August 01, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659380358
title: [linkbudz rss feed] Wikipedia is a quality resource
link: https://en.wikipedia.org/wiki/Category:Wikipedia_slapping_templates
content_type: html
id: lucidiot20220801185918
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] The free and healthy typeface for bread and butter use</summary>
<div class="links">
<a href="http://vollkorn-typeface.com/">read original</a>
</div>
<div class="content"><p><a href="http://vollkorn-typeface.com/">The free and healthy typeface for bread and butter use</a></p>
                <p>[http] posted by dozens on August 01, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659372207
title: [linkbudz rss feed] The free and healthy typeface for bread and butter use
link: http://vollkorn-typeface.com/
content_type: html
id: dozens20220801164327
author: 
enclosure: 
category: http
</details>
</details>
<details>
<summary>[linkbudz rss feed] Open letter to Google Security team from a librarian (warning: GDocs link)</summary>
<div class="links">
<a href="https://docs.google.com/document/d/1f6HPQbUjslcbjVHkJkAgYmQmBV3PRRHEcx4WL5rxuE8/preview">read original</a>
</div>
<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>
                <p>[https] posted by acdw on August 01, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659370095
title: [linkbudz rss feed] Open letter to Google Security team from a librarian (warning: GDocs link)
link: https://docs.google.com/document/d/1f6HPQbUjslcbjVHkJkAgYmQmBV3PRRHEcx4WL5rxuE8/preview
content_type: html
id: acdw20220801160815
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Brainshit] Les assistants Web de Windows XP</summary>
<div class="links">
<a href="https://brainshit.fr/read/308">read original</a>
</div>
<div class="content">À la découverte de quelques assistants très particuliers de Windows XP.</div>
<details class="info"><summary>item information</summary>
timestamp: 1659218400
title: [Brainshit] Les assistants Web de Windows XP
link: https://brainshit.fr/read/308
content_type: html
id: https://brainshit.fr/read/308
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Informatique
</details>
</details>
<details>
<summary>[linkbudz rss feed] Simple Firewalls with iptables</summary>
<div class="links">
<a href="http://lambdacreate.com/posts/37">read original</a>
</div>
<div class="content"><p><a href="http://lambdacreate.com/posts/37">Simple Firewalls with iptables</a></p>
                <p>[http] posted by wsinatra on July 29, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659101991
title: [linkbudz rss feed] Simple Firewalls with iptables
link: http://lambdacreate.com/posts/37
content_type: html
id: wsinatra20220729133951
author: 
enclosure: 
category: http
</details>
</details>
<details>
<summary>[linkbudz rss feed] The Old School Computer Challenge Rules!</summary>
<div class="links">
<a href="https://dataswamp.org/~solene/2021-07-07-old-computer-challenge.html">read original</a>
</div>
<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>
                <p>[https] posted by wsinatra on July 29, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659101724
title: [linkbudz rss feed] The Old School Computer Challenge Rules!
link: https://dataswamp.org/~solene/2021-07-07-old-computer-challenge.html
content_type: html
id: wsinatra20220729133524
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Mess with DNS</summary>
<div class="links">
<a href="https://jvns.ca/blog/2021/12/15/mess-with-dns/">read original</a>
</div>
<div class="content"><p><a href="https://jvns.ca/blog/2021/12/15/mess-with-dns/">Mess with DNS</a></p>
                <p>[https] posted by wsinatra on July 29, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659101325
title: [linkbudz rss feed] Mess with DNS
link: https://jvns.ca/blog/2021/12/15/mess-with-dns/
content_type: html
id: wsinatra20220729132845
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Quirky DNS overview</summary>
<div class="links">
<a href="https://jvns.ca/blog/2022/02/01/a-dns-resolver-in-80-lines-of-go/">read original</a>
</div>
<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>
                <p>[https] posted by wsinatra on July 29, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659101292
title: [linkbudz rss feed] Quirky DNS overview
link: https://jvns.ca/blog/2022/02/01/a-dns-resolver-in-80-lines-of-go/
content_type: html
id: wsinatra20220729132812
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Firecracker VM</summary>
<div class="links">
<a href="https://jvns.ca/blog/2021/01/23/firecracker--start-a-vm-in-less-than-a-second/">read original</a>
</div>
<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>
                <p>[https] posted by wsinatra on July 29, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659100757
title: [linkbudz rss feed] Firecracker VM
link: https://jvns.ca/blog/2021/01/23/firecracker--start-a-vm-in-less-than-a-second/
content_type: html
id: wsinatra20220729131917
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Recutils, GOOPS and virtual slots</summary>
<div class="links">
<a href="https://ane.iki.fi/lisp/goops-virtual-slots-and-ffi.html">read original</a>
</div>
<div class="content"><p><a href="https://ane.iki.fi/lisp/goops-virtual-slots-and-ffi.html">Recutils, GOOPS and virtual slots</a></p>
                <p>[https] posted by dozens on July 28, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659052448
title: [linkbudz rss feed] Recutils, GOOPS and virtual slots
link: https://ane.iki.fi/lisp/goops-virtual-slots-and-ffi.html
content_type: html
id: dozens20220728235408
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Calendar handling with mutt</summary>
<div class="links">
<a href="https://dacav.roundhousecode.com/blog/2019-11/09-mutt-calendar-and-such.html">read original</a>
</div>
<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>
                <p>[https] posted by wsinatra on July 28, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659030089
title: [linkbudz rss feed] Calendar handling with mutt
link: https://dacav.roundhousecode.com/blog/2019-11/09-mutt-calendar-and-such.html
content_type: html
id: wsinatra20220728174129
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] charmbracelet goodness for shell scripts without go</summary>
<div class="links">
<a href="https://github.com/charmbracelet/gum">read original</a>
</div>
<div class="content"><p><a href="https://github.com/charmbracelet/gum">charmbracelet goodness for shell scripts without go</a></p>
                <p>[https] posted by dozens on July 28, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659029764
title: [linkbudz rss feed] charmbracelet goodness for shell scripts without go
link: https://github.com/charmbracelet/gum
content_type: html
id: dozens20220728173604
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] AI Protein Folding? Nifty.</summary>
<div class="links">
<a href="https://www.deepmind.com/blog/alphafold-reveals-the-structure-of-the-protein-universe">read original</a>
</div>
<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>
                <p>[https] posted by marcus on July 28, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659017104
title: [linkbudz rss feed] AI Protein Folding? Nifty.
link: https://www.deepmind.com/blog/alphafold-reveals-the-structure-of-the-protein-universe
content_type: html
id: marcus20220728140504
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Velocipedia - bicycles based on people's attempts to draw them from memory</summary>
<div class="links">
<a href="https://www.gianlucagimini.it/portfolio-item/velocipedia/">read original</a>
</div>
<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>
                <p>[https] posted by mio on July 28, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1659016198
title: [linkbudz rss feed] Velocipedia - bicycles based on people's attempts to draw them from memory
link: https://www.gianlucagimini.it/portfolio-item/velocipedia/
content_type: html
id: mio20220728134958
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Zero to chiptune in one hour (2017)</summary>
<div class="links">
<a href="https://media.ccc.de/v/SHA2017-175-zero_to_chiptune_in_one_hour">read original</a>
</div>
<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>
                <p>[https] posted by mio on July 28, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658972062
title: [linkbudz rss feed] Zero to chiptune in one hour (2017)
link: https://media.ccc.de/v/SHA2017-175-zero_to_chiptune_in_one_hour
content_type: html
id: mio20220728013422
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] The Ultimate Amiga 500 Talk: Amiga Hardware Design and Programming (2015)</summary>
<div class="links">
<a href="https://media.ccc.de/v/32c3-7468-the_ultimate_amiga_500_talk">read original</a>
</div>
<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>
                <p>[https] posted by mio on July 28, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658972022
title: [linkbudz rss feed] The Ultimate Amiga 500 Talk: Amiga Hardware Design and Programming (2015)
link: https://media.ccc.de/v/32c3-7468-the_ultimate_amiga_500_talk
content_type: html
id: mio20220728013342
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] The Ultimate Game Boy Talk (2016)</summary>
<div class="links">
<a href="https://media.ccc.de/v/33c3-8029-the_ultimate_game_boy_talk">read original</a>
</div>
<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>
                <p>[https] posted by mio on July 28, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658971950
title: [linkbudz rss feed] The Ultimate Game Boy Talk (2016)
link: https://media.ccc.de/v/33c3-8029-the_ultimate_game_boy_talk
content_type: html
id: mio20220728013230
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Cosmopolitan C</summary>
<div class="links">
<a href="https://justine.lol/cosmopolitan/">read original</a>
</div>
<div class="content"><p><a href="https://justine.lol/cosmopolitan/">Cosmopolitan C</a></p>
                <p>[https] posted by acdw on July 27, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658946453
title: [linkbudz rss feed] Cosmopolitan C
link: https://justine.lol/cosmopolitan/
content_type: html
id: acdw20220727182733
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] The History of &</summary>
<div class="links">
<a href="https://www.merriam-webster.com/words-at-play/the-history-of-ampersand">read original</a>
</div>
<div class="content"><p><a href="https://www.merriam-webster.com/words-at-play/the-history-of-ampersand">The History of &</a></p>
                <p>[https] posted by acdw on July 27, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658933616
title: [linkbudz rss feed] The History of &
link: https://www.merriam-webster.com/words-at-play/the-history-of-ampersand
content_type: html
id: acdw20220727145336
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] TIC-80 byte jam</summary>
<div class="links">
<a href="https://media.ccc.de/v/mch2022-226-tic-80-byte-jam">read original</a>
</div>
<div class="content"><p><a href="https://media.ccc.de/v/mch2022-226-tic-80-byte-jam">TIC-80 byte jam</a></p>
                <p>[https] posted by mio on July 26, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658877880
title: [linkbudz rss feed] TIC-80 byte jam
link: https://media.ccc.de/v/mch2022-226-tic-80-byte-jam
content_type: html
id: mio20220726232440
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Rocking the Web Bloat: Modern Gopher, Gemini and the Small Internet</summary>
<div class="links">
<a href="https://media.ccc.de/v/mch2022-83-rocking-the-web-bloat-modern-gopher-gemini-and-the-small-internet">read original</a>
</div>
<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>
                <p>[https] posted by mio on July 26, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658877076
title: [linkbudz rss feed] Rocking the Web Bloat: Modern Gopher, Gemini and the Small Internet
link: https://media.ccc.de/v/mch2022-83-rocking-the-web-bloat-modern-gopher-gemini-and-the-small-internet
content_type: html
id: mio20220726231116
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] plop a license in ur projects</summary>
<div class="links">
<a href="https://git.acdw.net/licensor/">read original</a>
</div>
<div class="content"><p><a href="https://git.acdw.net/licensor/">plop a license in ur projects</a></p>
                <p>[https] posted by acdw on July 26, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658867912
title: [linkbudz rss feed] plop a license in ur projects
link: https://git.acdw.net/licensor/
content_type: html
id: acdw20220726203832
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] A doctor for your Palm PDAs</summary>
<div class="links">
<a href="https://www.palmdr.com/cart/">read original</a>
</div>
<div class="content"><p><a href="https://www.palmdr.com/cart/">A doctor for your Palm PDAs</a></p>
                <p>[https] posted by wsinatra on July 26, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658864880
title: [linkbudz rss feed] A doctor for your Palm PDAs
link: https://www.palmdr.com/cart/
content_type: html
id: wsinatra20220726194800
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] rewrite it in rust, but in french</summary>
<div class="links">
<a href="https://github.com/bnjbvr/rouille">read original</a>
</div>
<div class="content"><p><a href="https://github.com/bnjbvr/rouille">rewrite it in rust, but in french</a></p>
                <p>[https] posted by lucidiot on July 26, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658864623
title: [linkbudz rss feed] rewrite it in rust, but in french
link: https://github.com/bnjbvr/rouille
content_type: html
id: lucidiot20220726194343
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Brainshit] Trouver des synonymes en craquant un orteil</summary>
<div class="links">
<a href="https://brainshit.fr/read/312">read original</a>
</div>
<div class="content">Non, mon cerveau n'est pas en train de craquer. Enfin… pas cette fois.</div>
<details class="info"><summary>item information</summary>
timestamp: 1658786400
title: [Brainshit] Trouver des synonymes en craquant un orteil
link: https://brainshit.fr/read/312
content_type: html
id: https://brainshit.fr/read/312
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Informatique
</details>
</details>
<details>
<summary>[Dozens and Dragons] It is Time To Plant The Beans</summary>
<div class="links">
<a href="https://dozensanddragons.neocities.org/30.html">read original</a>
</div>
<div class="content">actual play</div>
<details class="info"><summary>item information</summary>
timestamp: 1658721600
title: [Dozens and Dragons] It is Time To Plant The Beans
link: https://dozensanddragons.neocities.org/30.html
content_type: html
id: https://dozensanddragons.neocities.org/30.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[lipu pi jan Niko] Minecraft 1.14 was a failure, but here's how to (maybe) improve it</summary>
<div class="links">
<a href="https://tilde.town/~nihilazo/log/minecraftvillage.html">read original</a>
</div>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1658707200
title: [lipu pi jan Niko] Minecraft 1.14 was a failure, but here's how to (maybe) improve it
link: https://tilde.town/~nihilazo/log/minecraftvillage.html
content_type: html
id: https://tilde.town/~nihilazo/log/minecraftvillage.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[Tilde Whirl Tildeverse Podcast] episode 9</summary>
<div class="links">
<a href="https://tilde.town/~dozens/podcast/2022-07-24-episode-9-tomasino.html">read original</a>
<a href="https://archive.org/download/tilderwhirl-S01E01/tildewhirl-s01e09.mp3">enclosure</a>
</div>
<div class="content"><h2 id="notes">notes</h2>
<p>look, it’s tomasino!</p>
<ul>
<li><a href="https://tomasino.org/" class="uri">https://tomasino.org/</a></li>
<li><a href="https://tilde.zone/@tomasino" class="uri">https://tilde.zone/@tomasino</a></li>
<li><a href="https://cosmic.voyage/" class="uri">https://cosmic.voyage/</a></li>
</ul>
<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>
<!-- this episode's secret phrase is 'pepperoni pizza' //-->
<p>Your secret message for this episode is:</p>
<pre><code>zdv nhwb h uxd fe lfwb jnhejb dl mvbttfem xnfjn lfembct f nhwb aqhjbk kdxe hek xfeefem h efjb tvcacftb</code></pre>
<h2 id="segments">segments</h2>
<ul>
<li>poetry corner – pessimism is for lightweights
<ul>
<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>
<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>
</ul></li>
<li>science fun fact corner – crabs – <a href="https://xkcd.com/2314/" class="uri">https://xkcd.com/2314/</a></li>
<li>magic and divination – iching</li>
<li>story time – joneworlds chapters 21 - 25 – &lt;gemini://republic.circumlunar.space/users/joneworlds/2020-12-21-throwing-pumpkins.gmi&gt;</li>
<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>
<li>happy birthday</li>
<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
- [ ] a message from our sponsors
- [ ] see you in the funny papers
- [ ] mindfulness and meditation
- [ ] food and wine
// --></li>
</ul>
<h2 id="links">links</h2>
<p>Stuff we talked about on the show</p>
<ul>
<li><a href="http://sdf.org/" class="uri">http://sdf.org/</a></li>
<li><a href="https://kakoune.org/" class="uri">https://kakoune.org/</a></li>
<li><a href="https://colemak.com/" class="uri">https://colemak.com/</a></li>
<li><a href="https://first20hours.com/typing/" class="uri">https://first20hours.com/typing/</a></li>
<li><a href="https://linux.die.net/man/1/dash" class="uri">https://linux.die.net/man/1/dash</a></li>
<li><a href="https://gemini.circumlunar.space/" class="uri">https://gemini.circumlunar.space/</a></li>
<li><a href="https://gemlog.blue/" class="uri">https://gemlog.blue/</a></li>
<li><a href="https://fate-srd.com/fate-core" class="uri">https://fate-srd.com/fate-core</a></li>
<li><a href="https://evilhat.com/product/romance-in-the-air/" class="uri">https://evilhat.com/product/romance-in-the-air/</a></li>
<li>gemini://campaignwiki.org/play/ijirait</li>
<li><a href="gopher://gopher.black/1/cyoa" class="uri">gopher://gopher.black/1/cyoa</a></li>
<li><a href="https://archive.tilderadio.org/tomasino/" class="uri">https://archive.tilderadio.org/tomasino/</a></li>
<li><a href="https://archives.anonradio.net/i2018/index.html#tomasino" class="uri">https://archives.anonradio.net/i2018/index.html#tomasino</a></li>
<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>
<li><a href="https://www.ironswornrpg.com/" class="uri">https://www.ironswornrpg.com/</a></li>
<li><a href="https://en.wikipedia.org/wiki/Advanced_Fighting_Fantasy" class="uri">https://en.wikipedia.org/wiki/Advanced_Fighting_Fantasy</a></li>
<li><a href="https://noroadhome.itch.io/alone-among-the-stars" class="uri">https://noroadhome.itch.io/alone-among-the-stars</a></li>
<li><a href="https://armandah.itch.io/xenoarcheology" class="uri">https://armandah.itch.io/xenoarcheology</a></li>
<li><a href="gopher://gopher.black/1/explorations" class="uri">gopher://gopher.black/1/explorations</a></li>
<li><a href="https://divination.com/iching/lookup/" class="uri">https://divination.com/iching/lookup/</a></li>
<li><a href="https://archive.org/details/ichingclarifiedp00sect" class="uri">https://archive.org/details/ichingclarifiedp00sect</a></li>
<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>
<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>
</ul>
<h2 id="sources">sources</h2>
<p>birthday song</p>
<ul>
<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>
<li><a href="https://freesound.org/people/Victor_Natas/sounds/553481/" class="uri">https://freesound.org/people/Victor_Natas/sounds/553481/</a></li>
<li><a href="https://freesound.org/people/Victor_Natas/sounds/547053/" class="uri">https://freesound.org/people/Victor_Natas/sounds/547053/</a></li>
<li><a href="https://freesound.org/people/OllieOllie/sounds/262351/" class="uri">https://freesound.org/people/OllieOllie/sounds/262351/</a></li>
<li><a href="https://freesound.org/people/shelbyshark/sounds/512513/" class="uri">https://freesound.org/people/shelbyshark/sounds/512513/</a></li>
<li><a href="https://freesound.org/people/newlocknew/sounds/584952/" class="uri">https://freesound.org/people/newlocknew/sounds/584952/</a></li>
<li><a href="https://freesound.org/people/newlocknew/sounds/584953/" class="uri">https://freesound.org/people/newlocknew/sounds/584953/</a></li>
<li><a href="https://freesound.org/people/nomiqbomi/sounds/579259/" class="uri">https://freesound.org/people/nomiqbomi/sounds/579259/</a></li>
<li><a href="https://freesound.org/people/nomiqbomi/sounds/579258/" class="uri">https://freesound.org/people/nomiqbomi/sounds/579258/</a></li>
<li><a href="https://freesound.org/people/nomiqbomi/sounds/579265/" class="uri">https://freesound.org/people/nomiqbomi/sounds/579265/</a></li>
<li><a href="https://freesound.org/people/nomiqbomi/sounds/579266/" class="uri">https://freesound.org/people/nomiqbomi/sounds/579266/</a></li>
<li><a href="https://freesound.org/people/Victor_Natas/sounds/544897/" class="uri">https://freesound.org/people/Victor_Natas/sounds/544897/</a></li>
</ul></div>
<details class="info"><summary>item information</summary>
timestamp: 1658689932
title: [Tilde Whirl Tildeverse Podcast] episode 9
link: https://tilde.town/~dozens/podcast/2022-07-24-episode-9-tomasino.html
content_type: html
id: Thu, 24 July 2022 12:12:12 -0700
author: 
enclosure: https://archive.org/download/tilderwhirl-S01E01/tildewhirl-s01e09.mp3
category: 
</details>
</details>
<details>
<summary>[~lucidiot's wiki] Compiled Qt translations</summary>
<div class="links">
<a href="https://envs.net/~lucidiot/qm.html">read original</a>
</div>
<div class="content"></div>
<details class="info"><summary>item information</summary>
timestamp: 1658594619
title: [~lucidiot's wiki] Compiled Qt translations
link: https://envs.net/~lucidiot/qm.html
content_type: 
id: https://envs.net/~lucidiot/qm.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[~lucidiot's wiki] Agora Nomic</summary>
<div class="links">
<a href="https://envs.net/~lucidiot/agoranomic.html">read original</a>
</div>
<div class="content"></div>
<details class="info"><summary>item information</summary>
timestamp: 1658594498
title: [~lucidiot's wiki] Agora Nomic
link: https://envs.net/~lucidiot/agoranomic.html
content_type: 
id: https://envs.net/~lucidiot/agoranomic.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[(lambda (x) (create x))] Simple Iptables Firewalls</summary>
<div class="links">
<a href="https://lambdacreate.com/posts/37">read original</a>
</div>
<div class="content"><h2>Simple Iptables Firewalls</h2>
<h3>It doesn't have to be scary &middot; July 23rd, 2022</h3>

<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>

<h3>What is it?</h3>

<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>

<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>

<h3>My Droid's Firewall</h3>

<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>

<div class="codeSnippet">
 <pre><code>
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#Route established and related traffic
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
#Allow SSH
-A INPUT -i wlan0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i wlan0 -p udp -m state --state NEW -m udp --dport 60000:61000 -j ACCEPT
#Allow Lapis Dev
-A INPUT -s 192.168.88.0/24 -i wlan0 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
#Allow fserv
-A INPUT -i wlan0 -p tcp -m state --state NEW -m tcp --dport 8090 -j ACCEPT
#Allow PNTP
-A INPUT -i wlan0 -p tcp -m state --state NEW -m tcp --dport 8091 -j ACCEPT
#Drop other unlisted input, drop forwards, accept output
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
COMMIT
 </code></pre>
</div>

<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>

<div class="codeSnippet">
 <pre><code>
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
 </code></pre>
</div>

<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>

<div class="codeSnippet">
 <pre><code>
#Route established and related traffic
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
#Drop other unlisted input, drop forwards, accept output
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
COMMIT
 </code></pre>
</div>

<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>

<ul>
  <li>Accept any traffic that is already ESTABLISHED or RELATED to existing traffic</li>
  <li>Accept any sort of input from our lo interface</li>
  <li>Drop any INPUT traffic that doesn't match accepted INPUT rules above</li>
  <li>Drop any FORWARD traffic that doesn't match accepted FORWARD rules above</li>
  <li>Accept ALL OUTPUT traffic coming from the system</li>
</ul>

<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>

<div class="codeSnippet">
 <pre><code>
#Allow SSH
-A INPUT -i wlan0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
 </code></pre>
</div>

<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>

<div class="codeSnippet">
 <pre><code>
#Allow MOSH
-A INPUT -i wlan0 -p udp -m state --state NEW -m udp --dport 60000:61000 -j ACCEPT
 </code></pre>
</div>

<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>

<div class="codeSnippet">
 <pre><code>
#Allow Lapis Dev
-A INPUT -s 192.168.88.0/24 -i wlan0 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
 </code></pre>
</div>

<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>

<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>

<div class="codeSnippet">
  <pre><code>
-A INPUT
Append to chain INPUT

-s 192.168.88.0/24
Any traffic with source IP of subnet 192.168.88.0/24

-i wlan0
Inbound from interface wlan0

-p tcp
That is TCP protocol traffic

-m state --state NEW
And is NEW traffic

-m tcp --dport 8080
Which is TCP traffic destined to port 8080

-j ACCEPT
If all of that checks out, jump to the ACCEPT chain, and push the traffic through.
  </code></pre>
</div>

<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>

<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>
<details class="info"><summary>item information</summary>
timestamp: 1658577600
title: [(lambda (x) (create x))] Simple Iptables Firewalls
link: https://lambdacreate.com/posts/37
content_type: html
id: https://lambdacreate.com/posts/37
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] Racket Summer #lang Party</summary>
<div class="links">
<a href="https://racket.discourse.group/t/summer-lang-party/1128">read original</a>
</div>
<div class="content"><p><a href="https://racket.discourse.group/t/summer-lang-party/1128">Racket Summer #lang Party</a></p>
                <p>[https] posted by elioat on July 22, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658454815
title: [linkbudz rss feed] Racket Summer #lang Party
link: https://racket.discourse.group/t/summer-lang-party/1128
content_type: html
id: elioat20220722015335
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[~mio_gemlog] Old Computer Challenge, July 10-17 2022</summary>
<div class="links">
<a href="gemini://tilde.town/~mio/log/2022-07-21-occ-2022.gmi">read original</a>
</div>
<div class="content"># Old Computer Challenge, July 10-17 2022

The 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.

The parameters:

* Device: Asus Chromebook C201
  * RAM: 512M of 2G, soft-limited via earlyoom
  * CPU: 1 of 4 cores, soft-limited via ulimit CPU time (1m for 100% CPU)
  * OS: Alpine Linux
* Internet time limit: 1 hour, manually logged
* Exemptions:
  * Messaging/calls over a mobile device
  * IRC messaging over SSH (Day 3 onwards)

My 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.

One 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.

Overall 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:

* What kind of internet experiences would I like to have?
* What, if anything, would I miss by computing with a predominantly terminal interface?
* Were there applications or activities I would have liked to do that were infeasible due to the resource limits?

The 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.

=> https://dataswamp.org/~solene/2021-07-07-old-computer-challenge.html Old Computer Challenge
=> http://lambdacreate.com/posts/26 wsinatra's blog post at lambdacreate
=> https://dataswamp.org/~solene/2022-07-01-oldcomputerchallenge-v2-rtc.html this year's challenge
=> https://github.com/nikolas-n/GNU-Linux-on-Asus-C201-Chromebook list of distros known working on the Asus C201 Chromebook


## Day 1

* Internet time: 45m
  * 20m - looked up resource limit settings, added system-wide fonts
  * 10m - downloaded podcasts from a mobile device
  * 10m - checked mail, prefetched RSS feeds, checked IRC
  * 5m - checked local fediverse
* RAM: 175M
* CPU: 0.30

Since 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:

* 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.
* 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.
* Display server and window manager (65M - 98M) - 98M with a few GUI apps open, dropped to 65M with only the terminal emulator open.
* 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.
* Password manager (60M) - replaceable with a CLI version, but closed for now when not in use.
* PDF viewer (58M) - to be supplemented with a CLI version when reading text-only files.
* 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.

Baseline RAM usage was in the range of 146M - 181M using mainly CLI applications:

* A multiplexer with a file manager, text editor, clients for Gemini, HTTPS web, RSS and Mastodon.
* A few utilities, e.g. SSH, NetworkManager, language input bus, process monitor.

Including 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.

CPU-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:

* 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.
* 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.

Typically 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.

Spent 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.

Couldn'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.

## Day 2

* Internet time: 1h
  * 5m - downloaded podcasts
  * 5m - checked mail, prefetched RSS feeds and local fediverse timeline
  * 50m - checked IRC
* RAM: 130M - 275M
* CPU: 0.2 - 1.0

Easily 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.

Would 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.

Another 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.

=> https://nightfall.city/x/republic.circumlunar.space/users/joneworlds/index.gmi Braxon
=> https://tilde.town/~dozens/podcast/ Tilde Whirl podcast
=> https://luckynewtgames.itch.io/whistling-wolf-cafe Whistling Wolf Café


## Day 3

* Internet time: 50m
  * 10m - downloaded podcasts, mail and RSS
  * 30m - looked into saving Gemini content, downloaded PDF viewers
  * 10m - looked up tabletop games licensed under CC-BY/CC-BY-SA
* RAM: 146M - 454M
* CPU: 0.20 - 0.83

Went 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.

For 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:

```
epub2txt file.epub - | less
epub2txt file.epub > file.txt
```

The 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:

* CorePDF - 40M to open both files. It sat between Zathura and Evince for number of features.
* 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.
* 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.
* 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.

Bookworm 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.

=> https://gemini.circumlunar.space/software/ Gemini software list
=> https://github.com/RangerMauve/gemini-fetch gemini-fetch
=> https://stackoverflow.com/questions/3570591/cli-pdf-viewer-for-linux using pdftotext


## Day 4

* Internet time: 35m
  * 10m - downloaded podcasts, mail, RSS and fediverse timeline
  * 25m - looked up tabletop games under open game licensing
* RAM: 153M - 538M
* CPU: 0.10 - 1.39

Used 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.

Another 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.

Online 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.

## Day 5

* Internet time: 55m
  * 10m - downloaded podcasts, mail, RSS and fediverse timeline
  * 10m - browsed links from the fediverse
  * 35m - looked up a few Gemini clients, browsed Gemini capsules
* RAM: 248M
* CPU: 0.17

On 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.

Read *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.

=> https://github.com/makeworld-the-better-one/amfora Amfora
=> http://bombadillo.colorfield.space/ Bombadillo
=> https://git.sr.ht/~julienxx/asuka Asuka


## Day 6

* Internet time: 1h
  * 5m - downloaded podcasts, mail, RSS and fediverse timeline
  * 35m - looked up licenses for tabletop game titles, checked a Gemini message board
  * 20m - browsed Gemini capsules
* RAM: 251M - 379M
* CPU: 0.22

Followed 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).

Also began reading *Starting Forth* with an interpreter open beside the book to try the examples in it.

=> https://geminiquickst.art/ geminiquickst.art
=> gemini://geddit.glv.one/ Gemini message board


## Day 7

* Internet time: 50m
  * 5m - downloaded podcasts, mail, RSS and fediverse timeline
  * 45m - looked up tabletop game licenses
* RAM: 257M - 573M
* CPU: 0.16 - 1.72

Exceeded 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.

## Day 8

* Internet time: 50m
  * 5m - downloaded podcasts, mail, RSS and fediverse timeline
  * 30m - searched for a tabbed Gemini browser, tested another CLI browser
  * 10m - fetched dependencies to compile a package
  * 5m - looked up command flag options
* RAM: 208M - 343M
* CPU: 0.27 - 1.16

A 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.

While 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:

```
class*: superclass does not provide an expected method for override
  override name: on-close-request
  class name: custom-tab-panel%
```

In 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:

```
raco setup: making: <pkgs>/compiler-lib/compiler/commands
raco setup:  in <pkgs>/compiler-lib/compiler/commands
raco setup:  in <pkgs>/compiler-lib/compiler/private
SIGSEGV MAPERR si_code 1 fault on addr 0x207
Aborted (core dumped)
```

Re-ran `abuild -r` and got a different error:

```
Linking current directory as a package
Compiling bytecode... done.
Building executable...find-exe: can't find GRacket executable for variant 3m
```

This issue seemed to be related to the racket compiler, not just Fafi. A workaround was to do:

```
raco pkg install
raco exe --3m main.rkt
```

This 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.

TIL 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.

With 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.

=> https://www.leocad.org/ LeoCAD
=> https://andregarzia.com/2020/08/fafi-browser-a-racket-based-gemini-client.html Fafi
=> https://todo.sr.ht/~soapdog/racket-gemini/7 racket-gemini issue #7
=> https://github.com/racket/racket/issues/3969 racket issue #3869
=> https://oakenboro.itch.io/a-day-at-the-crystal-market A Day at the Crystal Market


## Conclusion

To revisit the questions I had on day 1:

**What kind of internet experiences would I like to have?**

At this point in time, I look for experiences more focused on people and expression.

From 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.

Given 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.

**What, if anything, did I miss by computing with a predominantly terminal interface?**

The 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.

Related 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.

**Were there applications or activities I would have liked to do that were infeasible due to the resource limits?**

* 3D toy brick modelling, unless I could find another compatible open source application (CPU constraint)
* Playing some modern games (RAM constraint and lack of dedicated GPU)
* Compiling packages is still possible in some cases RAM permitting, but would take much longer than it currently does given weaker ARM processor
* 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)

Overall, 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>
<details class="info"><summary>item information</summary>
timestamp: 1658436720
title: [~mio_gemlog] Old Computer Challenge, July 10-17 2022
link: gemini://tilde.town/~mio/log/2022-07-21-occ-2022.gmi
content_type: plain
id: gemini://tilde.town/~mio/log/2022-07-21-occ-2022.gmi
author: mio
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] literate programming ish</summary>
<div class="links">
<a href="https://rtomayko.github.io/shocco/">read original</a>
</div>
<div class="content"><p><a href="https://rtomayko.github.io/shocco/">literate programming ish</a></p>
                <p>[https] posted by acdw on July 21, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658376499
title: [linkbudz rss feed] literate programming ish
link: https://rtomayko.github.io/shocco/
content_type: html
id: acdw20220721040819
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[blog __ ~ben] git diff-highlight</summary>
<div class="links">
<a href="https://tilde.team/~ben/blog/git-diff-highlight.html">read original</a>
</div>
<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>
<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>
<p>from its own documentation:</p>
<blockquote>
<p>[diff-highlight] post-processes the line-oriented diff, finds pairs of lines, and highlights the differening segments.</p>
</blockquote>
<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>
<pre><code>$ sudo make -C /usr/share/doc/git/contrib/diff-highlight
$ sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin/
</code></pre>
<p>now you can pipe git&rsquo;s diff output to to diff-highlight to get a better view of what actually changed.</p>
<pre><code>git diff | diff-highlight
</code></pre>
<p>optionally, you can configure git to use it all the time. add the following to your <code>~/.gitconfig</code>:</p>
<pre><code>[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
</code></pre>
<p>see the <a href="https://github.com/git/git/blob/master/contrib/diff-highlight/README">documentation</a> for more usage tips!</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658370190
title: [blog __ ~ben] git diff-highlight
link: https://tilde.team/~ben/blog/git-diff-highlight.html
content_type: html
id: https://tilde.team/~ben/blog/git-diff-highlight.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] How to setup aescbc secstore on plan9</summary>
<div class="links">
<a href="https://9p.io/wiki/plan9/Using_aescbc_to_store_factotum_keys/index.html">read original</a>
</div>
<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>
                <p>[https] posted by wsinatra on July 21, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658363172
title: [linkbudz rss feed] How to setup aescbc secstore on plan9
link: https://9p.io/wiki/plan9/Using_aescbc_to_store_factotum_keys/index.html
content_type: html
id: wsinatra20220721002612
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Jenga tower dice alternate for sttrpgs</summary>
<div class="links">
<a href="https://itch.io/jam/wretched-jam/topic/796498/dice-substitute-for-jenga-towers">read original</a>
</div>
<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>
                <p>[https] posted by wsinatra on July 21, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658363123
title: [linkbudz rss feed] Jenga tower dice alternate for sttrpgs
link: https://itch.io/jam/wretched-jam/topic/796498/dice-substitute-for-jenga-towers
content_type: html
id: wsinatra20220721002523
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] "Plan9 Desktop Guide!"</summary>
<div class="links">
<a href="https://pspodcasting.net/dan/blog/2019/plan9_desktop.html">read original</a>
</div>
<div class="content"><p><a href="https://pspodcasting.net/dan/blog/2019/plan9_desktop.html">"Plan9 Desktop Guide!"</a></p>
                <p>[https] posted by wsinatra on July 21, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658363062
title: [linkbudz rss feed] "Plan9 Desktop Guide!"
link: https://pspodcasting.net/dan/blog/2019/plan9_desktop.html
content_type: html
id: wsinatra20220721002422
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] HOT DRINKS</summary>
<div class="links">
<a href="https://www.youtube.com/watch?v=_ZXeFPpPJeI">read original</a>
</div>
<div class="content"><p><a href="https://www.youtube.com/watch?v=_ZXeFPpPJeI">HOT DRINKS</a></p>
                <p>[https] posted by acdw on July 20, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658345113
title: [linkbudz rss feed] HOT DRINKS
link: https://www.youtube.com/watch?v=_ZXeFPpPJeI
content_type: html
id: acdw20220720192513
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] gators lol</summary>
<div class="links">
<a href="https://twitter.com/GatorsDaily/status/1545215138332086274">read original</a>
</div>
<div class="content"><p><a href="https://twitter.com/GatorsDaily/status/1545215138332086274">gators lol</a></p>
                <p>[https] posted by acdw on July 19, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658259306
title: [linkbudz rss feed] gators lol
link: https://twitter.com/GatorsDaily/status/1545215138332086274
content_type: html
id: acdw20220719193506
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] paper airplane designs</summary>
<div class="links">
<a href="https://www.foldnfly.com/">read original</a>
</div>
<div class="content"><p><a href="https://www.foldnfly.com/">paper airplane designs</a></p>
                <p>[https] posted by dozens on July 19, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658198147
title: [linkbudz rss feed] paper airplane designs
link: https://www.foldnfly.com/
content_type: html
id: dozens20220719023547
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] nofetch, a new fetch tool by acdw</summary>
<div class="links">
<a href="https://git.acdw.net/nofetch/">read original</a>
</div>
<div class="content"><p><a href="https://git.acdw.net/nofetch/">nofetch, a new fetch tool by acdw</a></p>
                <p>[https] posted by acdw on July 18, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658180624
title: [linkbudz rss feed] nofetch, a new fetch tool by acdw
link: https://git.acdw.net/nofetch/
content_type: html
id: acdw20220718214344
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[p1k3::feed] monday, september 20, 2021</summary>
<div class="links">
<a href="https://p1k3.com/2021/9/20">read original</a>
</div>
<div class="content"><article><div class="entry"><h1>monday, september 20, 2021</h1>

<p>it's always the last day of the festival<br />
you're always packing to go home</p>



<p class="tags"><b>tags:</b> <a href="/topics/poem">topics/poem</a></p><p class="datestamp"><a href="/">p1k3</a> /
<a href="/2021/" title="2021">2021</a> /
<a href="/2021/9/" title="9">9</a> /
<a href="/2021/9/20/" title="20">20</a></p>
</div></article></div>
<details class="info"><summary>item information</summary>
timestamp: 1658176064
title: [p1k3::feed] monday, september 20, 2021
link: https://p1k3.com/2021/9/20
content_type: html
id: /2021/9/20
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] WordPerfect ... for UNIX !</summary>
<div class="links">
<a href="https://lock.cmpxchg8b.com/wordperfect.html">read original</a>
</div>
<div class="content"><p><a href="https://lock.cmpxchg8b.com/wordperfect.html">WordPerfect ... for UNIX !</a></p>
                <p>[https] posted by acdw on July 18, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1658173878
title: [linkbudz rss feed] WordPerfect ... for UNIX !
link: https://lock.cmpxchg8b.com/wordperfect.html
content_type: html
id: acdw20220718195118
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[(lambda (x) (create x))] Old School Computer Challenge 2022</summary>
<div class="links">
<a href="https://lambdacreate.com/posts/36">read original</a>
</div>
<div class="content"><h2>Old School Computer Challenge 2022</h2>
<h3>Revisiting the challenge a year later &middot; July 18th, 2022</h3>

<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>

<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>

<h3>The Setup</h3>

<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>

<div id="imgContainer">
  <img src="https://lambdacreate.com/static/images/36/day0.jpg" alt="Post install prep">
</div>

<h3>Day 0</h3>

<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>

<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>

<ul>
  <li><a href="https://fqa.9front.org/fqa4.html#4.1">9Front FQA Installation Guide</a></li>
  <li><a href="https://fqa.9front.org/fqa4.html#4.4">9Front FQA Encryption Guide</a></li>
  <li><a href="https://fqa.9front.org/fqa6.html#6.2.2.1">Adding firmware blobs to 9Front</a></li>
  <li><a href="https://9lab.org/plan9/thinkpad-t420s/">Decryption prompt & wifi init at boot</a></li>
  <li><a href="https://9p.io/wiki/plan9/Using_aescbc_to_store_factotum_keys/index.html">Configuring aescbc secstore</a></li>
  <li><a href="https://pspodcasting.net/dan/blog/2019/plan9_desktop.html">Plan9 Desktop Guide</a></li>
  <li><a href="http://nopenopenope.net/posts/audio">Plan9 Audio Info</a></li>
  <li><a href="http://nopenopenope.net/posts/opus">Patching 9Front kernel to support OPUS media</a></li>
</ul>

<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>

<div class="codeSnippet">
 <pre><code>
*nomp=1
*ncpu=1
*maxmem=512M
 </code></pre>
</div>

<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>

<div class="codeSnippet">
  <pre><code>
case terminal
	if(! webcookies >[2]/dev/null)
		webcookies -f /tmp/webcookies
	webfs
	plumber
	echo -n accelerated > '#m/mousectl'
	echo -n 'res 3' > '#m/mousectl'
	prompt=('term% ' '	')
	if(test -f $home/lib/fact.keys)
		auth/aescbc -d < $home/lib/fact.keys | read -m > /mnt/factotum/ctl
	initwifi
	fn term%{ $* }
	rio -i riostart
  </code></pre>
</div>

<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>

<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>

<div class="codeSnippet">
 <pre><code>
ssh username@tcp!192.168.88.101!20022
 </code></pre>
</div>

<h3>Day 1 - 2</h3>

<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>

<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>

<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>

<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>

<h3>Day 3</h3>

<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>

<div id="imgContainer">
  <img src="https://lambdacreate.com/static/images/36/airport.jpg" alt="Cranking out a blog post on iptables before my flight!"> 
</div>

<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>

<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>

<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>

<p>Oh by the way, Plan9 mile high club? Guarantee I'm the only person on this flight with such an eclectic rig.</p>

<div id="imgContainer">
  <img src="https://lambdacreate.com/static/images/36/in_transit.jpg" alt="Mile high 9 club!">
</div>

<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>

<h3>The Rest</h3>

<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>

<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>


<h3>Retrospect</h3>

<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>

<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>

<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>

<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>

<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>
<details class="info"><summary>item information</summary>
timestamp: 1658145600
title: [(lambda (x) (create x))] Old School Computer Challenge 2022
link: https://lambdacreate.com/posts/36
content_type: html
id: https://lambdacreate.com/posts/36
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[Dozens and Dragons] Thousand Year Old Vampire</summary>
<div class="links">
<a href="https://dozensanddragons.neocities.org/29.html">read original</a>
</div>
<div class="content">game play and review</div>
<details class="info"><summary>item information</summary>
timestamp: 1658030400
title: [Dozens and Dragons] Thousand Year Old Vampire
link: https://dozensanddragons.neocities.org/29.html
content_type: html
id: https://dozensanddragons.neocities.org/29.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[Brainshit] La version méconnue du texte bien connu, seconde partie</summary>
<div class="links">
<a href="https://brainshit.fr/read/307">read original</a>
</div>
<div class="content">Une expression régulière qui pourrait gagner un concours d'obfuscation.</div>
<details class="info"><summary>item information</summary>
timestamp: 1658008800
title: [Brainshit] La version méconnue du texte bien connu, seconde partie
link: https://brainshit.fr/read/307
content_type: html
id: https://brainshit.fr/read/307
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Informatique
</details>
</details>
<details>
<summary>[linkbudz rss feed] static site hosting from tildegit repos</summary>
<div class="links">
<a href="https://tildepages.org/">read original</a>
</div>
<div class="content"><p><a href="https://tildepages.org/">static site hosting from tildegit repos</a></p>
                <p>[https] posted by dozens on July 16, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657979669
title: [linkbudz rss feed] static site hosting from tildegit repos
link: https://tildepages.org/
content_type: html
id: dozens20220716135429
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] writing and running a bbs on a Macintosh plus</summary>
<div class="links">
<a href="https://jcs.org/2022/07/15/kludge">read original</a>
</div>
<div class="content"><p><a href="https://jcs.org/2022/07/15/kludge">writing and running a bbs on a Macintosh plus</a></p>
                <p>[https] posted by elioat on July 15, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657898458
title: [linkbudz rss feed] writing and running a bbs on a Macintosh plus
link: https://jcs.org/2022/07/15/kludge
content_type: html
id: elioat20220715152058
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[~lucidiot's wiki] Channel Definition Format</summary>
<div class="links">
<a href="https://envs.net/~lucidiot/cdf.html">read original</a>
</div>
<div class="content"></div>
<details class="info"><summary>item information</summary>
timestamp: 1657877322
title: [~lucidiot's wiki] Channel Definition Format
link: https://envs.net/~lucidiot/cdf.html
content_type: 
id: https://envs.net/~lucidiot/cdf.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[p1k3::feed] Friday, July 15, 2022</summary>
<div class="links">
<a href="https://p1k3.com/2022/7/15">read original</a>
</div>
<div class="content"><article><div class="entry"><h1>Friday, July 15, 2022</h1>

<p><a href="/2019/12/18">One from 2019</a>.</p>



<p class="datestamp"><a href="/">p1k3</a> /
<a href="/2022/" title="2022">2022</a> /
<a href="/2022/7/" title="7">7</a> /
<a href="/2022/7/15/" title="15">15</a></p>
</div></article></div>
<details class="info"><summary>item information</summary>
timestamp: 1657869250
title: [p1k3::feed] Friday, July 15, 2022
link: https://p1k3.com/2022/7/15
content_type: html
id: /2022/7/15
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[p1k3::feed] wednesday, december 18, 2019 - notes to a much younger self, to the extent that i can reconstruct him</summary>
<div class="links">
<a href="https://p1k3.com/2019/12/18">read original</a>
</div>
<div class="content"><article><div class="entry"><h1>wednesday, december 18, 2019</h1>

<h2>notes to a much younger self, to the extent that i can reconstruct him</h2>

<p><i>(posted wednesday, july 13, 2022)</i></p>

<p>i'll start by saying that it's<br />
better after a while<br />
for you at least</p>

<p>the dimensions of your<br />
life, they do expand</p>

<p>it's worse, too, and<br />
sometimes for years on end</p>

<p>there are things ahead<br />
that are going to destroy parts of you<br />
there are things ahead<br />
that are going to tear at the whole frame<br />
of the world you inhabit<br />
one of the things that life is<br />
is a series of losses<br />
that you never quite recover from</p>

<p>and in all that,<br />
you're going to fuck up a lot<br />
you'll learn most of what you learn<br />
the hard way<br />
you'll fail altogether<br />
to learn far too much</p>

<p>but all the same you'll make some friends,<br />
fall in love more than once<br />
and in more than one way<br />
wake up on some mornings<br />
to find yourself strong and able</p>

<p>maybe fear will always be with you, and<br />
far too much of it<br />
but the walls that arise in your mind<br />
between you and some imagined truer self<br />
they fall away with time</p>

<p>along, maybe, with the idea that<br />
there's any truer self to be found.</p>


<p class="tags"><b>tags:</b> <a href="/topics/poem">topics/poem</a></p><p class="datestamp"><a href="/">p1k3</a> /
<a href="/2019/" title="2019">2019</a> /
<a href="/2019/12/" title="12">12</a> /
<a href="/2019/12/18/" title="18">18</a></p>
</div></article></div>
<details class="info"><summary>item information</summary>
timestamp: 1657869250
title: [p1k3::feed] wednesday, december 18, 2019 - notes to a much younger self, to the extent that i can reconstruct him
link: https://p1k3.com/2019/12/18
content_type: html
id: /2019/12/18
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[#fridaypostcard] pipe dreams</summary>
<div class="links">
<a href="http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg">read original</a>
<a href="http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg">enclosure</a>
</div>
<div class="content">pipe dreams<br />~rogbeer</div>
<details class="info"><summary>item information</summary>
timestamp: 1657853842
title: [#fridaypostcard] pipe dreams
link: http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg
content_type: html
id: http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg
author: rogbeer@tilde.town (rogbeer)
enclosure: http://live.staticflickr.com/65535/52160774612_bc67c42811_c.jpg
category: 
</details>
</details>
<details>
<summary>[Dozens and Dragons] Shoes in the Dark</summary>
<div class="links">
<a href="https://dozensanddragons.neocities.org/28.html">read original</a>
</div>
<div class="content">a postcard-sized ttrpg</div>
<details class="info"><summary>item information</summary>
timestamp: 1657684800
title: [Dozens and Dragons] Shoes in the Dark
link: https://dozensanddragons.neocities.org/28.html
content_type: html
id: https://dozensanddragons.neocities.org/28.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] FizzBuzz in GNU make</summary>
<div class="links">
<a href="https://citizen428.net/blog/fizzbuzz-in-gnu-make/">read original</a>
</div>
<div class="content"><p><a href="https://citizen428.net/blog/fizzbuzz-in-gnu-make/">FizzBuzz in GNU make</a></p>
                <p>[https] posted by dozens on July 13, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657672683
title: [linkbudz rss feed] FizzBuzz in GNU make
link: https://citizen428.net/blog/fizzbuzz-in-gnu-make/
content_type: html
id: dozens20220713003803
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Tilde Whirl Tildeverse Podcast] episode 8</summary>
<div class="links">
<a href="https://tilde.town/~dozens/podcast/2022-07-12-episode-8-eli.html">read original</a>
<a href="https://archive.org/download/tilderwhirl-S01E01/tildewhirl-s01e08.mp3">enclosure</a>
</div>
<div class="content"><h2 id="notes">notes</h2>
<p>Check out eli:</p>
<ul>
<li><a href="https://eli.li/" class="uri">https://eli.li/</a></li>
<li><a href="https://dog.estate/@eli_oat" class="uri">https://dog.estate/@eli_oat</a></li>
</ul>
<p>This is a super fun show! We talk about making the internet quieter and weirder, and games, and all kinds of stuff.</p>
<p>Check it out!</p>
<!-- this episode's secret phrase is 'quiet and weird' //-->
<p>Your secret message for this episode is:</p>
<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>
<figure>
<img src="assets/img/tildefold.jpg" alt="tildefold" /><figcaption aria-hidden="true">tildefold</figcaption>
</figure>
<figure>
<img src="assets/img/cryptid.jpg" alt="cryptid" /><figcaption aria-hidden="true">cryptid</figcaption>
</figure>
<h2 id="segments">segments</h2>
<ul>
<li>food and wine</li>
<li>letters from our listeners
<ul>
<li><a href="https://piepi.kindrobot.ca/" class="uri">https://piepi.kindrobot.ca/</a></li>
<li><a href="https://journal.miso.town/" class="uri">https://journal.miso.town/</a></li>
<li><a href="https://kiosk.nightfall.city/" class="uri">https://kiosk.nightfall.city/</a></li>
<li><a href="https://smol.pub/" class="uri">https://smol.pub/</a></li>
</ul></li>
<li>poetry corner
<ul>
<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>
<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>
<li><a href="https://en.wikipedia.org/wiki/Cactus_cat" class="uri">https://en.wikipedia.org/wiki/Cactus_cat</a></li>
</ul></li>
<li>see you in the funny papers</li>
<li>story corner – joneworlds chapters 15 - 20
<ul>
<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>
</ul></li>
<li>hey gamers! – Let’s play Lisergia / Abenteuerspiel!
<ul>
<li><a href="https://terriblybeautiful.itch.io/abenteuerspiel" class="uri">https://terriblybeautiful.itch.io/abenteuerspiel</a></li>
<li><a href="https://capacle.itch.io/lisergia" class="uri">https://capacle.itch.io/lisergia</a></li>
</ul></li>
</ul>
<h2 id="links">links</h2>
<p>Stuff we talked about on the show</p>
<ul>
<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>
<li>my fennel ripoff of tiny pomodoro timer: <a href="https://tildegit.org/dozens/pomo" class="uri">https://tildegit.org/dozens/pomo</a></li>
<li>eli on breadpunk – <a href="https://breadpunk.club/~yeast/" class="uri">https://breadpunk.club/~yeast/</a></li>
<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>
<li>Super Vegan – <a href="https://supervegan.neocities.org/" class="uri">https://supervegan.neocities.org/</a></li>
<li>Retro Forth – <a href="http://retroforth.org/" class="uri">http://retroforth.org/</a></li>
<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>
<li><a href="https://search.marginalia.nu/" class="uri">https://search.marginalia.nu/</a></li>
<li><a href="https://wiby.me/" class="uri">https://wiby.me/</a></li>
<li><a href="https://indieweb.org/" class="uri">https://indieweb.org/</a></li>
<li><a href="https://miniflux.app/" class="uri">https://miniflux.app/</a></li>
<li><a href="https://codemadness.org/sfeed-simple-feed-parser.html" class="uri">https://codemadness.org/sfeed-simple-feed-parser.html</a></li>
<li><a href="https://txt.eli.li/pb/rss/feeds.html" class="uri">https://txt.eli.li/pb/rss/feeds.html</a></li>
<li><a href="https://rss.tildeverse.org" class="uri">https://rss.tildeverse.org</a></li>
<li><a href="https://github.com/jmdejong/daily_adventure" class="uri">https://github.com/jmdejong/daily_adventure</a></li>
<li><a href="http://tilde.town/~eli_oat/map/map.txt" class="uri">http://tilde.town/~eli_oat/map/map.txt</a></li>
<li>angband – <a href="https://rephial.org/" class="uri">https://rephial.org/</a></li>
<li>miscroscope – <a href="https://www.lamemage.com/microscope/" class="uri">https://www.lamemage.com/microscope/</a></li>
<li>the quiet year – <a href="https://buriedwithoutceremony.com/the-quiet-year" class="uri">https://buriedwithoutceremony.com/the-quiet-year</a></li>
<li>Project Xanadu! – <a href="https://en.wikipedia.org/wiki/Project_Xanadu" class="uri">https://en.wikipedia.org/wiki/Project_Xanadu</a></li>
<li>csvkit – <a href="https://csvkit.readthedocs.io/en/latest/index.html" class="uri">https://csvkit.readthedocs.io/en/latest/index.html</a></li>
</ul></div>
<details class="info"><summary>item information</summary>
timestamp: 1657653132
title: [Tilde Whirl Tildeverse Podcast] episode 8
link: https://tilde.town/~dozens/podcast/2022-07-12-episode-8-eli.html
content_type: html
id: Thu, 12 July 2022 12:12:12 -0700
author: 
enclosure: https://archive.org/download/tilderwhirl-S01E01/tildewhirl-s01e08.mp3
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] james webb first images</summary>
<div class="links">
<a href="https://www.nasa.gov/webbfirstimages">read original</a>
</div>
<div class="content"><p><a href="https://www.nasa.gov/webbfirstimages">james webb first images</a></p>
                <p>[https] posted by acdw on July 12, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657648512
title: [linkbudz rss feed] james webb first images
link: https://www.nasa.gov/webbfirstimages
content_type: html
id: acdw20220712175512
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] relative vs absolute urls in rss content hell</summary>
<div class="links">
<a href="https://www.jessesquires.com/blog/2021/06/06/rss-feeds-jekyll-and-absolute-versus-relative-urls/">read original</a>
</div>
<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>
                <p>[https] posted by m455 on July 12, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657592772
title: [linkbudz rss feed] relative vs absolute urls in rss content hell
link: https://www.jessesquires.com/blog/2021/06/06/rss-feeds-jekyll-and-absolute-versus-relative-urls/
content_type: html
id: m45520220712022612
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[~lucidiot's wiki] books</summary>
<div class="links">
<a href="https://envs.net/~lucidiot/books.html">read original</a>
</div>
<div class="content"></div>
<details class="info"><summary>item information</summary>
timestamp: 1657530341
title: [~lucidiot's wiki] books
link: https://envs.net/~lucidiot/books.html
content_type: 
id: https://envs.net/~lucidiot/books.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] web-based system administration for Unix</summary>
<div class="links">
<a href="https://www.webmin.com/demo.html">read original</a>
</div>
<div class="content"><p><a href="https://www.webmin.com/demo.html">web-based system administration for Unix</a></p>
                <p>[https] posted by m455 on July 11, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657515744
title: [linkbudz rss feed] web-based system administration for Unix
link: https://www.webmin.com/demo.html
content_type: html
id: m45520220711050224
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] stylish text generator (all of the early msn messenger nickname ascii art you need)</summary>
<div class="links">
<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>
</div>
<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>
                <p>[https] posted by m455 on July 11, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657511814
title: [linkbudz rss feed] stylish text generator (all of the early msn messenger nickname ascii art you need)
link: https://www.webestools.com/stylish-text-generator-nickname-message-msn-facebook-windows-live-messenger-text-accents-effect-ascii-text.html
content_type: html
id: m45520220711035654
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Brainshit] La version méconnue du texte bien connu, première partie</summary>
<div class="links">
<a href="https://brainshit.fr/read/306">read original</a>
</div>
<div class="content">Le grand retour du terrible standard ISO.</div>
<details class="info"><summary>item information</summary>
timestamp: 1657490400
title: [Brainshit] La version méconnue du texte bien connu, première partie
link: https://brainshit.fr/read/306
content_type: html
id: https://brainshit.fr/read/306
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Informatique
</details>
</details>
<details>
<summary>[ Oatmeal] </summary>
<div class="links">
<a href="https://eli.li/2022/07/10/%F0%9F%91%8B-oh-hai">read original</a>
</div>
<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>
<p><span class="small-caps">&#x1F44B;</span> Oh hai!</p>
<p>I was interviewed on a podcast!</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657482512
title: [ Oatmeal] 
link: https://eli.li/2022/07/10/%F0%9F%91%8B-oh-hai
content_type: html
id: https://eli.li/2022/07/10/%F0%9F%91%8B-oh-hai
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[ Oatmeal] </summary>
<div class="links">
<a href="https://eli.li/2022/07/9/2022-07-09-11-48-32">read original</a>
</div>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1657381712
title: [ Oatmeal] 
link: https://eli.li/2022/07/9/2022-07-09-11-48-32
content_type: html
id: https://eli.li/2022/07/9/2022-07-09-11-48-32
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[ Oatmeal] </summary>
<div class="links">
<a href="https://eli.li/2022/07/9/this-is-also-something-people-keep-getting-wrong-about-markdown-as-originally-presented">read original</a>
</div>
<div class="content"><p>In reply to: <a href="https://idiomdrottning.org/a-simple-mess">A simple mess</a></p>
<blockquote>
<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>
</blockquote>
<p>Yes yes yes yes yes yes!</p>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1657370538
title: [ Oatmeal] 
link: https://eli.li/2022/07/9/this-is-also-something-people-keep-getting-wrong-about-markdown-as-originally-presented
content_type: html
id: https://eli.li/2022/07/9/this-is-also-something-people-keep-getting-wrong-about-markdown-as-originally-presented
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] Barrett's Privateers</summary>
<div class="links">
<a href="https://www.youtube.com/watch?v=ZIwzRkjn86w">read original</a>
</div>
<div class="content"><p><a href="https://www.youtube.com/watch?v=ZIwzRkjn86w">Barrett's Privateers</a></p>
                <p>[https] posted by acdw on July 08, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657313546
title: [linkbudz rss feed] Barrett's Privateers
link: https://www.youtube.com/watch?v=ZIwzRkjn86w
content_type: html
id: acdw20220708205226
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[#fridaypostcard] "GAME" designed by Leo Kupper</summary>
<div class="links">
<a href="http://ttm.sh/w8c.jpg">read original</a>
<a href="http://ttm.sh/w8c.jpg">enclosure</a>
</div>
<div class="content">"GAME" designed by Leo Kupper<br />~flowercorpse</div>
<details class="info"><summary>item information</summary>
timestamp: 1657311695
title: [#fridaypostcard] "GAME" designed by Leo Kupper
link: http://ttm.sh/w8c.jpg
content_type: html
id: http://ttm.sh/w8c.jpg
author: flowercorpse@tilde.town (flowercorpse)
enclosure: http://ttm.sh/w8c.jpg
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] SEA SHANTY RADIOOOOOO</summary>
<div class="links">
<a href="https://www.smshantyradio.com/">read original</a>
</div>
<div class="content"><p><a href="https://www.smshantyradio.com/">SEA SHANTY RADIOOOOOO</a></p>
                <p>[https] posted by acdw on July 08, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657308844
title: [linkbudz rss feed] SEA SHANTY RADIOOOOOO
link: https://www.smshantyradio.com/
content_type: html
id: acdw20220708193404
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] How to build a web app with Clack/Lack (Common Lisp)</summary>
<div class="links">
<a href="https://fukamachi.hashnode.dev/how-to-build-a-web-app-with-clack-and-lack-1">read original</a>
</div>
<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>
                <p>[https] posted by elioat on July 08, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657287327
title: [linkbudz rss feed] How to build a web app with Clack/Lack (Common Lisp)
link: https://fukamachi.hashnode.dev/how-to-build-a-web-app-with-clack-and-lack-1
content_type: html
id: elioat20220708133527
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Apparently, a new search engine disgned with devs in mind.</summary>
<div class="links">
<a href="https://beta.sayhello.so/">read original</a>
</div>
<div class="content"><p><a href="https://beta.sayhello.so/">Apparently, a new search engine disgned with devs in mind.</a></p>
                <p>[https] posted by marcus on July 07, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657219689
title: [linkbudz rss feed] Apparently, a new search engine disgned with devs in mind.
link: https://beta.sayhello.so/
content_type: html
id: marcus20220707184809
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] a blog platform for hackers</summary>
<div class="links">
<a href="https://prose.sh/">read original</a>
</div>
<div class="content"><p><a href="https://prose.sh/">a blog platform for hackers</a></p>
                <p>[https] posted by acdw on July 07, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657217758
title: [linkbudz rss feed] a blog platform for hackers
link: https://prose.sh/
content_type: html
id: acdw20220707181558
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] a scheme primer</summary>
<div class="links">
<a href="https://spritely.institute/static/papers/scheme-primer.html">read original</a>
</div>
<div class="content"><p><a href="https://spritely.institute/static/papers/scheme-primer.html">a scheme primer</a></p>
                <p>[https] posted by mio on July 07, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657217609
title: [linkbudz rss feed] a scheme primer
link: https://spritely.institute/static/papers/scheme-primer.html
content_type: html
id: mio20220707181329
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] fraidycat: like RSS but more</summary>
<div class="links">
<a href="https://github.com/kickscondor/fraidycat">read original</a>
</div>
<div class="content"><p><a href="https://github.com/kickscondor/fraidycat">fraidycat: like RSS but more</a></p>
                <p>[https] posted by dozens on July 07, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657203690
title: [linkbudz rss feed] fraidycat: like RSS but more
link: https://github.com/kickscondor/fraidycat
content_type: html
id: dozens20220707142130
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Dozens and Dragons] magic words</summary>
<div class="links">
<a href="https://dozensanddragons.neocities.org/27.html">read original</a>
</div>
<div class="content">bibliomantic generation of spells and grimories</div>
<details class="info"><summary>item information</summary>
timestamp: 1657166400
title: [Dozens and Dragons] magic words
link: https://dozensanddragons.neocities.org/27.html
content_type: html
id: https://dozensanddragons.neocities.org/27.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[lipu pi jan Niko] some writing thoughts, and probably leaving gemini</summary>
<div class="links">
<a href="https://tilde.town/~nihilazo/log/onwriting.html">read original</a>
</div>
<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.
A 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>
<details class="info"><summary>item information</summary>
timestamp: 1657152000
title: [lipu pi jan Niko] some writing thoughts, and probably leaving gemini
link: https://tilde.town/~nihilazo/log/onwriting.html
content_type: html
id: https://tilde.town/~nihilazo/log/onwriting.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[Brainshit] Bada Bing</summary>
<div class="links">
<a href="https://brainshit.fr/read/310">read original</a>
</div>
<div class="content">Un test de burger en pleine fête de la musique.</div>
<details class="info"><summary>item information</summary>
timestamp: 1657144800
title: [Brainshit] Bada Bing
link: https://brainshit.fr/read/310
content_type: html
id: https://brainshit.fr/read/310
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Gastronomie
</details>
</details>
<details>
<summary>[bakersdozen gemlog] Thoughts On The Fourth Of July In The Year 2022</summary>
<div class="links">
<a href="gemini://breadpunk.club/~bakersdozen/gemlog/13.gmi">read original</a>
</div>
<div class="content"></div>
<details class="info"><summary>item information</summary>
timestamp: 1657129342
title: [bakersdozen gemlog] Thoughts On The Fourth Of July In The Year 2022
link: gemini://breadpunk.club/~bakersdozen/gemlog/13.gmi
content_type: 
id: gemini://breadpunk.club/~bakersdozen/gemlog/13.gmi
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] has this been posted yet?</summary>
<div class="links">
<a href="https://neal.fun/absurd-trolley-problems/">read original</a>
</div>
<div class="content"><p><a href="https://neal.fun/absurd-trolley-problems/">has this been posted yet?</a></p>
                <p>[https] posted by acdw on July 06, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657118195
title: [linkbudz rss feed] has this been posted yet?
link: https://neal.fun/absurd-trolley-problems/
content_type: html
id: acdw20220706143635
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] learn a language with forth!</summary>
<div class="links">
<a href="https://zserge.com/posts/too-many-forths/">read original</a>
</div>
<div class="content"><p><a href="https://zserge.com/posts/too-many-forths/">learn a language with forth!</a></p>
                <p>[https] posted by acdw on July 06, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657117491
title: [linkbudz rss feed] learn a language with forth!
link: https://zserge.com/posts/too-many-forths/
content_type: html
id: acdw20220706142451
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[ Oatmeal] Lamination for a lost explorer</summary>
<div class="links">
<a href="https://eli.li/2022/07/6/lamination-for-a-lost-explorer">read original</a>
</div>
<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>
<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>
<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>
<p>Perhaps Kicks got lost in the web&#x2009;&#x2014;&#x2009;out there still?</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657116113
title: [ Oatmeal] Lamination for a lost explorer
link: https://eli.li/2022/07/6/lamination-for-a-lost-explorer
content_type: html
id: https://eli.li/2022/07/6/lamination-for-a-lost-explorer
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[blog __ ~ben] sqlite3 for wordpress</summary>
<div class="links">
<a href="https://tilde.team/~ben/blog/sqlite3-for-wordpress.html">read original</a>
</div>
<div class="content"><h1 id="sqlite3-for-wordpress">sqlite3 for wordpress</h1>
<p>running wordpress with sqlite is quick, easy, and can be much less
system administration load as it eliminates the need for a separate
database process running.</p>
<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
drop-in</a>.</p>
<h2 id="set-it-up">set it up</h2>
<ul>
<li>download <a href="https://wordpress.org/latest.tar.gz">https://wordpress.org/latest.tar.gz</a></li>
<li>extract it into your webroot (something like <code>/var/www</code>)</li>
<li>download
<a href="https://github.com/aaemnnosttv/wp-sqlite-db/raw/master/src/db.php">db.php</a>
and add it to <code>/var/www/yoursite/wp-content/</code></li>
<li>follow the normal setup instructions but skip the database fields</li>
<li>profit????</li>
</ul>
<h2 id="nginx-config">nginx config</h2>
<p>adjust configs as needed. this is the live config for this site
wptest.bhh.sh.</p>
<p>snippets/ssl/bhh.sh just includes the block from certbot that points to
the right cert and key.</p>
<pre><code>server {
        listen 80;
        server_name wptest.bhh.sh;
        return 307 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        server_name wptest.bhh.sh;
        include snippets/ssl/bhh.sh;
        index index.php index.html;
        root /var/www/wptest.bhh.sh;
        client_max_body_size 100M;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~* wp-config.php {
                deny all;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }

        location ~ /\.ht {
                deny all;
        }
}
</code></pre></div>
<details class="info"><summary>item information</summary>
timestamp: 1657115580
title: [blog __ ~ben] sqlite3 for wordpress
link: https://tilde.team/~ben/blog/sqlite3-for-wordpress.html
content_type: html
id: https://tilde.team/~ben/blog/sqlite3-for-wordpress.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] grug brain developer</summary>
<div class="links">
<a href="https://grugbrain.dev">read original</a>
</div>
<div class="content"><p><a href="https://grugbrain.dev">grug brain developer</a></p>
                <p>[https] posted by elioat on July 06, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657114822
title: [linkbudz rss feed] grug brain developer
link: https://grugbrain.dev
content_type: html
id: elioat20220706134022
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] html journal format</summary>
<div class="links">
<a href="https://journal.miso.town/">read original</a>
</div>
<div class="content"><p><a href="https://journal.miso.town/">html journal format</a></p>
                <p>[https] posted by dozens on July 05, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657040286
title: [linkbudz rss feed] html journal format
link: https://journal.miso.town/
content_type: html
id: dozens20220705165806
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Genealogy of ELIZA programs</summary>
<div class="links">
<a href="https://sites.google.com/view/elizagen-org/the-original-eliza">read original</a>
</div>
<div class="content"><p><a href="https://sites.google.com/view/elizagen-org/the-original-eliza">Genealogy of ELIZA programs</a></p>
                <p>[https] posted by elioat on July 05, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1657027698
title: [linkbudz rss feed] Genealogy of ELIZA programs
link: https://sites.google.com/view/elizagen-org/the-original-eliza
content_type: html
id: elioat20220705132818
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[(lambda (x) (create x))] Truly using Lapis</summary>
<div class="links">
<a href="https://lambdacreate.com/posts/35">read original</a>
</div>
<div class="content"><h2>Truly using Lapis</h2>
<h3>Rebuilding LambdaCreate's Internals &middot; July 5th, 2022</h3>

<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>

<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>

<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>

<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>

<h2>Redesigning the Site</h2>

<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>

<h3>Routes in Lapis</h3>

<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>

<div class="codeSnippet">
  <pre><code>
app:match("index", "/", function(self)
			 --Table of last 10 blog posts
			 self.archive = lcpost.getLast(10)
			 --The last published post
			 self.latest = lcpost.getPost(lcpost.getLatest())
			 --Last update of published post
			 self.timestamp = lcpost.getUpdated(lcpost.getLatest())
			 self.shows = lcpod.getShows()
			 --Table of projects
			 self.projects = lcproj.getArchive()
			 self.internal_layout = "index"
			 return { render = true, layout = "layout" }
end)
  </code></pre>
</div>

<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>

<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>

<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>

<div class="codeSnippet">
  <pre><code>
<section class='content'>
  < render("views." .. internal_layout) > 
</section>
  </code></pre>
</div>

<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>

<div class="codeSnippet">
  <pre><code>
(div class="row")
  (div class="leftcolumn")
	(div class="post")
      (% render("views.posts." .. latest.id) %)
    (/div)
  (/div)
  (div class="rightcolumn")
    (div class="card")
      (h3)Bio(/h3)
      (% render("views.about") %)
    (/div)
    (div class="card")
	  (h3)Recent Posts:(/h3)
	  (ul class="list")
		(% for k, v in pairs(archive) do %)
		(% local route = "https://lambdacreate.com/posts/" .. v.id %)
		(li)(a href="(%= build_url(route, { key = v.id }) %)")(%= v.title )(/)(/li)
		(% end %)
	  (/ul)
	  (h3)(a href="(%= build_url('archive/post') )")Post Archive(/a)(/h3)
    (/div)
	(% render("views.shows") %)
	(% render("views.dev") %)
  (/div)
(/div)
  </code></pre>
</div>

<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>

<h3>Post/Podcast Generation</h3>

<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>

<div class="codeSnippet">
  <pre><code>
--Return a table of the last X records
function lcpost.getLast(num)
   local db = sql.open("lc.db")
   local stmt = db:prepare("SELECT id,title FROM posts ORDER BY id DESC LIMIT :limit")
   local info = {}
   stmt:bind_names({limit = num})
   for row in stmt:nrows() do
	  table.insert(info, row)
   end
   stmt:finalize()
   return info
end
  </code></pre>
</div>

<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>

<div class="codeSnippet">
  <pre><code>
{
 { id = 35, title = "Truly using Lapis"},
 { id = 34, title = "The Infamous Droid"},
}	
  </code></pre>
</div>

<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>

<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>

<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>

<div class="codeSnippet">
  <pre><code>
--Blog posts/Podcast episode archive lists
app:match("/archive/:type(/:show)", function(self)
			 if self.params.type == "post" then
				--Table of all posts
				self.archive = lcpost.getArchive()
				self.timestamp = {}
				self.internal_layout = "post_archive"
				return { render = true, layout = "layout" }
			 elseif self.params.type == "podcast" then
				--Specified show information
				self.show = lcpod.getShow(self.params.show)
				--Table of all episodes in the show
				self.archive = lcpod.getArchive(self.params.show)
				self.timestamp = {}
				self.internal_layout = "podcast_archive"
				return { render = true, layout = "layout" }
			 else
				--Redirect to e404 if the archive type doesn't exist
				return { redirect_to = self:url_for("404") }
			 end
end)
  </code></pre>
</div>

<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>

<ul>
  <li><a href="https://lambdacreate.com/archive/post">https://lambdacreate.com/archive/post</a></li>
  <li><a href="https://lambdacreate.com/archive/podcast/droidcast">https://lambdacreate.com/archive/podcast/droidcast</a></li>
  <li><a href="https://lambdacreate.com/archive/podcast/lambdacast">https://lambdacreate.com/archive/podcast/lambdacast</a></li>
</ul>

<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>

<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>

<p>More simply, you can visualize it like this.</p>

<div class="codeSnippet">
  <pre><code>
https://lambdacreate.com/archive/podcast/droidcast
-> self.params = { route = "archive", type = "podcast", show = "droidcast" }
  </code></pre>
</div>

<h3>Building a Paste Service</h3>

<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>

<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>

<div class="codeSnippet">
  <pre><code>
--Paste Service
--curl -v -F key="key" -F upload=@argtest.fnl https://lambdacreate.com/paste
app:match("paste", "/paste(/:file)", respond_to({
				GET = function(self)
				   --This GET allows us to share the same name space as our POST
				   --static/paste      - nginx:nginx 0755
				   --static/paste/file - nginx:nginx 0640
				   return
				end,
				POST = function(self)
				   --Check authorization of POST
				   local authn = lcauth.validate(self.params.key)
				   if authn == true then
					  --Upload a file to paste directory
					  local tmp = lcpaste.save(self.params.upload.content, self.params.upload.filename)
					  --Return the paste url
					  return {
						 render = false,
						 layout = false,
						 self:build_url() .. "/paste/" .. tmp .. "\
"
					  }
				   else
					  --Return access denied
					  return {
						 render = false,
						 layout = false,
						 "Access Denied\
"
					  }
				   end
				end,
}))
  </code></pre>
</div>

<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>

<div id="imgContainer">
  <img src="https://lambdacreate.com/static/images/35/lcpaste.png" alt="The paste function flow.">
</div>

<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>

<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>

<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>

<h3>Fin</h3>
<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>

<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>
<details class="info"><summary>item information</summary>
timestamp: 1657022400
title: [(lambda (x) (create x))] Truly using Lapis
link: https://lambdacreate.com/posts/35
content_type: html
id: https://lambdacreate.com/posts/35
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] a Perl/CGI program that lets you access IRC from a web browser</summary>
<div class="links">
<a href="http://cgiirc.org/">read original</a>
</div>
<div class="content"><p><a href="http://cgiirc.org/">a Perl/CGI program that lets you access IRC from a web browser</a></p>
                <p>[http] posted by m455 on July 05, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656986746
title: [linkbudz rss feed] a Perl/CGI program that lets you access IRC from a web browser
link: http://cgiirc.org/
content_type: html
id: m45520220705020546
author: 
enclosure: 
category: http
</details>
</details>
<details>
<summary>[linkbudz rss feed] reference for escaping characters in xml documents</summary>
<div class="links">
<a href="https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents">read original</a>
</div>
<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>
                <p>[https] posted by m455 on July 05, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656979687
title: [linkbudz rss feed] reference for escaping characters in xml documents
link: https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents
content_type: html
id: m45520220705000807
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Brainshit] Extended Well-Known Text</summary>
<div class="links">
<a href="https://brainshit.fr/read/302">read original</a>
</div>
<div class="content">Je croyais en avoir fini avec mes expressions régulières, mais ce serait trop facile.</div>
<details class="info"><summary>item information</summary>
timestamp: 1656972000
title: [Brainshit] Extended Well-Known Text
link: https://brainshit.fr/read/302
content_type: html
id: https://brainshit.fr/read/302
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Informatique
</details>
</details>
<details>
<summary>[linkbudz rss feed] Harder Drives (includes how to use ping has a block storage device)</summary>
<div class="links">
<a href="https://www.youtube.com/watch?v=JcJSW7Rprio">read original</a>
</div>
<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>
                <p>[https] posted by kindrobot on July 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656868499
title: [linkbudz rss feed] Harder Drives (includes how to use ping has a block storage device)
link: https://www.youtube.com/watch?v=JcJSW7Rprio
content_type: html
id: kindrobot20220703171459
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] rss</summary>
<div class="links">
<a href="https://feddit.de/pictrs/image/9cf64a24-87ec-4f3a-b5f1-6dabf0e56d63.jpeg">read original</a>
</div>
<div class="content"><p><a href="https://feddit.de/pictrs/image/9cf64a24-87ec-4f3a-b5f1-6dabf0e56d63.jpeg">rss</a></p>
                <p>[https] posted by dozens on July 03, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656806726
title: [linkbudz rss feed] rss
link: https://feddit.de/pictrs/image/9cf64a24-87ec-4f3a-b5f1-6dabf0e56d63.jpeg
content_type: html
id: dozens20220703000526
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[ Oatmeal] </summary>
<div class="links">
<a href="https://eli.li/2022/07/2/2022-07-02-10-42-53">read original</a>
</div>
<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>
<p><span class="small-caps">&#x1F331;&#x1F99B;</span></p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656772973
title: [ Oatmeal] 
link: https://eli.li/2022/07/2/2022-07-02-10-42-53
content_type: html
id: https://eli.li/2022/07/2/2022-07-02-10-42-53
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] linkbud went on too many dates</summary>
<div class="links">
<a href="https://git.m455.casa/linkbud/commit/?id=93a9b61963f6369fac04c765f98c635f9a0aecf6">read original</a>
</div>
<div class="content"><p><a href="https://git.m455.casa/linkbud/commit/?id=93a9b61963f6369fac04c765f98c635f9a0aecf6">linkbud went on too many dates</a></p>
                <p>[https] posted by m455 on July 01, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656693166
title: [linkbudz rss feed] linkbud went on too many dates
link: https://git.m455.casa/linkbud/commit/?id=93a9b61963f6369fac04c765f98c635f9a0aecf6
content_type: html
id: m45520220701163246
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] I'm never not going to post this</summary>
<div class="links">
<a href="https://www.youtube.com/watch?v=rv4wf7bzfFE">read original</a>
</div>
<div class="content"><p><a href="https://www.youtube.com/watch?v=rv4wf7bzfFE">I'm never not going to post this</a></p>
                <p>[https] posted by acdw on June 29, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656537802
title: [linkbudz rss feed] I'm never not going to post this
link: https://www.youtube.com/watch?v=rv4wf7bzfFE
content_type: html
id: acdw20220629212322
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Databases and like, complicatedness</summary>
<div class="links">
<a href="https://www.twilio.com/blog/sqlite-postgresql-complicated">read original</a>
</div>
<div class="content"><p><a href="https://www.twilio.com/blog/sqlite-postgresql-complicated">Databases and like, complicatedness</a></p>
                <p>[https] posted by acdw on June 29, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656535907
title: [linkbudz rss feed] Databases and like, complicatedness
link: https://www.twilio.com/blog/sqlite-postgresql-complicated
content_type: html
id: acdw20220629205147
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[Dozens and Dragons] through the white forest to the house of the fae lord</summary>
<div class="links">
<a href="https://dozensanddragons.neocities.org/26.html">read original</a>
</div>
<div class="content">weird stuff happening in surreal places</div>
<details class="info"><summary>item information</summary>
timestamp: 1656388800
title: [Dozens and Dragons] through the white forest to the house of the fae lord
link: https://dozensanddragons.neocities.org/26.html
content_type: html
id: https://dozensanddragons.neocities.org/26.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[p1k3::feed] Monday, June 27, 2022 - aphoristic noodling</summary>
<div class="links">
<a href="https://p1k3.com/2022/6/27">read original</a>
</div>
<div class="content"><article><div class="entry"><h1>Monday, June 27, 2022</h1>

<h2>aphoristic noodling</h2>

<p>I read <a href="https://www.baldurbjarnason.com/2021/100-things-every-web-developer-should-know/"
title="136 facts every web dev should know before they burn out and turn to landscape painting or nude modelling">this
post by Baldur Bjarnason</a>, listing "Everything I’ve learned about web development in the almost twenty-five years
I’ve been practising", and <a href="https://www.baldurbjarnason.com/2021/the-curious-case-of-the-crashing-conic-gradient/">this
followup</a>, which says:

<blockquote>

  <p>Some of the aphorisms ended up not-so-pithy, but it was overall a fun little
  experiment that I recommend: note down everything relevant about the craft that
  you can think of over the space of a week.</p>

</blockquote>

<p>I thought about this, and then I thought: Ok, what exactly is my craft?  I
do computer shit.  So I started a list about that, challenging myself to be
<i>descriptive</i> about things and not veer too far into pure advice.</p>

<p>A year or so passed, and I noticed this post was still sitting in my "work
in progress" directory.  I tried picking it back up and noticed how much
overlap it would have with other posts like these:</p>

<ul>
  <li>2013: <a href="/2013/12/4/">on software</a></li>
  <li>2014: <a href="/2014/9/6/">language things</a></li>
  <li>2015: <a href="/2015/5/5/">YOUR CODE IS TOO COMPLICATED</a>
  <li>2019: <a href="/2019/10/5" title="sfe">this entry on the experience of working at SparkFun</a></li>
  <li>2021: <a href="/2021/7/21/">rules</a></li>
</ul>

<p>This style of writing is basically catnip to people like me, whether it's of
much use to anyone else or not.  This post ultimately felt like a dead end,
because instead of a blog post, it really wants to be some long document where
I collect all sorts of aphorisms, pithy quotes, eponymous laws, and so forth
about technical work and maybe just work generally.  Maybe I'll start that
document one of these days.</p>

<p class="centerpiece"> ✯ </p>

<p>Anyway, that very partial and uneven list:</p>

<ol>

  <li>Caching is hard to think about and breaks often.

  <li>Cleverness in code is generally a sign of danger.

  <li>Business ruins everything.

  <li>Some forms of interoperability are a trap.

  <li>Bad ideas aren't limited to bad people.

  <li>Good people aren't limited to good ideas.

  <li>An aesthetic is not an ethic.

  <li>The customer is usually wrong.

  <li>If it's written in:
    <ul>
      <li>C: It'll work, but I should remember there's a buffer overflow or something.
      <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.
      <li>Python: 50/50 whether it'll just barf stack traces into my terminal for non-obvious reasons.
      <li>Ruby: Decent chance I'll wind up reading the source code and cursing at clever Ruby programmers.
      <li>Haskell: It works, but I'm not smart enough to understand it.
      <li>Rust: Probably works, if they finished writing it.  I'm not smart enough to understand the code.
      <li>Go: Total crapshoot, but either way I bet the CLI has a bunch of infuriatingly nested subcommands.
      <li>JavaScript: Life is too short to deal with whatever package management and runtime I'm supposed to use for this now.
      <li>Java: If I have to <i>find out</i> it's Java, I'm probably in trouble.
    </ul>
  </li>

  <li>Lightweight markup languages are fundamentally in tension with the range
  of structures that their users will inevitably want to express.

  <li>Design, marketing, and management are all real undertakings, but they are
  also aggressively self-reproducing ideological systems and political
  projects.

  <li>Environments within which small tools can be combined to operate on
  simple abstractions are powerful.  An environment might be what you think of
  as an operating system, a programming language, a database, or an
  application.  All else being equal, the ones that can bridge to other
  environments are more powerful.

  <li>There are few abstractions in computing more stable than filesystems,
  standard IO, text files, and the shell. Boring relational databases aren't
  too far behind, but the barriers to entry and data transfer are higher.

  <li>Technology is at least as fashion-oriented as the sartorial choices of
  highschoolers, actors, and musicians.  Changes are driven as much by a desire
  for difference from the perceived status quo as anything else.

  <li>Technical politics are also organizational, labor, and identity politics.
  The currents of power they involve are illegible without taking those factors
  into account.

  <li>There's no guarantee that your technical preferences will match up with
  the ideas, people, or power structures you find agreeable in other domains.
  (Or vice versa.)

</ol>


<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> /
<a href="/2022/" title="2022">2022</a> /
<a href="/2022/6/" title="6">6</a> /
<a href="/2022/6/27/" title="27">27</a></p>
</div></article></div>
<details class="info"><summary>item information</summary>
timestamp: 1656318192
title: [p1k3::feed] Monday, June 27, 2022 - aphoristic noodling
link: https://p1k3.com/2022/6/27
content_type: html
id: /2022/6/27
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[Brainshit] Blockchain Nomic</summary>
<div class="links">
<a href="https://brainshit.fr/read/309">read original</a>
</div>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1656280800
title: [Brainshit] Blockchain Nomic
link: https://brainshit.fr/read/309
content_type: html
id: https://brainshit.fr/read/309
author: neuron@brainshit.fr (Lucidiot)
enclosure: 
category: Réflexions
</details>
</details>
<details>
<summary>[ Oatmeal] </summary>
<div class="links">
<a href="https://eli.li/2022/06/26/2022-06-26-06-49-15">read original</a>
</div>
<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>
<details class="info"><summary>item information</summary>
timestamp: 1656240555
title: [ Oatmeal] 
link: https://eli.li/2022/06/26/2022-06-26-06-49-15
content_type: html
id: https://eli.li/2022/06/26/2022-06-26-06-49-15
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[ Oatmeal] </summary>
<div class="links">
<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>
</div>
<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>
<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>
<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>
<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>
<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>
<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>
<p>Hopefully this is my last health update for a long time, and I can go back to posting about forth now!</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656212772
title: [ Oatmeal] 
link: 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
content_type: html
id: 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
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] Mipui - open source collaborative grid map editor for tabletop games</summary>
<div class="links">
<a href="https://www.mipui.net/">read original</a>
</div>
<div class="content"><p><a href="https://www.mipui.net/">Mipui - open source collaborative grid map editor for tabletop games</a></p>
                <p>[https] posted by mio on June 25, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656168162
title: [linkbudz rss feed] Mipui - open source collaborative grid map editor for tabletop games
link: https://www.mipui.net/
content_type: html
id: mio20220625144242
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Start all of your shell scripts with a comma</summary>
<div class="links">
<a href="https://rhodesmill.org/brandon/2009/commands-with-comma/">read original</a>
</div>
<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>
                <p>[https] posted by m455 on June 24, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1656080609
title: [linkbudz rss feed] Start all of your shell scripts with a comma
link: https://rhodesmill.org/brandon/2009/commands-with-comma/
content_type: html
id: m45520220624142329
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] directly query csv with sqlite</summary>
<div class="links">
<a href="https://til.simonwillison.net/sqlite/one-line-csv-operations">read original</a>
</div>
<div class="content"><p><a href="https://til.simonwillison.net/sqlite/one-line-csv-operations">directly query csv with sqlite</a></p>
                <p>[https] posted by dozens on June 22, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1655929342
title: [linkbudz rss feed] directly query csv with sqlite
link: https://til.simonwillison.net/sqlite/one-line-csv-operations
content_type: html
id: dozens20220622202222
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[~lucidiot's wiki] forest</summary>
<div class="links">
<a href="https://envs.net/~lucidiot/forest.html">read original</a>
</div>
<div class="content"></div>
<details class="info"><summary>item information</summary>
timestamp: 1655877494
title: [~lucidiot's wiki] forest
link: https://envs.net/~lucidiot/forest.html
content_type: 
id: https://envs.net/~lucidiot/forest.html
author: 
enclosure: 
category: 
</details>
</details>
<details>
<summary>[trash cat tech chat] 004 - Matrix, part 2</summary>
<div class="links">
<a href="https://podcast.librepunk.club/tctc/004">read original</a>
<a href="https://podcast.librepunk.club/tctc/tctc_004_Matrix,-part-2.ogg">enclosure</a>
</div>
<div class="content"><p>trash cat (they/them) and Juliana (she/her) talk about Matrix. Part 2 of 2.</p>
<h2>Timestamps</h2>
<ul>
<li>0:00.000 [Theme]</li>
<li>0:08.943 What's it like using encryption on Matrix?</li>
<li>20:13.711 A brief note on OTF funding</li>
<li>20:40.788 Issues with Matrix</li>
<li>44:36.851 Our opinions on Matrix</li>
<li>50:13.580 [Outro]</li>
</ul>
<h2>Transcript</h2>
<h3>[Intro]</h3>
<p><strong>trash cat:</strong> You're listening to <em>trash cat tech chat</em>, a Librepunk podcast.</p>
<h3>What's it like using encryption on Matrix?</h3>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<p><strong>J:</strong> Okay.</p>
<p><strong>tc:</strong> And sorry for interrupting you, but like...</p>
<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>
<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>
<p><strong>J:</strong> That is an interesting distinction.</p>
<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>
<p><strong>J:</strong> Go ahead.</p>
<p><strong>tc:</strong> I introduced you to talk, and then I'm just doing all the talking. But, uh... [<em>laughs</em>]</p>
<p><strong>J:</strong> I'm sorry that I don't have a better understanding.</p>
<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>
<p><strong>J:</strong> Okay.</p>
<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>
<p><strong>J:</strong> Yes.</p>
<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>
<p><strong>J:</strong> Yes, it does.</p>
<p><strong>tc:</strong> Okay.</p>
<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>
<p><strong>tc:</strong> The uh, in English, what it calls it is &quot;Secure Backup&quot;.</p>
<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>
<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>
<p><strong>J:</strong> Yes. And this simple interface is used for everywhere that user verification is required, so it's super nice.</p>
<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>
<p><strong>J:</strong> That is interesting. I hadn't thought about that. But yeah, that makes sense.</p>
<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>
<p><strong>J:</strong> It's kind of a shame.</p>
<p><strong>tc:</strong> It is. I hope that they fix that at some point.</p>
<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>
<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>
<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>
<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>
<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>
<p><strong>tc:</strong> On Element? It shouldn't require verification to turn on encryption.</p>
<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>
<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>
<p><strong>J:</strong> That's interesting. I wonder what was happening then. Huh.</p>
<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>
<p><strong>J:</strong> Gotcha.</p>
<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>
<p><strong>J:</strong> I don't think so.</p>
<p><strong>tc:</strong> Okay.</p>
<h3>A brief note on OTF funding</h3>
<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>
<p><strong>J:</strong> Yeah.</p>
<p><strong>tc:</strong> Cool.</p>
<h3>Issues with Matrix</h3>
<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>
<p><strong>J:</strong> Well, as our recent discussion may have shown, it's not exactly transparent everything that is going on.</p>
<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>
<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>
<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>
<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>
<p><strong>tc:</strong> Yeah, same for me.</p>
<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>
<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>
<p><strong>J:</strong> What?</p>
<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>
<p><strong>J:</strong> Oh no.</p>
<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>
<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>
<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>
<p><strong>J:</strong> Yeah.</p>
<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>
<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>
<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>
<p><strong>J:</strong> Yeah.</p>
<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>
<p><strong>J:</strong> Yeah, I think that's -- at least having the option for that is a good idea.</p>
<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>
<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>
<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>
<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>
<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>
<p><strong>J:</strong> Oh, that's super cool.</p>
<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>
<p><strong>J:</strong> Yeah, a government actor is gonna have a lot of resources to make redundancy possible.</p>
<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>
<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>
<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>
<p><strong>J:</strong> Yeah.</p>
<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>
<p><strong>J:</strong> Yeah.</p>
<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>
<p><strong>J:</strong> Oof!</p>
<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>
<p><strong>J:</strong> Wow. That's...</p>
<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>
<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>
<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>
<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>
<p><strong>tc:</strong> Yeah, absolutely. Like... [<em>disgruntled sound</em>] Yeah.</p>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<p><strong>tc:</strong> And they were written in a time when people tried to write good software.</p>
<p><strong>J:</strong> Yeah. [<em>laughs</em>]</p>
<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>
<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>
<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>
<p><strong>J:</strong> Yeah.</p>
<p><strong>tc:</strong> I don't know.</p>
<h3>Our opinions on Matrix</h3>
<p><strong>tc:</strong> So, what is ultimately your conclusion, your takeaway? How do you ultimately feel about Matrix?</p>
<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>
<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>
<p><strong>J:</strong> Yeah.</p>
<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>
<p><strong>J:</strong> [<em>sarcastically</em>] Whoa, really?!</p>
<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>
<p><strong>J:</strong> If it does, we will find something else.</p>
<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>
<p><strong>J:</strong> Yeah, exactly.</p>
<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>
<p><strong>J:</strong> I think that's a very nuanced and thorough analysis of the situation, and I agree.</p>
<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>
<p><strong>J:</strong> Yes.</p>
<p><strong>tc:</strong> ...and we have been using that with each other for this show.</p>
<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>
<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>
<p><strong>J:</strong> Yeah.</p>
<h3>[Outro]</h3>
<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>
<h2>Links</h2>
<ul>
<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>
<li><a href="https://minestrix.henri2h.fr/">MinesTRIX</a> (&quot;A privacy focused social media based on matrix&quot;)</li>
<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>
</ul>
<h2>Credits</h2>
<p>Music by <a href="https://karlcasey.bandcamp.com/">Karl Casey</a> @ <a href="https://whitebataudio.com/">White Bat Audio</a></p></div>
<details class="info"><summary>item information</summary>
timestamp: 1655867272
title: [trash cat tech chat] 004 - Matrix, part 2
link: https://podcast.librepunk.club/tctc/004
content_type: html
id: https://podcast.librepunk.club/tctc/004
author: 
enclosure: https://podcast.librepunk.club/tctc/tctc_004_Matrix,-part-2.ogg
category: 
</details>
</details>
<details>
<summary>[linkbudz rss feed] Running Doom on a chip from a $15 smart lamp</summary>
<div class="links">
<a href="https://uk.pcmag.com/games/133930/you-can-run-doom-on-a-chip-from-a-15-ikea-smart-lamp">read original</a>
</div>
<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>
                <p>[https] posted by mio on June 21, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1655774852
title: [linkbudz rss feed] Running Doom on a chip from a $15 smart lamp
link: https://uk.pcmag.com/games/133930/you-can-run-doom-on-a-chip-from-a-15-ikea-smart-lamp
content_type: html
id: mio20220621012732
author: 
enclosure: 
category: https
</details>
</details>
<details>
<summary>[linkbudz rss feed] Old-school blogging, retro computers, and decentralisation</summary>
<div class="links">
<a href="https://andregarzia.com/2022/05/Old-school-blogging-retro-computers-and-decentralisation.html">read original</a>
</div>
<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>
                <p>[https] posted by m455 on June 20, 2022</p></div>
<details class="info"><summary>item information</summary>
timestamp: 1655733653
title: [linkbudz rss feed] Old-school blogging, retro computers, and decentralisation
link: https://andregarzia.com/2022/05/Old-school-blogging-retro-computers-and-decentralisation.html
content_type: html
id: m45520220620140053
author: 
enclosure: 
category: https
</details>
</details>
<a href="mailto:fwends@me.acdw.net">email acdw</a> if you have issues.
</body>
</html>