summaryrefslogtreecommitdiff
path: root/www/blog/feed.rss
blob: f929be165c66a2b70622c0ed9178046f0bce63cf (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
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
 <title>senders.io - Blog</title>
 <description>senders.io's blog feed</description>
 <link>https://www.senders.io/</link>
 <copyright>2023 senders dot io - CC BY-SA 4.0</copyright>
 <language>en-US</language>
 <ttl>60</ttl>
 <lastBuildDate>Fri, 06 Jan 2023 18:56:10 -0500</lastBuildDate>
 <pubDate>Fri, 06 Jan 2023 00:00:00 -0500</pubDate>
 <item>
  <title>How I Generate My RSS Feed</title>
  <link>https://www.senders.io/blog/2023-01-06/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2023-01-06/index.html</guid>
  <pubDate>Fri, 06 Jan 2023 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h1>How I Generate My RSS Feed</h1>
      <p>I only just now started supplying an RSS feed to you fine people! You
      can subscribe to it at <a href=
      "/blog/feed.rss">www.senders.io/blog/feed.rss</a>!</p>
      <p>I decided rather than manually generating the file contents I’d hook
      into my pre-existing publish scripts to be able to generate the RSS
      file.</p>
      <h2>Publishing blog posts - shell scripts ftw</h2>
      <p>In <a href="/blog/2022-11-06/">My Markdown -&gt; HTML Setup</a> I
      touch on how I publish my markdown files into HTML for this blog. But
      what I don’t <em>really</em> touch on is the shell scripts that tie the
      whole process together.</p>
      <p>What I have is two, now three, scripts that feed the whole
      process:</p>
      <ol>
        <li><code>publish-blog.sh</code> - the main script</li>
        <li><code>compile-md.sh</code> - generates the HTML output</li>
        <li><code>update-feed.sh</code> - generates/appends the RSS feed</li>
      </ol>
      <p>The <code>update-feed.sh</code> script is the new one I just
      added.</p>
      <p><code>publish-blog.sh</code> is the primary interface, I supply the
      date of the post and the path to the md file and that calls compile and
      update to automate the entire process.</p>
      <p>Without going into TOO much detail you can view the latest versions of
      the scripts at <a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://git.senders.io/senders/senders-io/tree/">git.senders.io/senders/senders-io/tree/</a>.</p>
      <p>But the gist of the scripts is I parse out the necessary details,
      find/replace some tokens in template files I have setup for headers and
      footers, and concat the outputs into the final output HTML files, and now
      RSS feed.</p>
      <h3>update-feed.sh</h3>
      <p>Source File: <a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://git.senders.io/senders/senders-io/tree/update-feed.sh">git.senders.io/senders/senders-io/tree/update-feed.sh</a></p>
      <p>This script is pretty interesting. I didn’t want to deal with any XML
      parsers and libraries to just maintain a proper XML rss file and push
      items into the tree. Rather, I just follow a similar setup to my markdown
      generation. I leverage some temporary files to hold the contents, a
      static temp file for the previously generated content, and at the end
      swap the temp file with the real file.</p>
      <p>I take in an input of the publish date (this is the date from the
      publish script), the title, and the HTML file path. These are all already
      variables in the publish script, but also something I can manually supply
      if I need to publish an older article, or something I wrote directly in
      HTML.</p>
      <p>The core of the script is found here:</p>
      <pre><code>PUBDATE=$(date -d &quot;$1&quot; -R)
TITLE=$2
FILE_PATH=$3
PERMALINK=$(echo &quot;${FILE_PATH}&quot; | sed -e &quot;s,${TKN_URL_STRIP},${URL_PREFIX},g&quot;)
LINK=$(echo &quot;${PERMALINK}&quot; | sed -e &quot;s,${TKN_INDEX_STRIP},,g&quot;)

# Generate TMP FEED File Header

cat -s $FILE_RSS_HEADER &gt; $FILE_TMP_FEED
sed -i -E &quot;s/${TKN_BUILDDATE}/${BUILDDATE}/g&quot; $FILE_TMP_FEED
sed -i -E &quot;s/${TKN_PUBDATE}/${PUBDATE}/g&quot; $FILE_TMP_FEED

# Generate TMP Item File

cat -s $FILE_RSS_ITEM_HEADER &gt; $FILE_TMP_ITEM
sed -i -E &quot;s~${TKN_TITLE}~${TITLE}~g&quot; $FILE_TMP_ITEM
sed -i -E &quot;s/${TKN_PUBDATE}/${PUBDATE}/g&quot; $FILE_TMP_ITEM
sed -i -E &quot;s,${TKN_PERMALINK},${PERMALINK},g&quot; $FILE_TMP_ITEM
sed -i -E &quot;s,${TKN_LINK},${LINK},g&quot; $FILE_TMP_ITEM
sed -n &quot;/&lt;article&gt;/,/&lt;\/article&gt;/p&quot; $FILE_PATH &gt;&gt; $FILE_TMP_ITEM
cat -s $FILE_RSS_ITEM_FOOTER &gt;&gt; $FILE_TMP_ITEM

# Prepend Item to items list and overwrite items file w/ prepended item
## In order to &quot;prepend&quot; the item (so it&#39;s on top of the others)
## We need to concat the tmp item file with the existing list, then
## we can push the contents over the existing file
## We use cat -s to squeeze the blank lines
cat -s $FILE_ITEM_OUTPUT &gt;&gt; $FILE_TMP_ITEM
cat -s $FILE_TMP_ITEM &gt; $FILE_ITEM_OUTPUT

# Push items to TMP FEED
cat -s $FILE_ITEM_OUTPUT &gt;&gt; $FILE_TMP_FEED

# Push RSS footer to TMP FEED
cat -s $FILE_RSS_FOOTER &gt;&gt; $FILE_TMP_FEED
echo $FILE_TMP_FEED

# Publish feed
cat -s $FILE_TMP_FEED &gt; $FILE_RSS_OUTPUT

echo &quot;Finished generating feed&quot;
</code></pre>
      <p>Some key takeaways are:</p>
      <ol>
        <li>sed lets you do regex with delimiters that AREN’T <code>/</code> so
        you can substitute something that shouldn’t actually ever show up in
        your regex. For me that is <code>~</code>.</li>
        <li>I always forget you can use sed to extract between tokens - which
        is how I get the CDATA for the RSS: <code>sed -n
        &quot;/&lt;article&gt;/,/&lt;\/article&gt;/p&quot;</code></li>
        <li><code>mktemp</code> is really REALLY useful - and I feel is under
        utilized in shellscripting</li>
      </ol>
      <p>The obvious cracks are:</p>
      <ol>
        <li>I rely SO much on <code>sed</code> that it’s almost certainly going
        to break</li>
        <li>I don’t have much other flag control to do partial generation - so
        if I need to do something either starting partway through or not finish
        the full process, I don’t have that.</li>
        <li>Sometimes things can break silently and it will go through, there
        is no verification or like manual checking along the way before
        publishing the feed.rss</li>
      </ol>
      <p>The final two can easily be managed by writing the feed to a location
      that isn’t a temp file and I can manually do the <code>cat -s
      $FILE_TMP_FEED &gt; www/blog/feed.rss</code> myself after I check it
      over.</p>
      <p>But for now I’ll see if I ever have to redo it. I don’t think anyone
      will actually sub to this so I don’t really need to care that much if I
      amend the feed.</p>
      <h2>Where to put the feed URL</h2>
      <p>I never intended to provide an RSS feed. I doubt anyone but me reads
      this, and from my previous experience with gemini feed generation was a
      bit of a headache.</p>
      <p>A quick aside: I really only decided thanks to Mastodon. I was
      thinking during the Twitter meltdown “what if twitter but RSS” (I know
      super unique idea). But basically like a true “microblog”. And some OSS
      tools to publish your blog. This got me reading the RSS spec and looking
      into it more - which then lead me down the using the RSS readers more (in
      conjunction with gemini, and Cortex podcast talking about using RSS
      more).</p>
      <p>But I’ve decided to just put the RSS feed in the blog index, on my
      homepage, and that’s it. I don’t need it permanently in the header.</p>
      <h2>Conclusion</h2>
      <p>I didn’t have much to share here, it doesn’t make too much sense to
      write a big post on what can be explained better by just checking out the
      shell scripts in my git source. The code speaks better than I ever
      could.</p>
      <p>I really, really like shell scripting.</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>Music Spotlight: My Top Album 2022</title>
  <link>https://www.senders.io/blog/2023-01-03/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2023-01-03/index.html</guid>
  <pubDate>Tue, 03 Jan 2023 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h1>Music Spotlight: My Top Album 2022</h1>
      <p>The hype is real. I only recently wrote last years, so I bet your hype
      is nonexistent but for me I was writing that knowing full well there were
      some bangers waiting to be unleashed in this year end review!</p>
      <p>If you hadn’t read my previous post for 2021 the link is at the
      bottom:</p>
      <blockquote>
        <p>The winner was “KANGA - You and I Will Never Die”</p>
      </blockquote>
      <h2>The album pool</h2>
      <p>As always the criteria:</p>
      <ul>
        <li>it was released in 2022</li>
        <li>it wasn’t a single</li>
        <li>if it was an EP it has to be substantial and intentional</li>
      </ul>
      <p>And the albums are…</p>
      <ul>
        <li>Amining for Enrike - The Rats and the Children</li>
        <li>And So I watch You from Afar - Jettison</li>
        <li>Astronoid - Radiant Bloom</li>
        <li>Carpenter Brut - Leather Terror</li>
        <li>Cult of Luna - The Long Road North</li>
        <li>Dance With the Dead - Driven to Madness</li>
        <li>Elder - Innate Passage</li>
        <li>Emma Ruth Rundle - EG2: Dowsing Voice</li>
        <li>Giraffes? Giraffes! - Death Breath</li>
        <li>God Mother - Obeveklig</li>
        <li>Jay Hosking - Celestial spheres (and various other releases)</li>
        <li>Long Distance Calling - Eraser</li>
        <li>Ludovico Technique - Haunted People</li>
        <li>MWWB - The Harvest (Mammoth Weed Wizard Bastard)</li>
        <li>MØL - Diorama (Instrumental)</li>
        <li>Psychostick - … and Stuff</li>
        <li>Russian Circles - Gnosis</li>
        <li>SIERRA - See Me Now</li>
        <li>Starcadian - Shadowcatcher</li>
        <li>Tina Dickow - Bitte Små Ryk</li>
        <li>Toundra - Hex</li>
        <li>Waveshaper - Forgotten Shapes</li>
      </ul>
      <p>2022’s playlist (+ 2 albums from bandcamp not on Spotify):</p>
      <ul>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href=
              "https://open.spotify.com/playlist/2TCd910OyZcTjQ8l8Dc0Jy?si=efd0dc6286b84062">
          [spotify] senders&#39; Releases 2022 Spotify Playlist</a>
        </li>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href=
              "https://emmaruthrundle.bandcamp.com/album/eg2-dowsing-voice">[bandcamp]
              Emma Ruth Rundle - EG2: Dowsing Voice</a>
        </li>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href=
              "https://jayhosking.bandcamp.com/album/celestial-spheres">[bandcamp]
              Jay Hosking - Celestial spheres</a>
        </li>
      </ul>
      <h2>The Top 5</h2>
      <p>In alphabetical order:</p>
      <ul>
        <li>Carpenter Brut - Leather Terror</li>
        <li>Elder - Innate Passage</li>
        <li>Emma Ruth Rundle - EG2: Dowsing Voice</li>
        <li>Jay Hosking - Celestial spheres (and various other releases)</li>
        <li>Tina Dickow - Bitte Små Ryk</li>
      </ul>
      <h2>Carpenter Brut - Leather Terror</h2>
      <p>Some metal infused synthwave, Carpenter Brut managed to release a
      catchy and heavy banger of an album. Featuring a few guest performers,
      each of these tracks are unique and catchy in what I would consider a
      very “same-y” genre. It’s nice having an infinite supply of retro synth
      tracks to drive to, but sometimes it’s hard for one to really break
      through into “oh shit yes!”. Typically, Starcadian is the one to do that
      for me, as they add an extra layer to their tracks through their music
      videos (each track being an “ear movie”).</p>
      <p>Throughout the year I found myself coming back to a few tracks over
      and over - especially when I was showering or doing some other short
      activity and I just wanted something upbeat and fun as heck!</p>
      <p>Some call out featured songs are The Widow Maker featuring Gunship,
      Imaginary Fire featuring Greg Puciato, and Lipstick Masquerade featuring
      Persha. I looped these three songs quite a bit. But there are quite a few
      more to checkout.</p>
      <h3>Favorite Track</h3>
      <p>This is tough, as I looped those three songs quite a bit - each
      bringing their own unique energy. So I’ll pick all three - my list my
      rules:</p>
      <ul>
        <li>
          <p>The Widow maker - feat. Gunship This track is representative of
          the genre. It’s synthwave to the core.</p>
        </li>
        <li>
          <p>Imaginary Fire - feat. Greg Puciato This is a metal track with
          synths. Greg Puciato (of The Dillinger Escape Plan fame) is one of my
          favorite vocalists and is immensely talented. This is probably my
          favorite because I can’t get enough of his vocal style - the screams
          and the clean vocals!</p>
        </li>
        <li>
          <p>Lipstick Masquerade - feat. Persha This is a modern 80s track.
          This is what retrowave was designed around and while tracks like The
          Widow Maker are more typical of the genre, this is the song they all
          are basing their sound off of. This is kill pop song.</p>
        </li>
      </ul>
      <h3>Special Commendation - Non Stop Bangers</h3>
      <p>You throw this album on and it hits you with just banger after banger.
      I can’t keep myself from dancing. Even as I listen back as I write this
      gemlog I am grooving in my chair! Like Kanga last year, this is just a
      series of tracks that just make you dance.</p>
      <h3>Album Link</h3>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://open.spotify.com/album/37PW0ipoWcjx3APS1MN0ql?si=HE0-siOqTsqVlJrlL9MWTw">
      [spotify] Carpenter Brut - Leather Terror</a></p>
      <h2>Elder - Innate Passage</h2>
      <p>I toot’d a bit about this album, a later release in the year, this
      took this year end review and flipped it on its head. I thought it was
      wrapped up already with a separate release this year, but this makes the
      decision so hard.</p>
      <p>Elder came at us with what feels like a return to form. Having
      previously released Omens in 2020 and a collaboration album in 2021,
      Innate Passage takes the best parts of those two albums and builds on-top
      of more “classic Elder” albums like Lore. Elder has carved out their own
      niche in the genre making a blend of psych rock and stoner metal, with
      each release leaning harder and harder into psychedelic realms. Innate
      Passage has this almost ethereal feeling - especially in their opening
      track Catastasis.</p>
      <p>I think, however, they’ve left the doom and stoner metal behind. Dead
      Roots Stirring and Elder (self titled) were certainly “Doomy” and in that
      “doom/stoner” metal overlap. Lore, Reflections of a Floating World are
      both still very “stoner metal”. But is playing psychedelic-metal with a
      big muff automatically stoner metal? I think since Omens they’re
      probably, as a band, firmly outside of the stoner metal field - and more
      soundly in some psychedelic/prog metal genre?</p>
      <p>They introduce themselves as such in their website actually!</p>
      <figure>
        <blockquote>
          <p>genre-pushing rock band&nbsp;that melds heavy psychedelic sounds
          with progressive elements and evocative soundscapes.</p>
        </blockquote>
        <figcaption>
          <cite>— <a rel="external noopener noreferrer"
             target="_blank"
             href=
             "https://beholdtheelder.com/elder-bio/">https://beholdtheelder.com/elder-bio/</a></cite>
        </figcaption>
      </figure>
      <p>“Merged In Dreams - Ne Plus Ultra” is the track that flips this whole
      argument on its head and shows that regardless, they’re still very much a
      metal band and one that you’ll absolutely be head banging too, horn up
      \m/.</p>
      <h3>Favorite Track</h3>
      <p>I think “Merged In Dreams - Ne Plus Ultra”. A nearly 15 minute track
      that has everything in it you expect from Elder.</p>
      <h3>Special Commendation - Excellent Vinyl Record Cover</h3>
      <p>I LOVE their record covers when they do the circular inserts. You can
      display this vinyl with having 3 separate views through the port, which
      while purely aesthetic - it’s very nice!</p>
      <p>The quality of the vinyl release was great, though I find any
      non-black Vinyl has a 33% chance of being slightly warped upon arrival. I
      am going to stick to traditional black vinyls from now on sadly. It’s too
      freaking often</p>
      <h3>Album Link</h3>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://open.spotify.com/album/5XClGjeje4c3qPjbtT898K?si=PFgsT8S_TD6hu4dwbFp3Jw">
      [spotify] Elder - Innate Passage</a></p>
      <h2>Emma Ruth Rundle - EG2: Dowsing Voice</h2>
      <p>Her second album in her “Electric Guitar” series - Emma Ruth Rundle
      (ERR from here on out) has released “Dowsing Voice” a haunting follow-up
      to last years Engine of Hell. Holy holy HOLY hell, this album is an
      impactful, artistic, just WOW. It’s hard to describe. I was listening to
      it for this review and my partner, sitting behind me relaxing, said “What
      the hell are you listening too, this is scary!”. And scary, emotional,
      and difficult it is. ERR stretches the use of the “electric guitar”
      title, as the focus here is the additional layers and voices added on-top
      of the main tracks.</p>
      <p>An experimental release that, at this time is only available on
      bandcamp, is one I don’t put on frequently, but when I do am fully
      captivated. If you like artistic records - please check this out.</p>
      <h3>Favorite Track</h3>
      <p>Probably: Keening into Ffynnon Llanllawer - I love the guitar(?) part
      and the wailing/vocalization. It’s haunting. As a recording is
      amazing.</p>
      <p>Though “In the Cave of The Cailleach’s Death-Birth” is the /best/
      track. Put some headphones on and give this a listen! Just amazing.</p>
      <h3>Special Commendation - Album Art</h3>
      <p>This album, IS ART, but the album art is just… really suiting the
      music.</p>
      <h3>Album Link</h3>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://emmaruthrundle.bandcamp.com/album/eg2-dowsing-voice">[bandcamp]
         Emma Ruth Rundle - EG2: Dowsing Voice</a></p>
      <h2>Jay Hosking - Celestial spheres (and various other releases)</h2>
      <p>This is an interesting pick. Having released JUST in time for this
      year, this is an album I have been engaging with in many, many ways.
      Firstly, I am a patron of this performer via Patreon. They make music
      videos (audio only performance videos of the songs) that they compile
      into albums. Last year’s album is probably my actual favorite and likely
      SHOULD’VE snuck into the top 5 because of the final track alone, which
      was an emotional and just epic banger of a track (Linked at the bottom of
      this review).</p>
      <p>Celestial spheres is a compilation of 8 synth jams. Jay bills these as
      semi-improvisational, and while the YT channel is a synth nerds dream of
      these informative performances, the songs stand on their own. This one is
      no exception. Using various different pieces of hardware synths,
      grooveboxes, drum machines and traditional instruments - each track is
      unique while still carrying this /energy/ and style. It’s so easy to hear
      Jays tracks and know it’s him.</p>
      <p>I’ve been following him for years and really enjoy the music he makes,
      and the community he’s built up around his music. Due to the disconnected
      nature of the singles (releasing effectively as YouTube videos prior to
      the album drop) it’s difficult to ultimately rate these in these lists
      since I don’t get a chance to really enjoy them /as an album/ until the
      end of the year (the past two times happened like this where they came
      out around the end of the year). And on my playlist “Future, Tense” is
      present as it’s a “2022” album according to Spotify, but was out on
      bandcamp in 2021, and that’s when I was gifted it by Jay.</p>
      <p>So yeah - this whole section is like “disclaimer disclaimer” but if
      you like groovy, typically instrumental synth music - check it out.</p>
      <h3>The various other releases</h3>
      <p>This year Jay released a few albums actually which I didn’t want to
      include separately. If you enjoy this album (which was mostly comprised
      of 2022 music, so was the primary focus) check out the other albums:</p>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://jayhosking.bandcamp.com/album/cinematic-works">https://jayhosking.bandcamp.com/album/cinematic-works</a>
         <a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://jayhosking.bandcamp.com/album/away-music-for-a-productive-day">https://jayhosking.bandcamp.com/album/away-music-for-a-productive-day</a>
         <a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://jayhosking.bandcamp.com/album/home-music-for-a-productive-day">https://jayhosking.bandcamp.com/album/home-music-for-a-productive-day</a></p>
      <h3>Favorite Track</h3>
      <p>Without out a doubt it’s Nychthemeron. It’s truly a wild track, with
      so much happening in it. I suspect it was his favorite too since he made
      an actual music video for it:</p>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href="https://www.youtube.com/watch?v=Ka-xE3Qo3dA">[youtube] Jay
         Hosking - Nychthemeron (Official Music video)</a></p>
      <h3>Special Commendation - Each track has a live performance attached to
      it!</h3>
      <p>If you enjoy videos - these each have a corresponding YT video linked
      at the bottom of the bandcamp page.</p>
      <h3>Album Link</h3>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://jayhosking.bandcamp.com/album/celestial-spheres">[bandcamp]
         Jay Hosking - Celestial spheres</a></p>
      <h2>Tina Dickow - Bitte Små Ryk</h2>
      <p>Tina Dickow (sometimes credited as Tina Dico, depending on the
      release) is a fantastic Danish singer songwriter. Since her first solo
      album she’s really found a way to elevate what is just folk indie pop.
      Her songwriting, arrangements, and performances are always so rich. She
      knows when to strip the song back - like Chefen Skal Ha&#39; Fri - while,
      has certainly a lot happening beneath the lyrics - mixes them back a bit
      to let the layered vocals cut through as the song builds. Each song has
      so much to listen to! Picking out various instruments, layers, yet every
      song would work performed just her and her acoustic guitar. I find her
      style of pop music to be very engaging for that reason. I don’t often
      listen to this style of music, but the production behind each track is so
      good it hooks me in. That and her beautiful voice - which drew me in
      first.</p>
      <p>It’s a bit harder to talk about this album given the language barrier
      (I do not speak Danish!) Which is a shame, since her lyrics are often
      what I love about some of her previous albums. I’ve read the translations
      and done my own as a learning exercise, but there is a layer missing
      which is a shame given how strong this album is as whole.</p>
      <p>I’ve spoken about Tina before in two previous gemlogs (<a href=
      "gemini://senders.io/gemlog/2021-04-27-music-spotlight-awesome-eps.gmi">Music
      Spotlight: Awesome EPs</a> and <a href=
      "gemini://senders.io/gemlog/2021-05-18-5x5-playlists.gmi">5x5
      Playlists</a> (both gemini:// links)) and is one of my absolute favorite
      artists of all time. I’ve been slowly collecting her entire discography,
      which can be tricky, given a lot of copies are out of print and the
      remaining stock/used copies are often in Europe. (And that 5x5 playlist
      is very telling given most of those artists have been featured in my top
      albums lists and were winners! Is this foreshadowing?!)</p>
      <h3>Favorite Track</h3>
      <p>I shouldn’t have introduced this section - it has been so hard each
      time! I think the title track, Bitte Små Ryk. It’s got everything there,
      and is representative of the albums sound.</p>
      <h3>Special Commendation - Lovely</h3>
      <p>This whole album is lovely. There is emotion here too, and while I
      don’t speak the language its often very clear. But I love Tina and her
      music. It’s lovely and hits this spot in me thats just warm.</p>
      <h3>Album Link</h3>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://open.spotify.com/album/6YV4Gomk4iy0dUyVqPDN7T?si=e3wO7G3XTI-ZIwhOSCswJA">
      [spotify] Tina Dickow - Bitte Små Ryk</a></p>
      <h2>My Top Pick</h2>
      <p>This year has been especially hard, since I spent so much time
      listening to 2021s releases which are some of my favorite of all time.
      And between 2021 and 2022 (and mentioned in my 2021 spotlight) nearly
      every one of my favorite artists released an album. So I have been
      blessed with a lot to listen to.</p>
      <p>Anyone following me on mastodon may have seen Tina Dickow just owning
      my entire wrapped campaign, but with Elder releasing their album after
      the data collection stops for wrapped, that certainly isn’t telling the
      whole story.</p>
      <p>And it wouldn’t be a top album list if I didn’t mention Starcadian
      being consistently in the top 10 year after year, just narrowly missing
      the top 5 - though technically, this release was in my 2020s list, as it
      was available then, but had since been pulled, and was released
      “officially” in 2022. Looking at what I can see it’s the same tracklist,
      but the “inspired by” credits are entirely gone from the 2022
      release.</p>
      <h3>Elder - Innate Passage</h3>
      <p>Each year picking the winner is hard. Part of the reason I do this is
      I don’t really add stuff to the list I don’t like. A LOT of music comes
      out each year, and I add what I listen to. I don’t listen to music I
      don’t like - so by nature of the process - each album is a “top album”
      for me.</p>
      <p>But the top 5 is usually a mix of “omg obvs” and “yeah turns out I
      threw that on way more than I expected” (Carpenter Brut). But its really
      always a fight between those “obvs” - this year was Elder and Tina
      Dickow. Their releases were seriously top tier and repeat listens.</p>
      <p>Tina came in with the advantage of releasing in April, and Elder JUST
      released theirs at the end of November. But I did some math on my
      mastodon breaking down the comparison. Elder came at us with a longer
      albums, under half as many tracks, and over 2x the average song length
      (about 10min/track).</p>
      <p>They didn’t waste a single second (neither did Tina) but just being
      such an accessible album - just direct pure energy and power - BOOM! It
      was great.</p>
      <h3>This should’ve been a tie</h3>
      <p>Honestly, I was ready to call it a tie. I am actually writing this
      minutes before posting it, because that’s how undecided I am and how
      close this is.</p>
      <p>Tina Dickow deserves the number one slot any other year, and both her
      and Elder’s albums I hope to see more of in the next few years! Both are
      classic albums in their discographies (both albums of which I own and
      spin regularly). I forced myself to pick, and just knowing me, my tastes,
      and all the stuff I said above - I went with Elder. But seriously, listen
      to this record - Tina manages to pack so much musicality in carving out a
      unique sound and just amazing style. I love her &lt;3 :)</p>
      <p>And if her music isn’t your jam - check out her guest tracks on the
      Zero-7 stuff - angelic voice.</p>
      <h2>Conclusion</h2>
      <p>I am REALLY disappointed I had to choose between Elder and Tina Dickow
      this year. Similarly, last year I had Raised by Swans, ERR, and Kanga!
      And our winner in 2020 was Bell Witch. These ARE my top six favorite
      musical artists currently active.</p>
      <p>I’ll talk about music trends and my tastes later on. But I just wanted
      to emphasize how much of a banger these last 3 years have been musically
      and I am grateful I get to share these with you here.</p>
      <p>I am really excited for 2023!</p>
      <h2>This year’s playlist (2023)</h2>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://open.spotify.com/playlist/4zgdFBZslkcEq0xYFyME7U?si=4bc2bf7d015c4254">
      [spotify] senders&#39; Releases 2023 Playlist</a></p>
      <h2>Links</h2>
      <p>If you use gemini:// you can check out my previous posts (until/unless
      I decided to port those over too)</p>
      <ul>
        <li>
          <a href=
          "gemini://senders.io/gemlog/2022-11-30-music-spotlight-top-album-2021.gmi">
          [gemini] Music Spotlight: Top Album 2021</a>
        </li>
        <li>
          <a href=
          "gemini://senders.io/gemlog/2021-03-21-music-spotlight-top-album-2020.gmi">
          [gemini] Music Spotlight: Top Album 2020</a>
        </li>
      </ul>
      <p>Thanks for reading! I don’t always crosspost - I am trying something
      out :)</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>RSS - A Follow-up</title>
  <link>https://www.senders.io/blog/2022-12-31/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2022-12-31/index.html</guid>
  <pubDate>Sat, 31 Dec 2022 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h1>RSS - A Follow-up</h1>
      <p>Get an RSS reader and connect everything to it!</p>
      <p>Between switching to Mastodon for my social media allowance, and using
      a dedicated RSS reader has really cut down my overall consumption and
      wasted PC time.</p>
      <blockquote>
        <p>this blogpost is originally posted to my gemini gemlog: <a href=
        "gemini://senders.io/gemlog/2022-12-31-rss-a-follow-up.gmi">gemini://senders.io/gemlog/2022-12-31-rss-a-follow-up.gmi</a>
        which is where I do most of my writing, converting some useful to share
        things over here. It is also where the original RSS gemlog this is a
        follow-up to was posted. For context, I wanted to cutback on a lot of
        my web consumption, wasting time and just being mindless online. So I
        looked to RSS to help centralize and solve this issue.</p>
      </blockquote>
      <h2>Recap</h2>
      <p>So I am using <a rel="external noopener noreferrer"
         target="_blank"
         href="https://tt-rss.org">https://tt-rss.org/</a> as my RSS
         aggregator. It’s a self-hosted RSS aggregator that, using profiles,
         allows you to subscribe to multiple feeds and have them “synced”
         between multiple devices (they’re not synced, you’re connecting to a
         central server). I like this because I don’t ever have to worry about
         dismissing, reading, or marking anything on my phone to have it still
         present on my PC. And I don’t have to worry about feed subscriptions
         or my phone pinging a bunch of feeds, or obviously, any third-party
         hosting.</p>
      <h2>How I’ve been using it</h2>
      <p>So as always, please send me interesting RSS feeds! Or even your own!
      I am trying to read more blogs, and if you have something you enjoy drop
      me a DM or email! I’ll share what I am following throughout this section
      &lt;3</p>
      <h3>Blogs</h3>
      <p>Obviously, I am following blogs, one of the last holdouts of RSS. I
      have a few that I follow, mostly other transfolk on Mastodon that I found
      had their own blogs. Most non-trans folks I follow are using gemini and
      still rely on the feed aggregators for that.</p>
      <p>If you’re interested the two main ones I am reading right now are:</p>
      <ol>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://erininthemorn.substack.com">Erin In The Morn
              (substack)</a>
        </li>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.selfawaresoup.com/">Selfaware Soup</a>
        </li>
      </ol>
      <p>Which have been pretty insightful. Erin sharing a lot of US
      transgender news, which is good since I have dropped off using Reddit
      which is where I “got” my “news” from.</p>
      <h3>Podcasts</h3>
      <p>The other mainstay in RSS is podcasts. Some even say if a podcast
      can’t be consumed via RSS, is it even a podcast? I would agree.
      Everything else is just a show. I don’t <em>need</em> the content to be
      consumable from my reader, but I’d really appreciate it if were. I am
      always on the lookout for more podcasts though. With the only two
      consistent listens being:</p>
      <ol>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.relay.fm/penaddict">The Pen Addict Podcast
              (relay.fm)</a>
        </li>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.relay.fm/cortex">Cortex Podcast (relay.fm)</a>
        </li>
      </ol>
      <p>And currently off-season:</p>
      <ul>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.relay.fm/backmarkers">Backmarkers Podcast
              (relay.fm)</a>
        </li>
      </ul>
      <p>Which has a YouTube video format. Though, I honestly really don’t care
      for Austin Evans, I just enjoy consuming some F1 content and pretending I
      have friends I can talk to about motor racing.</p>
      <p>While writing this section I added:</p>
      <ul>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://inside.java/podcast/">Inside.java Podcast</a>
        </li>
      </ul>
      <p>I have yet to listen, some of the topics seem interesting and being
      infrequent gives me hope its quality over quantity. (And I like having
      podcasts for chores to distract my brain)</p>
      <h3>Tech News</h3>
      <p>Right now I follow two main news sources in tech:</p>
      <ol>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.debian.org/News/">debian.org/news</a>
        </li>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://lwn.net/">LWN.net</a>
        </li>
      </ol>
      <p>Running servers using stable debian - it’s good to know when security
      updates come in, as well as distro updates. And LWN is fantastic, I’ve
      been a subscriber for many years and while sometimes (Jake) can focus a
      bit heavy on Python news, has been always interesting to read.</p>
      <p>This is the section I plan on adding more and more to. I had other
      tech blogs that just felt like clutter and were pushing out daily
      articles that I couldn’t care less about (opensource.com cough cough).
      But that’s just me. Tech news is mainly where I want to focus - since
      fluff blogs are rarely my cup of tea.</p>
      <p>LWN has some links in their weekly editions for other news feeds I
      might consider directly subscribing too, but for now I have these.</p>
      <h3>Music News</h3>
      <p>Some folk have an RSS feed for their site updates, which I appreciate.
      Some use sites like Squarespace but don’t properly connect up the RSS
      feed which I do NOT appreciate.</p>
      <p>So right now I have two bandsites that DO update it seems (as their
      site aligns with the feed) - but the only one I’ll mention is: <a rel=
      "external noopener noreferrer"
         target="_blank"
         href="https://raisedbyswans.com/">raisedbyswans.com</a> I’ve spoken of
         this artist in my Music Spotlight MANY times and is one of my
         favorites. His site, while entirely simple, is setup with RSS and has
         been publishing his updates consistently. I appreciate this. Always a
         strong rec from me!</p>
      <p>I’ve been toying with Music Review sites that talk about new releases
      in the genres they specialize in, but I haven’t settled on anything that
      is helping me discover new music.</p>
      <h3>YouTube</h3>
      <p>This is probably where the biggest change has actually come in. Having
      my YouTube feed fed through RSS has been fantastic. I am able to not only
      refresh and not miss any updates (since YouTube sometimes likes to pull
      updates in out of order than I don’t see it because it’s buried between
      some other videos that I’d already seen.</p>
      <p>But this also allows me one further level of filtering on my YouTube
      subscriptions. I can stay subscribed to channels I am interested in
      watching <em>occasionally</em> but not every video, and keep those off my
      RSS feed. And for the “I like to watch most if not all the new videos” I
      can subscribe to those via RSS. So it’s like the “bell” but without the
      app basically. And since on Mobile I do NOT use the YouTube app (so I can
      take advantage of the Ad Blocker in Firefox) that’s great!</p>
      <p>What sucks / is tricky is actually subscribing to the RSS feeds
      because YouTube buried that feature now. You just need the channel_id or
      the username and you can subscribe using the following URL:</p>
      <pre><code>https://www.youtube.com/feeds/videos.xml?channel_id={ID}
</code></pre>
      <p>And you can obtain the channel_id either using the URL (though with
      aliases now (@channelname) its rare to see a channel_id in the URL) if
      present otherwise a little console JS can print it out:</p>
      <pre><code>ytInitialData.metadata.channelMetadataRenderer.externalId
</code></pre>
      <p>A note however - you’ll need to clear the console if you navigate to
      the next channel, at least in Firefox, it caches the result otherwise and
      you’ll print out the duplicate value. There are some tools where you can
      print your subscribers list into these feed URLs and bulk subscribe. I’ve
      lost the link (and it’s what I did initially) but I recommend doing the
      manual add at least to focus on the channels you WANT in RSS, since you
      can always fallback to the main subscriptions page on YouTube.</p>
      <p>But what this has given me is the ability to effectively ignore
      YouTube almost entirely. Ideally, I’d script something with YouTube-dl
      but I don’t REALLY care that much, and I’ve gotten into the habit of
      closing the tab after the video so I don’t stick around and get sucked
      into the algorithm.</p>
      <p>What my morning looks like is sitting down, switching to my tt-rss
      tab, seeing what’s fresh, and watching a video with my coffee maybe, then
      just moving on and doing something else. I still lurk Mastodon, or get
      sucked into my computer in some way or another, but it’s been really
      positive! I can count on one hand how many times since dedicating to RSS
      I’ve just clicked around YouTube.</p>
      <h3>Hobby</h3>
      <p>The last section which really is an extension of Blogs/News is “hobby”
      RSS feeds. These feed a bit into the consumerist side of life and why I
      keep them separate. Right now it’s almost <em>entirely</em> fountain pen
      related (Who&#39;da thought this community would still be writing blogs
      :P) but since most of the blog posts are either about products or reviews
      in some way, I try and limit how much I expose myself to them. I have
      been working on a draft about consumerism for quite a while now and just
      haven’t really worked it into a post that isn’t just DAE consumerism BAD?
      low-effort Toot level. (But basically, I kinda hate how all my hobbies,
      and hobbies in general rely heavily on a consumerism mindset, GAS, and
      such). So I’ve been trying to be more appreciative of what I already have
      and such.</p>
      <p>But these blogs are nice, and often keep in the know about my hobbies
      and can react to anything meaningful that’s being released. A good video
      sorta on this topic was by Adam Neely(<a rel=
      "external noopener noreferrer"
         target="_blank"
         href="https://www.youtube.com/v/mHoljbkyAEs">Adam Neely - How In-Ear
         Monitors are Making Better Musicians</a>), and how his band spend
         $6000 on gear for their tour, but what it did was eliminate stress and
         enable them to more easily fine tune and control how they monitor
         their live performance. He touches on the fact that gear videos feed
         into the consumerist mindset of music making, but gear is often
         necessary to facilitate certain things, and setting up a portable
         in-ear-monitor rig for their entire band is well… unavoidable. It’s
         just a minor aside in a much deeper video about IEMs and touring and
         FEEL. And quite the departure from his usual music education content.
         But it sums up the main thesis of my consumerism gemlog quite nicely I
         feel (or at least I am projecting my thoughts into a brief aside he
         makes).</p>
      <h2>tt-rss - in retrospect</h2>
      <p>So tt-rss is <em>fine</em> honestly, I think I need to setup a better
      theme, something that has a bit more contrast. I don’t REALLY read in it,
      I just use it as the aggregator and then open the links directly. I don’t
      mind the way it renders the full articles with images, but I do mind how
      GREY it is by default (in “night” theme). It looks totally customizable
      and I bet I can download a decent theme for it if I look. But I may spend
      some time doing that and try and read more in application.</p>
      <p>But other than that it’s been quite the improvement over my internet
      experience. More RSS!!</p>
      <h2>Conclusion</h2>
      <p>I need more feeds, as I do enjoy reading. So I’m always on the look
      out. I hate to throw in engagement-y things like “let me know” stuff but
      I am genuinely looking for interesting suggestions for stuff you might
      subscribe to over RSS. Even if it’s just “this is my webblog” :) I always
      like reading people’s things. I should troll the aggregators and look at
      folks capsule landings to see what is linked!</p>
      <p>Anyway, you should look into getting an RSS aggregator setup. It’s
      been really impactful on cutting down on internet scrolling and
      mindlessness.</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>RSS - A Follow-up</title>
  <link>https://www.senders.io/blog/2022-12-31/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2022-12-31/index.html</guid>
  <pubDate>Sat, 31 Dec 2022 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h1>RSS - A Follow-up</h1>
      <p>Get an RSS reader and connect everything to it!</p>
      <p>Between switching to Mastodon for my social media allowance, and using
      a dedicated RSS reader has really cut down my overall consumption and
      wasted PC time.</p>
      <blockquote>
        <p>this blogpost is originally posted to my gemini gemlog:
        gemini://senders.io/gemlog/2022-12-31-rss-a-follow-up.gmi which is
        where I do most of my writing, converting some useful to share things
        over here. It is also where the original RSS gemlog this is a follow-up
        to was posted. For context, I wanted to cutback on a lot of my web
        consumption, wasting time and just being mindless online. So I looked
        to RSS to help centralize and solve this issue.</p>
      </blockquote>
      <h2>Recap</h2>
      <p>So I am using <a rel="external noopener noreferrer"
         target="_blank"
         href="https://tt-rss.org">https://tt-rss.org/</a> as my RSS
         aggregator. It’s a self-hosted RSS aggregator that, using profiles,
         allows you to subscribe to multiple feeds and have them “synced”
         between multiple devices (they’re not synced, you’re connecting to a
         central server). I like this because I don’t ever have to worry about
         dismissing, reading, or marking anything on my phone to have it still
         present on my PC. And I don’t have to worry about feed subscriptions
         or my phone pinging a bunch of feeds, or obviously, any third-party
         hosting.</p>
      <h2>How I’ve been using it</h2>
      <p>So as always, please send me interesting RSS feeds! Or even your own!
      I am trying to read more blogs, and if you have something you enjoy drop
      me a DM or email! I’ll share what I am following throughout this section
      &lt;3</p>
      <h3>Blogs</h3>
      <p>Obviously, I am following blogs, one of the last holdouts of RSS. I
      have a few that I follow, mostly other transfolk on Mastodon that I found
      had their own blogs. Most non-trans folks I follow are using gemini and
      still rely on the feed aggregators for that.</p>
      <p>If you’re interested the two main ones I am reading right now are:</p>
      <ol>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://erininthemorn.substack.com">Erin In The Morn
              (substack)</a>
        </li>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.selfawaresoup.com/">Selfaware Soup</a>
        </li>
      </ol>
      <p>Which have been pretty insightful. Erin sharing a lot of US
      transgender news, which is good since I have dropped off using Reddit
      which is where I “got” my “news” from.</p>
      <h3>Podcasts</h3>
      <p>The other mainstay in RSS is podcasts. Some even say if a podcast
      can’t be consumed via RSS, is it even a podcast? I would agree.
      Everything else is just a show. I don’t <em>need</em> the content to be
      consumable from my reader, but I’d really appreciate it if were. I am
      always on the lookout for more podcasts though. With the only two
      consistent listens being:</p>
      <ol>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.relay.fm/penaddict">The Pen Addict Podcast
              (relay.fm)</a>
        </li>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.relay.fm/cortex">Cortex Podcast (relay.fm)</a>
        </li>
      </ol>
      <p>And currently off-season:</p>
      <ul>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.relay.fm/backmarkers">Backmarkers Podcast
              (relay.fm)</a>
        </li>
      </ul>
      <p>Which has a YouTube video format. Though, I honestly really don’t care
      for Austin Evans, I just enjoy consuming some F1 content and pretending I
      have friends I can talk to about motor racing.</p>
      <p>While writing this section I added:</p>
      <ul>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://inside.java/podcast/">Inside.java Podcast</a>
        </li>
      </ul>
      <p>I have yet to listen, some of the topics seem interesting and being
      infrequent gives me hope its quality over quantity. (And I like having
      podcasts for chores to distract my brain)</p>
      <h3>Tech News</h3>
      <p>Right now I follow two main news sources in tech:</p>
      <ol>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://www.debian.org/News/">debian.org/news</a>
        </li>
        <li>
          <a rel="external noopener noreferrer"
              target="_blank"
              href="https://lwn.net/">LWN.net</a>
        </li>
      </ol>
      <p>Running servers using stable debian - it’s good to know when security
      updates come in, as well as distro updates. And LWN is fantastic, I’ve
      been a subscriber for many years and while sometimes (Jake) can focus a
      bit heavy on Python news, has been always interesting to read.</p>
      <p>This is the section I plan on adding more and more to. I had other
      tech blogs that just felt like clutter and were pushing out daily
      articles that I couldn’t care less about (opensource.com cough cough).
      But that’s just me. Tech news is mainly where I want to focus - since
      fluff blogs are rarely my cup of tea.</p>
      <p>LWN has some links in their weekly editions for other news feeds I
      might consider directly subscribing too, but for now I have these.</p>
      <h3>Music News</h3>
      <p>Some folk have an RSS feed for their site updates, which I appreciate.
      Some use sites like Squarespace but don’t properly connect up the RSS
      feed which I do NOT appreciate.</p>
      <p>So right now I have two bandsites that DO update it seems (as their
      site aligns with the feed) - but the only one I’ll mention is: <a rel=
      "external noopener noreferrer"
         target="_blank"
         href="https://raisedbyswans.com/">raisedbyswans.com</a> I’ve spoken of
         this artist in my Music Spotlight MANY times and is one of my
         favorites. His site, while entirely simple, is setup with RSS and has
         been publishing his updates consistently. I appreciate this. Always a
         strong rec from me!</p>
      <p>I’ve been toying with Music Review sites that talk about new releases
      in the genres they specialize in, but I haven’t settled on anything that
      is helping me discover new music.</p>
      <h3>YouTube</h3>
      <p>This is probably where the biggest change has actually come in. Having
      my YouTube feed fed through RSS has been fantastic. I am able to not only
      refresh and not miss any updates (since YouTube sometimes likes to pull
      updates in out of order than I don’t see it because it’s buried between
      some other videos that I’d already seen.</p>
      <p>But this also allows me one further level of filtering on my YouTube
      subscriptions. I can stay subscribed to channels I am interested in
      watching <em>occasionally</em> but not every video, and keep those off my
      RSS feed. And for the “I like to watch most if not all the new videos” I
      can subscribe to those via RSS. So it’s like the “bell” but without the
      app basically. And since on Mobile I do NOT use the YouTube app (so I can
      take advantage of the Ad Blocker in Firefox) that’s great!</p>
      <p>What sucks / is tricky is actually subscribing to the RSS feeds
      because YouTube buried that feature now. You just need the channel_id or
      the username and you can subscribe using the following URL:</p>
      <pre><code>https://www.youtube.com/feeds/videos.xml?channel_id={ID}
</code></pre>
      <p>And you can obtain the channel_id either using the URL (though with
      aliases now (@channelname) its rare to see a channel_id in the URL) if
      present otherwise a little console JS can print it out:</p>
      <pre><code>ytInitialData.metadata.channelMetadataRenderer.externalId
</code></pre>
      <p>A note however - you’ll need to clear the console if you navigate to
      the next channel, at least in Firefox, it caches the result otherwise and
      you’ll print out the duplicate value. There are some tools where you can
      print your subscribers list into these feed URLs and bulk subscribe. I’ve
      lost the link (and it’s what I did initially) but I recommend doing the
      manual add at least to focus on the channels you WANT in RSS, since you
      can always fallback to the main subscriptions page on YouTube.</p>
      <p>But what this has given me is the ability to effectively ignore
      YouTube almost entirely. Ideally, I’d script something with YouTube-dl
      but I don’t REALLY care that much, and I’ve gotten into the habit of
      closing the tab after the video so I don’t stick around and get sucked
      into the algorithm.</p>
      <p>What my morning looks like is sitting down, switching to my tt-rss
      tab, seeing what’s fresh, and watching a video with my coffee maybe, then
      just moving on and doing something else. I still lurk Mastodon, or get
      sucked into my computer in some way or another, but it’s been really
      positive! I can count on one hand how many times since dedicating to RSS
      I’ve just clicked around YouTube.</p>
      <h3>Hobby</h3>
      <p>The last section which really is an extension of Blogs/News is “hobby”
      RSS feeds. These feed a bit into the consumerist side of life and why I
      keep them separate. Right now it’s almost <em>entirely</em> fountain pen
      related (Who&#39;da thought this community would still be writing blogs
      :P) but since most of the blog posts are either about products or reviews
      in some way, I try and limit how much I expose myself to them. I have
      been working on a draft about consumerism for quite a while now and just
      haven’t really worked it into a post that isn’t just DAE consumerism BAD?
      low-effort Toot level. (But basically, I kinda hate how all my hobbies,
      and hobbies in general rely heavily on a consumerism mindset, GAS, and
      such). So I’ve been trying to be more appreciative of what I already have
      and such.</p>
      <p>But these blogs are nice, and often keep in the know about my hobbies
      and can react to anything meaningful that’s being released. A good video
      sorta on this topic was by Adam Neely(<a rel=
      "external noopener noreferrer"
         target="_blank"
         href="https://www.youtube.com/v/mHoljbkyAEs">Adam Neely - How In-Ear
         Monitors are Making Better Musicians</a>), and how his band spend
         $6000 on gear for their tour, but what it did was eliminate stress and
         enable them to more easily fine tune and control how they monitor
         their live performance. He touches on the fact that gear videos feed
         into the consumerist mindset of music making, but gear is often
         necessary to facilitate certain things, and setting up a portable
         in-ear-monitor rig for their entire band is well… unavoidable. It’s
         just a minor aside in a much deeper video about IEMs and touring and
         FEEL. And quite the departure from his usual music education content.
         But it sums up the main thesis of my consumerism gemlog quite nicely I
         feel (or at least I am projecting my thoughts into a brief aside he
         makes).</p>
      <h2>tt-rss - in retrospect</h2>
      <p>So tt-rss is <em>fine</em> honestly, I think I need to setup a better
      theme, something that has a bit more contrast. I don’t REALLY read in it,
      I just use it as the aggregator and then open the links directly. I don’t
      mind the way it renders the full articles with images, but I do mind how
      GREY it is by default (in “night” theme). It looks totally customizable
      and I bet I can download a decent theme for it if I look. But I may spend
      some time doing that and try and read more in application.</p>
      <p>But other than that it’s been quite the improvement over my internet
      experience. More RSS!!</p>
      <h2>Conclusion</h2>
      <p>I need more feeds, as I do enjoy reading. So I’m always on the look
      out. I hate to throw in engagement-y things like “let me know” stuff but
      I am genuinely looking for interesting suggestions for stuff you might
      subscribe to over RSS. Even if it’s just “this is my webblog” :) I always
      like reading people’s things. I should troll the aggregators and look at
      folks capsule landings to see what is linked!</p>
      <p>Anyway, you should look into getting an RSS aggregator setup. It’s
      been really impactful on cutting down on internet scrolling and
      mindlessness.</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>CSS Themes Exist Now!?</title>
  <link>https://www.senders.io/blog/2022-12-05/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2022-12-05/index.html</guid>
  <pubDate>Mon, 05 Dec 2022 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>CSS Themes Exist Now!?</h2>
      <p>Yeah news to me too! Seems like according to <a rel=
      "external noopener noreferrer"
         target="_blank"
         href=
         "https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme#browser_compatibility">
      the MDN</a> it’s been supported since 2019 for most browsers and
      supported by all by now.</p>
      <p>This is so wild!</p>
      <h3>Why is this cool?</h3>
      <p>Well you may have noticed this is in dark mode now (if you set your
      preferences to dark in your OS/Browser). But this is cool because it
      means we’re no longer restricted to using Javascript and custom
      preferences for websites.</p>
      <p>I had assumed this existed because sites like GitHub were defaulting
      to darkmode despite me never setting anything in like my profile
      settings. But I just assumed based off of my legacy knowledge this was
      some custom render trick using javascript.</p>
      <h4>Still no JS!</h4>
      <p>I keep this blog JS free! While not all pages under the senders.io
      umbrella are javascript free - everything in www.senders.io (this blog)
      will always be.</p>
      <p>I try to keep that, not only for my sake, but for your sake too - a
      javascript free blog means the priority is reading.</p>
      <h3>Examples</h3>
      <p>So I achieve darkmode in this blog by doing the following:</p>
      <pre><code>/* default / light */
:root {
  --background: white;
  --font: black;
  --quote: #eee;
  --link: #0303ee;
  --linkv: #551a8b;
  --linkf: #f02727;
  --articleborder: #060606;
  --tableborder: #aaa;
  --tablehead: #ebcfff;
  --tablez: #eee;
}
@media (prefers-color-scheme: dark) {
  :root {
    --background: #1e1e1e;
    --font: #eee;
    --quote: #444;
    --link: #00d3d3;
    --linkv: #cd78f4;
    --linkf: #f02727;
    --articleborder: #23ed9b;
    --tableborder: #aaa;
    --tablehead: #6f5a7e;
    --tablez: #313131;
  }
}
</code></pre>
      <p>Essentially, I leverage <a rel="external noopener noreferrer"
         target="_blank"
         href=
         "https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties">
      CSS Variables</a> to define the specific areas I set theme specific
      colors (my nav bar is static regardless of dark/light mode for
      example).</p>
      <p>Then if the media preference is dark - I overwrite the variables with
      my dark mode values!</p>
      <p>Whats tricky is originally most of these values didn’t actually HAVE
      values set - I relied on the system default for things like links and the
      page colors in an effort to use minimum CSS as well.</p>
      <p>I still feel like I am honoring that since I don’t have to duplicate
      any actual CSS this way, I just have a lookup table of color values.</p>
      <p>That being said my CSS file is still only about 3kB which is not so
      bad. And I’ve actually covered most themed properties already - links,
      tables, quotes.</p>
      <h4>Toggling Themes</h4>
      <p>Something else I found out during this experiment is you can actually
      toggle the themes directly in your developer tooling. By opening your
      devtools and going to Inspector (in firefox at least) there are two
      buttons in the styles section “toggle light color scheme” and “toggle
      dark color scheme” using a sun and moon icon.</p>
      <p>This made testing VERY easy and actually is what I noticed to prompt
      me into looking up if this was a standard CSS thing or not. So thanks
      Mozilla!</p>
      <h3>Conclusion</h3>
      <p>Yeah if you’ve never realized this check out the MDN guides on both
      variables (I didn’t realize these got put in the standard either!) and
      themes!</p>
      <ul>
        <li>CSS Variables: <a rel="external noopener noreferrer"
              target="_blank"
              href=
              "https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties">
          https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties</a>
        </li>
        <li>CSS Media prefers-color-scheme: <a rel=
        "external noopener noreferrer"
              target="_blank"
              href=
              "https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme">
          https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme</a>
        </li>
      </ul>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>My Markdown -> HTML Setup</title>
  <link>https://www.senders.io/blog/2022-11-06/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2022-11-06/index.html</guid>
  <pubDate>Sun, 06 Nov 2022 00:00:00 -0400</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>My Markdown -&gt; HTML Setup</h2>
      <p>A common way I see a lot of people blog, especially micro-blog, is in
      <a rel="external noopener noreferrer"
         target="_blank"
         href="https://daringfireball.net/projects/markdown/">markdown</a>.</p>
      <figure>
        <blockquote>
          <p>Markdown is a lightweight markup language for creating formatted
          text using a plain-text editor.</p>
        </blockquote>
        <figcaption>
          <cite>— <a rel="external noopener noreferrer"
             target="_blank"
             href="https://en.wikipedia.org/wiki/Markdown">Wikipedia |
             Markdown</a></cite>
        </figcaption>
      </figure>
      <p>It built itself on-top of common syntax prevalent on the web and was
      designed to be converted into simple HTML output. Since it leveraged
      preexisting syntax it was easy for new users to pick up, and is now found
      all over the web and applications.</p>
      <p>Since I started this website, I had been writing each page by hand
      using a few tools to facilitate that - and for a while I had been looking
      for a good way to try out using markdown to generate some lighter pages
      and these blogposts.</p>
      <h3>Writing HTML by hand</h3>
      <p>When it comes to blogging a lot of platforms offer WYSIWYG editor –
      allowing users to write in rich-text that then gets converted into HTML
      in the style of the platform. But for my case, since I self host this
      website, I decided to stick to my roots and write PURE HTML instead.</p>
      <p>HTML is fairly simple and easy once you get use to the basic structure
      of the system. And since I’ve been working in HTML almost two decades
      now, at the time it felt like the best solution to make a clean
      website.</p>
      <p>I briefly touched on my design process in <a href=
      "/blog/2019-01-21/">2019-01-21 - First! A New Years Resolution</a>
      outlining that I wanted to make a very lightweight and simple website.
      And at the time I believed the best way to achieve this goal was to
      carefully structure and craft my website’s HTML by hand.</p>
      <p>This article is making the process sound far more difficult than it is
      – it’s mostly just tedious.</p>
      <pre><code>&lt;article&gt;
&lt;h2&gt; Title &lt;/h2&gt;
&lt;p&gt;
   Some paragraph....
&lt;/p&gt;
&lt;h3&gt;
&lt;p&gt; some subsection &lt;/p&gt;
&lt;/h3&gt;
&lt;p&gt; more text &lt;/p&gt;
... etc
</code></pre>
      <p>Is essentially what the website looks like - you can view the source
      of this page to see – it’s very simple HTML.</p>
      <p>The benefit I found doing this, mostly leveraging <a href=
      "www.html-tidy.org/">tidy</a>, allowed a very easy to edit codebase. And
      by leveraging the existing tags and their properties I also attempted to
      keep the styling to an absolute minimum. Using existing tags to enforce
      the styling I desired.</p>
      <p>Only for certain areas (tables, code, quotes) where readability is an
      issue do I setup custom CSS.</p>
      <p>Most of this process is actually what will continue to happen but the
      actual writing process will be unobstructed by the tedium of writing
      HTML.</p>
      <h3>Micro-blogging in general</h3>
      <p>At the time of writing this, I have no ported over any of my <a rel=
      "external noopener noreferrer"
         target="_blank"
         href="https://gemini.circumlunar.space/">Gemini</a> micro-blogs. This
         warrants a longer post, since I wrote consistently in gemini from
         March 2021 through May 2021 – having only stopped due to a long move
         leading to a lot of server downtime breaking the habit. My gemini
         updated multiple days a week - mostly due to the extremely lightweight
         and limited nature of the platform.</p>
      <h4>Gemtext</h4>
      <p><a rel="external noopener noreferrer"
         target="_blank"
         href="https://gemini.circumlunar.space/docs/gemtext.gmi">Gemtext</a>
         was the gemini protocol’s standard MIME type. It was a basic markup
         language that relied on line based syntax. It was purposefully as lean
         as necessary because this was what was ACTUALLY being served to
         clients – unlike Markdown which first needed to be converted to HTML,
         gemtext was the actual text served and rendered on the viewers client.
         You could customize the style of your client - but you could not, as
         an author, dictate how your content would be viewed. This meant the
         only aspects of your blog you had control over was the actual content
         and it’s structure – which for a blog is really all you should care
         about.</p>
      <p>It’s syntax contained most of what I was actually using here already
      from HTML:</p>
      <ol>
        <li>headings</li>
        <li>paragraphs that were wrapped based on page-width</li>
        <li>links</li>
        <li>lists</li>
        <li>quotes</li>
        <li>preformatted-text / codeblocks</li>
      </ol>
      <p>Besides links - it also leveraged the same common syntaxes that
      markdown did.</p>
      <h4>Gemtext links</h4>
      <p>From my brief time in the IRC and in geminispace in general - a lot of
      the “recommendations” came from new users about providing in-line links.
      The philosophy was that by forcing links to exist on their own line -
      clients could configure how they wanted these to be seen and not have to
      worry about links interfering with the text.</p>
      <figure>
        <blockquote>
          <p>Like Gopher (and unlike Markdown or HTML), Gemtext only lets you
          put links to other documents on a line of their own. You can’t make a
          single word in the middle of a sentence into a link. This takes a
          little getting used to, but it means that links are extremely easy to
          find, and clients can style them differently (e.g. to make it clear
          which protocol they use, or to display the domain name to help users
          decide whether they want to follow them or not) without interfering
          with the readability of your actual textual content.</p>
        </blockquote>
        <figcaption>
          — <cite><a rel="external noopener noreferrer"
             target="_blank"
             href=
             "https://gemini.circumlunar.space/docs/gemtext.gmi">gemini.circumlunar.space
             – A quick introduction to “gemtext” markup | Links</a></cite>
        </figcaption>
      </figure>
      <p>I felt that this provided a lot of useful limitations that removed a
      huge barrier for me to actually write down ideas without feeling over
      burdened. I also lurked in the IRC - as well as <a rel=
      "external noopener noreferrer"
         target="_blank"
         href="https://github.com/s3nd3r5/java-gemini-server">implemented my
         own gemini server</a>.</p>
      <p>As a quick aside – the java server was a lot of fun! The protocol was
      very simple to work with for basic gemtext. I felt the ultimate downside
      was trying to build something for basic gemini capsule hosting (like I
      was using for a decent chunk of my time with gemini) - and something for
      developers to use as a base application server. At the time in 2021 a lot
      of talk was happening on IRC of users starting to look to provide more
      complex experiences via the protocol and I wanted a way for those
      interactions to be built out in Java - since most were in Go or Python at
      the time. This decision lead to me burning out due to difficulties
      splitting those responsiblities easily - where you could host along side
      your application - since I lacked the experience with more complex Gemini
      capsule applications.</p>
      <p>But it was a good experience and I got hands on experience with Certs,
      Netty, and SNI - which actually came in handy at my job!</p>
      <h3>Wasn’t this about Markdown?</h3>
      <p>A lot of what I liked about Gemini I found missing when I returned to
      the World Wide Web. Writing a new post was tedious and I actually had a
      few drafts sitting unposted. They’re probably checked into my git at this
      moment! So I thought - why not just use markdown and convert to HTML?
      That’s what it’s built for - and I already designed my site to work with
      minimal customization of raw HTML tags!</p>
      <h3>How I use Markdown</h3>
      <p>Firstly, this blogpost was written in Markdown (with minimal HTML
      sprinkled in). Then I render the markdown into HTML using <a rel=
      "external noopener noreferrer"
         target="_blank"
         href=
         "https://www.pell.portland.or.us/~orc/Code/discount/">Discount</a>.
         Frankly, I don’t know how I stumbled across this markdown parser - I
         think it came pre-installed on my KDE Arch system because another KDE
         program used it. But I liked it, and it seemed extensible enough for
         my needs.</p>
      <p>This would produce the “body” of my articles - and I could then
      prepend and append the template-head and foot to my html output to form a
      blog post/web page.</p>
      <h4>Customizations</h4>
      <p>After I generated the output file, I replaced some placeholders in the
      templates via <code>sed</code> and then <code>tidy</code>’d the HTML. The
      only other major issue was Discount had no way of appending any link
      attributes – so for external links I had <code>sed</code> append the
      <code>rel</code> and <code>target</code> attributes - which work off the
      assumption they’re not there. A lot of my home-server scripts rely on
      assumptions…</p>
      <p>This is all bundled up in a simple script file so I can just supply a
      few arguments and the full page is re-rendered on command.</p>
      <h3>Two Sources of Truth</h3>
      <p>In the sytem I devised the markdown files are really the “source of
      truth” but you could argue that the HTML files hold equal weigh - as
      they’re what you’re reading right now. The markdown is only useful if I
      render it as HTML. There exist nginx extensions to serve markdown as HTML
      so I store everything as markdown. I could also provide some heading
      information to the markdowns to remove the command arguments and have on
      boot it generate the .html files in place before launching the site… But
      these are all nice ideas for a later date.</p>
      <p>Ultimately, this is something I contribute to ocassionally - I don’t
      need something too complicated. I just need to output some HTML a few
      times a year. So if I manually publish the HTML each time - that’s likely
      far more efficent then re-rendering.</p>
      <h3>Learnings</h3>
      <p>This is the first post that uses this - though I’ve converted a page
      over to this already. But once I worked out the kinks and built a flow
      that works for me - this made the writing process a LOT easier. Another
      issue was that once I <code>tidy</code>’d the HTML file - it became
      frustrating to edit, and I didn’t always re-tidy it. Because the output
      is always <code>tidy</code>’d by the script - I can edit the raw markdown
      as needed. And the script generally will always output the same file
      (with whatever changes I made of course). This makes the editing and git
      history a lot clearer.</p>
      <p>I would recommend writing in markdown - or even trying out gemini -
      you can host your gemini capsule on the web even! (Most gemini webpages
      are gemini capsules converted). I am sure other “blog focused markups”
      also exist too.</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>Manjaro Followup - Breaking things!</title>
  <link>https://www.senders.io/blog/2021-01-05/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2021-01-05/index.html</guid>
  <pubDate>Tue, 05 Jan 2021 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>Manjaro Follow-up - Breaking things!</h2>
      <p>I wanted to write a quick follow-up covering how I managed to break,
      and then recover, everything when I went to remove my old debian
      partition.</p>
      <h3>Recap</h3>
      <p>To recap: I installed Manjaro alongside a Debian/sid and Windows 10
      install. Each of those OSs were on their own SSDs. I went from a 128SSD
      with Windows installed, to adding a 256 installing Debian. Years later I
      split the Debian SSD into two parts - installing Manjaro on my new slice.
      Since my last update I have been playing around with Manjaro and having
      made my i3 keybindings for Kwin I&#39;ve been pretty happy. But then I
      started breaking things.</p>
      <h3>Break stuff</h3>
      <p>I broke my Manjaro by updating my Debian (apparently). To be honest
      this is the one part I don&#39;t fully understand <i>why</i> it happened.
      From what I could find online I didn&#39;t setup my system to handle two
      separate Linux OS installs. But I was no longer able to boot directly
      into Manjaro without using the initramfs failover boot option. I only
      updated my Debian install because I was debugging something on my work
      install, which both run Debian/sid. (Otherwise I would&#39;ve used my
      server which runs Debian/Stable). But considering I hadn&#39;t had any
      need to boot back into Debian I decided to just get rid of it!</p>
      <h3>GParted, Grub, Gotchas!</h3>
      <p>I went in knowing I&#39;d have to fix my Grub since I&#39;d be
      removing Debian, which was the OS that I configured when I first
      dualbooted the machine, so I assumed they were linked somehow and I would
      need to reinstall it. The process I followed was:</p>
      <ul>
        <li>Create a GParted Live USB</li>
        <li>Launch GParted reconfigure my partitions</li>
        <li>Open the terminal in the live USB and reinstall Grub</li>
      </ul>The 3rd point being a bit of a &quot;rest of the owl&quot; I
      wasn&#39;t sure what to expect. GParted thankfully warns you
      &quot;you&#39;re probably going to break stuff see our FAQ&quot; which
      had a section on reinstalling grub. Reading that the 3rd part became:
      <ul>
        <li>mount the linux OS</li>
        <li>bind the live dirs that are needed: <code class='inline'>/dir /sys
        /proc</code></li>
        <li>chroot into the mounted folder</li>
        <li>run <code class='inline'>grub-install &lt;device&gt;</code></li>
      </ul>But what I failed to realize (stupidly in hindsight) was the
      &quot;device&quot; is the Master Boot Record (MBR) device. So in my case
      Windows or <code class="inline">/dev/sdb</code>. I had assumed it was the
      device of the linux install so I tried that and got notified my EFI boot
      directory didn&#39;t look like an EFI partition... and from here it was
      rabbit holes.
      <h3>Where is my EFI partition?</h3>
      <p>I have a fairly old Windows 7 install that has been upgraded to
      Windows 10 during this whole journey. I&#39;ve been meaning to reinstall
      it (on a larger drive). But rather than having a few partitions on my
      drive (typically having a boot partition) I just have the one (and a
      recovery partition). Its marked as boot, and even mounted to <code class=
      'inline'>/boot/efi</code> I found when I was able to boot into Manjaro
      again. But it made no sense to me. If I needed an EFI partition, why was
      my efi pointed to the root of my Windows C drive? The rabbit hole
      consisted of:</p>
      <ul>
        <li>Creating a 200MB Fat32 Boot partition</li>
        <li>Mounting that as my efi-directory</li>
        <li>Reinstalling grub (again on my Linux device)</li>
        <li>Eventually getting it to boot straight into Manjaro</li>
        <li>Modifying my <code class='inline'>/etc/fstab</code> to mount my
        boot/efi to the new partition (oops)</li>
        <li>Repeating the above steps 5 times hoping something would be
        different</li>
        <li>Eventually finding in a forum that grub should be on the
        MBR...</li>
      </ul>
      <h3>The Fix and Final Steps</h3>
      <p>The fix was to basically follow the steps above but use the MBR:</p>
      <ul>
        <li>Boot GParted Live USB</li>
        <li>Properly configure any partitions (this case delete the
        &quot;EFI&quot; partition)</li>
        <li>Mount the linux device</li>
        <li>Bind the necessary live dirs to the linux mount</li>
        <li>Run grub-install to the MBR device</li>
        <li>Reboot</li>
      </ul>It was that misunderstanding about the MBR that sent me on a path,
      but now I at least feel semi-confident in changing around my OSs knowing
      how to fix Grub. But what bout the Fstab?
      <p>Like all true movie monsters, my stupidity came back for the final
      scare. I booted into Manjaro, from Grub! to have it crash on me. It
      couldn&#39;t mount one of the devices! The deleted partition! I was in
      the recover shell and was able to modify the Fstab to point back to the
      correct boot/efi device. (Thankfully I was familiar with Fstab to begin
      with). But editing two files in a super-low-res terminal is not my idea
      of fun (okay, maybe it is).</p>
      <h3>Conclusion</h3>
      <p>One of my new years resolutions was to learn more about my system. So
      lighting a fire I had to put out was a great way to get some more
      knowledge on maintence for grub/dualbooting.</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>Manjaro Experiment</title>
  <link>https://www.senders.io/blog/2020-12-17/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2020-12-17/index.html</guid>
  <pubDate>Thu, 17 Dec 2020 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>Manjaro Experiment</h2>
      <p>After years on Debian, running i3, I decided to try out a more
      traditional Linux setup, and take a stab at gaming on Linux. I chose
      Manjaro for a few reasons:</p>
      <ul>
        <li>It&#39;s not Debian based (it&#39;s arch btw /s)</li>
        <li>It&#39;s still on Systemd so I won&#39;t lose that familiarity</li>
        <li>For gaming it comes with pretty up to date drivers and setup for
        running Steam games</li>
        <li>It has a KDE installation which is what I wanted to run</li>
      </ul>
      <h3>Why &quot;not Debian&quot;</h3>
      <p>Debian is home for me. I have used it for years on both work machines,
      servers, personal desktop. But it comes with its own quirks. Starters - I
      am running base Debian, not a Debian based system, which generally means
      some packages are out of date. To get around this I run Sid/Unstable.
      This hasn&#39;t been a particular issue, but sometimes there are version
      conflicts and other just nuisances and no real <i>easy</i> way to get
      every package in the proper version configuration. This was a particular
      pain-point with getting Steam (nonfree too which adds another layer of
      configurations) Wine and a few other packages all set up. Plus
      32-bit!</p>
      <h4>i3</h4>
      <p>I have been using i3 as my window manager and without really any other
      desktop environment programs. My login is the typical tty debian login.
      But running i3 and then having windows appear, especially game windows
      which can be tempermental, getting tiled to have to break it out again is
      just a hassle. While I could&#39;ve gone with another Debian base running
      a proper desktop environment + window manager I figured that&#39;d be
      boring and I&#39;d just be trying out the programs and not the Linux,
      which is half the fun.</p>
      <p>That being said. i3 <i>is</i> Linux for me. Being able to just move
      between windows with a macro and every bit of it just being intutive
      (after you&#39;ve learned!) is a productivity booster. Which is why I
      still use it on my work machine, and can&#39;t see myself ever switching
      off.</p>
      <h3>KDE</h3>
      <p>I&#39;ve used Gnome and XFCE as desktop environments before, and
      they&#39;re fine, but I&#39;ve always like the customability,
      flexibility, and polished look of KDE.</p>
      <h4>Setting up KDE for an i3 addict</h4>
      <p>By default KDE isn&#39;t really too hard to &quot;get used to&quot;
      since it feels like any other OS, especially a windows setup. But the
      main thing I needed to change is the <code class=
      'inline'>meta+&lt;key&gt;</code> commands.</p>
      <ul>
        <li>Remapping the Virtual Desktop changes</li>
        <li>Remapping the KWin window focuses</li>
        <li>Remapping the KWin move to desktop</li>
        <li>Installing DMenu</li>
        <li>Shrinking the &quot;start bar&quot; panel</li>
        <li>Removing Pager</li>
        <li>Changing Task Manger to Window List</li>
        <li>Configuring Desktop Layout to &quot;Desktop&quot; (this removes the
        icons)</li>
      </ul>Doing this helped make me feel at home so far, and not have to
      retrain my brain.
      <h4>Some of the key remappings</h4>
      <p>Setting up the KWin window keymapping was really what made me feel at
      home. For the first few hours with it, I felt as limited in my
      productivity as with Windows. KDE and Windows share by default a lot of
      the same keymappings around window manipulation and virtual desktop
      changes. <b>Switch to desktop N</b> setting this as <code class=
      'inline'>meta+&lt;N&gt;</code> where N is the dekstop 1-10 (0). <b>Switch
      to Window to the Left/Right/Up/Down</b> This was one I was nervous
      wouldn&#39;t exist as a keybind. But What was <code class=
      'inline'>meta+alt+&lt;dir&gt;</code> was mapped to without the alt. This
      allowed for the very annoying lack of ability to just jump between
      browser and terminal, or especially two separate terminals. <b>Quit
      Window</b> with <code class='inline'>meta+shift+Q</code>, <b>Tile
      Window</b> command to use the Shift key rather, especially as
      <code class='inline'>meta+&lt;dir&gt;</code> was overwritten by the focus
      switching.</p>
      <h3>Manjaro</h3>
      <p>So I went with KDE Manjaro. Manjaro aims for the gaming desktop
      experience. Arch is new for me, so I feel that would be something to
      adjust to and learn.</p>
      <h2>Gaming</h2>
      <p>It has only been a day with it as I am writing. But I was able to get
      a fair amount of the fighting games I wanted to play work.</p>
      <h3>Proton + Steam</h3>
      <p>So far my main focus has been running the fighting games I noodle
      around on in Steam. To do this I launched Steam and installed the proton
      and setup to run all games, regardless of compatibility. None of the
      games I hoped to run had worked this way. I then opt&#39;d into the beta
      for Proton running the experimental builds, which should generally have
      the more up-to-date tunings for games. With this setup I was able to get
      Soulcalibur VI to work. Battle for the Grid and Dragon Ball FighterZ both
      had launching issues. So I looked around and found <a href=
      "https://github.com/GloriousEggroll/proton-ge-custom/">Proton Ge
      Custom</a> which is a custom fork of Proton that contains custom settings
      and tweeks for various games. One of which is Battle For the Grid which
      is how I found it. Using this I was able to play every game except Dragon
      Ball FighterZ! A callout for Dead or Alive 6 which is performing
      questionably. It can run and isn&#39;t actually too bad, but in windowed
      or borderless it stutters and drops frames.</p>
      <h4>Other issues</h4>
      <p>Even on Windows there are issues with some games and your standard
      configurations. Disabling Steam Overlay and adjusting the Steam Input
      Setting on some games helped get some games working.</p>
      <h3>Conclusion</h3>
      <p>Gaming on Linux is still not great. Its MILES ahead of where it was
      even a few years ago when I setup this PC. And I think it will take some
      adjustment getting a feel for an i3less workflow.</p>
      <h2>Update!</h2>
      <h3>NTFS mounting</h3>
      <p>Update! I got DOA and a few other games to run a bit smoother by
      remounting my NTFS drives properly. I ended up using the following for my
      /etc/fstab configuraiton for my NTFS drives: <code>UUID=&lt;drive-id&gt;
      /mount/path ntfs
      uid=1000,gid=1000,rw,user,exec,async,locale=en_US.utf8,umask=000 0
      0</code> I had noticed that both steam and mount.ntfs was running at
      20-40% CPU while not really doing anything. And then upwards of 80%
      during gameplay.</p>
      <h3>i3 Compatibility</h3>
      <p>As I spend more time using the OS I made a few more adjustments:</p>
      <ul>
        <li>Removed everything except the Clock and System Tray.</li>
        <li>I added KRunner to <code class='inline'>meta+space</code> to ease
        running KDE specific programs that I can&#39;t be bothered to memorize
        the name of</li>
        <li>Back and forth on forcing &quot;No border&quot; on all windows.
        Part of the reason I moved away from i3 was so that I had better
        floating window management. And doing this would basically put me in an
        equally hard to manage system for floating game windows. So until I
        find a plugin that makes small taskbar/borders for the windows I&#39;ll
        be sticking with the default.</li>
        <li>On Manjaro at least: UNINSTALL mesa-demos! <code class=
        'inline'>sudo pacman -R lib32mesa-demos mesa-demos</code> This package
        had the annoying &quot;fire&quot; demo which made dmenu opening firefox
        a pain in the ass.</li>
      </ul>The biggest difference was removing the Application Launcher from
      the main panel. Having it there really felt like a crutch for running
      programs. It is equal I would say to running apps as dmenu via
      <code class='inline'>meta+d</code> vs just <code class=
      'inline'>meta</code> to launch the Application Launcher. However, the
      bulky UI of it, even using just Window List, took away from the look/feel
      I was going for.
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>Bread Blog (First post)</title>
  <link>https://www.senders.io/blog/bread/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/bread/index.html</guid>
  <pubDate>Mon, 17 Feb 2020 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>Bread</h2>
      <p>I decided to make a singular dedicated page to my recent bread bakes.
      I am trying to at least keep a log of each bake, what went wrong/right in
      hopes of nailing a recipe that works best for me.</p>
      <h3 id="2020-02-17">February 17, 2020</h3>
      <p>First post! I have done four bakes in 2020 that are worth mentioning.
      Three that ended up rather successful and one lesson learned. Because
      this is my first post its containing three very similar bakes that were
      effectively the same recipe</p>
      <h4>Boules</h4>
      <p>I have made two very good boules in 2020. I first made a pate
      fermentee using the following ratio using 50% of my total flour weight:
      (500g, so 250g).</p>
      <table class="bake-info">
        <caption>
          Pate Fermentee
        </caption>
        <thead>
          <tr>
            <th>Item</th>
            <th>%</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>Flour (Bread)</td>
            <td>100%</td>
          </tr>
          <tr>
            <td>Water (Room temp)</td>
            <td>70%</td>
          </tr>
          <tr>
            <td>Yeast (Instant)</td>
            <td>0.55%</td>
          </tr>
          <tr>
            <td>Salt</td>
            <td>10%</td>
          </tr>
        </tbody>
      </table>To make the pate, I mixed all the dry ingredients together, then
      added the room temperature water. I let that loose mixture rest for 15
      minutes. Once it was rested, I wet my hands and bench (lightly) and
      kneaded for roughly 8 minutes. After kneading I tightened the dough into
      a boule and let it sit in a plastic wrap covered greased bowl for an
      hour. After an hour I placed it into the friged, as is.
      <p>The next day, basically in the AM when I had time to bake I took the
      dough out of the fridge, cut it into smaller bits (four), and let it come
      to room temperature (ish, about an hour). I prepped the same ratio above
      except with warmer water (~108°F). When I added the water to the dry
      ingredients I added the pate along with it. I used the curved edge of my
      scrapper to cut into the pate and incorporate it fully. Once I felt it
      was all one loose mess I let it sit for 15 minutes. After the 15 minutes
      I wet my hands, and bench, and began to knead the dough for 8 minutes.
      After kneading I formed the dough into a boule and placed it into a
      greased bowl covered in plastic wrap. I let that sit on my bench for 90
      minutes or so. After the first proof I dampened my bench and took the
      risen dough out of the bowl and lightly pressed it into a thick circle. I
      then took the, what would be, corners of the mass and folded them into
      the center, rotating after each fold. This process creates a boule shape
      while creating tension. I would continue to do this about 8-10 times
      really until it felt like I couldn&#39;t grab anymore/it wouldn&#39;t
      stick. Then I flipped the dough over and tightened the boule in a
      scooping motion as I rotated it. Then placed it into my floured banneton.
      I let it rise again for about 45 minutes. Around the 30 minute mark I
      would preheat my oven to 500°F. Once the oven was preheated and its been
      at least 45 minutes. I flipped out the dough onto the peel (dusted with
      corn flour) and scored it. I then misted the top with a spray bottle of
      water and slid it onto my baking stone. While preheating the oven I also
      set a kettle to boil some water which I poured into the preheating baking
      sheet on the bottom rack. I set the timer for 10 minutes and every two
      minutes or so I would add more boiling water. After 6 minutes I rotated
      the dough using the peel (careful not to damage it). And misted the
      facing side with the spray bottle (I found the back is lighter so this
      helps make the entire steaming more even). After the turn and mist I add
      twenty minutes to my timer and drop the temperature to 450°F.</p>
      <p>This produces a nice, well risen boule with a golden brown crust.</p>
      <p>I skipped the pate in my most recent bake and just did 100% (500g)
      starting from &quot;day 2&quot;. I also subtituted 100g with AP
      flour.</p>
      <h4>Baguettes</h4>
      <p>I actually did the boule recipe first for my baguettes. I did aiming
      for 1000g flour so my pate was with 500g and a 50/50 AP/Bread mix. I
      screwed up the ratio for yeast and added almost double. The recipe is
      essentially the same with the final steps being the difference.</p>
      <p>After the first proof I sliced the dough into three chunks. Then I
      formed those into boules and let them sit for 5 minutes. After resting I
      then rolled them into batards and let them sit for 10 minutes. After 10
      minutes I then rolled them into baguettes and placed them on the baguette
      sheet. And then baked them. After letting them rise for 45 or so
      minutes.</p>
      <h4>Accidents</h4>
      <p>Baguette rolling is hard. And I need to let the dough rest longer
      between each shape.</p>
      <p>1000g for three ~15 inch baguettes is too much. I would do 750g next
      time.</p>
      <p>Proofing on the sheet is not recommended in the future as the rose
      really well (probably all that extra yeast!) and ended up sticking
      together.</p>
      <p>I broke my oven light with my spray bottle. And I ruined my cast irons
      seasoning usnig that for the boiling water.</p>
      <h4>What to do next time</h4>
      <p>Next french style boule, I want to do a pate again. As I&#39;ve only
      done it for one boule loaf. And I want to try making two loafs from
      it.</p>
      <h2>Resources</h2>
      <p><a target="_blank"
         href="https://bakewithjack.co.uk">Bake With Jack&#39;s Youtube
         Channel</a> really helped me shape up my shaping up. And the core of
         the pate+french bread recipe is based on that from <a target="_blank"
         href=
         "https://www.goodreads.com/book/show/39910.The_Bread_Baker_s_Apprentice">The
         Bread Baker&#39;s Apprentice</a></p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>remember/recall - what could’ve been a command line tool</title>
  <link>https://www.senders.io/blog/2020-01-13/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2020-01-13/index.html</guid>
  <pubDate>Mon, 13 Jan 2020 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>remember/recall - what could&#39;ve been a command line tool</h2>
      <p>During a meeting at work when I realized I often forget useful
      commands. So I had the bright idea to create a command line tool that
      would basically append a file with the command you wanted to remember
      that you could search over later if you wanted to recall a certain
      command. I figured I could it could just be a simple bash script that
      recalls your bash-history and appends it to a file, all things that are
      incredibly easy to do... or so I thought.</p>
      <h3>Look before you leap</h3>
      <p>This article is a reminder to myself to test the core functionality
      first, before decorating your program/script with all those bells and
      whistles. While I did learn a lot in the process it is always a good to
      check the basics first.</p>
      <h3>What went right</h3>
      <p>I actually ended up learning a lot during the development of the
      (never finished) tool. I had never used <code>getopts</code> inside a
      script before, which turned out to be extremely intuitive. That was all
      that went right...</p>
      <h3>What went wrong</h3>
      <p>Literally, everything else that could&#39;ve went wrong did. The
      &quot;project&quot; was a single bash script roughly 160 lines long
      before I found out it wouldn&#39;t work. It was a series of flags that
      enabled actions that called functions, some of which ended the script
      either successfully or not. It wasn&#39;t necessarily a mess to read (I
      tried to make it that every function ended up in an exit so I knew if I
      entered I would need to assume it terminated) but it was hard to follow
      when writing. I tried to allow it so you could default an action to make
      the CLI intuitive which lead to a messy set of if/elses and switch
      cases.</p>
      <h4>You can&#39;t access un-committed bash history</h4>
      <p>History command in a bash shell commits the history at the end of the
      session. This makes sense once you know this, there are a lot of reasons
      saving the commands to file after every execution is probably not the
      best idea. However, it can be enabled with a flag when you enable a shell
      session. But I didn&#39;t want to build a tool that required me to
      remember I had to add something to my bash_profile before it would work.
      I wanted something I could just copy onto a new machine and have access
      to its functionality.</p>
      <h3>Lesson learned</h3>
      <p>While developing a tool to help me remember things, I learned
      something I cannot forget: Test the core, simplest functionality first.
      Before you do anything validate what you&#39;re trying to do will work.
      Because after building all of these fancy bells and whistles, if it
      can&#39;t do the basics, there is no point.</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>Lisps, Assembly, C, and Conlangs</title>
  <link>https://www.senders.io/blog/2019-12-09/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2019-12-09/index.html</guid>
  <pubDate>Mon, 09 Dec 2019 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>Lisps, Assembly, C, and Conlangs</h2>
      <p>I had originally hoped to do more blogging as a way of practicing my
      writing and an incentive to do more hobby programming. The intent was
      never to make this site solely programming, I had actually a few scrapped
      posts about baking and guitar that just didn&#39;t get anywhere... but
      that being said I did have a fair amount of hobbying in 2019 that I can
      share some unfiltered, semi-structured thoughts on.</p>
      <h3>Racket, 80x86, and even more C</h3>
      <h4>Racket</h4>
      <p><a target="_blank"
         href="https://racket-lang.org">Racket</a> is a general-purpose
         lisp-like language. I had began messing around in it with the
         intention of creating a similar language to <a target="_blank"
         href="https://docs.racket-lang.org/scribble/">Scribble</a> a document
         authoring language written in Racket. I made <a target="_blank"
         href="https://xkcd.com/1205/">the classic mistake</a> of trying to
         create a productivity tool rather than just do the task I had
         originally intended to do. It was interesting messing around in a
         lisp/functional language which I haven&#39;t really used in a long
         time. I wish I had more insightful things to say about it or project
         to share. Either way its very worth the look.</p>
      <h4>6502 -&gt; 80x86 -&gt; Commander X16</h4>
      <p>I wanted to play around with writing some assembly language programs.
      I looked back at the NES tutorials and tried writing some basic
      hello-world programs for it, but never really came out with anything
      worth while. I booted up dosbox and tried experimenting in some DOS
      programming to get a kick of nostalgia. On my way over to a friends
      apartment I stumbled across an 80x86 reference book which I took home and
      dug into. I made some decent progress in, relative to my 6502 learning.
      But this was in the summer, and I was preparing for what would turn into
      a pretty time consuming move. After my move, my puppy, and some youtube,
      <a target="_blank"
         href="http://www.the8bitguy.com">The 8-Bit Guy</a> made a video about
         his 8 Bit computer project <a target="_blank"
         href="http://www.commanderx16.com/X16/Ready.html">Commander X16</a>
         which I started looking into. Like all the other assembly language
         projects they never amounted to more than a few print statements or
         colors on the screen. But X16 is something I am going to keep an eye
         on in 2020.<br>
      <a target="_blank"
         href="https://eater.net/">Ben Eater</a> also started a <a target=
         "_blank"
         href="https://eater.net/6502">6502 video series</a> which was amazing,
         and thankfully my learnings from earlier in the year made the content
         very understandable. In summary, I spent a lot of 2019 reading and
         watching a lot of content about assembly language programming, but
         never really did anything with it.</p>
      <h4>Never ending C</h4>
      <p>Without much to really say on the topic, I kept writing small programs
      in C throughout the year. I spent a lot of time debugging and
      troubleshooting a prefix terminal calculator with the intention of making
      it a full utility to use on the command line / from within scripts. You
      could do simple math without opening up x-calc, which I find myself doing
      to check some quick math. Example code: <code class="inline">calc &quot;+
      1 1&quot;</code>. To me this was far cleaner than writing: <code class=
      'inline'>echo $((1+1))</code>. The big ideas I had for it was adding a
      REPL and making it a command line calculator tool where you could get the
      features of a standard calculator with store and recall functions. This
      project involved making two stacks: the operations and the numbers.
      Implementing two stacks from scratch was interesting and I may upload the
      source and link it in an update. Overall it was full of breaks, bugs,
      wrong turns, and bizarre memory issues. So needless to say it was a fun 3
      days of programming.</p>
      <h3>Non Programming Writing</h3>
      <p>The project that soaked up a majority of my writing time, which sadly
      should&#39;ve been documented here, was my conlang / world-building
      project &quot;Tyur&quot;. This project spawned out of sci-fi story ideas
      that, of course, never went anywhere (due to my poor dialog writing, and
      writing in general) and my interest in language history. I have been
      reading <a target="_blank"
         href=
         "https://www.goodreads.com/book/show/1831667.The_Horse_the_Wheel_and_Language">
      The Horse the Wheel and Language</a> by David W. Anthony, which goes into
      the history around Proto-Indo-European. It can be a bit dense so I had
      been reading it on and off, and during the off times also started
      <a target="_blank"
         href=
         "https://www.goodreads.com/book/show/18635317-the-origins-of-language">The
         Origins of Language: A Slim Guide</a> by James R. Hurford, which tries
         to provide insights on the evolutionary concept of language. Both of
         these provided some fodder for the idea of creating my own <a target=
         "_blank"
         href="https://en.wikipedia.org/wiki/Constructed_language">conlang</a>.
         My conlang is &quot;Tyur&quot; the language spoken by the Tyur people.
         This process has really been a mix of world-building around the Tyur
         and some fun fantasy mini story ideas similar to The Lord of the Rings
         and old Warhammer Fantasy worlds. This however began my adventure down
         the rabbit hole of trying to figure out how to create a font so I can
         write more here about it. The documentation on this conlang is a mix
         of loose-leaf folded in my bag that I scribble on when I get an idea.
         So figuring out a proper way of building the alphabet and some root
         words to start a dictionary are my current goals for the remainder of
         the year/ start of 2020.</p>
      <h3>Closing</h3>
      <p>In closing, I think despite not writing much here, I messed around
      with some interesting languages this year, and hope I can hobby more in
      2020.</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>Venturing back into C</title>
  <link>https://www.senders.io/blog/2019-02-17/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2019-02-17/index.html</guid>
  <pubDate>Sun, 17 Feb 2019 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>Venturing back into C</h2>
      <p>For the past two weeks or so I have been diving back into C
      programming. I&#39;ve found it to be a very fun and refreshing experience
      coming off of a slog of Java 11 updates at work. I&#39;ve found comfort
      in its simplicity and frustrations in my &quot;I can do this without an
      IDE&quot; mindset.</p>
      <p>I started C programming in College during a 8 AM course of which all I
      can remember is that it was at 8 AM. I loved programming in C, dealing
      with memory, pointers, no strings, structs, no strings, linking, no
      strings. It was a really interesting difference from the web and Java
      programming I had done previously. Obviously the lack of the
      &quot;string&quot; type made things interesting and initially a challenge
      for me back then. In my most recent endevour I found <code class=
      'inline'>char *</code> to be perfectly suitable for every case I came
      across. It was usually a separate library that was failing me, not a
      fixed char array. This was mostly due to the types of programs I was
      writting in college were text adventures where all of what I did was
      using strings. And my lack of understanding of what was actually
      happening in C was really what was causing all the issues.</p>
      <h3>The Project</h3>
      <p>I started working on an application I had been meaning to develop
      called <a href=
      'https://github.com/s3nd3r5/reminder'><b>reminder.d</b></a>. This daemon
      would monitor for reminder notifications I would send via a CLI. It queue
      them up based on some time set to send the notification. I ended up
      writing both the CLI and the daemon in this past week, both in C.</p>
      <h4>The Beginning</h4>
      <p>This project started with an outline (as a README) which I think was
      the reason this ended up as an actually successful project. I had been
      thinking about this for a long time, and had begun using a calendar to
      keep track of long term reminders/dates etc. First, I outlined the
      architecture &quot;how would I actually do want to send myself
      remidners&quot;. Since half my day is spent infront of a computer, with a
      terminal open or at least two keystrokes away, a CLI would do the trick.
      Then how do I actually send myself notifications... writing them down. So
      I can use the CLI to write to a file and have a daemon pick up the
      changes and notify me once it hits the desired time posted.</p>
      <h4>The CLI</h4>
      <p>The CLI <b>remindme</b> took in messages and appened them to a file.
      This file would be monitored by the daemon later on. Each reminder
      consisted of three parts:</p>
      <ul>
        <li><i>Message</i> - The body of the notification.</li>
        <li><i>Time</i> - This is either a datetime or a period for when the
        notification should send.</li>
        <li><i>Flag</i> - The Flag was set by the CLI when written to the file,
        this marks the status of the reminder</li>
      </ul>After a notification is written the daemon will pick up the
      notification and notify if the time set is now/past.
      <h4>The Daemon</h4>
      <p>The Daemon <b>reminder-daemon</b> opened and tailed a file at
      <i>/usr/local/etc/reminder.d/$USER.list</i>. It would tail the file
      monitoring any incoming lines parsing them into reminders. The syntax of
      the reminder is <code class='inline'>FLAG EPOCHSEC MESSAGE</code> .
      Tokenizing on spaces it was then added to a linked-list sorted by time.
      Every second it checks the file for any new lines, adding reminders as
      they come in, then check the head of the list. If the reminder at the
      head is ready to be notified the daemon pops it off the list and sends
      the notification. After a notification is sent successfully the daemon
      modifies that line in file updating its <code class='inline'>FLAG</code>
      to &#39;d&#39;. This is so when the daemon starts back up it skips the
      reminder. Notifications are sent via <i>libnotify</i>: <code class=
      'inline'>Reminder - $DATETIME</code> with the message body. They are also
      set to last until dismissed manually, this way if were to walk away, once
      I sat down I&#39;d see the stale reminder waiting.</p>
      <h4>Future Plans for Reminder.d</h4>
      <p>Having a system to create and send myself notifications is incredibly
      useful but having them limit to just the computer I sent them on makes
      them a very limited. I have been using them at work for the last few days
      and its nice to be able to tell myself to remeber to email a person after
      lunch. But I would like to be able to tell myself things later in the
      day. I have planned since the beginning to have a remote server I can
      sync the reminders through. In addition having an application running on
      my phone that also gets and sets reminders.</p>
      <p>Remote syncing would change entirely how I deal with reminders in the
      file.</p>
      <pre>
<code>
 struct remnode { 
   long fileptr; 
   struct reminder* reminder; 
   struct remnode* next; 
 }; 
      </code></pre>
      <p>Is currently the struct I use to keep track of the reminders.
      <code class='inline'>fileptr</code> is the line of the file where the
      reminder is, so I can <code class='inline'>fseek</code> back to the
      location and overwrite its flag. I cannot currently think of a way to
      keep the files perfectly identical without introducing countless
      edgecases. What I do think might work is providing some form of UUID.
      When a remote pull tells the systems daemon that a notification has been
      cleared it can mark it by ID. Right now the fileptr is effectively its
      ID, but that will not work anymore. A composite key of the daemons own id
      (generated at install?) with a new ID of each incoming message would help
      ensure uniqueness across ID generations across multiple systems.</p>
      <h3>What I&#39;ve learned</h3>
      <p>First off, I probably could&#39;ve done this in bash. With
      <code class='inline'>date notify-send git awk cron</code> and a few other
      useful commands I could very easily keep track of file changes and push
      notifications at a certain time. But seeing as I scrap together bash
      scripts all the time I though C would make things more fun.</p>
      <p>Writing manpages was the probably the most fun I had working on the
      project. They have a simple elegance to them, similar to C. That being
      said you could FEEL the age of the language. Every single decision is
      there to make things simple to parse. Even compared to modern markup the
      explicit direct nature of the language made it so easy to learn. Every
      tag served a specific purpose and each objective I had had a flag to do
      it.</p>
      <pre><code>
.TH REMINDME 1 
.SH NAME
 remindme \- Send yourself reminders at a specific time on one or more devices
.SH SYNOPSIS
.B remindme
[\fB\-t\fR \fITIME\fR]
[\fB\-\-at \fITIME\fR]
[\fB\-i\fR \fIPERIOD\fR]
[\fB\-\-in\fR \fIPERIOD\fR]
        </code>
      </pre>
      <p>Libnotify was insanely easy to work with, from a programming
      perspective.</p>
      <pre><code>
  NotifyNotification *notif = notify_notification_new(title, rem-&gt;message, &quot;info&quot;);
  notify_notification_set_app_name(notif, APP_NAME);
  notify_notification_set_timeout(notif, NOTIFY_EXPIRES_NEVER);

  GError* error = NULL;
  gboolean shown = notify_notification_show(notif, &amp;error);
        </code>
      </pre>
      <h3>In closing</h3>
      <p>Overall, this was an extremely fun first week of engineering. I look
      forward to what I am able to do syncing and sending notifications on
      android.</p>
      <p>For the zero people reading, grab a beer and outline your project.
      Full through. Think about the how, then write it down. Don&#39;t worry
      about getting in the weeds of how to write a manfile, thats what is fun
      about programming. I thought I botched my debian/sid environment
      uninstalling and reinstalling a notification daemon. Infact I think its
      caused me to take a stance on the whole systemd thing. Either way, start
      a private repo (they&#39;re free now) write a README and a LICENSE file
      and iterate on the README until you realize &quot;oh shit this is
      something I can do&quot;. Then do it. This project still needs some work,
      but for an MVP, its actually done. And now I can dive in the deep end of
      trying to actually make it easy to setup on a fresh PC. Or dive into
      modern android development and server syncing...</p>
    </article>
  ]]>
  </description>
 </item>
 <item>
  <title>First! A New Years Resolution</title>
  <link>https://www.senders.io/blog/2019-01-21/</link>
  <guid isPermaLink="true">https://www.senders.io/blog/2019-01-21/index.html</guid>
  <pubDate>Mon, 21 Jan 2019 00:00:00 -0500</pubDate>
  <description>
  <![CDATA[
    <article>
      <h2>First! A New Years Resolution</h2>
      <p>I like to write small hacky things from time to time when I have a
      weekend to myself, or a day, or an hour... But I never had a place to put
      them or the push to complete them beyond their initial hack. So I decided
      I should write a blog about it.</p>
      <p>Also for work I had to write some prose about myself, something beyond
      a technical document or RFC and I realized I am shit at writing my
      thoughts outside of a very direct specific technical way.</p>
      <p>I am not sure if it is the age of the internet I grew up in where most
      of my written communication was informal or for school. But my personal
      writing skills are trash and this is my attempt to kill all the birds
      with one stone</p>
      <h3>What can be expected here</h3>
      <p>My intentions for this site beyond just a landing page with my resume,
      I hope to upload some code-snippets from things I found interesting,
      ideally some recordings, drawings, and model-painting.</p>
      <h3>How often do I intend to update this blog</h3>
      <p>Ideally, whenever I have something that I feel is worth sharing. But
      for the sake of my resolution I want to do at least one post a month, and
      if I am keeping my other resolutions I should have content to put
      here</p>
      <h3>Designing my site</h3>
      <p>Designing this blog actually took way more time than it should have.
      It began when I wanted to tackle a <i>javascriptless</i> website. And I
      found that a bit difficult if I wanted to have code with syntax
      highlighting. So I wrote a python script to generate <code class=
      'inline'>&lt;pre&gt;</code> tag wrapping Java code with partial syntax
      highlighting.Possibly mistaking <code class='inline'>highlight.js</code>
      usage documentation. But I would like to prevent having javascript on my
      main website keeping it as simplistic as possible.</p>
      <p>I test the site using both <code class='inline'>tidy</code> and
      <code class='inline'>nginx</code> via <code class='inline'>docker</code>.
      Using tidy I can validate the html (making sure I didn&#39;t miss any
      tags etc) and tidy up any odd spacing. And then visually test it running
      nginx. Having it served up similarly to s3 all the paths will work, and
      is insanely easy to setup! If you&#39;re reading this and have anything
      beyond a simple html file I recommend running docker + nginx over any
      javascript server.</p>
      <p>Then I deploy the site through <code class='inline'>s3-cli</code>
      Which is simple and to the point.</p>
      <h3>In Closing</h3>
      <p>I wanted to include more but I ran out of time today to write more, I
      will probably update this article with more information (and an updated
      timestamp). Or just make another post of my code highlighting task.</p>
    </article>
  ]]>
  </description>
 </item>
</channel>
</rss>