(2973,'2019-12-25','Introduction to Advent of Code',836,'Advent of code is a challenge each year between 1-25 of December.','<p>I discuss all the challenges we have seen so far during the Advent of Code and talk about what they entailed and how hard they were to solve.</p>',382,0,0,'CC-BY-SA','coding, challenge',0,0,1),
(2974,'2019-12-26','Guitar Setup pt. 2',3107,'NYbill finish a guitar setup.','<p>Heh, listen to NYbill tune a guitar for an hour.</p>\r\n<p>Part two of guitar set up. Fret polishing, neck relief, string height, and intonation.</p>\r\n<h3 id=\"suppliers\">Suppliers:</h3>\r\n<ul>\r\n<li><p>Stewart MacDonald:<br />\r\n<a href=\"https://www.stewmac.com/\" class=\"uri\">https://www.stewmac.com/</a></p></li>\r\n<li><p>Warmoth:<br />\r\n<a href=\"https://www.warmoth.com/\" class=\"uri\">https://www.warmoth.com/</a></p></li>\r\n<li><p>Allied Lutherie:<br />\r\n<a href=\"https://alliedlutherie.com/\" class=\"uri\">https://alliedlutherie.com/</a></p></li>\r\n<li><p>Guitar Fetish:<br />\r\n<a href=\"https://www.guitarfetish.com/\" class=\"uri\">https://www.guitarfetish.com/</a></p></li>\r\n<li><p>Zona micro fiber polishing paper:<br />\r\n<a href=\"https://www.zonatool.net/cat/scroll-sander-sanding-tools/3m-wet-dry-micron-graded-polishing-papers/\" class=\"uri\">https://www.zonatool.net/cat/scroll-sander-sanding-tools/3m-wet-dry-micron-graded-polishing-papers/</a></p></li>\r\n<li><p>Pics for the episode:<br />\r\n<a href=\"https://media.gunmonkeynet.net/u/nybill/collection/guitar-setup-pt-2/\" class=\"uri\">https://media.gunmonkeynet.net/u/nybill/collection/guitar-setup-pt-2/</a></p></li>\r\n</ul>\r\n',235,0,0,'CC-BY-SA','Guitar, Setup, Repair',0,0,1),
(2977,'2019-12-31','World of Commodore 2019 Episode 3: Life after Commodore',1660,'A presentation by Dr. Richard Immers, author of \"Inside Commodore DOS\"','<p>Some relevant links of note:</p>\r\n<ul>\r\n<li><a href=\"https://www.goodreads.com/author/show/826731.Richard_C_Immers\" class=\"uri\">https://www.goodreads.com/author/show/826731.Richard_C_Immers</a></li>\r\n<li><a href=\"https://www.youtube.com/user/TorontoPETUsersGroup/\" class=\"uri\">https://www.youtube.com/user/TorontoPETUsersGroup/</a></li>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>\r\n',383,78,0,'CC-BY-SA','Commodore,PET,Amiga,64,Geckos,retro,Inside Commodore,DOS',0,0,1),
(2978,'2020-01-01','GARAGE DOOR',738,'I talk about various GARAGE DOOR and fixes','<p>Are you afraid if your garage door ? Have no fear!</p>',36,0,1,'CC-BY-SA','home improvement, garage door ,DIY',0,0,1),
(2982,'2020-01-07','World of Commodore 2019 Episode 4: Bare metal c64 Emulation on Raspberry Pi',2420,'Randy Rossi\'s presentation of his Github project on bare metal emulation of the C64 on a Pi 3.','<p>Links of note:</p>\r\n<ul>\r\n<li><a href=\"https://github.com/randyrossi/bmc64\" class=\"uri\">https://github.com/randyrossi/bmc64</a></li>\r\n<li><a href=\"https://www.youtube.com/user/TorontoPETUsersGroup/\" class=\"uri\">https://www.youtube.com/user/TorontoPETUsersGroup/</a></li>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>',383,103,0,'CC-BY-SA','Raspberry,Pi,emulation,Commodore,64,World of Commodore,TPUG,Toronto,Pet,Users,Group,Github,Open Sour',0,0,1),
(2985,'2020-01-10','Firefox Update',1046,'Some recent updates to Firefox that add useful features','<p>Firefox has been the more secure alternative to Chrome, and it has over the last few months made some updates. So we may want to take a look and see if these are any good, and ask if they add to the security. In some cases there are valuable improvements, such as Facebook Container and the Monitor service.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.mozilla.org/en-US/firefox/flashback/\" class=\"uri\">https://www.mozilla.org/en-US/firefox/flashback/</a></li>\r\n<li><a href=\"https://www.mozilla.org/en-US/firefox/privacy/\" class=\"uri\">https://www.mozilla.org/en-US/firefox/privacy/</a></li>\r\n<li><a href=\"https://www.mozilla.org/en-US/privacy/firefox/\" class=\"uri\">https://www.mozilla.org/en-US/privacy/firefox/</a></li>\r\n<li><a href=\"https://support.mozilla.org/en-US/kb/firefox-accounts-managing-account-data\" class=\"uri\">https://support.mozilla.org/en-US/kb/firefox-accounts-managing-account-data</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1072\" class=\"uri\">https://www.zwilnik.com/?page_id=1072</a></li>\r\n</ul>\r\n',198,74,0,'CC-BY-SA','Firefox, Sync, Container',0,0,1),
(2986,'2020-01-13','Onlykey Updated',1390,'Onlykey more like you better have two keys!','<p>I chat about Onlykey updates along with plugins / updates / issues/ fixes</p>\r\n<p><a href=\"https://chrome.google.com/webstore/detail/onlykey-configuration/adafilbceehejjehoccladhbkgbjmica?hl=en-US\" class=\"uri\">https://chrome.google.com/webstore/detail/onlykey-configuration/adafilbceehejjehoccladhbkgbjmica?hl=en-US</a></p>\r\n',36,74,1,'CC-BY-SA','fob,2fa,onlykey,security,computers',0,0,1),
(2991,'2020-01-20','Fix yer fog machine',674,'Save Your Fog Machine today!','<p><a href=\"https://smile.amazon.com/gp/product/B077HYSYSG\" class=\"uri\">https://smile.amazon.com/gp/product/B077HYSYSG</a></p>\r\n',36,0,1,'CC-BY-SA','Halloween,fog machine,DIY',0,0,1),
(2996,'2020-01-27','Spideroak Update',465,'I give you an update on my cloud backup solution and fixes','<p><a href=\"https://spideroak.support/hc/en-us/articles/115001891343-Command-Line-Reference\" class=\"uri\">https://spideroak.support/hc/en-us/articles/115001891343-Command-Line-Reference</a></p>\r\n<p>service script:</p>\r\n<pre><code># Make sure you have space or link the base path to some place else\r\n# make sure you have R/W for the plex user\r\n# ln -s /media/data/SPIDEROAK_CONFIG/ /home/plex/.config/SpiderOakONE\r\n\r\n[Unit]\r\nDescription=SPIDEROAK STARTUP\r\nAfter=network.target\r\n\r\n[Service]\r\nUser=plex\r\nGroup=adm\r\n\r\nType=simple\r\nExecStart=/bin/bash -c &#39;\r\nPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ;\r\n/usr/bin/SpiderOakONE --headless --verbose&#39;\r\n\r\n[Install]\r\nWantedBy=multi-user.target</code></pre>\r\n',36,0,1,'CC-BY-SA','cloud backup,computers,linux,spideroak one,spideroak',0,0,1),
(3006,'2020-02-10','Hijack Auxiliary Input of your car!',2159,'I talk about my Q40 and getting Auxiliary Input when your car does not have one','<p><a href=\"https://www.myg37.com/forums/audio-video-and-electronics/285929-2015-infiniti-q40-4dr-with-crap-audio.html\" class=\"uri\">https://www.myg37.com/forums/audio-video-and-electronics/285929-2015-infiniti-q40-4dr-with-crap-audio.html</a></p>\r\n<p><a href=\"https://rmccurdy.com/.scripts/downloaded/www.nicoclub.com/FSM/Q40/2015%20Q40/\" class=\"uri\">https://rmccurdy.com/.scripts/downloaded/www.nicoclub.com/FSM/Q40/2015%20Q40/</a></p>\r\n<p><strong>Updated: Solved:</strong> The audio could use a dac or something nice but this will do. Not (DO NOT PLUG IN THE HARNESS WRONG ORDER OR YOU WILL BLOW AT LEAST 4 FUSES ) I had to swap out 3 in the passenger side and 1 for the rear lights on the IPDM E/R next to the battery in a #@$% spot.</p>\r\n<p>pulled the pins and soldered a audio jack to them and fed it though the AC vent :</p>\r\n<p>pin 1 - G : Satellite radio sound signal LH pin 2 + R : Satellite radio sound signal LH pin 3 - w : Satellite radio sound signal RH pin 4 + b : Satellite radio sound signal RH</p>\r\n<h4 id=\"reference\">Reference:</h4>\r\n<ul>\r\n<li><a href=\"https://www.myg37.com/forums/audio-v...ml#post4253485\" class=\"uri\">https://www.myg37.com/forums/audio-v...ml#post4253485</a></li>\r\n<li><a href=\"https://rmccurdy.com/.scripts/downlo...5%20Q40/av.pdf\" class=\"uri\">https://rmccurdy.com/.scripts/downlo...5%20Q40/av.pdf</a> pg 42</li>\r\n</ul>\r\n<p><b>NOT SOLVED 08/21/2019 :</b> So I\'m sick of this jank setup .. the software is wonky and works about 1/2 the time .. I have to ƒ@#$ with it for about 5-10 min every time I want to use it … WIRELINQ is crap.. and I don\'t want the 600$ BT mod .. I just want AUX in !! I dont care if CD or SAT is spliced!</p>\r\n<ul>\r\n<li>NO I\'m not using a Apple device ..</li>\r\n<li>NO I\'m not going BT because its crap audio ..</li>\r\n<li>NO I\'m not using MONO or anything like that (discord) because that\'s even worse then BT…</li>\r\n<li>NO I\'m not using a FM Transmitter because that\'s just stupid its a 2015 car it should have AUX input ..</li>\r\n</ul>\r\n<p>maybe I can hack it myself the issue is that the SAT is in the @<span class=\"math inline\"></span>^ing trunk .. so I would have to find the wires that go to the trunk. I use a long speaker wire with alligator clips on it and a continuity tester (volt meter ) to hunt for it …</p>\r\n<p>Part No<br />\r\n2591a 1ma5e</p>\r\n<p>Model No<br />\r\ncv-vn01e04d</p>\r\n<p>\"11 12 Infiniti G25 G37 Radio CD Player 2591A-1MA5E Bulk 711\"</p>\r\n<p><b>SOLVED 01/20/2018 :</b> YAY ! this works and I dont have to have grap BT audio</p>\r\n<ul>\r\n<li>2015 INFINITI Q40 NONAV ANDROID</li>\r\n<li>IPOD WIRELINQ GROM-WLQ</li>\r\n<li>Electop 2 Pack USB 2.0 A Female to USB Micro Female Adapter Converter</li>\r\n<li>Wsken Mini2 Micro USB Magnetic LED Display Data Sync Fast Charge 3.28ft Cable for Android (Silver)</li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','Car Audio,DIY,music,cars,auto',0,0,1),
(3011,'2020-02-17','Linux is HARD rant with Intel graphics',1228,'I go over my issues around Linux in general specifically Video issues','<p>Help me help you! I rant about linux and Video drivers etc …</p>\r\n<p>Get Video and CPU Info<br />\r\nchrome://gpu</p>\r\n<pre><code># gives you info about video GPU in chrome!\r\nchrome://gpu</code></pre>\r\n<p>phoronix-test-suite system-info</p>\r\n<pre><code># neat little project to dump out all kinds of info\r\nphoronix-test-suite system-info</code></pre>\r\n<pre><code># get hard disk temperatures !\r\n\r\nhddtemp /dev/sdb\r\n/dev/sdb: WDC WD4003FZEX-00Z4SA0: 37°C\r\nhddtemp /dev/sdc\r\n/dev/sdc: WDC WD4003FZEX-00Z4SA0: 36°C</code></pre>\r\n<p>vainfo - display information from VA API driver</p>\r\n<p>lspci specific device</p>\r\n<pre><code>lspci -v -s 00:02.0\r\n00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Desktop) (prog-if 00 [VGA controller])\r\n        Subsystem: ASRock Incorporation Device 3e92\r\n        Flags: bus master, fast devsel, latency 0, IRQ 126\r\n        Memory at a0000000 (64-bit, non-prefetchable) [size=16M]\r\n        Memory at 90000000 (64-bit, prefetchable) [size=256M]\r\n        I/O ports at 4000 [size=64]\r\n        [virtual] Expansion ROM at 000c0000 [disabled] [size=128K]\r\n        Capabilities: [40] Vendor Specific Information: Len=0c &lt;?&gt;\r\n        Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00\r\n        Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable- 64bit-\r\n        Capabilities: [d0] Power Management version 2\r\n        Capabilities: [100] Process Address Space ID (PASID)\r\n        Capabilities: [200] Address Translation Service (ATS)\r\n        Capabilities: [300] Page Request Interface (PRI)\r\n        Kernel driver in use: i915\r\n        Kernel modules: i915\r\nlshw\r\n#  lshw is a small tool to extract detailed information on the hardware configuration of the machine\r\n\r\nlshw -c video\r\n  *-display\r\n       description: VGA compatible controller\r\n       product: UHD Graphics 630 (Desktop)\r\n       vendor: Intel Corporation\r\n       physical id: 2\r\n       bus info: pci@0000:00:02.0\r\n       version: 00\r\n       width: 64 bits\r\n       clock: 33MHz\r\n       capabilities: pciexpress msi pm vga_controller bus_master cap_list rom\r\n       configuration: driver=i915 latency=0\r\n       resources: irq:126 memory:a0000000-a0ffffff memory:90000000-9fffffff ioport:4000(size=64) memory:c0000-dffff</code></pre>\r\n<p>glxinfo</p>\r\n<p>The glxinfo program shows information about the OpenGL and GLX implementations running on a given X display.</p>\r\n<pre><code>glxinfo | egrep -i &#39;device|memory|OpenGL|direct&#39;</code></pre>\r\n<p>dmesg</p>\r\n<pre><code>dmesg | grep -e IOMMU -e DMAR\r\n\r\ndmesg | grep -E &#39;drm|radeon&#39; | grep -iE &#39;firmware|microcode&#39;\r\ndmesg | grep -i -e i915 -e drm -e vga</code></pre>\r\n<p>dmidecode - DMI table decoder</p>\r\n<pre><code>dmidecode -t baseboard | grep -i &#39;Product&#39;</code></pre>\r\n<p>GPU usage</p>\r\n<pre><code>apt-get install intel-gpu-tools | intel_gpu_top</code></pre>\r\n<p>Google Dorks</p>\r\n<ul>\r\n<li>when googleing try -ubuntu -xubuntu</li>\r\n<li>when searching for start up stuff use ‘systemd’ in your query</li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','linux,video,DIY,xbmc,kodi,ubuntu,debian',0,0,1),
(3016,'2020-02-24','Nixie tube clock and friends!',874,'I chat about Novice Nixie tubes and tronics soldering etc','<p>Nixie tube (English: /ˈnɪk. siː/ NIK-see), or cold cathode display, is an electronic device for displaying numerals or other information using glow discharge.</p>\r\n<p><a href=\"https://www.tindie.com/products/robg/msp430-nixie-clock-kit/\" class=\"uri\">https://www.tindie.com/products/robg/msp430-nixie-clock-kit/</a></p>',36,0,0,'CC-BY-SA','DIY,nixie tube,LED,electronics ',0,0,1),
(2987,'2020-01-14','World of Commodore 2019 Episode 5: New games from Double Sided Games',2250,'A presentation by Jérémie Marsin of Double Sided games.','<p>Links of note:</p>\r\n<ul>\r\n<li><a href=\"https://doublesidedgames.com/\" class=\"uri\">https://doublesidedgames.com/</a></li>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>',383,0,0,'CC-BY-SA','Commodore 64,retro,computing,games,gamer,vintage',0,0,1),
(2992,'2020-01-21','World of Commodore 2019 Episode 6: Introduction to C64 OS',2159,'Greg Naçu presents to us his new operating system to the Commodore 64','<p>Links of note:</p>\r\n<ul>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>\r\n',383,103,0,'CC-BY-SA','Commodore,64,OS,World of Commodore',0,0,1),
(2983,'2020-01-08','my phone',497,'gnu-linuxy in my pocket','<ul>\r\n<li><p>lineageOS<br />\r\n<a href=\"https://lineageos.org/\" class=\"uri\">https://lineageos.org/</a></p></li>\r\n<li><p>termux<br />\r\n<a href=\"https://termux.com/\" class=\"uri\">https://termux.com/</a></p></li>\r\n<li><p>fdroid<br />\r\n<a href=\"https://f-droid.org/\" class=\"uri\">https://f-droid.org/</a></p></li>\r\n<li><p>satstat<br />\r\n<a href=\"https://f-droid.org/en/packages/com.vonglasow.michael.satstat/\" class=\"uri\">https://f-droid.org/en/packages/com.vonglasow.michael.satstat/</a></p></li>\r\n<li><p>skymap<br />\r\n<a href=\"https://f-droid.org/en/packages/com.google.android.stardroid/\" class=\"uri\">https://f-droid.org/en/packages/com.google.android.stardroid/</a></p></li>\r\n<li><p>web utilities<br />\r\n<a href=\"https://radio.jezra.net\" class=\"uri\">https://radio.jezra.net</a><br />\r\n<a href=\"https://twilock.jezra.net\" class=\"uri\">https://twilock.jezra.net</a></p></li>\r\n</ul>\r\n',243,0,0,'CC-BY-SA','phone, linux',0,0,1),
(2990,'2020-01-17','JDK14 - Wrap up edition',911,'We look into what is included in the next release of the JDK.','<p>305: <a href=\"https://openjdk.java.net/jeps/305\">Pattern Matching for instanceof (Preview)</a><br />\r\n343: <a href=\"https://openjdk.java.net/jeps/343\">Packaging Tool (Incubator)</a><br />\r\n345: <a href=\"https://openjdk.java.net/jeps/345\">NUMA-Aware Memory Allocation for G1</a><br />\r\n349: <a href=\"https://openjdk.java.net/jeps/349\">JFR Event Streaming</a><br />\r\n352: <a href=\"https://openjdk.java.net/jeps/352\">Non-Volatile Mapped Byte Buffers</a><br />\r\n358: <a href=\"https://openjdk.java.net/jeps/358\">Helpful NullPointerExceptions</a><br />\r\n359: <a href=\"https://openjdk.java.net/jeps/359\">Records (Preview)</a><br />\r\n361: <a href=\"https://openjdk.java.net/jeps/361\">Switch Expressions (Standard)</a><br />\r\n362: <a href=\"https://openjdk.java.net/jeps/362\">Deprecate the Solaris and SPARC Ports</a><br />\r\n363: <a href=\"https://openjdk.java.net/jeps/363\">Remove the Concurrent Mark Sweep (CMS) Garbage Collector</a><br />\r\n364: <a href=\"https://openjdk.java.net/jeps/364\">ZGC on macOS</a><br />\r\n365: <a href=\"https://openjdk.java.net/jeps/365\">ZGC on Windows</a><br />\r\n366: <a href=\"https://openjdk.java.net/jeps/366\">Deprecate the ParallelScavenge + SerialOld GC Combination</a><br />\r\n367: <a href=\"https://openjdk.java.net/jeps/367\">Remove the Pack200 Tools and API</a><br />\r\n368: <a href=\"https://openjdk.java.net/jeps/368\">Text Blocks (Second Preview)</a><br />\r\n370: <a href=\"https://openjdk.java.net/jeps/370\">Foreign-Memory Access API (Incubator)</a></p>\r\n',382,0,0,'CC-BY-SA','java, news',0,0,1),
(2979,'2020-01-02','Bicycle Freewheel Maintenance',450,'I explain how to lube a bicycle freewheel','<p>This is a short episode where I explain how to service your bicycle freewheel if it\'s misbehaving. My pedals were turning around when I walked the bike, and they ought to be stationary. A quick dose of chain oil in the freewheel fixed the problem. Click the image to see photos showing how to do this.</p>\r\n\r\n<p><a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/137675441@N05/albums/72157712277100862\" title=\"Bicycle Freewheel Lube\"><img src=\"https://live.staticflickr.com/65535/49243896423_d89e9185da.jpg\" width=\"500\" height=\"281\" alt=\"Bicycle Freewheel Lube\"></a></p>\r\n',238,115,0,'CC-BY-SA','bicycles, bicycle maintenance, DIY, bicycle repair',0,0,1),
(2984,'2020-01-09','RHEL 8 Workstation first looks ',543,'Runing RHEL 8 workstation on a HP Stream Laptop','<p>Hi Everyone a bit random ideas about RHEL 8 on a low end laptop.</p>\r\n<p>Interesting Git and flatpak are already installed out of the box.</p>\r\n<p>MS Teams works great.</p>',129,0,0,'CC-BY-SA','HP Stream, RHEL 8, MS Teams, flatpak',0,0,1),
(2988,'2020-01-15','A tale of two hackers in the same system',518,'AIX Hacking and modem stuff!!','<p>Hi, I’m sigflup. This is about that awesome time I found that there was another hacker in the same system that I was hacking. Fun stuff</p>\r\n',115,0,1,'CC-BY-SA','unix,aix,modem,lynx',0,0,1),
(2989,'2020-01-16','2019-2020 New Year Show Episode 1',8435,'Eighth Annual New Year Show - Sint brings toys','<h3>Hacker Public Radio 2019-20 New Year Show Episode 1</h3>\r\n<p>04:30 - 11:00 EST (09:30 - 16:00 UTC)</p>\r\n<ul>\r\n<li>Ken explains Sinterklaas\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Sinterklaas\">https://en.wikipedia.org/wiki/Sinterklaas</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=vTGDFhi7z4U\">https://www.youtube.com/watch?v=vTGDFhi7z4U</a></li>\r\n</ul></li>\r\n<li><a href=\"https://www.comptia.org/certifications/a\">https://www.comptia.org/certifications/a</a></li>\r\n<li>Ken &amp; Popey chat</li>\r\n<li>Netminer invites Popey &amp; Ken\'s daughter to be guests on LinuxLUGcast</li>\r\n<li>Raspberry Pi IV discussion</li>\r\n<li>Popey and TonyH chat about restoring model cars</li>\r\n<li>Popey and TonyH chat about: More model cars, 8-bit computing, ZX Spectrum, Commodore</li>\r\n<li><a href=\"https://8bitversus.com/\"> https://8bitversus.com/</a></li>\r\n<li>Sinclair calculator - <a href=\"https://en.wikipedia.org/wiki/List_of_Sinclair_calculators\">https://en.wikipedia.org/wiki/List_of_Sinclair_calculators</a></li>\r\n<li>Popey and TonyH speak about Lenovo laptops</li>\r\n<li>Mr Cholmondley Warner (<a href=\"https://www.youtube.com/watch?v=tQWPR9TM0Gk)\">https://www.youtube.com/watch?v=tQWPR9TM0Gk)</a></li>\r\n<li>DaveM and TonyH talk more about model cars, their restoration and history</li>\r\n<li>DaveM is working on a \"MagicMirror2\" system on a Pi 3A+ to show status information</li>\r\n<li>Dinky Toys - <a href=\"https://en.wikipedia.org/wiki/Dinky_Toys\">https://en.wikipedia.org/wiki/Dinky_Toys</a></li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show, NYS',0,0,1),
(3026,'2020-03-09','Hex Bug and Battle Bots',1120,'Review/mods of fun Hex Bug and Battle Bots','<p>Review/mods of fun Hex Bug and Battle Bots</p>\r\n',36,0,0,'CC-BY-SA','robots,hexbug,battlebots,RC,IR',0,0,1),
(2993,'2020-01-22','2019-2020 New Year Show Episode 2',9298,'Eighth Annual New Year Show with ThinkPads, Steam engines and Corporate America philosophy','<h3>Hacker Public Radio 2019-20 New Year Show Episode 2</h3>\r\n<p>11:00 - 16:30 EST (16:00 - 21:30 UTC)</p>\r\n<ul>\r\n<li>TonyH &amp; JoeB chat: ThinkPads, podcasts they are involved with</li>\r\n<li>KenF explains podcast download stats</li>\r\n<li>Commercial podcasts hurting the little guy?</li>\r\n<li>TonyH &amp; JoeB chat: Headphones</li>\r\n<li>TonyH &amp; Popey chat: Food, games, first computer experience</li>\r\n<li>Moss joins in</li>\r\n<li>Old data storage: cassette tapes, Zip &amp; Jazz drives</li>\r\n<li>Thaj joins Moss &amp; JoeB: Favorite books &amp; authors</li>\r\n<li>Netminer discusses Autism</li>\r\n<li>Automobile inspections</li>\r\n<li>Netminer &amp; TonyH chat: personal property boundary issues</li>\r\n<li>Handsome_pirate joins: steam engine chat</li>\r\n<li>HonkeyMagoo joins</li>\r\n<li>David Richards steam engine Youtube channel -<a href= \"https://www.youtube.com/channel/UCBdj-vOveiEFWe3vnGoJUag\">https://www.youtube.com/channel/UCBdj-vOveiEFWe3vnGoJUag</a></li>\r\n<li>Mass transit, city traffic</li>\r\n<li>Corporate America philosophy</li>\r\n<li>Worker unions</li>\r\n<li>Fireworks</li>\r\n<li>Wimpy joins</li>\r\n<li>Ubuntu Mate discussion</li>\r\n<li>Donating used PC\'s</li>\r\n<li><a href=\"https://8bitversus.com/\">https://8bitversus.com/</a></li>\r\n<li>Timezone confusion??</li>\r\n<li>Ubuntu podcast</li>\r\n<li>TonyH: how he discovered Linux</li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show, HPRNYS',0,0,1),
(2994,'2020-01-23','Wrestling As You Like It Episode 3',1327,'A podcast on why I like wrestling and how it works to draw in fans.','<p>In this episode I discuss what direction I’m taking the podcast in. Also more importantly I discuss what Supercards are and their purpose in Pro Wrestling.</p>',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1),
(2995,'2020-01-24','ActivityPub Conference 2019 - ActivityPub: past, present, future',961,'ActivityPub Conference 2019 Keynote','<p>The ActivityPub Conference of 2019 was held in Prague. This is about the opening keynote talk from Christopher Lemmer Webber. <a href=\"https://www.zwilnik.com/?page_id=1063\" class=\"uri\">https://www.zwilnik.com/?page_id=1063</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-chris\" class=\"uri\">https://archive.org/details/apconf-chris</a></li>\r\n<li><a href=\"https://dustycloud.org/\" class=\"uri\">https://dustycloud.org/</a></li>\r\n<li><a href=\"https://www.crockford.com/ec/\" class=\"uri\">https://www.crockford.com/ec/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1063\" class=\"uri\">https://www.zwilnik.com/?page_id=1063</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(2997,'2020-01-28','World of Commodore 2019 Episode 7: Video Playback with 1541 Ultimate',1161,'In this seventh episode, Greg returns to tell us how he got full video playback on a Commodore 64.','<h3 id=\"links\">Links</h3>\r\n<ul>\r\n<li><a href=\"https://www.youtube.com/user/TorontoPETUsersGroup/\" class=\"uri\">https://www.youtube.com/user/TorontoPETUsersGroup/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n<li><a href=\"https://www.c64-wiki.com/wiki/1541_Ultimate\" class=\"uri\">https://www.c64-wiki.com/wiki/1541_Ultimate</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/1541_Ultimate\" class=\"uri\">https://en.wikipedia.org/wiki/1541_Ultimate</a></li>\r\n</ul>\r\n',383,103,0,'CC-BY-SA','Commodore 64,retro,computing,games,gamer,vintage,video,World of Commodore,TPUG',0,0,1),
(2998,'2020-01-29','2019-2020 New Year Show Episode 3',9164,'Eighth Annual New Year Show: The US is awake','<h3>Hacker Public Radio 2019-20 New Year Show Episode 3</h3>\r\n<p>16:30 - 21:54 EST (21:30 - 02:54 UTC)</p>\r\n<ul>\r\n<li>KWisher joins: ponders the New Year show editing</li>\r\n<li>New PC discussion, used PC acquisitions</li>\r\n<li>Remote desktop solutions</li>\r\n<li>Raspberry Pi IV</li>\r\n<li>DannW joins: text editors, Pascal, Fortran &amp; other programming languages</li>\r\n<li>MS Windows licensing, software, operating systems</li>\r\n<li>More MS woes</li>\r\n<li>Asperger syndrome, some light political chat</li>\r\n<li>ClaudioM joins: talks about BSD</li>\r\n<li>Moss: Feren OS - <a href=\"https://ferenos.weebly.com/\">https://ferenos.weebly.com/</a></li>\r\n<li>ZFS discussion</li>\r\n<li>Urandom Podcast - <a href=\"https://urandom-podcast.info/\">https://urandom-podcast.info/</a></li>\r\n<li>SELF - <a href=\"https://southeastlinuxfest.org/\">https://southeastlinuxfest.org/</a></li>\r\n<li>Destination Linux Podcast - <a href=\"https://destinationlinux.org/\">https://destinationlinux.org/</a></li>\r\n<li>Mandriva, Sabayon, Slackware, Fedora discussion</li>\r\n<li>Softmaker Office, office suite discussion</li>\r\n<li>Pokey joins: automobiles, politics</li>\r\n<li>Mushrooms, farming, college</li>\r\n<li>HP EliteBooks</li>\r\n<li>Linux Mint, thermal paste</li>\r\n<li>Winter weather &amp; driving, tire socks</li>\r\n<li><a href=\"https://thermal-grizzly.com/en/products/16-kryonaut-en\">https://thermal-grizzly.com/en/products/16-kryonaut-en</a></li>\r\n<li>Netminer talks about his DOS days, ISO standards</li>\r\n<li>Spine/back issues, treatment</li>\r\n<li>Xoke joins in</li>\r\n<li>Pokey loves DuckDuckGo</li>\r\n<li>Gnome boxes virtualization - <a href=\"https://help.gnome.org/users/gnome-boxes/stable/\">https://help.gnome.org/users/gnome-boxes/stable/</a></li>\r\n<li>Android key mapper - <a href=\"https://f-droid.org/en/packages/io.github.sds100.keymapper/\">https://f-droid.org/en/packages/io.github.sds100.keymapper/</a></li>\r\n</ul>',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1),
(3002,'2020-02-04','World of Commodore 2019 Episode 8: Vote of thanks',1156,'This is the final episode of the World of Commodore 2019 mini series.','<h3 id=\"links\">Links</h3>\r\n<ul>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>',383,0,1,'CC-BY-SA','Commodore,64,PET, Vic 20, amiga,World of Commodore, TPUG',0,0,1),
(3003,'2020-02-05','2019-2020 New Year Show Episode 4',9707,'Eighth Annual New Year Show. From Star Wars to NASA','<h3 id=\"hacker-public-radio-2019-20-new-year-show-episode-4\">Hacker Public Radio 2019-20 New Year Show Episode 4</h3>\r\n<p>21:54 - 01:40 EST (02:54 - 06:40 UTC)</p>\r\n<ul>\r\n<li>Chat about music, Star Wars, The Mandalorian</li>\r\n<li>Current main distro</li>\r\n<li>X2go RDP, Teamviewer, Dark Reader Firefox theme</li>\r\n<li>Pokey sucks at uRandom promotion</li>\r\n<li>Advent - <a href=\"https://en.wikipedia.org/wiki/Advent\" class=\"uri\">https://en.wikipedia.org/wiki/Advent</a></li>\r\n<li>Pokey’s firestarters</li>\r\n<li>Thaj publicly shames Lyle </li>\r\n<li>Lyle joins in shame</li>\r\n<li>Brief history of the New Year show </li>\r\n<li>Thaj challenges everyone listening to find one HPR episode that doesn’t have tags and contribute them this year. Tags get sparse around episode 550 if you are trying to find a place to start. OH…and you also owe Ken a show too.</li>\r\n<li>Here are the instructions: <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a></li>\r\n<li>Discussion about exercise </li>\r\n<li>Pokey tries to help Mongo with Mumble </li>\r\n<li>Thaj describes his custom keyboard layout </li>\r\n<li>Pokey repairs his wife’s laptop</li>\r\n<li>Thaj publicly shames Klattu &amp; Pokey for no tags on their shows</li>\r\n<li>CladioM explains the Latin tradition “Twelve Grapes” </li>\r\n<li>Pokey talks about being a grandparent</li>\r\n<li>More HP &amp; laptop talk</li>\r\n<li>Urugami joins</li>\r\n<li>Mongo joins</li>\r\n<li>Texas geography</li>\r\n<li>Motorcycles</li>\r\n<li>War stories</li>\r\n<li>NASA</li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1),
(3008,'2020-02-12','2019-2020 New Year Show Episode 5',7013,'Eighth Annual New Year Show: war stories and more war stories','<h3 id=\"hacker-public-radio-2019-20-new-year-show-episode-5\">Hacker Public Radio 2019-20 New Year Show Episode 5</h3>\r\n<p>01:40 - 07:20 EST (09:40 - 12:20 UTC)</p>\r\n<ul>\r\n<li>More war stories, podcasts, lawn mowing</li>\r\n<li>Timezones, Daylight Savings Time</li>\r\n<li>Antique computers - PDP, VAX, distro talk</li>\r\n<li>NAS discussion, EU politics</li>\r\n<li>Urugami joins</li>\r\n<li>Mongo joins</li>\r\n<li>Texas geography</li>\r\n<li>Motorcycles</li>\r\n<li>War stories</li>\r\n<li>NASA</li>\r\n<li>More war stories, podcasts, lawn mowing</li>\r\n<li>Timezones, Daylight Savings Time</li>\r\n<li>Antique computers - PDP, VAX, distro talk</li>\r\n<li>NAS discussion, EU politics</li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1),
(3005,'2020-02-07','Is ActivityPub Paving The Way to Web 3.0?',735,'ActivityPub Conference 2019, a talk about whether ActivityPub is leading the way to Web 3.0','<p>The ActivityPub Conference of 2019 was held in Prague. This is about a talk raising a suggestion that ActivityPub might be a way to implement Web 3.0. <a href=\"https://www.zwilnik.com/?page_id=1081\" class=\"uri\">https://www.zwilnik.com/?page_id=1081</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk2_Maloki_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk2_Maloki_compressed.mov</a></li>\r\n<li><a href=\"https://medium.com/@maloki/does-mastodon-spark-joy-no-meet-florence-788bbc8b48c2\" class=\"uri\">https://medium.com/@maloki/does-mastodon-spark-joy-no-meet-florence-788bbc8b48c2</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1081\" class=\"uri\">https://www.zwilnik.com/?page_id=1081</a></li>\r\n</ul>',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(3015,'2020-02-21','ActivityPub Conference 2019 - The Semantic Social Network',438,'ActivityPub Conference 2019, building a Semantic Social Network','<p>The ActivityPub Conference of 2019 was held in Prague. This is about a talk using ActivityPub to create the Semantic Social Network. <a href=\"https://www.zwilnik.com/?page_id=1086\" class=\"uri\">https://www.zwilnik.com/?page_id=1086</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk3_Pukkamustard_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk3_Pukkamustard_compressed.mov</a></li>\r\n<li><a href=\"https://schema.org/\" class=\"uri\">https://schema.org/</a></li>\r\n<li><a href=\"https://schema.org/servesCuisine\" class=\"uri\">https://schema.org/servesCuisine</a></li>\r\n<li><a href=\"https://schema.org/areaServed\" class=\"uri\">https://schema.org/areaServed</a></li>\r\n<li><a href=\"https://5stardata.info/en/\" class=\"uri\">https://5stardata.info/en/</a></li>\r\n<li><a href=\"https://moz.com/blog/json-ld-for-beginners\" class=\"uri\">https://moz.com/blog/json-ld-for-beginners</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1086\" class=\"uri\">https://www.zwilnik.com/?page_id=1086</a></li>\r\n</ul>',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(3025,'2020-03-06','Keep unwanted messages off the Fediverse',881,'ActivityPub Conference 2019, techniques for fighting SPAM and unwanted messages in the Fediverse.','<p>The ActivityPub Conference of 2019 was held in Prague. This is about a talk about how we can keep SPAM and unwanted messages off of our platforms in the Fediverse. <a href=\"https://www.zwilnik.com/?page_id=1089\" class=\"uri\">https://www.zwilnik.com/?page_id=1089</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk4_Serge_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk4_Serge_compressed.mov</a></li>\r\n<li><a href=\"https://gitlab.com/spritely/ocappub\" class=\"uri\">https://gitlab.com/spritely/ocappub</a></li>\r\n<li><a href=\"https://www.zwilnik.com/spritely/ocappub/master/*How%20to%20build%20it\" class=\"uri\">https://www.zwilnik.com/spritely/ocappub/master/*How%20to%20build%20it</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1089\" class=\"uri\">https://www.zwilnik.com/?page_id=1089</a></li>\r\n</ul>',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, SPAM',0,0,1),
(3035,'2020-03-20','Decentralised Hashtag Search and Subscription in Federated Social Networks',669,'ActivityPub Conference 2019, a proposal for how we can use hashtags to find and subscribe to content','<p>The ActivityPub Conference of 2019 was held in Prague. This is about a talk a proposal for a method to allow searching for hashtags in a decentralized Fediverse environment so that we can find, and subscribe to, content of interest. <a href=\"https://www.zwilnik.com/?page_id=1091\" class=\"uri\">https://www.zwilnik.com/?page_id=1091</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk5_Schmittlauch_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk5_Schmittlauch_compressed.mov</a></li>\r\n<li><a href=\"https://relay.mastodon.host/\" class=\"uri\">https://relay.mastodon.host/</a></li>\r\n<li><a href=\"https://hacks.mozilla.org/2018/11/decentralizing-social-interactions-with-activitypub/\" class=\"uri\">https://hacks.mozilla.org/2018/11/decentralizing-social-interactions-with-activitypub/</a></li>\r\n<li><a href=\"https://source.joinmastodon.org/mastodon/pub-relay\" class=\"uri\">https://source.joinmastodon.org/mastodon/pub-relay</a></li>\r\n<li><a href=\"https://git.orlives.de/schmittlauch/paper_hashtag_federation/src/branch/master/paper_hashtag_federation.pdf\" class=\"uri\">https://git.orlives.de/schmittlauch/paper_hashtag_federation/src/branch/master/paper_hashtag_federation.pdf</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1091\" class=\"uri\">https://www.zwilnik.com/?page_id=1091</a></li>\r\n</ul>',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Hashtags',0,0,1),
(3045,'2020-04-03','OSS compliance with privacy by default and design',951,'How can Open Source Software manage the mandates of regulations like the GDPR?','<p>The GDPR (General Data Protection Regulation) was enacted by the European Community in 2016, and began to be enforced in 2018. Since this covers a large segment of the Internet users, and other jurisdictions are looking at similar legislation this talk is a timely look at what is required and how Open Source Software can meet the legal requirements. <a href=\"https://www.zwilnik.com/?page_id=1096\" class=\"uri\">https://www.zwilnik.com/?page_id=1096</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk6_Cristina_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk6_Cristina_compressed.mov</a></li>\r\n<li><a href=\"https://xwiki.com/en/company/who-we-are/\" class=\"uri\">https://xwiki.com/en/company/who-we-are/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/General_Data_Protection_Regulation\" class=\"uri\">https://en.wikipedia.org/wiki/General_Data_Protection_Regulation</a></li>\r\n<li><a href=\"https://developercertificate.org/\" class=\"uri\">https://developercertificate.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1096\" class=\"uri\">https://www.zwilnik.com/?page_id=1096</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Privacy',0,0,1),
(3007,'2020-02-11','Photography 101',1468,'I tell you everything I know about the basics of photography','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://musopen.org/music/43172-pleasant-moments/\" class=\"uri\">https://musopen.org/music/43172-pleasant-moments/</a></li>\r\n<li><a href=\"https://pquirk.com\" class=\"uri\">https://pquirk.com</a></li>\r\n</ul>\r\n',383,0,0,'CC-BY-SA','Photography 101,digital,film,camera',0,0,1),
(2999,'2020-01-30','SQRL - Secure Quick Reliable Login',1442,'In this podcast we talk about what SQRL is and how it works.','<p>In this podcast, we talk about what SQRL is, and how it works, why I feel that it’s an exciting new login method that is safe and easy to use.</p>\r\n<ul>\r\n<li><p>SQRL Documentation<br />\r\n<a href=\"https://www.grc.com/sqrl/sqrl.htm\" class=\"uri\">https://www.grc.com/sqrl/sqrl.htm</a></p></li>\r\n<li><p>SQRL Forums<br />\r\n<a href=\"https://sqrl.grc.com/\" class=\"uri\">https://sqrl.grc.com/</a></p></li>\r\n<li><p>SQRL Github organization<br />\r\n<a href=\"https://github.com/sqrldev\" class=\"uri\">https://github.com/sqrldev</a></p></li>\r\n<li><p>Android Application<br />\r\n<a href=\"https://play.google.com/store/apps/details?id=org.ea.sqrl\" class=\"uri\">https://play.google.com/store/apps/details?id=org.ea.sqrl</a></p></li>\r\n<li><p>Github repository for Android Application<br />\r\n<a href=\"https://github.com/kalaspuffar/secure-quick-reliable-login\" class=\"uri\">https://github.com/kalaspuffar/secure-quick-reliable-login</a></p></li>\r\n</ul>\r\n',382,0,1,'CC-BY-SA','security, login method',0,0,1),
(3281,'2021-03-01','HPR Community News for February 2021',4150,'HPR Volunteers talk about shows released and comments posted in February 2021','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new hosts: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0390.html\" target=\"_blank\">o9l</a>, \n    <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3261\" target=\"_blank\">3261</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-02-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3261\" target=\"_blank\">HPR Community News for January 2021</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3262\" target=\"_blank\">3262</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-02-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3262\" target=\"_blank\">My thoughts on diversity in Linux and open source</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3263\" target=\"_blank\">3263</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-02-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3263\" target=\"_blank\">My Beginnings in Tech</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0390.html\" target=\"_blank\">o9l</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3264\" target=\"_blank\">3264</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-02-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3264\" target=\"_blank\">Intro to Nagios</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3265\" target=\"_blank\">3265</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-02-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3265\" target=\"_blank\">My Chromebook Experience</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3266\" target=\"_blank\">3266</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-02-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3266\" target=\"_blank\">Upgrading Debian on my raspberry pi</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3267\" target=\"_blank\">3267</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-02-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3267\" target=\"_blank\">Ripping Media 2021</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3268\" target=\"_blank\">3268</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-02-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3268\" target=\"_blank\">Video Game Review - Ark Survival Evolved</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3269\" target=\"_blank\">3269</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-02-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3269\" target=\"_blank\">Linux Inlaws S01E23: The first year of the five year plan</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3270\" target=\"_blank\">3270</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-02-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3270\" target=\"_blank\">An Example of Using Layers</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3271\" target=\"_blank\">3271</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-02-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3271\" target=\"_blank\">Interview with a 6yo child </a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3272\" target=\"_blank\">3272</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-02-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3272\" target=\"_blank\">In GNU/Linux, there is no \"diversity\", we\'re all just data.</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3273\" target=\"_blank\">3273</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-02-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3273\" target=\"_blank\">Embrace Firefox</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3274\" target=\"_blank\">3274</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-02-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3274\" target=\"_blank\">My Custom dwm Setup</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0138.html\" target=\"_blank\">arfab</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3275\" target=\"_blank\">3275</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-02-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3275\" target=\"_blank\">D1 Mini Close Lid to Scan</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3276\" target=\"_blank\">3276</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-02-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3276\" target=\"_blank\">Deepgeek\'s thoughts about HD Radio</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0073.html\" target=\"_blank\">deepgeek</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3277\" target=\"_blank\">3277</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-02-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3277\" target=\"_blank\">Microsoft in my Debian repo</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3278\" target=\"_blank\">3278</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-02-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3278\" target=\"_blank\">A Minor Victory Against Designed-In Obsolescence</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0246.html\" target=\"_blank\">Beeza</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3279\" target=\"_blank\">3279</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-02-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3279\" target=\"_blank\">Linux Inlaws S01E24: Legacy programming languages</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3280\" target=\"_blank\">3280</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-02-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3280\" target=\"_blank\">What We Need For the ActivityPub Network</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 16 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 7 comments on\n4 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2356#comments\" target=\"_blank\">hpr2356</a></strong>\n(2017-08-14) \"<em>Safely enabling ssh in the default Raspbian Image</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2356#4\" target=\"_blank\">Comment 4</a>:\nLeo_B on 2021-02-23:\n\"If you\'re watching this in 2021\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2356#5\" target=\"_blank\">Comment 5</a>:\nKen Fallon on 2021-02-25:\n\"Updated versions\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3187#comments\" target=\"_blank\">hpr3187</a></strong>\n(2020-10-20) \"<em>Ansible for Dynamic Host Configuration Protocol</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3187#2\" target=\"_blank\">Comment 2</a>:\nWindigo on 2021-02-10:\n\"Interesting approach\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3241#comments\" target=\"_blank\">hpr3241</a></strong>\n(2021-01-04) \"<em>HPR Community News for December 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3241#1\" target=\"_blank\">Comment 1</a>:\nclacke on 2021-02-16:\n\"NoSQL and Redis\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3241#2\" target=\"_blank\">Comment 2</a>:\nclacke on 2021-02-16:\n\"Redis pronunciation\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3241#3\" target=\"_blank\">Comment 3</a>:\nDave Morriss on 2021-02-17:\n\"Key/value storage\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3259#comments\" target=\"_blank\">hpr3259</a></strong>\n(2021-01-28) \"<em>Nextcloud - The easy way</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3259#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2021-02-01:\n\"Show name\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 9 comments on 5 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3262#comments\" target=\"_blank\">hpr3262</a></strong>\n(2021-02-02) \"<em>My thoughts on diversity in Linux and open source</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#1\" target=\"_blank\">Comment 1</a>:\nnorist on 2021-02-02:\n\"Storyteller\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#2\" target=\"_blank\">Comment 2</a>:\nBill n1vux on 2021-02-04:\n\"well said\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-02-04:\n\"Further discussion\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#4\" target=\"_blank\">Comment 4</a>:\nblizzack on 2021-02-15:\n\"Systematically kept out - part 1\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#5\" target=\"_blank\">Comment 5</a>:\nblizzack on 2021-02-15:\n\"Systematically kept out - part 2\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3269#comments\" target=\"_blank\">hpr3269</a></strong>\n(2021-02-11) \"<em>Linux Inlaws S01E23: The first year of the five year plan</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3269#1\" target=\"_blank\">Comment 1</a>:\nclaudiom on 2021-02-12:\n\"Thanks for the invite....\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3271#comments\" target=\"_blank\">hpr3271</a></strong>\n(2021-02-15) \"<em>Interview with a 6yo child </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3271#1\" target=\"_blank\">Comment 1</a>:\nthelovebug on 2021-02-16:\n\"Loved this!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3272#comments\" target=\"_blank\">hpr3272</a></strong>\n(2021-02-16) \"<em>In GNU/Linux, there is no \"diversity\", we\'re all just data.</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3272#1\" target=\"_blank\">Comment 1</a>:\nbookewyrmm on 2021-02-17:\n\"welcome\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3274#comments\" target=\"_blank\">hpr3274</a></strong>\n(2021-02-18) \"<em>My Custom dwm Setup</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0138.html\" target=\"_blank\">arfab</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3274#1\" target=\"_blank\">Comment 1</a>:\nmcnalu on 2021-02-19:\n\"Might return to dwm\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-February/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-February/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></b></p>\n<p>Over the period tags and/or summaries have been added to 10 shows which were without them.</p>\n<p>There are now 414 shows which need a summary and/or tags.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3306,'2021-04-05','HPR Community News for March 2021',2000,'HPR Volunteers talk about shows released and comments posted in March 2021','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new host: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0392.html\" target=\"_blank\">timttmy</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3281\" target=\"_blank\">3281</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3281\" target=\"_blank\">HPR Community News for February 2021</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3282\" target=\"_blank\">3282</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3282\" target=\"_blank\">HP Laptop with AMD Ryzen 3 Mobile with Radeon Graphics</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3283\" target=\"_blank\">3283</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3283\" target=\"_blank\">HPR RPG Club reviews Dead Earth</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3284\" target=\"_blank\">3284</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-03-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3284\" target=\"_blank\">Introduction to gdb</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3285\" target=\"_blank\">3285</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-03-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3285\" target=\"_blank\">Upgrading Lubuntu on my Samsung N150 Plus netbook</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3286\" target=\"_blank\">3286</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3286\" target=\"_blank\">Wireguard How To</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0392.html\" target=\"_blank\">timttmy</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3287\" target=\"_blank\">3287</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3287\" target=\"_blank\">Quick tip</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3288\" target=\"_blank\">3288</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3288\" target=\"_blank\">Linux Inlaws S01E25: The Grumpy Old Coders</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3289\" target=\"_blank\">3289</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-03-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3289\" target=\"_blank\">NextCloud the hard way</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3290\" target=\"_blank\">3290</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-03-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3290\" target=\"_blank\">GIMP: More on Layer Tools and Techniques</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3291\" target=\"_blank\">3291</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3291\" target=\"_blank\">The New Audacity and Batch Processing Macros</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3292\" target=\"_blank\">3292</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3292\" target=\"_blank\">Squirrel FSF blog</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3293\" target=\"_blank\">3293</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3293\" target=\"_blank\">HPR RPG Club reviews Dungeon Raiders</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3294\" target=\"_blank\">3294</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-03-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3294\" target=\"_blank\">Update to MakeMKV to back up media</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3295\" target=\"_blank\">3295</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-03-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3295\" target=\"_blank\">Renewing a Let\'s Encrypt cert for Home Network use</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3296\" target=\"_blank\">3296</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3296\" target=\"_blank\">Spam Bot Honey Pot</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0293.html\" target=\"_blank\">Rho`n</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3297\" target=\"_blank\">3297</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3297\" target=\"_blank\">Nextcloud Application Updating</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0273.html\" target=\"_blank\">ToeJet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3298\" target=\"_blank\">3298</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3298\" target=\"_blank\">Poisoning The Well</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3299\" target=\"_blank\">3299</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-03-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3299\" target=\"_blank\">Linux Inlaws S01E26: Make your Linux harder</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3300\" target=\"_blank\">3300</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-03-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3300\" target=\"_blank\">YouTube Channels for Learning Spanish, Part 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3301\" target=\"_blank\">3301</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3301\" target=\"_blank\">K S P Kerbal Space Program! (Game)</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3302\" target=\"_blank\">3302</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3302\" target=\"_blank\">Input Methods on Ubuntu</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0311.html\" target=\"_blank\">clacke</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3303\" target=\"_blank\">3303</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3303\" target=\"_blank\">Slackware on RaspberryPi</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0326.html\" target=\"_blank\">Brian in Ohio</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 15 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 3 comments on\n3 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3153#comments\" target=\"_blank\">hpr3153</a></strong>\n(2020-09-02) \"<em>Fixing eBooks with Calibre and pdfcrop</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3153#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2021-03-03:\n\"Thanks Again.\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3241#comments\" target=\"_blank\">hpr3241</a></strong>\n(2021-01-04) \"<em>HPR Community News for December 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3241#4\" target=\"_blank\">Comment 4</a>:\nclacke on 2021-03-03:\n\"OpenLDAP on BDB?\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3262#comments\" target=\"_blank\">hpr3262</a></strong>\n(2021-02-02) \"<em>My thoughts on diversity in Linux and open source</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3262#6\" target=\"_blank\">Comment 6</a>:\nbjhend on 2021-03-08:\n\"Get rid of bad terms in IT\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 12 comments on 7 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3282#comments\" target=\"_blank\">hpr3282</a></strong>\n(2021-03-02) \"<em>HP Laptop with AMD Ryzen 3 Mobile with Radeon Graphics</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3282#1\" target=\"_blank\">Comment 1</a>:\nfrank on 2021-03-18:\n\"Using your OEM Windows key in a VM\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3289#comments\" target=\"_blank\">hpr3289</a></strong>\n(2021-03-11) \"<em>NextCloud the hard way</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3289#1\" target=\"_blank\">Comment 1</a>:\nmonochromec on 2021-01-29:\n\"apachectl restart vs. systemctl restart apache2.service\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3291#comments\" target=\"_blank\">hpr3291</a></strong>\n(2021-03-15) \"<em>The New Audacity and Batch Processing Macros</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3291#1\" target=\"_blank\">Comment 1</a>:\nRmccurdyDOTcom on 2021-03-15:\n\"audio\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3291#2\" target=\"_blank\">Comment 2</a>:\nGumnos on 2021-03-26:\n\"Which hardware podcast player did you move to?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3291#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-03-27:\n\"Your answer\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3292#comments\" target=\"_blank\">hpr3292</a></strong>\n(2021-03-16) \"<em>Squirrel FSF blog</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3292#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2021-03-09:\n\"Good Question\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3292#2\" target=\"_blank\">Comment 2</a>:\nA listener on 2021-03-16:\n\"Enjoyed the podcast, but...\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3292#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-03-18:\n\"Thank you\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3292#4\" target=\"_blank\">Comment 4</a>:\nThaj on 2021-03-27:\n\"Well...\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3296#comments\" target=\"_blank\">hpr3296</a></strong>\n(2021-03-22) \"<em>Spam Bot Honey Pot</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0293.html\" target=\"_blank\">Rho`n</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3296#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-03-25:\n\"Great show!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3298#comments\" target=\"_blank\">hpr3298</a></strong>\n(2021-03-24) \"<em>Poisoning The Well</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3298#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2021-03-25:\n\"Agreed\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3299#comments\" target=\"_blank\">hpr3299</a></strong>\n(2021-03-25) \"<em>Linux Inlaws S01E26: Make your Linux harder</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3299#1\" target=\"_blank\">Comment 1</a>:\nnobody on 2021-03-25:\n\"Other MAC implementations\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-March/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-March/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></b></p>\n<p>Over the period tags and/or summaries have been added to 10 shows which were without them.</p>\n<p>There are now 404 shows which need a summary and/or tags.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3055,'2020-04-17','Advice to new Fediverse administrators and developers',754,'An experienced admin for a Mastodon Instance at a major Fediverse developer offers some tips','<p>Framasoft is a company that develops for PeerTube and Mobilizon, and also hosts a Mastodon instance. The speaker is the sysadmin for the Mastodon instance gives his tips based on his experience at this non-profit company. <a href=\"https://www.zwilnik.com/?page_id=1098\" class=\"uri\">https://www.zwilnik.com/?page_id=1098</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk1_Luc_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk1_Luc_compressed.mov</a></li>\r\n<li><a href=\"https://frama.link/ap-conf-2019\" class=\"uri\">https://frama.link/ap-conf-2019</a></li>\r\n<li><a href=\"https://joinpeertube.org/\" class=\"uri\">https://joinpeertube.org/</a></li>\r\n<li><a href=\"https://joinmobilizon.org/en/\" class=\"uri\">https://joinmobilizon.org/en/</a></li>\r\n<li><a href=\"https://soutenir.framasoft.org/en/\" class=\"uri\">https://soutenir.framasoft.org/en/</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1034\" class=\"uri\">https://www.zwilnik.com/?page_id=1034</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1098\" class=\"uri\">https://www.zwilnik.com/?page_id=1098</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(3065,'2020-05-01','The case for the unattributed message',977,'Anonymity can cause problems (trolls) but also can be necessary.','<p>Anonymity has an unfortunate consequence of enabling trolls and abuse. But there are cases where it is important for people to communicate anonymously. In this talk some ideas are presented on how to enable a measure of anonymity without having all of the problems. <a href=\"https://www.zwilnik.com/?page_id=1103\" class=\"uri\">https://www.zwilnik.com/?page_id=1103</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk7_Caleb_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk7_Caleb_compressed.mov</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/EFnet\" class=\"uri\">https://en.wikipedia.org/wiki/EFnet</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Freenet\" class=\"uri\">https://en.wikipedia.org/wiki/Freenet</a></li>\r\n<li><a href=\"https://medium.com/@mhatta/easy-censorship-resistant-communication-with-syndie-e063a6c9cf35\" class=\"uri\">https://medium.com/@mhatta/easy-censorship-resistant-communication-with-syndie-e063a6c9cf35</a></li>\r\n<li><a href=\"https://www.zwilnik.com/wp-admin/post.php?post=1101&amp;action=edit\" class=\"uri\">https://www.zwilnik.com/wp-admin/post.php?post=1101&amp;action=edit</a></li>\r\n<li><a href=\"https://medium.com/@ameet/strong-opinions-weakly-held-a-framework-for-thinking-6530d417e364\" class=\"uri\">https://medium.com/@ameet/strong-opinions-weakly-held-a-framework-for-thinking-6530d417e364</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1034\" class=\"uri\">https://www.zwilnik.com/?page_id=1034</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1103\" class=\"uri\">https://www.zwilnik.com/?page_id=1103</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Privacy, Anonymity',0,0,1),
(3075,'2020-05-15','Federated Blogging with WriteFreely',740,'A look at a minimally social blogging app using ActivityPub.','<p>Many social media apps seem determined to put bells and whistles in every possible place, which is not always in the interest of the user. This talk presents an alternative view which is called “minimally social” which only puts in the features needed by the user. In this case, the main focus is on a simple blogging app. There is also a brief mention of a very technical talk about coding. <a href=\"https://www.zwilnik.com/?page_id=1103\" class=\"uri\">https://www.zwilnik.com/?page_id=1103</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk8_Matt_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk8_Matt_compressed.mov</a></li>\r\n<li><a href=\"https://read.as/\" class=\"uri\">https://read.as/</a></li>\r\n<li><a href=\"https://libresaas.org/\" class=\"uri\">https://libresaas.org/</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1105\" class=\"uri\">https://www.zwilnik.com/?page_id=1105</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk9_Michael_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk9_Michael_compressed.mov</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1103\" class=\"uri\">https://www.zwilnik.com/?page_id=1103</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Blogging',0,0,1),
(3085,'2020-05-29','Architectures of Robust Openness',1142,'A look at how to secure social networks against attack while still being open to strangers.','<p>Social networks can be attacked by people who want to cause abuse and disruption, and one way to deal with that is to lock down the membership. But that goes against the idea of social, which should include being open to welcoming strangers. Mark Miller presents an analysis of how you can be both secure and welcoming which focuses on Object Capabilities. <a href=\"https://www.zwilnik.com/?page_id=1107\" class=\"uri\">https://www.zwilnik.com/?page_id=1107</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-mark\" class=\"uri\">https://archive.org/details/apconf-mark</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Project_Xanadu\" class=\"uri\">https://en.wikipedia.org/wiki/Project_Xanadu</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Miller_columns\" class=\"uri\">https://en.wikipedia.org/wiki/Miller_columns</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/E_(programming_language)\" class=\"uri\">https://en.wikipedia.org/wiki/E_(programming_language)</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Caja_programming_language\" class=\"uri\">https://en.wikipedia.org/wiki/Caja_programming_language</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Foresight_Institute\" class=\"uri\">https://en.wikipedia.org/wiki/Foresight_Institute</a></li>\r\n<li><a href=\"https://www.synopsys.com/blogs/software-security/polaris-software-integrity-platform/\" class=\"uri\">https://www.synopsys.com/blogs/software-security/polaris-software-integrity-platform/</a></li>\r\n<li><a href=\"https://www.cs.jhu.edu/~seaborn/plash/html/\" class=\"uri\">https://www.cs.jhu.edu/~seaborn/plash/html/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Bitfrost\" class=\"uri\">https://en.wikipedia.org/wiki/Bitfrost</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Security_Content_Automation_Protocol\" class=\"uri\">https://en.wikipedia.org/wiki/Security_Content_Automation_Protocol</a></li>\r\n<li><a href=\"https://alanhkarp.com/scoopfs/index.html\" class=\"uri\">https://alanhkarp.com/scoopfs/index.html</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Secure_Scuttlebutt\" class=\"uri\">https://en.wikipedia.org/wiki/Secure_Scuttlebutt</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1107\" class=\"uri\">https://www.zwilnik.com/?page_id=1107</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Security, OCaps',0,0,1),
(3000,'2020-01-31','Chopin Free project',1433,'An effort to produce royalty and copyright free versions of Frédéric Chopin work.','<p>\r\nThe <a href=\"https://musopen.org/about/\">Musopen</a> (www.musopen.org) is a 501(c)(3) non-profit focused on improving access and exposure to music by creating free resources and educational materials. We provide recordings, sheet music, and textbooks to the public for free, without copyright restrictions. Put simply, our mission is to set music free.\r\n</p>\r\n<p>\r\nTheir latest <a href=\"https://www.kickstarter.com/projects/Musopen/set-chopin-free\">Kickstarter</a> aims to open the works of <a href=\"https://en.wikipedia.org/wiki/Fr%C3%A9d%C3%A9ric_Chopin\">Frédéric Chopin</a> copyright free.\r\n</p>',383,0,0,'CC-BY-SA','musopen, Frédéric Chopin',0,0,1),
(3004,'2020-02-06','Fixing simple audio problems with Audacity',808,'Sharing a few experiences with Audacity that may be helpful to others','<h2 id=\"overview\">Overview</h2>\r\n<p>I recorded the audio for the show I did with <a href=\"https://hackerpublicradio.org/correspondents/0201.html\" title=\"MrX\">MrX</a> in late 2019: <a href=\"https://hackerpublicradio.org/eps.php?id=2972\">“hpr2972 :: The foot of the ski slope”</a>. I was using my Zoom H2n recorder in my car, on a small tripod placed on the dashboard. Something about this setup caused the result to be very <em>boomy</em> and (to me) unpleasant to listen to. This episode is about what I did for a cure, after some research.</p>\r\n<p>I have also been using the <a href=\"https://manual.audacityteam.org/man/truncate_silence.html\" title=\"Truncate Silence\">‘<em>Truncate Silence</em>’</a> effect in Audacity incorrectly in the past, and I used the opportunity to learn how to do a better job with it.</p>\r\n<p>Now, I am well aware that there are some skilled and experienced Audio Engineers out there in HPR-land. I am certainly not one of these, though I quite enjoy fiddling with audio to make it sound better. I’d like to make two requests:</p>\r\n<ol type=\"1\">\r\n<li>If I didn’t do a good job, please tell me what I did wrong here, and how I should have done it.</li>\r\n<li>Think about doing a show (or shows) on HPR about how to deal with common audio problems. For example: how to remove a mains hum, the use of compression and normalisation.</li>\r\n</ol>\r\n<h2 id=\"long-notes\">Long notes</h2>\r\n<p>A longer form of these notes may be <a href=\"https://hackerpublicradio.org/eps/hpr3004/full_shownotes.html\">found here (full_shownotes.html)</a>. These go into more detail on the steps I took to try and make the audio for show 2972 more tolerable.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Wikipedia page describing <a href=\"https://en.wikipedia.org/wiki/Audacity_%28audio_editor%29\">Audacity</a></li>\r\n<li>Audacity <a href=\"https://www.audacityteam.org/\">website</a></li>\r\n<li>Effects:\r\n<ul>\r\n<li><a href=\"https://manual.audacityteam.org/man/noise_reduction.html\">Noise Reduction</a></li>\r\n<li><a href=\"https://manual.audacityteam.org/man/high_pass_filter.html\">High-pass Filter</a></li>\r\n<li><a href=\"https://manual.audacityteam.org/man/amplify.html\">Amplify</a></li>\r\n<li><a href=\"https://manual.audacityteam.org/man/truncate_silence.html\">Truncate Silence</a></li>\r\n</ul></li>\r\n</ul>\r\n',225,0,1,'CC-BY-SA','audio,Audacity,effects,problem solving',0,0,1),
(3009,'2020-02-13','Linux Inlaws S01E01',3570,'Linux Inlaws - a podcast about on topics around free and open source software','<p><em>Linux Inlaws</em> - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.</p>\r\n<p>Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute t-rexes or other associated dinosaurs.</p>\r\n\r\n<p>\r\nIn this show the lads introduce themselves and discuss the technology they use and why they are putting on the show.\r\n</p>\r\n\r\n<h3>Links:</h3>\r\n<ul>\r\n<li><a href=\"https://linuxinlaws.eu/\">https://linuxinlaws.eu/</a></li>\r\n<li>email: feedback at linuxinlaws eu</li>\r\n<li><a href=\"https://traceroute-online.com/mtr/\">https://traceroute-online.com/mtr/</a></li>\r\n</ul>\r\n',384,111,1,'CC-BY','free open source software revolution',0,0,1),
(3095,'2020-06-12','Intro to GIMP',1064,'An introduction to GIMP to kick off a new series.','<p>GIMP is the open source alternative to the proprietary Photoshop, and can do most of the same things while respecting your freedom. This show will kick off a new series of tutorials. As a note of caution, I am not an expert, I am just learning GIMP as I go. But I thought there was no harm in sharing my experiences with the HPR community. <a href=\"https://www.ahuka.com/?page_id=1423\" class=\"uri\">https://www.ahuka.com/?page_id=1423</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.youtube.com/watch?v=Q8C0LJPpr64\" class=\"uri\">https://www.youtube.com/watch?v=Q8C0LJPpr64</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=SoP5LOFxPeY\" class=\"uri\">https://www.youtube.com/watch?v=SoP5LOFxPeY</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=_L_MMU22bAw\" class=\"uri\">https://www.youtube.com/watch?v=_L_MMU22bAw</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=TiavEWDVQGE\" class=\"uri\">https://www.youtube.com/watch?v=TiavEWDVQGE</a></li>\r\n<li><a href=\"https://www.gimp.org/tutorials/\" class=\"uri\">https://www.gimp.org/tutorials/</a></li>\r\n<li><a href=\"https://www.makeuseof.com/tag/gimp-photo-editing/\" class=\"uri\">https://www.makeuseof.com/tag/gimp-photo-editing/</a></li>\r\n<li><a href=\"https://www.wikihow.com/Use-GIMP\" class=\"uri\">https://www.wikihow.com/Use-GIMP</a></li>\r\n<li><a href=\"https://daviesmediadesign.com/20-gimp-2-10-tutorials-for-beginners/\" class=\"uri\">https://daviesmediadesign.com/20-gimp-2-10-tutorials-for-beginners/</a></li>\r\n<li><a href=\"https://www.pcworld.com/article/3451356/gimp-basics-tips-and-tricks-for-beginners.html\" class=\"uri\">https://www.pcworld.com/article/3451356/gimp-basics-tips-and-tricks-for-beginners.html</a></li>\r\n<li><a href=\"https://howtogimp.com/\" class=\"uri\">https://howtogimp.com/</a></li>\r\n<li><a href=\"https://issuu.com/gimpmagazine\" class=\"uri\">https://issuu.com/gimpmagazine</a></li>\r\n<li><a href=\"https://www.gimp.org/downloads/\" class=\"uri\">https://www.gimp.org/downloads/</a></li>\r\n<li><a href=\"https://whatis.techtarget.com/fileformat/XCF-GIMP-document\" class=\"uri\">https://whatis.techtarget.com/fileformat/XCF-GIMP-document</a></li>\r\n<li><a href=\"https://gist.github.com/rbrito/e57c87d5376fd56113df058abf71bdf3\" class=\"uri\">https://gist.github.com/rbrito/e57c87d5376fd56113df058abf71bdf3</a></li>\r\n<li><a href=\"https://www.ahuka.com/?page_id=1423\" class=\"uri\">https://www.ahuka.com/?page_id=1423</a></li>\r\n</ul>\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics',0,0,1),
(3010,'2020-02-14','FOSDEM first impressions',1638,'Impressions from my first attendance at FOSDEM.','<p><a href=\"https://fosdem.org\">FOSDEM</a> is the biggest Free and Open Source conference in the world and on its 20<sup>th</sup> anniversary I decided to attend for the first time. By a good turn of fate, and some well-judged pitching, Ken Fallon secured a stand for the <a href=\"https://freeculturepodcasts.org/\">Free Culture Podcasts project</a> which is an umbrella group that covers HPR, many of the shows on <a href=\"https://otherside.network/\">The Other Side Network</a> and many more excellent podcasts that are released under creative commons licenses.</p>\r\n\r\n<p>This audio is recorded in snippets in between manning the stand and gives some off-the-cuff observations from a FOSDEM noob. I was surprised to find that relatively few visitors to our stand had heard of HPR, which we quickly rectified of course, and I give a brief summary of the feedback we received. Also mentioned in this show, but not actually appearing, are my co-conspirators at FOSDEM, <a href=\"https://hackerpublicradio.org/correspondents/0030.html\">Ken</a>, <a href=\"https://hackerpublicradio.org/correspondents/0288.html\">Beni</a>, <a href=\"https://hackerpublicradio.org/correspondents/0129.html\">JWP</a> as well as <a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a> who unfortunately wasn\'t able to join us in person but was very much there in spirit.</p>\r\n\r\n',268,0,0,'CC-BY-SA','fosdem,conference,podcasts,creative commons',0,0,1),
(3012,'2020-02-18','Sample episode from Wikipediapodden',518,'An English microsode of their Swedish language podcast about Wikipedia.','<p>\r\nJan Ainali from the  <a href=\"https://wikipediapodden.se/\">https://wikipediapodden.se/</a> podcast came over to the <a href=\"https://freeculturepodcasts.org/\">https://freeculturepodcasts.org/</a> booth at <a href=\"https://fosdem.org/2020/\">FOSDEM</a> 2020.\r\n</p>\r\n<p>\r\nThey do a Swedish Language Podcast about wikipedia et al, and of course we added them to the <a href=\"https://freeculturepodcasts.org/\">https://freeculturepodcasts.org/</a> site. While their main shows are in Swedish, they also have summaries that they do in English which can be found at <a href=\"https://wikipediapodden.se/tag/english/\">https://wikipediapodden.se/tag/english/</a>, (<a href=\"https://wikipediapodden.se/tag/english/feed/\">RSS Feed</a>).\r\n</p>',30,75,1,'CC-BY-SA','fosdem, wikipediapodden, swedish, sweden',0,0,1),
(3036,'2020-03-23','WiiU is dead long live WiiU!',1439,'How to approach dea-ish mod communities','<ul>\r\n<li><p>lulz:<br />\r\n<a href=\"https://twitter.com/operat0r/status/1224025568334708737\" class=\"uri\">https://twitter.com/operat0r/status/1224025568334708737</a></p></li>\r\n<li><p>Discord:<br />\r\n<a href=\"https://discord.gg/nintendohomebrew\" class=\"uri\">https://discord.gg/nintendohomebrew</a></p></li>\r\n<li><p>Saves:<br />\r\n<a href=\"https://gbatemp.net/threads/wii-u-save-files-compilation.427761/#post-6374659\" class=\"uri\">https://gbatemp.net/threads/wii-u-save-files-compilation.427761/#post-6374659</a></p></li>\r\n<li><p>lego ntsc save<br />\r\n<a href=\"https://drive.google.com/open?id=1bTtXv1c8NkOkeHoKOkWHhP6RbiXv9ERo\" class=\"uri\">https://drive.google.com/open?id=1bTtXv1c8NkOkeHoKOkWHhP6RbiXv9ERo</a><br />\r\n<a href=\"https://www.youtube.com/user/BullyWiiPlaza/videos\" class=\"uri\">https://www.youtube.com/user/BullyWiiPlaza/videos</a></p></li>\r\n<li><p>old cheat engine files:<br />\r\n<a href=\"https://rmccurdy.com/.scripts/downloaded/CheatEngineTables-master/tables/\" class=\"uri\">https://rmccurdy.com/.scripts/downloaded/CheatEngineTables-master/tables/</a></p></li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','wiiu,modding,hacking,tcpgecko,android,ssl pinning,games',0,0,1),
(3014,'2020-02-20','A Headless Raspberry Pi Streaming Radio',1068,'I use a Raspberry Pi to make a streaming radio device for my pillow speaker.','<p>In this episode I talk about how I used a Raspberry Pi to create a streaming radio device to feed my pillow speaker. This is something I used to do with clock radios and later a satellite radio, but in an effort to decrease monthly subscription costs for services I did not use optimally, I discontinued my satellite radio subscription about a year ago. This new free solution is an excellent substitute for Satellite Radio so far, since I was mostly listening to this same channel on the Sat Radio but paying about $12 a month for the privilege. The device I’m using is a <a href=\"https://www.raspberrypi.org/products/raspberry-pi-2-model-b/\">Raspberry Pi 2 Model B</a> with <a href=\"https://ubuntu.com/download/raspberry-pi\">Ubuntu Server</a>. My barrier to this project in the past was not being able to find the URL for the stream I wanted but I discovered you can find it easily if you use Firefox with <a href=\"https://www.downloadhelper.net/\">Video Download Helper</a> to reveal the URL on a page with media playing (in this case it’s from TuneIn):</p>\r\n\r\n<pre><code>https://XX.XXX.XXX.XXX/radio-stationmp3-48?session-id=af1b271fefba04b650f8e253c6b253bd&source=TuneIn\r\n</code></pre>\r\n\r\n<p>Strip off everything after the <code>48</code> to get raw URL:</p>\r\n\r\n<pre><code>https://XX.XXX.XXX.XXX/radio-stationmp3-48\r\n</code></pre>\r\n\r\n<p>Command to play stream with <a href=\"https://www.mpg123.de/\">mpg123</a> on the Pi. Using the <code>-q</code> option to suppress output:</p>\r\n\r\n<pre><code>mpg123-pulse -q https://XX.XXX.XXX.XXX/radio-stationmp3-48 &\r\n</code></pre>\r\n\r\n<p>Once I figure out the command that plays the stream I want, I save the command as an executable script in <code>/home/$user/bin</code>.</p>\r\n\r\n<h3 id=\"usingtheradio\">Using the “Radio”</h3>\r\n\r\n<p>To start playing a stream you first have to SSH into the RasPi. This is easy from a laptop using any terminal emulator. I use pubkey auth so I don’t have to type a password every time. On my phone I use <a href=\"https://play.google.com/store/apps/details?id=org.connectbot&hl=en_US\">ConnectBot</a>. Once I’m into the Pi I run the radio commands from CLI like <code>espn</code> or <code>kmfa</code> or <code>krvs</code>. To stop playback I kill the process with <code>pkill mpg</code>. I have a 3.5mm audio splitter Plugged into the headphone jack of the USB audio interface. In one side of the splitter I’ve got an old pair of earbuds where one side didn’t work, with the working earbud under my pillow. That’s my pillow speaker. On the other side of the splitter I put the audio cable for an <a href=\"https://smile.amazon.com/gp/product/B005GUQ0FI/\">FM transmitter</a>, so that I can use an FM radio to listen to the stream while I’m walking around the house.</p>\r\n\r\n<p>Click the image below to see pictures of the setup.</p>\r\n\r\n<p><a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/137675441@N05/albums/72157712927722077\" title=\"Raspberry Pi Radio\"><img src=\"https://live.staticflickr.com/65535/49473218252_39195601ed.jpg\" width=\"500\" height=\"281\" alt=\"Raspberry Pi Radio\"></a></p>\r\n\r\n<h3 id=\"links\">Links</h3>\r\n\r\n<ul>\r\n<li><a href=\"https://www.raspberrypi.org/products/raspberry-pi-2-model-b/\">Raspberry Pi 2 Model B</a></li>\r\n<li><a href=\"https://ubuntu.com/download/raspberry-pi\">Ubuntu Server</a></li>\r\n<li><a href=\"https://www.downloadhelper.net/\">Video Download Helper</a> (Firefox extension)</li>\r\n<li>The <a href=\"https://smile.amazon.com/gp/product/B001MSS6CS/\">USB Audio interface</a> I use</li>\r\n<li>Panda Wireless <a href=\"https://smile.amazon.com/gp/product/B00762YNMG\">USB WiFi adapter</a></li>\r\n<li><a href=\"https://www.mpg123.de/\">mpg123</a> command-line audio player</li>\r\n<li><a href=\"https://play.google.com/store/apps/details?id=org.connectbot&hl=en_US\">ConnectBot</a></li>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B005GUQ0FI/\">C. Crane FM Transmitter</a></li>\r\n</ul>\r\n',238,0,0,'CC-BY-SA','Raspberry Pi, Internet Radio, Streaming Radio, Radio, Streaming Audio, Ubuntu, Ubuntu Server',0,0,1),
(3018,'2020-02-26','Encrypted edit',1234,'Klaatu talks about editing and viewing encrypted files in a tmpfs in RAM','<ul>\r\n<li><a href=\"https://www.passwordstore.org/\" target=\"_blank\">Password-store</a> and the <strong>pre</strong> command.</li>\r\n<li><a href=\"https://gitlab.com/notklaatu/credit/\" target=\"_blank\">Credit</a> command</li>\r\n</ul>\r\n',78,0,0,'CC-BY-SA','GPG, privacy',0,0,1),
(3017,'2020-02-25','Developing Black and White Film',2544,'Join me as I develop my first roll of black and white film since over 30 years ago.','<p>My photos will be available at: <a href=\"https://pquirk.com\" class=\"uri\">https://pquirk.com</a></p>\r\n',383,0,0,'CC-BY-SA','Photography,film,developing,black and white',0,0,1),
(3019,'2020-02-27','Linux Inlaws S01E02 FOSDEM shenanigans',3929,'Linux Inlaws - a podcast about on topics around free and open source software','<p>Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://linuxinlaws.eu\" class=\"uri\">https://linuxinlaws.eu</a></li>\r\n<li><a href=\"https://fosdem.org\" class=\"uri\">https://fosdem.org</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=3009\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=3009</a></li>\r\n</ul>',384,111,1,'CC-BY-SA','free open source software, revolution, FLOSS',0,0,1),
(3013,'2020-02-19','Bash Tips - 21',2497,'Environment variables','<h2 id=\"the-environment-more-collateral-bash-tips\">The Environment <small><small>(More collateral Bash tips)</small></small></h2>\r\n<h3 id=\"overview\">Overview</h3>\r\n<p>You will probably have seen references to <em>The Environment</em> in various contexts relating to shells, shell scripts, scripts in other languages and compiled programs.</p>\r\n<p>In Unix and Unix-like operating systems an environment is maintained by the shell, and we will be looking at how Bash deals with this in this episode. When a script, program or subprocess is invoked it is given an array of strings called the <em>environment</em>. This is a list of name-value pairs, of the form <code>name=value</code>.</p>\r\n<h4 id=\"using-the-environment\">Using the environment</h4>\r\n<p>The environment is used to convey various pieces of information to the executing script or program. For example, two standard variables provided by the shell are <code>\'HOME\'</code>, which is set to the current user’s home directory and <code>\'PWD</code>, set to the current working directory. The shell user can set, change, remove and view environment variables for their own purposes as we will see in this episode. The Bash shell itself creates and in some cases manages environment variables.</p>\r\n<p>The environment contains global data which is passed down to subprocesses (<em>child</em> processes) by copying. However, it is not possible for a subprocess to pass information <b>back</b> to the superior (<em>parent</em>) process.</p>\r\n<h4 id=\"viewing-the-environment\">Viewing the environment</h4>\r\n<p>You can view the environment in a number of ways.</p>\r\n<ul>\r\n<li><p>From the command line the command <code>printenv</code> can do this (this is usually but not always a stand-alone command: it’s <code>/usr/bin/printenv</code> on my Debian system). We will look at this command later.</p></li>\r\n<li><p>The command <code>env</code> without any arguments does the same thing as <code>printenv</code> without arguments. This is actually a tool to run a program in a modified environment which we will look at later. The environment printing capability can be regarded as more of a bonus feature.</p></li>\r\n<li><p>Scripting languages like <code>awk</code> (as well as Python and Perl, to name just a few) can view and manipulate the environment.</p></li>\r\n<li><p>Compiled languages such as <code>C</code> can do this too of course.</p></li>\r\n<li><p>There are other commands that will show the environment, and we will look at some of these briefly.</p></li>\r\n</ul>\r\n<h4 id=\"changing-variables-in-the-environment\">Changing variables in the environment</h4>\r\n<p>The variables in the environment are not significantly different from the <em>shell parameters</em> we have seen throughout this Bash Tips series. The only difference is that they are marked for <em>export</em> to commands and sub-shells. You will often see variables (or parameters) in the environment referred to as <em>environment variables</em>. The Bash manual makes a distinction between ordinary parameters (variables) and environment variables, but many other sources are less precise about this in my experience.</p>\r\n<p>The standard variables in the environment have upper-case names (<code>HOME</code>, <code>SHELL</code>, <code>PWD</code>, etc), but there is no reason why a variable you create should not be in lower or mixed case. In fact, the Bash manual suggests that you should avoid using all upper-case names so as not to clash with Bash’s variables.</p>\r\n<p>Variables can be created and changed a number of ways.</p>\r\n<ul>\r\n<li>They can be set up at login time (globally or locally) through various standard configuration files. It is intended to look at this subject in an upcoming episode so we will leave discussing the subject until then.</li>\r\n<li>By preceding the command or script invocation with <em>name=value</em> expressions which will temporarily place these variables into the environment for the command</li>\r\n<li>Using the <code>export</code> command</li>\r\n<li>Using the <code>declare</code> command with the <code>-x</code> option</li>\r\n<li>The value of an environment variable (once established) can be changed at any time in the sub-shell with a command like <code>myvar=42</code>, just as for a normal variable</li>\r\n<li>The <code>export</code> command can also be used to turn off the <em>export</em> marker on a variable</li>\r\n<li>Deletion is performed with the <code>unset</code> command (as seen earlier in the series)</li>\r\n</ul>\r\n<p>We will look at all of these features in more detail later in the episode.</p>\r\n<h2 id=\"long-notes\">Long notes</h2>\r\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"https://hackerpublicradio.org/eps/hpr3013/full_shownotes.html\">viewed here</a>.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">“<em>GNU BASH Reference Manual</em>”</a>\r\n<ul>\r\n<li>Section <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Command-Execution-Environment\">“3.7.3 Command Execution Environment”</a></li>\r\n<li>Section <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Environment\">“3.7.4 Environment”</a></li>\r\n</ul></li>\r\n<li><a href=\"https://www.gnu.org/software/coreutils/manual/\"><em>GNU Coreutils Manual</em></a>\r\n<ul>\r\n<li>Section <a href=\"https://www.gnu.org/software/coreutils/manual/html_node/env-invocation.html\">23.2 env: Run a command in a modified environment</a></li>\r\n</ul></li>\r\n<li><p><a href=\"https://en.wikipedia.org/wiki/Env\">Wikipedia page on the <code>env</code> command</a></p></li>\r\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\r\n<li>Previous episodes under the heading <em>Bash Tips</em>:<br />\r\n<small><strong>Episode number</strong></small>\r\n<ol>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1648\">HPR episode 1648 <code>\"</code><em>Bash parameter manipulation</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1843\">HPR episode 1843 <code>\"</code><em>Some Bash tips</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1884\">HPR episode 1884 <code>\"</code><em>Some more Bash tips</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1903\">HPR episode 1903 <code>\"</code><em>Some further Bash tips</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1951\">HPR episode 1951 <code>\"</code><em>Some additional Bash tips</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2045\">HPR episode 2045 <code>\"</code><em>Some other Bash tips</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2278\">HPR episode 2278 <code>\"</code><em>Some supplementary Bash tips</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2293\">HPR episode 2293 <code>\"</code><em>More supplementary Bash tips</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2639\">HPR episode 2639 <code>\"</code><em>Some ancillary Bash tips - 9</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2649\">HPR episode 2649 <code>\"</code><em>More ancillary Bash tips - 10</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2659\">HPR episode 2659 <code>\"</code><em>Further ancillary Bash tips - 11</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2669\">HPR episode 2669 <code>\"</code><em>Additional ancillary Bash tips - 12</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2679\">HPR episode 2679 <code>\"</code><em>Extra ancillary Bash tips - 13</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2689\">HPR episode 2689 <code>\"</code><em>Bash Tips - 14 (Some auxiliary Bash tips)</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2699\">HPR episode 2699 <code>\"</code><em>Bash Tips - 15 (More auxiliary Bash tips)</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2709\">HPR episode 2709 <code>\"</code><em>Bash Tips - 16 (Further auxiliary Bash tips)</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2719\">HPR episode 2719 <code>\"</code><em>Bash Tips - 17 (Additional auxiliary Bash tips)</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2729\">HPR episode 2729 <code>\"</code><em>Bash Tips - 18 (Extra auxiliary Bash tips)</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2739\">HPR episode 2739 <code>\"</code><em>Bash Tips - 19 (Supplemental auxiliary Bash tips)</em><code>\"</code></a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2756\">HPR episode 2756 <code>\"</code><em>Bash Tips - 20 (Some collateral Bash tips)</em><code>\"</code></a></li>\r\n</ol></li>\r\n</ul>\r\n<ul>\r\n<li>Resources:\r\n<ul>\r\n<li>Examples:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3013/bash21_ex1.sh\">bash21_ex1.sh</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3013/bash21_ex2.sh\">bash21_ex2.sh</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3013/bash21_ex3.awk\">bash21_ex3.awk</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3013/bash21_ex4.sh\">bash21_ex4.sh</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3013/bash21_ex5.sh\">bash21_ex5.sh</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3013/bash21_ex6.sh\">bash21_ex6.sh</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3013/bash21_ex6_1.cfg\">bash21_ex6_1.cfg</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3013/bash21_ex6_2.cfg\">bash21_ex6_2.cfg</a></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n',225,42,1,'CC-BY-SA','Bash,variable,environment,environment variable',0,0,1),
(3020,'2020-02-28','Validating data in Haskell',1500,'Tuula talks about wow to validate incoming http request before acting on them','<h1 id=\"background\">Background</h1>\r\n<p>The space game I working on needs a admin interface that can by used by game masters to view and modify the simulation.</p>\r\n<p>For start, I added interface for viewing, modifying and creating new people. It has three HTTP endpoints that are defined below. In this episode, I’ll concentrate on creating a new person and especially making sure that parameters used are valid.</p>\r\n<pre><code>/api/admin/people              AdminApiPeopleR     GET\r\n/api/admin/people/#PersonId    AdminApiPersonR     GET PUT\r\n/api/admin/addPerson           AdminApiAddPersonR  POST</code></pre>\r\n<h1 id=\"types-and-parsing\">Types and parsing</h1>\r\n<p>There are two important approaches on making sure that data is valid. Making illegal state unpresentable and parsing instead of validation.</p>\r\n<p>If it’s impossible to create invalid data, you don’t have to validate it. Instead of using <code>Integer</code> and checking that given parameter is 0 or more, you should use <code>Natural</code>. Since <code>Natural</code> can’t have negative values, you don’t have to validate it. Similarly, instead of using a list, you could use <code>NonEmpty</code> to make sure that there’s at least one element present in the collection.</p>\r\n<p>Parse, don’t validate is similar approach. Instead of having a lax parser and then validating the result, parser should reject data that doesn’t make sense. By selecting suitable datatypes to represent data in the system, simply parsing incoming message is sometimes enough to validate it at the same time.</p>\r\n<h1 id=\"person-creation\">Person creation</h1>\r\n<p>Function in charge of generating a new person has signature of <code>generatePersonM :: RandomGen g =&gt; StarDate -&gt; PersonOptions -&gt; Rand g Person</code>. Given a current <code>StarDate</code> and <code>PersonOptions</code> describing what kind of person is needed, it will return a computation that can be executed to generate a random person.</p>\r\n<p><code>PersonOptions</code> is very barebones. There’s only one field to tell what kind of age the person should have and even that is an optional field.</p>\r\n<pre><code>data PersonOptions = PersonOptions\r\n    { personOptionsAge :: Maybe AgeOptions\r\n    } deriving (Show, Read, Eq)</code></pre>\r\n<p><code>AgeOptions</code> has two possibilities. <code>AgeBracket</code> describes case where age should be inside of given range. <code>ExactAge</code> specifies exactly what age should be.</p>\r\n<pre><code>data AgeOptions =\r\n    AgeBracket Age Age\r\n    | ExactAge Age\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p><code>Age</code> is newtype wrapping <code>Natural</code>, thus <code>Age</code> can never be less than zero.</p>\r\n<pre><code>newtype Age = Age { unAge :: Natural }\r\n    deriving (Show, Read, Eq, Num, Ord)</code></pre>\r\n<p>Hand written <code>FromJSON</code> instance takes care of rejecting numbers that aren’t integers and at least zero. One could skip the checks here and parsed <code>Age</code> still couldn’t be negative. Advantage of explicit checks is that we get much nicer error message instead of just annoying runtime exception.</p>\r\n<pre><code>instance FromJSON Age where\r\n    parseJSON =\r\n        withScientific &quot;age&quot;\r\n            (\\x -&gt; case toBoundedInteger x of\r\n                Nothing -&gt;\r\n                    mempty\r\n\r\n                Just n -&gt;\r\n                    if n &gt;= 0 then\r\n                        return $ Age $ fromIntegral (n :: Int)\r\n\r\n                    else\r\n                        mempty)</code></pre>\r\n<p>So, when creating a new person, you can have:</p>\r\n<ul>\r\n<li>no age options at all, computer can pick something</li>\r\n<li>specific age, computer calculates date of birth based on current date</li>\r\n<li>age bracket, computer calculates date of birth based on current date and bracket</li>\r\n<li>age is always integer that is 0 or more</li>\r\n</ul>\r\n<p>There’s still possibility of error. Nothing ensure that age bracket makes sense. It could be <code>AgeBracket (Age 10) (Age 5)</code> (bracket from 10 to 5). We need to add a bit of validation.</p>\r\n<p><code>Data.Validation</code> is “a data-type like Either but with an accumulating Applicative”. What this means to me is that I can validate multiple aspects and collect errors in a list. It’s handy for getting all the problems at once, instead of having to fix them one by one and retry after each fix.</p>\r\n<p>Our validation function has signature <code>validateAddPerson :: PersonOptions -&gt; Validation [ErrorCode] PersonOptions</code>. Given <code>PersonOptions</code>, it will give list of <code>ErrorCode</code> and original <code>PersonOptions</code>. Multiple validation functions can be combined for more complex validations.</p>\r\n<p>In our example <code>validateAgeOptions</code> validates only age related options of the data. <code>validateAddPerson</code> is supposed to validate whole data, but currently it just delegates to <code>validateAgeOptions</code>. In the future, we can add more validations by adding more functions and chaining them with <code>&lt;*</code> operator.</p>\r\n<pre><code>validateAddPerson :: PersonOptions -&gt; Validation [ErrorCode] PersonOptions\r\nvalidateAddPerson opt =\r\n        pure opt\r\n            &lt;* validateAgeOptions opt\r\n\r\nvalidateAgeOptions :: PersonOptions -&gt; Validation [ErrorCode] PersonOptions\r\nvalidateAgeOptions opt =\r\n    case personOptionsAge opt of\r\n        Nothing -&gt;\r\n            _Success # opt\r\n\r\n        Just (AgeBracket a b) -&gt;\r\n            if a &lt;= b\r\n                then _Success # opt\r\n                else _Failure # [ AgeBracketStartIsGreaterThanEnd ]\r\n\r\n        Just (ExactAge _) -&gt;\r\n            _Success # opt</code></pre>\r\n<h1 id=\"putting-it-all-together\">Putting it all together</h1>\r\n<p>Function that handles <code>POST</code> message and creates a new person is shown below:</p>\r\n<pre><code>postAdminApiAddPersonR :: Handler Value\r\npostAdminApiAddPersonR = do\r\n    _ &lt;- apiRequireAdmin\r\n    msg &lt;- requireJsonBody\r\n    date &lt;- runDB $ starDate\r\n    _ &lt;- raiseIfFailure $ validateAddPerson msg\r\n    g &lt;- liftIO newStdGen\r\n    let person = evalRand (generatePersonM date msg) g\r\n    pId &lt;- runDB $ insert person\r\n    returnJson (Entity pId person)</code></pre>\r\n<p>It does several things: - check that current user is admin - get json content and parse it to <code>PersonOptions</code> - get current star date from database - validate <code>PersonOptions</code> and return error if validation fails - get new random number generator - generate new person - insert it into database - return tuple of <code>(PersonId, Person)</code></p>\r\n<h1 id=\"closing\">Closing</h1>\r\n<p>Types should represent only valid states. By having invalid state unpresentable, we can avoid many errors. Likewise, parsing should reject invalid data. This usually follows from having invalid states being unpresentable (you can’t parse invalid message to invalid data if you don’t have way to represent that invalid data).</p>\r\n<p>Questions, comments and feedback welcome. Best way to reach me is either by email or in mastodon, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','validation, algebraic data types, json',0,0,1),
(3022,'2020-03-03','FOSDEM 2020 Stand Interviews',5578,'Interviews with some of the stands at FOSDEM 2020','<h1>Table of Contents</h1>\r\n\r\n<ul>\r\n  <li><a href=\"#previous\">Previously Interviewed Projects</a></li>\r\n  <li><a href=\"#missed\">Projects we did not get to Interview (yet)</a></li>\r\n  <li><a href=\"#0_A.D\">0 A.D.</a></li>\r\n  <li><a href=\"#AdoptOpenJDK\">AdoptOpenJDK</a></li>\r\n  <li><a href=\"#Apache_Camel\">Apache Camel</a></li>\r\n  <li><a href=\"#Checkmk\">Checkmk</a></li>\r\n  <li><a href=\"#Coderdojo\">Coderdojo</a></li>\r\n  <li><a href=\"#Eclipse_Foundation\">Eclipse Foundation</a></li>\r\n  <li><a href=\"#GitLab\">GitLab</a></li>\r\n  <li><a href=\"#GNU_Health\">GNU Health</a></li>\r\n  <li><a href=\"#Javascript\">Javascript</a></li>\r\n  <li><a href=\"#Jenkins-x\">Jenkins-x</a></li>\r\n  <li><a href=\"#Kopano\">Kopano</a></li>\r\n  <li><a href=\"#KubeVirt_Metal3\">KubeVirt and Metal3</a></li>\r\n  <li><a href=\"#Micropython_Espruino\">Micropython and Espruino</a></li>\r\n  <li><a href=\"#Nuspell\">Nuspell</a></li>\r\n  <li><a href=\"#openHAB\">openHAB</a></li>\r\n  <li><a href=\"#OpenStack_Foundation\">OpenStack Foundation</a></li>\r\n  <li><a href=\"#OpenTAP\">OpenTAP</a></li>\r\n  <li><a href=\"#OpenUK\">OpenUK</a></li>\r\n  <li><a href=\"#openWifi\">openWifi</a></li>\r\n  <li><a href=\"#OWASP\">OWASP</a></li>\r\n  <li><a href=\"#Percona\">Percona</a></li>\r\n  <li><a href=\"#PineTime\">PineTime</a></li>\r\n  <li><a href=\"#PostGraphile\">PostGraphile</a></li>\r\n  <li><a href=\"#Skolelinux_AlekSIS_Teckids\">Skolelinux / AlekSIS / Teckids</a></li>\r\n  <li><a href=\"#Technoethical\">Technoethical</a></li>\r\n  <li><a href=\"#TinyGo\">Tiny Go</a></li>\r\n  <li><a href=\"#XCP-ng\">XCP-ng</a></li>\r\n  <li><a href=\"#Zenroom\">Zenroom</a></li>\r\n  <li><a href=\"#fenster-full\">Fenster</a></li>\r\n</ul>\r\n\r\n<h2 id=\"previous\">Previously Interviewed Projects</h2>\r\n<ul>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2224#K2.3\">Apache Software Foundation</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2226#AW.4\">Automotive Grade Linux</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.10\">CentOS</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.5\">CiviCRM</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2226#AW.1\">Coreboot</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.4\">Debian</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1702\">Flashrom</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1C.7b\">Foreman</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.7\">FreeBSD Project</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1C.1\">Free Software Foundation Europe</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.2\">Gentoo Linux</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.2\">GNOME</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2227#H.1\">Godot Engine</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2225#K2.15b\">Google Summer of Code</a> (Saturday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1932\">Grafana</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.1b\">Haiku</a> (Saturday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.8\">illumos</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2226#AW.5\">Infobooth on amateur radio</a> (HAM Radio)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2224#K2.5\">Jenkins</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.1\">KDE</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.3\">LibreOffice</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1746\">Linux Professional Institute</a> (Saturday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2225#K2.19\">Matrix</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2224#K2.1\">Mozilla</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2225#K2.18\">Musescore</a> (Saturday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.6\">Nextcloud</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2226#AW.7\">OpenEmbedded</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1957#OpenMandriva\">OpenMandriva</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.9\">openSUSE Project</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1C.7a\">oVirt</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2224#K2.4\">OW2 Open Source Community</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2225#K2.11\">Perl</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.5\">PostgreSQL</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.1a\">ReactOS</a> (Sunday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1697\">Software Freedom Conservancy</a> (Sunday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.11\">The Fedora Project</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2227#H.5\">wolfSSL</a></li>\r\n</ul>\r\n\r\n<h2 id=\"missed\">Projects we did not get to Interview (yet)</h2>\r\n<ul>\r\n  <li><a href=\"https://3box.io/\">3Box</a> (Sunday)</li>\r\n  <li><a href=\"https://www.davx5.com/\">Davx</a></li>\r\n  <li><a href=\"https://fossasia.org/\">FOSSASIA</a> (Sunday)</li>\r\n  <li><a href=\"https://freeculturepodcasts.org/\">Free Culture Podcasts</a> (Sunday)</li>\r\n  <li><a href=\"https://www.linphone.org/\">Linphone</a></li>\r\n  <li><a href=\"https://www.linuxboot.org/\">LinuxBoot</a></li>\r\n  <li><a href=\"https://mattermost.com/\">Mattermost</a></li>\r\n  <li><a href=\"https://www.mautic.org\">Mautic</a> (Saturday)</li>\r\n  <li><a href=\"https://appinventor.mit.edu/\">MIT App Inventor</a> (Sunday)</li>\r\n  <li><a href=\"https://www.ntop.org/\">ntopng</a> (Sunday)</li>\r\n  <li><a href=\"https://www.onlyoffice.com/\">ONLYOFFICE</a></li>\r\n  <li><a href=\"https://opensourcedesign.net\">Open Source Design</a> (Sunday)</li>\r\n  <li><a href=\"https://kiwitcms.org/\">Open Source Test Management</a> (Sunday)</li>\r\n  <li><a href=\"https://pharo.org/\">Pharo</a> (Sunday)</li>\r\n  <li><a href=\"https://pine64.org/\">PINE64</a> (Sunday)</li>\r\n  <li><a href=\"https://raku.org/\">Raku</a></li>\r\n  <li><a href=\"https://sugarlabs.org/\">Sugar Labs</a> (Saturday)</li>\r\n  <li><a href=\"https://syndesis.io/\">Syndesis</a></li>\r\n  <li><a href=\"https://github.com/tine20/tine20\">Tine 2.0</a> (Saturday)</li>\r\n  <li><a href=\"https://www.algoo.fr/fr/tracim\">Tracim</a> (Sunday)</li>\r\n  <li><a href=\"https://yottadb.com/\">YottaDB</a></li>\r\n</ul>\r\n\r\n<h2 id=\"0_A.D\">0 A.D.</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/0_A.D.png\"/></p>\r\n<blockquote cite=\"https://en.wikipedia.org/wiki/0_A.D._(video_game)\">\r\n0 A.D. is a free and open-source, real-time strategy game under development by Wildfire Games. It is a historical war and economy game focusing on the years between 500 BC and 1 BC for the first part, and a planned second part for the years 1 AD to 500 AD. The game is cross-platform, playable on Windows, macOS, FreeBSD, Linux, and OpenBSD. It aims to be entirely free and open-source, using the GPLv2+ license for the game engine and CC BY-SA for the game art. \r\n</blockquote>\r\n\r\n<blockquote cite=\"https://wildfiregames.com/\">\r\nWildfire Games is a global group of volunteer game developers. We create open source games and mods.\r\n</blockquote>\r\n<h3>Listen to the interview with Stanislas Dolcini from 0 A.D.</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/0_A.D-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=94.000000,211.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=94.000000,211.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://play0ad.com\">https://play0ad.com</a></li>\r\n<li>Source Code: <a href=\"https://github.com/StanleySweet?tab=repositories\">https://github.com/StanleySweet?tab=repositories</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/0_A.D._(video_game)\">https://en.wikipedia.org/wiki/0_A.D._(video_game)</a></li>\r\n<li><a href=\"https://wildfiregames.com/\">https://wildfiregames.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"AdoptOpenJDK\">AdoptOpenJDK</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/AdoptOpenJDK.png\"/></p>\r\n<blockquote cite=\"https://adoptopenjdk.net/\">\r\nPrebuilt OpenJDK Binaries for Free!<br />\r\nJava&#153; is the world\'s leading programming language and platform. AdoptOpenJDK uses infrastructure, build and test scripts to produce prebuilt binaries from OpenJDK&#153; class libraries and a choice of either the OpenJDK HotSpot or Eclipse OpenJ9 VM. All AdoptOpenJDK binaries and scripts are open source licensed and available for free.\r\n</blockquote>\r\n<h3>Listen to the interview with Stewart X Addison AdoptOpenJDK</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/AdoptOpenJDK-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=209.000000,294.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=209.000000,294.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://adoptopenjdk.net/\">https://adoptopenjdk.net/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/AdoptOpenJDK\">https://github.com/AdoptOpenJDK</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/OpenJDK#OpenJDK_builds\">https://en.wikipedia.org/wiki/OpenJDK#OpenJDK_builds</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Apache_Camel\">Apache Camel</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Apache_Camel.png\"/></p>\r\n<blockquote cite=\"https://camel.apache.org/\">\r\nApache Camel is an open source framework for message-oriented middleware with a rule-based routing and mediation engine that provides a Java object-based implementation of the Enterprise Integration Patterns using an application programming interface (or declarative Java domain-specific language) to configure routing and mediation rules. The domain-specific language means that Apache Camel can support type-safe smart completion of routing rules in an integrated development environment using regular Java code without large amounts of XML configuration files, though XML configuration inside Spring Framework is also supported. Camel is often used with Apache ServiceMix, Apache ActiveMQ and Apache CXF in service-oriented architecture projects. \r\n</blockquote>\r\n<h3>Listen to the interview with Rachel Yord&#225;n from Apache Camel</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/Apache_Camel-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=304.000000,420.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=304.000000,420.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://camel.apache.org/\">https://camel.apache.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/apache/camel/\">https://github.com/apache/camel/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Apache_Camel\">https://en.wikipedia.org/wiki/Apache_Camel</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Checkmk\">Checkmk</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Checkmk.png\"/></p>\r\n<blockquote cite=\"https://checkmk.com/\">\r\nBest-in-class infrastructure and application monitoring. Helping you stay up and running from simple to the most complex environments.\r\n</blockquote>\r\n<h3>Listen to the interview with Marcel Arentz from Checkmk</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=409.000000,529.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=409.000000,529.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://checkmk.com/\">https://checkmk.com/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/tribe29/checkmk\">https://github.com/tribe29/checkmk</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Check_MK\">https://en.wikipedia.org/wiki/Check_MK</a></li>\r\n<li><a href=\"https://tribe29.com/\">https://tribe29.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Coderdojo\">Coderdojo</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Coderdojo.png\"/></p>\r\n<blockquote cite=\"https://coderdojobelgium.be/en\">\r\nCoderDojo organizes free coding workshops (called Dojo&#146;s) for girls and boys from 7 to 18 years old. A Dojo is entirely prepared and led by volunteers. If you are older, then you can help out at an existing Dojo or start your very own CoderDojo!      \r\n</blockquote>\r\n<h3>Listen to the interview with Coderdojo</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=536.000000,708.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=536.000000,708.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://coderdojobelgium.be/en\">https://coderdojobelgium.be/en</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/CoderDojo\">https://en.wikipedia.org/wiki/CoderDojo</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Eclipse_Foundation\">Eclipse Foundation</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Eclipse_Foundation.png\"/></p>\r\n<blockquote cite=\"https://www.eclipse.org/org/\">\r\nThe Eclipse Foundation provides our global community of individuals and organizations with a mature, scalable, and business-friendly environment for open source software collaboration and innovation. The Foundation is home to the Eclipse IDE, Jakarta EE, and over 350 open source projects, including runtimes, tools, and frameworks for a wide range of technology domains such as the Internet of Things, automotive, geospatial, systems engineering, and many others.\r\n</blockquote>\r\n<h3>Listen to the interview with Mika&#235;l Barbero, Release Engineer, Eclipse Foundation</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/Eclipse_Foundation-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=717.000000,801.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=717.000000,801.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.eclipse.org/org/\">https://www.eclipse.org/org/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Eclipse_Foundation\">https://en.wikipedia.org/wiki/Eclipse_Foundation</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"GitLab\">GitLab</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/GitLab.png\"/></p>\r\n<blockquote cite=\"https://en.wikipedia.org/wiki/GitLab\">\r\nGitLab is a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and CI/CD pipeline features, using an open-source license, developed by GitLab Inc.\r\n</blockquote>\r\n<h3>Listen to the interview with David Planella Director Of Community Relations at GitLab</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/GitLab-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=807.000000,917.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=807.000000,917.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://about.gitlab.com/\">https://about.gitlab.com/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/GitLab\">https://en.wikipedia.org/wiki/GitLab</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"GNU_Health\">GNU Health</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/GNU_Health.png\"/></p>\r\n<blockquote cite=\"https://www.gnuhealth.org/#/about\">\r\nGNU Health combines the socioeconomic determinants of health with state-of-the-art technology in bioinformatics and clinical genetics. It manages the internal processes of a health institution, such as financial management, stock and pharmacies or laboratories (LIMS)\r\n</blockquote>\r\n<h3>Listen to the interview with Axel K. Braun about GNU Health</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/GNU_Health-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=926.000000,1113.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=926.000000,1113.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.gnuhealth.org/\">https://www.gnuhealth.org/</a></li>\r\n<li>Source Code: <a href=\"https://savannah.gnu.org/projects/health\">https://savannah.gnu.org/projects/health</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/GNU_Health\">https://en.wikipedia.org/wiki/GNU_Health</a></li>\r\n<li><a href=\"https://www.gnusolidario.org/\">https://www.gnusolidario.org/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Javascript\">Javascript</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Javascript.png\"/></p>\r\n<blockquote cite=\"https://hackages.io/\">\r\nHackages is a community-based tech company with education at its core. We help you boost your skills and realise your projects through our expertise in training, product development, consultancy and community building.\r\n</blockquote>\r\n<h3>Listen to the interview with Marta Moliz about Javascript</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/Javascript-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1122.000000,1246.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1122.000000,1246.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/JavaScript\">https://en.wikipedia.org/wiki/JavaScript</a></li>\r\n<li><a href=\"https://hackages.io/\">https://hackages.io/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Jenkins-x\">Jenkins-x</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Jenkins-x.png\"/></p>\r\n<blockquote cite=\"https://jenkins-x.io/\">\r\nJenkins X provides pipeline automation, built-in GitOps, and preview environments to help teams collaborate and accelerate their software delivery at any scale.\r\n</blockquote>\r\n<h3>Listen to the interview with Kara de la Marck, Open Source Community Manager at CloudBees, about Jenkins-x</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/Jenkins-x-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1254.000000,1413.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1254.000000,1413.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://jenkins-x.io/\">https://jenkins-x.io/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/jenkins-x\">https://github.com/jenkins-x</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Jenkins_(software)\">https://en.wikipedia.org/wiki/Jenkins_(software)</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Kopano\">Kopano</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Kopano.png\"/></p>\r\n<blockquote cite=\"https://kopano.io/\">\r\n100% Open source collaboration tools: email, calendaring, Mattermost chat, webRTC video meetings, document collaboration with LibreOffice Online, integration with file storage services and more.\r\n</blockquote>\r\n<h3>Listen to the interview with Brian Joseph about Kopano</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/Kopano-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1421.000000,1740.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1421.000000,1740.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://kopano.io/\">https://kopano.io/</a></li>\r\n<li>Source Code: <a href=\"https://stash.kopano.io/repos?visibility=public\">https://stash.kopano.io/repos?visibility=public</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Kopano_(software)\">https://en.wikipedia.org/wiki/Kopano_(software)</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"KubeVirt_Metal3\">KubeVirt and Metal3</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/KubeVirt.png\"/></p>\r\n<blockquote cite=\"https://kubevirt.io/\">\r\nVirtual Machine Management on Kubernetes. Building a virtualization API for Kubernetes. KubeVirt technology addresses the needs of development teams that have adopted or want to adopt Kubernetes but possess existing Virtual Machine-based workloads that cannot be easily containerized. More specifically, the technology provides a unified development platform where developers can build, modify, and deploy applications residing in both Application Containers as well as Virtual \r\n</blockquote>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Metal3.png\"/></p>\r\n<blockquote cite=\"https://metal3.io/\">\r\nThere are a number of great open source tools for bare metal host provisioning, including Ironic. Metal3.io aims to build on these technologies to provide a Kubernetes native API for managing bare metal hosts via a provisioning stack that is also running on Kubernetes. We believe that Kubernetes Native Infrastructure, or managing your infrastructure just like your applications, is a powerful next step in the evolution of infrastructure management.\r\n</blockquote>\r\n<h3>Listen to the interview with KubeVirt and Metal3</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1742.000000,1902.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1742.000000,1902.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://kubevirt.io/\">https://kubevirt.io/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/kubevirt\">https://github.com/kubevirt</a></li>\r\n<li>Project Website: <a href=\"https://metal3.io/\">https://metal3.io/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/metal3-io/metal3-docs\">https://github.com/metal3-io/metal3-docs</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Micropython_Espruino\">Micropython and Espruino</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Micropython.png\"/></p>\r\n<blockquote cite=\"https://micropython.org/\">\r\nMicroPython is a lean and efficient implementation of the Python 3 programming language that includes a small subset of the Python standard library and is optimised to run on microcontrollers and in constrained environments. \r\n</blockquote>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Espruino.png\"/></p>\r\n<blockquote cite=\"\">\r\nEspruino is an open-source JavaScript interpreter for microcontrollers. It is designed for devices with small amounts of RAM (as low as 8kB). Espruino was created by Gordon Williams in 2012 as an attempt to make microcontroller development truly multiplatform. It was made open-source in 2013 after a successful Kickstarter campaign for a development board running the software.\r\n</blockquote>\r\n<h3>Listen to the interview with Christine Spindler from Micropython and Gordon Williams from Espruino</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/Micropython_Espruino-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1910.000000,2248.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1910.000000,2248.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://micropython.org/\">https://micropython.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/micropython\">https://github.com/micropython</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/MicroPython\">https://en.wikipedia.org/wiki/MicroPython</a></li>\r\n<li>Project Website: <a href=\"https://www.espruino.com/\">https://www.espruino.com/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/espruino\">https://github.com/espruino</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Espruino\">https://en.wikipedia.org/wiki/Espruino</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Nuspell\">Nuspell</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Nuspell.png\"/></p>\r\n<blockquote cite=\"\">\r\n</blockquote>\r\n<h3>Listen to the interview with Sander van Geloven from Nuspell</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/Nuspell-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2244.000000,2460.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2244.000000,2460.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://nuspell.github.io\">https://nuspell.github.io</a></li>\r\n<li>Source Code: <a href=\"https://github.com/nuspell/nuspell\">https://github.com/nuspell/nuspell</a></li>\r\n<li><a href=\"https://hellebaard.nl\">https://hellebaard.nl</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"openHAB\">openHAB</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/openHAB.png\"/></p>\r\n<blockquote cite=\"\">\r\nEmpowering the smart home. A vendor and technology agnostic open source automation software for your home.\r\n</blockquote>\r\n<h3>Listen to the interview with Thomas Bail about openHAB</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2465.000000,2625.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2465.000000,2625.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.openhab.org/\">https://www.openhab.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/openhab\">https://github.com/openhab</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/OpenHAB\">https://en.wikipedia.org/wiki/OpenHAB</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"OpenStack_Foundation\">OpenStack Foundation</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/OpenStack_Foundation.png\"/></p>\r\n<blockquote cite=\"\">\r\nThe OpenStack Foundation promotes the global development, distribution and adoption of open infrastructure with more than 105,000 community members from 187 countries around the world. The OpenStack Foundation was founded in September 2012 to provide an independent home for the OpenStack cloud operating system, which has since become one of the largest and most diverse open source projects in history.\r\n</blockquote>\r\n<h3>Listen to the interview with Jeremy Stanley about OpenStack Foundation</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2634.000000,2734.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2634.000000,2734.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.openstack.org/foundation/\">https://www.openstack.org/foundation/</a></li>\r\n<li>Source Code: <a href=\"https://opendev.org/openstack\">https://opendev.org/openstack</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/OpenStack\">https://en.wikipedia.org/wiki/OpenStack</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"OpenTAP\">OpenTAP</h2>\r\n<p><img alt=\"Logo\" src=\"https://hackerpublicradio.org/eps/hpr3022/OpenTAP.png\"/></p>\r\n<blockquote cite=\"https://www.opentap.io/\">\r\nOpenTAP is an open source project for test automation. An open source test sequencing engine. The project is available online at \r\nhttps://Gitlab.com/OpenTAP/OpenTAP\r\n</blockquote>\r\n<h3>Listen to the interview with Michael Dieudonn&#233; about OpenTAP</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2743.000000,2817.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2743.000000,2817.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.opentap.io/\">https://www.opentap.io/</a></li>\r\n<li>Source Code: <a href=\"https://gitlab.com/OpenTAP/opentap\">https://gitlab.com/OpenTAP/opentap</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"OpenUK\">OpenUK</h2>\r\n<p><img alt=\"Logo\" src=\"https://hackerpublicradio.org/eps/hpr3022/OpenUK.png\"/></p>\r\n<blockquote cite=\"\">\r\nWe are a UK organisation committed to develop and sustain UK leadership in Open Technology. We promote businesses, projects and people, who use Open. We strive to collaborate across all existing organisations for Open.\r\n</blockquote>\r\n<h3>Listen to the interview with Amanda Brock about OpenUK</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/OpenUK-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2826.000000,3000.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2826.000000,3000.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://openuk.uk\">https://openuk.uk</a></li>\r\n<li><a href=\"https://openuk.uk/profiles/amanda-brock/\">https://openuk.uk/profiles/amanda-brock/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"openWifi\">openWifi</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/openWifi.png\"/></p>\r\n<blockquote cite=\"\">\r\nopenwifi: Linux mac80211 compatible full-stack IEEE802.11/Wi-Fi design based on SDR (Software Defined Radio).\r\n</blockquote>\r\n<h3>Listen to the interview with XianJun Jiao about openWifi</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/openWifi-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3007.000000,3432.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3007.000000,3432.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Source Code: <a href=\"https://github.com/open-sdr/openwifi\">https://github.com/open-sdr/openwifi</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"OWASP\">OWASP</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/OWASP.png\"/></p>\r\n<blockquote cite=\"\">\r\nThe Open Web Application Security Project (OWASP) is a nonprofit foundation that works to improve the security of software. Through community-led open source software projects, hundreds of local chapters worldwide, tens of thousands of members, and leading educational and training conferences, the OWASP Foundation is the source for developers and technologists to secure the web.\r\n</blockquote>\r\n<h3>Listen to the interview with Antonis Manaras about OWASP</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/OWASP-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3422.000000,3547.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3422.000000,3547.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://owasp.org/\">https://owasp.org/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/OWASP\">https://en.wikipedia.org/wiki/OWASP</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Percona\">Percona</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Percona.png\"/></p>\r\n<blockquote cite=\"\">\r\nPercona is a leading provider of unbiased open source database solutions that allow organizations to easily, securely and affordably maintain business agility, minimize risks, and stay competitive.\r\n</blockquote>\r\n<h3>Listen to the interview with Evgeniy Patlan about Percona</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3554.000000,3598.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3554.000000,3598.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.percona.com/\">https://www.percona.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"PineTime\">PineTime</h2>\r\n<p><img alt=\"Logo\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/PineTime.png\"/></p>\r\n<blockquote cite=\"https://wiki.pine64.org/index.php/PineTime\">\r\nAn Open Source Smartwatch For Your Favorite Devices. Low Cost, High Fidelity.\r\n<br />\r\nThe PineTime is a free and open source smartwatch capable of running custom-built open operating systems. Some of the notable features include a heart rate monitor, a week-long battery as well as a capacitive touch IPS display that is legible in direct sunlight. It is a fully community driven side-project, which means that it will ultimately be up to the developers and end-users to determine when they deem the PineTime ready to ship. \r\n</blockquote>\r\n<h3>Listen to the interview with Koen Zandberg about PineTime</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/PineTime-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3607.000000,3855.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3607.000000,3855.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.pine64.org/pinetime/\">https://www.pine64.org/pinetime/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/bergzand\">https://github.com/bergzand</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Pine_Microsystems\">https://en.wikipedia.org/wiki/Pine_Microsystems</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"PostGraphile\">PostGraphile</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/PostGraphile.png\"/></p>\r\n<blockquote cite=\"https://www.graphile.org/\">\r\nExtensible high-performance automatic GraphQL API for PostgreSQL\r\n</blockquote>\r\n<h3>Listen to the interview with Benjie Gillam, OSS Maintainer PostGraphile</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/PostGraphile-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3865.000000,4085.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3865.000000,4085.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.graphile.org/\">https://www.graphile.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/graphile\">https://github.com/graphile</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Skolelinux_AlekSIS_Teckids\">Skolelinux / AlekSIS / Teckids</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Skolelinux_AlekSIS_Teckids.png\"/></p>\r\n<blockquote cite=\"https://www.teckids.org/en/\">\r\nAt Teckids, all children and adolescents become part of the Free Software community - as users and contributors. Our young tutors aged between 9 and 16 regularly work together on their workshops, which they then lead for children and adolescents of the same age.\r\n</blockquote>\r\n<h3>Listen to the interview with Niels Bradek from Skolelinux / AlekSIS / Teckids</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=4010.000000,4215.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=4010.000000,4215.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.teckids.org/en/\">https://www.teckids.org/en/</a></li>\r\n<li><a href=\"https://wiki.debian.org/DebianEdu/\">https://wiki.debian.org/DebianEdu/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Technoethical\">Technoethical</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Technoethical.png\"/></p>\r\n<blockquote cite=\"\">\r\nTechnoethical is an online shop that sells hardware compatible with operating systems that fully respect users\' freedom as defined by the GNU Project. We are based in Bucharest, Romania (European Union) and we ship worldwide.\r\n</blockquote>\r\n<h3>Listen to the interview with Tiberiu Turbureanu about Technoethical</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=4224.000000,4720.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=4224.000000,4720.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://tehnoetic.com/\">https://tehnoetic.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"TinyGo\">Tiny Go</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/TinyGo.png\"/></p>\r\n<blockquote cite=\"\">\r\nTinyGo is a project to bring the Go programming language to microcontrollers and modern web browsers by creating a new compiler based on LLVM. You can compile and run TinyGo programs on several different microcontroller boards such as the BBC micro:bit and the Arduino Uno. TinyGo can also be used to produce WebAssembly (WASM) code which is very compact in size.\r\n</blockquote>\r\n<h3>Listen to the interview with Ron \"Dead Program\" Evans about Tiny Go</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=4729.000000,5086.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=4729.000000,5086.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://tinygo.org/\">https://tinygo.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/tinygo-org/tinygo\">https://github.com/tinygo-org/tinygo</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Go_(programming_language)\">https://en.wikipedia.org/wiki/Go_(programming_language)</a></li>\r\n<li><a href=\"https://hybridgroup.com/\">https://hybridgroup.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"XCP-ng\">XCP-ng</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/XCP-ng.png\"/></p>\r\n<blockquote cite=\"https://xcp-ng.org/\">\r\nTurnkey Open Source Hypervisor. Based on XenServer, XCP-ng is the result of massive cooperation between individuals and companies, to deliver a product without limits. No restrictions on features and every bit available on GitHub! \r\n</blockquote>\r\n<h3>Listen to the interview with Olivier Lambert about XCP-ng</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/XCP-ng-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=5086.000000,5206.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=5086.000000,5206.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://xcp-ng.org/\">https://xcp-ng.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/xcp-ng\">https://github.com/xcp-ng</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Hypervisor\">https://en.wikipedia.org/wiki/Hypervisor</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Zenroom\">Zenroom</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/Zenroom.png\"/></p>\r\n<blockquote cite=\"https://zenroom.org/\">\r\nZenroom: easy cryptography to the people. Zenroom is a tiny and portable virtual machine that authenticates and manages access to data using human-readable smart contracts. Zenroom is easy to program to performs fast cryptographic operations for end-to-end encryption and runs on: desktop, embedded, mobile phones, clouds and web browsers.\r\n</blockquote>\r\n<h3>Listen to the interview with Denis \"Jaromil\" Roio from Zenroom</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/Zenroom-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=5214.000000,5496.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=5214.000000,5496.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://zenroom.org/\">https://zenroom.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/DECODEproject/zenroom/\">https://github.com/DECODEproject/zenroom/</a></li>\r\n<li><a href=\"https://dyne.org\">https://dyne.org</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"fenster-full\">Fenster</h2>\r\n<h3>Fenster - Free Software Song</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=5492.000000,5666.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=5492.000000,5666.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n\r\n<ul>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Free_Software_Song\">https://en.wikipedia.org/wiki/Free_Software_Song</a></li>\r\n<li>Official: <a href=\"https://www.gnu.org/music/free-software-song.html\">https://www.gnu.org/music/free-software-song.html</a></li>\r\n<li>Remix: <a href=\"https://freesoft.potlatch20.net/\">https://freesoft.potlatch20.net/</a></li>\r\n<li>RMS sings: <a href=\"https://www.youtube.com/watch?v=1BH7poMtPVU\">https://www.youtube.com/watch?v=1BH7poMtPVU</a></li>\r\n<li>GNU: <a href=\"https://audio-video.gnu.org/audio\">https://audio-video.gnu.org/audio</a></li>\r\n</ul>\r\n<pre>Track name : Free Software Song\r\nPerformer : Fenster\r\nRecorded date : 2002\r\nCopyright : Copyright (C) 2002, \r\nFenster LLC. Verbatim copying of this entire recording is permitted in any medium, \r\nprovided this notice is preserved. \r\nPerformers: \r\nPaul Robinson (vocals), \r\nRoman Kravec (guitar), \r\nEd D\'Angelo (bass), \r\nDave Newman (drums), \r\nBrian Yarbrough (trumpet), \r\nTony Moore (trumpet). \r\n</pre>\r\n\r\n',30,78,0,'CC-BY-SA','FOSDEM 2020',0,0,1),
(3023,'2020-03-04','Critique My Script, Episode 1 - Qots-Crew-Gen',782,'Discussion of using a shell script to randomly generate a ten man aircrew.','<p>This is my second HPR episode and the first in what could be a series about shell scripts I have written. This episode goes through a short script which randomly generates first and last names for a ten man aircrew to use with the Avalon Hill game B-17 Queen of the Skies.</p>\r\n<p>You can see the basic script in action here:<br />\r\n<a href=\"https://www.sodface.com/misc/qots-crew-gen\" class=\"uri\">https://www.sodface.com/misc/qots-crew-gen</a></p>\r\n<p>and a more complicated version here, though based on the same underlying methodolgy:<br />\r\n<a href=\"https://www.sodface.com/misc/qots-crew-gen2\" class=\"uri\">https://www.sodface.com/misc/qots-crew-gen2</a></p>\r\n<p>Here’s the script:</p>\r\n<pre><code>#!/bin/sh\r\n\r\nfirst_names=&#39;./firstnames.txt&#39;\r\nlast_names=&#39;./surnames.txt&#39;\r\ncrew_positions=&#39;./positions.txt&#39;\r\ncrew_ranks=&#39;./ranks.txt&#39;\r\n\r\nlen_first_names=$(wc -l &lt; ${first_names})\r\nlen_last_names=$(wc -l &lt; ${last_names})\r\n\r\nnum_pairs=$(printf &quot;10 ${len_first_names} ${len_last_names}&quot; | \\\r\n    awk &#39;BEGIN { srand() }\r\n    { for (i=1; i&lt;=$1; i++) {\r\n        for(f = 2; f &lt;= NF; f++) {\r\n        num=int(rand() * $f + 1); printf num&quot;,&quot; } printf &quot;\\n&quot;\r\n    }\r\n    }&#39;)\r\n\r\ni=1\r\n\r\nfor crew_member in ${num_pairs}\r\ndo\r\n  line_num=$(printf &quot;${crew_member}&quot; | cut -d&#39;,&#39; -f1)\r\n  first_name=$(sed -n ${line_num}p ${first_names})\r\n\r\n  line_num=$(printf &quot;${crew_member}&quot; | cut -d&#39;,&#39; -f2)\r\n  last_name=$(sed -n ${line_num}p ${last_names})\r\n\r\n  crew_position=$(sed -n ${i}p ${crew_positions})\r\n  crew_rank=$(sed -n ${i}p ${crew_ranks})\r\n\r\n  #\r\n  # Use the variables above to generate HTML.\r\n  # Omitted here to simplify this example.\r\n  #\r\n\r\n  i=$((( ${i} +1 )))\r\ndone</code></pre>\r\n',380,0,0,'CC-BY-SA','Shell Script,Random Numbers,Awk',0,0,1),
(3024,'2020-03-05','A funny thing happened the other day',259,'Describing a funny thing that happened the other day.','<p>Equipment used</p>\r\n<ul>\r\n<li><p><a href=\"https://en.wikipedia.org/wiki/Nexus_7_(2013)\">Nexus 7 tablet</a></p></li>\r\n<li><p><a href=\"https://www.amazon.co.uk/HccToo-Multifunctional-Rechargeable-Dictaphone-Conversation/dp/B015H9JP6S/ref=sr_1_1?ie=UTF8&amp;qid=1502381150&amp;sr=8-1&amp;keywords=dictation+machines\">My faithful Dictaphone</a></p></li>\r\n<li><p>Noise source<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr3024_noise-source.JPG\" alt=\"Noise source\" width=\"400\" height=\"400\" /></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','story, audio, sound',0,0,1),
(3027,'2020-03-10','What is quantum computing and why should we care?',1515,'What is all the quantum computing hype about & what is it that quantum computers will be able to do?','<h3 id=\"what-are-quantum-computers-anyway\">What are quantum computers anyway?</h3>\r\n<p>Physical computing systems that take advantage of quantum effects.</p>\r\n<h3 id=\"what-kind-of-quantum-effects-and-why-does-that-matter\">What kind of quantum effects, and why does that matter?</h3>\r\n<p>Entanglement and superposition: Entanglement lets us do unusual, head-scratching kinds of things like teleportation. Superposition lets us harness the almost unimaginable potential of quantum mechanics to do things that conventional computers can never do.</p>\r\n<h3 id=\"how-can-you-ever-explain-that-in-a-podcast\">How can you ever explain that in a podcast?</h3>\r\n<p>To really understand the details, you must have math, but math and audio formats are not so compatible. So I use analogies, and throw in some pithy quotes from Einstein and hope that does the trick.</p>\r\n<h3 id=\"big-picture\">Big picture?</h3>\r\n<p>Lots of work going on to build quantum processors (QPUs) that use quantum memory and, get this, will at some point actually do error correction. There are programming frameworks and rudimentary compilers to compile down python code all the way down to microwave pulses and laser pulses and there is control machinery to gather back the signals and interpret them to ones and zeros. Quantum computers will be securely networked using quantum protocols and we’ll all live happily ever after in a quantum computing world.</p>\r\n<p><b>Questions?</b> Please leave suggestions if you want to dive a bit deeper in some topic areas - it’ll encourage me to do more episodes.</p>\r\n',379,0,0,'CC-BY-SA','quantum computing',0,0,1),
(3028,'2020-03-11','Monads and Haskell',1275,'A hopefully not too rambly \"introduction\" to  functors and monads in and out of haskell','<p>This is basically a transcript of the post I wrote on the subject which I host <a href=\"https://www.crvs.xyz/posts_haskeljoin.html\">here</a> It has a bit more than what I talked about</p>\r\n<h1 id=\"join-in-haskell\">Join in Haskell</h1>\r\n<p><code>join</code> is a monadic operation, instead of working only on lists, it works on monads and has the signature:</p>\r\n<pre><code>   join :: Monad m =&gt; m ( m a ) -&gt; (m a)\r\n</code></pre>\r\n<p>In effect it <code>joins</code> or <code>merges</code> two successive monad applications into a single monad application. But join is not part of the canonical monad definition, which is given by:</p>\r\n<pre><code>   return ::  Monad m =&gt; a -&gt; m a` ; and`\r\n   (&gt;&gt;=) :: Monad m =&gt; m a -&gt; ( a -&gt; m b ) -&gt; m b\r\n</code></pre>\r\n<p>A good or rather trivial way to think of the relationship between <code>return</code> <code>join</code> and <code>(&gt;&gt;=)</code> is that in essence, since each monad is a functor, then what <code>(&gt;&gt;=)</code> does is that it maps the second argument over the first argument, and then uses <code>join</code> to merge the two applications of the monad constructor, i.e.:</p>\r\n<pre><code>  (x &gt;&gt;= f) = join $ fmap f x\r\n</code></pre>\r\n<p>However, join needs to be constructed from <code>return</code> and <code>(&gt;&gt;=)</code>. The naive solution is that we want to <code>trick</code> <code>(&gt;&gt;=)</code> to let us apply a function that does not pile up yet another <code>m</code> onto our initial type <code>m (m a)</code> and surprisingly, this will actually work if we let</p>\r\n<pre><code>   join x = (x &gt;&gt;= id)\r\n</code></pre>\r\n<p>Initially this is surprising since <code>id</code> has the signature <code>(c -&gt; c)</code> instead of the necessary <code>a -&gt; m b</code>! However, when <code>c</code> is not an atomic type, but rather of the form <code>m d</code> for some (maybe atomic) type <code>d</code>, then we actually have the signature <code>m d -&gt; m d</code>, and if we bind type <code>a</code> to <code>m d</code> and type <code>b</code> to <code>d</code>, we obtain <code>id</code> with actual type signatuare <code>a -&gt; m b</code>, and it can indeed be used as the second argument of <code>(&gt;&gt;=)</code>, and everything actually makes sense.</p>\r\n<p>Now style is important and so we can do an eta reduction on this, to get a point-free implementation by simply binding the second argument of <code>&gt;&gt;=</code>:</p>\r\n<pre><code>   join = (&gt;&gt;= id)\r\n</code></pre>\r\n<p>This is all fine and well for the type number, and it <em>does</em> work, but it\'s also important to understand how it works, so let\'s see it in a simple example, using the <code>Maybe</code> monad. So let\'s start by refreshing the implementation of the monad instance:</p>\r\n<pre><code>instance Monad Maybe where\r\n\r\n   (&gt;&gt;=) :: Maybe a -&gt; (a -&gt; Maybe b) -&gt; Maybe b\r\n   (&gt;&gt;=) Nothing _ = Nothing\r\n   (&gt;&gt;=) (Just x) f = f x\r\n\r\n   return :: a -&gt; Maybe a\r\n   return = Just\r\n</code></pre>\r\n<p>So let\'s now go through the successive bindings when performing <code>(&gt;&gt;=id)</code>:</p>\r\n<pre><code>   Just x = Just (Just 2) =&gt; x = Just 2\r\n   Just x &gt;&gt;= id = id x = x\r\n   x = Just 2\r\n</code></pre>\r\n<p>This example is pretty much verbatim the same thing for the <code>Either</code> monad and many other monads that follow a similar principle, so let\'s look at a bit more of a complex example. Let\'s look at the <code>List</code> monad:</p>\r\n<p>instance Monad List where</p>\r\n<pre><code>   (&gt;&gt;=) :: [a] -&gt; (a -&gt; [b]) -&gt; [b]\r\n   (&gt;&gt;=) [] _ = []\r\n   (&gt;&gt;=) (x:xs) f = f x ++ (xs &gt;&gt;= f)\r\n\r\n   return :: a -&gt; [a]\r\n   return = (:[])\r\n</code></pre>\r\n<p>Following the bindings again we have</p>\r\n<pre><code>   [[2,3],[4]] = (x:xs) =&gt; x = [2,3] ; xs = [[4]]\r\n   (x:xs) &gt;&gt;= id = (id x) ++ (xs &gt;&gt;= id) = x ++ (xs &gt;&gt;= id)\r\n   [[4]] = (y:ys) =&gt; y = [4] ; ys = []\r\n   (y:ys) &gt;&gt;= id = y ++ (ys &gt;&gt;= id)\r\n   ys = [] =&gt; (ys &gt;&gt;= id) = []\r\n   =&gt; (y:ys) &gt;&gt;= id  =  [4] ++ [] = [4]\r\n   =&gt; xs &gt;&gt;= id = [4]\r\n   =&gt; (x:xs) &gt;&gt;= id = x ++ [4] = [2,3] ++ [4] = [2,3,4]\r\n</code></pre>\r\n<p>So all of this is to say that <code>join</code> actually does what one expects it to do on a list of lists. It joins them one by one into a single list.</p>\r\n<h1 id=\"the-associativity-law\">The Associativity Law</h1>\r\n<p>The associativity law of a monad can be quite confusing, after all it takes the form:</p>\r\n<pre><code>   (m &gt;&gt;= f) &gt;&gt;= g == m &gt;&gt;= ( x -&gt; f x &gt;&gt;= g )\r\n</code></pre>\r\n<p>While not too complicated to understand it is difficult to see how it relates to a usual associativity law, which follows the form <code>a * (b * c) = (a * b) * c</code>. To recover the associativity the usual explanation is that one has to see it in terms of the monadic function composition <code>(&gt;=&gt;)</code> and while this is a valid way of doing so, I like to decompose things in terms of <code>fmap</code>, <code>(&gt;&gt;=)</code> and <code>join</code>.</p>\r\n<p>So let\'s use what we did previously on the associativity law, starting on the left side, and replacing the atomic-looking type <code>m</code> with the dependent type <code>M z</code>:</p>\r\n<pre><code>   (M z &gt;&gt;= f) &gt;&gt;= g\r\n   = join (fmap f (M z)) &gt;&gt;= g\r\n   = join (fmap g $ join ( fmap f (M z)))\r\n   = join (fmap g $ join ( M (f z) )\r\n</code></pre>\r\n<p>and the right-hand side:</p>\r\n<pre><code>   M z &gt;&gt;= ( x -&gt; f x &gt;&gt;= g )\r\n   = M z &gt;&gt;= ( x -&gt; join $ fmap g (f x))\r\n   = join $ fmap ( x -&gt; join $ fmap g (f x)) (M z)\r\n   = join $ M ( x -&gt; join $ fmap g (f x)) z\r\n   = join $ M (join $ fmap g (f z))\r\n</code></pre>\r\n<p>And essentially what it says is that if I have two functions <code>f</code> and <code>g</code> I can either do it in an orderly fashion where I apply them sequentially with <code>join . fmap f</code> followed by <code>join . fmap g</code>, or I can apply them both within the constructor and then join once within the constructor and one outside the constructor, and I should get the same thing. In fact if you replace <code>f</code> and <code>g</code> with <code>id</code>; this is the associativity law for monads as usually presented in a standard category theory textbook such as Mac Lane\'s Categories for the Working Mathematician (and recovering this was the whole point of this exercise in the first place).</p>\r\n',385,107,1,'CC-BY-SA','Haskell, Programming, Math',0,0,1),
(3029,'2020-03-12','At Union Station with a train delay',347,'This is a soundscape while waiting for a train at Union Station.','<p>I was waiting for the Metra train, when there was an announcement that the train would be late due to a server failure.</p>',318,101,0,'CC-BY-SA','soundscape, trains',0,0,1),
(3030,'2020-03-13','My new Samsung tablet',1686,'A general discussion about my new 10.5 inch Samsung Galaxy tablet','<ul>\r\n<li><p>Samsung Galaxy Tab A 10.5 inch 2018 Tablet at 3:30<br />\r\n<a href=\"https://www.amazon.co.uk/Samsung-Galaxy-10-5-WiFi-Black/dp/B07GG5DSTW/ref=asc_df_B07GG5DSTW/?tag=googshopuk-21&amp;linkCode=df0&amp;hvadid=310819184817&amp;hvpos=1o1&amp;hvnetw=g&amp;hvrand=16845709935342815174&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=9046893&amp;hvtargid=aud-858395717453:pla-667424753514&amp;psc=1&amp;th=1&amp;psc=1\">Amazon link</a></p></li>\r\n<li><p>Nexus 7 at 3:50<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nexus_7_(2013)\" class=\"uri\">https://en.wikipedia.org/wiki/Nexus_7_(2013)</a></p></li>\r\n<li><p>New tablet Battery at 5:20<br />\r\nLithium Polymer batteries, 7300 mAh capacity with claimed 15 hours of video playback on one charge. It seems to charge surprisingly quickly.</p></li>\r\n<li><p>Wikipedia entry for Edinburgh City Bypass at 9:30<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Edinburgh_City_Bypass\" class=\"uri\">https://en.wikipedia.org/wiki/Edinburgh_City_Bypass</a></p></li>\r\n<li><p>Eye strain at 14:07</p></li>\r\n<li><p>Bluetooth Ear buds at 15:15<br />\r\nSimilar to these: <a href=\"https://www.amazon.co.uk/Bluetooth-Wireless-Headphones-Canceling-Compatible-white/dp/B084ST42CL/ref=sr_1_13?keywords=bluetooth+earbuds&amp;qid=1582899080&amp;sr=8-13\">Amazon link</a></p></li>\r\n<li><p>Bluetooth speaker at 16:52<br />\r\n<a href=\"https://www.amazon.co.uk/EasyAcc-Portable-Rechargeable-Bluetooth-Microphone/dp/B00JK6MQEI/ref=sr_1_2?crid=1X95EE1DRL6DI&amp;keywords=bluetooth+speaker+easyacc&amp;qid=1582899239&amp;sprefix=bluetooth+speaker+easy+%2Caps%2C161&amp;sr=8-2\">Amazon link</a></p></li>\r\n<li><p>Bluetooth keyboard at 22:35<br />\r\n<a href=\"https://www.amazon.co.uk/Universal-Adjustable-Brightness-Smartphone-Rechargeable/dp/B00X5P8BJO/ref=sr_1_1?crid=1K2NT7A80IVPK&amp;keywords=arteck+universal+backlit+7-colors&amp;qid=1582899392&amp;sprefix=Artec+Uni%2Caps%2C160&amp;sr=8-1\">Amazon link</a></p></li>\r\n<li><p>Additional thoughts after recording this episode</p>\r\n<ul>\r\n<li><p>Closing one eye seems to solve the problem though not very practical. It doesn’t seem to matter which eye I close.</p></li>\r\n<li><p>Doesn’t seem to bother me with the other 8” Samsung tablet or any other tablet / phone.</p></li>\r\n<li><p>Counter intuitively increasing the brightness makes things better</p></li>\r\n<li><p>Searching for eye strain and Samsung brought up one or two results of people saying a similar thing to myself; one person commenting that they were fed up of people telling them to get an eye test and like myself they do not have this problem with any other device.</p></li>\r\n</ul></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Android, Tablet',0,0,1),
(3031,'2020-03-16','Daniel Persson - Me? Me!',1131,'I talk about who I am and where I come from and what my interests are.','<p>Talking about my history, forgot to talk about my open-source interests and different projects I’m a part of.</p>\r\n<p>If you want to know more about me you could follow any of the links below.</p>\r\n<ul>\r\n<li><p><a href=\"https://danielpersson.dev/\" class=\"uri\">https://danielpersson.dev/</a></p></li>\r\n<li><p><a href=\"https://youtube.com/c/DanielPersson\" class=\"uri\">https://youtube.com/c/DanielPersson</a></p></li>\r\n<li><p><a href=\"https://github.com/kalaspuffar\" class=\"uri\">https://github.com/kalaspuffar</a></p></li>\r\n<li><p><a href=\"https://github.com/sqrldev/wordpress-sqrl-login\" class=\"uri\">https://github.com/sqrldev/wordpress-sqrl-login</a></p></li>\r\n</ul>\r\n',382,0,0,'CC-BY-SA','biography',0,0,1),
(3032,'2020-03-17','piCore on a Raspberry Pi 1 Model B',651,'How I revived my Raspberry Pi Model 1 B with piCore and a tiny SD card.','<p>In this episode, I discuss how I revived my Raspberry Pi 1 Model B using piCore, a specialized version of Tiny Core Linux for the Raspberry Pi, on a 128 MB SD card that I had laying around. I also mention nanoBSD and Alpine Linux as possible alternatives to try out.</p>\r\n<ul>\r\n<li><p>Tiny Core Linux<br />\r\n<a href=\"https://tinycorelinux.net/\" class=\"uri\">https://tinycorelinux.net/</a></p></li>\r\n<li><p>piCore Releases<br />\r\n<a href=\"https://www.tinycorelinux.net/9.x/armv6/\" class=\"uri\">https://www.tinycorelinux.net/9.x/armv6/</a></p></li>\r\n<li><p>nanoBSD<br />\r\n<a href=\"https://www.freebsd.org/doc/en_US.ISO8859-1/articles/nanobsd/index.html\" class=\"uri\">https://www.freebsd.org/doc/en_US.ISO8859-1/articles/nanobsd/index.html</a><br />\r\n<a href=\"https://www.freebsd.org/doc/en_US.ISO8859-1/articles/nanobsd/howto.html\" class=\"uri\">https://www.freebsd.org/doc/en_US.ISO8859-1/articles/nanobsd/howto.html</a></p></li>\r\n<li><p>Alpine Linux<br />\r\n<a href=\"https://alpinelinux.org/\" class=\"uri\">https://alpinelinux.org/</a><br />\r\n<a href=\"https://wiki.alpinelinux.org/wiki/Raspberry_Pi\" class=\"uri\">https://wiki.alpinelinux.org/wiki/Raspberry_Pi</a></p></li>\r\n</ul>\r\n',152,0,0,'CC-BY-SA','raspberrypi,rpi,linux,bsd',0,0,1),
(3033,'2020-03-18','Linux Inlaws S01E03 32 Bit Time Travel',3543,'Linux Inlaws - a podcast on topics around free and open source software','<p>For show notes, please visit <a href=\"https://linuxinlaws.eu\" class=\"uri\">https://linuxinlaws.eu</a></p>',384,111,1,'CC-BY-SA','Linux Inlaws, free open source software, revolution, FLOSS',0,0,1),
(3034,'2020-03-19','How to bridge Freenode IRC rooms to Matrix.org',786,'Thaj builds upon a previous episode by Clacke to deep dive into bridging IRC to Matrix.org','<ul>\r\n<li><p>Attribution</p>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0311.html\">Clacke</a> - <a href=\"https://hackerpublicradio.org/eps.php?id=2169\">HPR Episode 2169 on Matrix</a></li>\r\n<li><a href=\"https://thelovebug.org/\">Dave Lee</a> - Helped a great deal in getting me on board with Matrix bridging. Check out his other podcasts at <a href=\"https://otherside.network/\">The Other Side Podcast Network</a></li>\r\n</ul></li>\r\n<li><p><a href=\"matrix.org\">Matrix.org</a> is a Free, open source, and decentralized messaging system. One of the strong points of this system is its ability to <a href=\"https://matrix.org/bridges\">bridge</a> multiple protocols together into one interface.</p></li>\r\n<li><p><a href=\"https://about.riot.im/\">Riot.im</a></p></li>\r\n<li><p>Bridging to Freenode\'s IRC server is built into Matrix.org. If you already have a registered Nick on Freenode it is a simple process to associate your Matrix and Freenode accounts.</p></li>\r\n<li><p>Steps to bridge to a Freenode IRC room</p>\r\n<ol>\r\n<li>Start a direct message with @freenode_NickServ:matrix.org and send the command <code>identify nick pass</code> (replacing nick and pass with your credentials).</li>\r\n<li>Direct message @appservice-irc:matrix.org with the command <code>!storepass nick:pass</code></li>\r\n<li>Join the room #freenode_#oggcastplanet:matrix.org. <em>You can really join any room on freenode with #freenode_#CHANNAME:matrix.org</em></li>\r\n<li>PROFIT!!!!</li>\r\n</ol></li>\r\n</ul>\r\n',270,108,0,'CC-BY-SA','Freenode, IRC, Matrix.org, Riot.im, Social Media',0,0,1),
(3037,'2020-03-24','Ambient recording at Union Station',205,'Ambient recording in the main hall at Union Station, Chicago','<p>This was recorded in the main hall at Union Station in Chicago, Illinois.<br />\r\nThere was a brief security announcement about watching for bags or package left unattended.</p>',318,101,0,'CC-BY-SA','soundscape, train station',0,0,1),
(3038,'2020-03-25','Solo Magic',2244,'All the magic without the gathering','<p>This episode outlines my single-player mod for the <strong>Magic: The Gathering</strong> card game.</p>',78,95,0,'CC-BY-SA','magic, mtg',0,0,1),
(3040,'2020-03-27','Why use GNU Autotools',1766,'6 good reasons you should be using a build system','<p>GNU Autotools is a build system that helps you distribute your code in a predictable and reliable way.\r\nBuild systems offer many benefits, including:\r\n</p>\r\n\r\n<ol>\r\n<li>Standard and automate-able build process</li>\r\n<li>hooks into packaging systems (RPM, DEB, Slackbuilds, Flatpak, Snap, and so on)</li>\r\n<li>version reporting</li>\r\n<li>build for various OSes</li>\r\n<li>you get lots of  code to handle every possible corner case, for free</li>\r\n<li>with a single configuration, you can build your project as the developer, build it for packagers, and enable users to build it for themselves</li>\r\n</ol>\r\n\r\n<p>Next up: how to use GNU Autotools</p>',78,0,0,'CC-BY-SA','autotools,build,make',0,0,1),
(3041,'2020-03-30','How to use GNU Autotools',2337,'How to use GNU Autotools','<p>I found a great article on this topic here: <a href=\"\" target=\"_blank\">https://opensource.com/article/19/7/introduction-gnu-autotools</a>, so please refer to that as show notes.</p>\r\n<p>\r\n<small>\r\nPage included by Ken, as permitted by cc-by-sa\r\n</small>\r\n</p>\r\n<h1>Introduction to GNU Autotools</h1>\r\n\r\n<p id=\"introduction-to-gnu-autotools\">Have you ever downloaded the source code for a popular software project that required you to type the almost ritualistic <strong>./configure; make &amp;&amp; make install</strong> command sequence to build and install it? If so, you’ve used <a href=\"https://www.gnu.org/software/automake/faq/autotools-faq.html\" target=\"_blank\">GNU Autotools</a>. If you’ve ever looked into some of the files accompanying such a project, you’ve likely also been terrified at the apparent complexity of such a build system.</p>\r\n\r\n<p>Good news! GNU Autotools is a lot simpler to set up than you think, and it’s GNU Autotools itself that generates those 1,000-line configuration files for you. Yes, you can write 20 or 30 lines of installation code and get the other 4,000 for free.</p>\r\n\r\n<h2 id=\"autotools-at-work\">Autotools at work</h2>\r\n\r\n<p>If you’re a user new to Linux looking for information on how to install applications, you do not have to read this article! You’re welcome to read it if you want to research how software is built, but if you’re just installing a new application, go read my article about <a href=\"https://opensource.com/article/18/1/how-install-apps-linux\">installing apps on Linux</a>.</p>\r\n\r\n<p>For developers, Autotools is a quick and easy way to manage and package source code so users can compile and install software. Autotools is also well-supported by major packaging formats, like DEB and RPM, so maintainers of software repositories can easily prepare a project built with Autotools.</p>\r\n\r\n<p>Autotools works in stages:</p>\r\n\r\n<ol>\r\n<li>First, during the <strong>./configure</strong> step, Autotools scans the host system (the computer it’s being run on) to discover the default settings. Default settings include where support libraries are located, and where new software should be placed on the system.</li>\r\n<li>Next, during the <strong>make</strong> step, Autotools builds the application, usually by converting human-readable source code into machine language.</li>\r\n<li>Finally, during the <strong>make install</strong> step, Autotools copies the files&nbsp;it built to the appropriate locations (as detected during the configure stage) on your computer.</li>\r\n</ol><p>This process seems simple, and it is, as long as you use Autotools.</p>\r\n\r\n<h2 id=\"the-autotools-advantage\">The Autotools advantage</h2>\r\n\r\n<p>GNU Autotools is a big and important piece of software that most of us take for granted. Along with <a href=\"https://en.wikipedia.org/wiki/GNU_Compiler_Collection\" target=\"_blank\">GCC (the GNU Compiler Collection)</a>, Autotools is the scaffolding that allows Free Software to be constructed and installed to a running system. If you’re running a <a href=\"https://en.wikipedia.org/wiki/POSIX\" target=\"_blank\">POSIX</a> system, it’s not an understatement to say that most of your operating system exists as runnable software on your computer because of these projects.</p>\r\n\r\n<p>In the likely event that your pet project isn’t an operating system, you might assume that Autotools is overkill for your needs. But, despite its reputation, Autotools has lots of little features that may benefit you, even if your project is a relatively simple application or series of scripts.</p>\r\n\r\n<h3 id=\"portability\">Portability</h3>\r\n\r\n<p>First of all, Autotools comes with portability in mind. While it can’t make your project work across all POSIX platforms (that’s up to you, as the coder), Autotools can ensure that the files you’ve marked for installation get installed to the most sensible locations on a known platform. And because of Autotools, it’s trivial for a power user to customize and override any non-optimal value, according to their own system.</p>\r\n\r\n<p>With Autotools, all you need to know is what files need to be installed to what general location. It takes care of everything else. No more custom install scripts that break on any untested OS.</p>\r\n\r\n<h3 id=\"packaging\">Packaging</h3>\r\n\r\n<p>Autotools is also well-supported. Hand a project with Autotools over to a distro packager, whether they’re packaging an RPM, DEB, TGZ, or anything else, and their job is simple. Packaging tools know Autotools, so there’s likely to be no patching, hacking, or adjustments necessary. In many cases, incorporating an Autotools project into a pipeline can even be automated.</p>\r\n\r\n<h2 id=\"how-to-use-autotools\">How to use Autotools</h2>\r\n\r\n<p>To use Autotools, you must first have Autotools installed. Your distribution may provide one package meant to help developers build projects, or it may provide separate packages for each component, so you may have to do some research on your platform to discover what packages you need to install.</p>\r\n\r\n<p>The primary components of Autotools are:</p>\r\n\r\n<ul>\r\n<li><strong>automake</strong></li>\r\n<li><strong>autoconf</strong></li>\r\n<li><strong>make</strong></li>\r\n</ul>\r\n\r\n<p>While you likely need to install the compiler (GCC, for instance) required by your project, Autotools works just fine with scripts or binary assets that don’t need to be compiled. In fact, Autotools can be useful for such projects because it provides a <strong>make uninstall</strong> script for easy removal.</p>\r\n\r\n<p>Once you have all of the components installed, it’s time to look at the structure of your project’s files.</p>\r\n\r\n<h3 id=\"autotools-project-structure\">Autotools project structure</h3>\r\n\r\n<p>GNU Autotools has very specific expectations, and most of them are probably familiar if you download and build source code often. First, the source code itself is expected to be in a subdirectory called <strong>src</strong>.</p>\r\n\r\n<p>Your project doesn’t have to follow all of these expectations, but if you put files in non-standard locations (from the perspective of Autotools), then you’ll have to make adjustments for that in your Makefile later.</p>\r\n\r\n<p>Additionally, these files are required:</p>\r\n\r\n<ul>\r\n<li><strong>NEWS</strong></li>\r\n<li><strong>README</strong></li>\r\n<li><strong>AUTHORS</strong></li>\r\n<li><strong>ChangeLog</strong></li>\r\n</ul>\r\n\r\n<p>You don’t have to actively use the files, and they can be symlinks to a monolithic document (like <strong>README.md</strong>) that encompasses all of that information, but they must be present.</p>\r\n\r\n<h3 id=\"autotools-configuration\">Autotools configuration</h3>\r\n\r\n<p>Create a file called <strong>configure.ac</strong> at your project’s root directory. This file is used by <strong>autoconf</strong> to create the <strong>configure</strong> shell script that users run before building. The file must contain, at the very least, the <strong>AC_INIT</strong> and <strong>AC_OUTPUT</strong> <a href=\"https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Initializing-configure.html\" target=\"_blank\">M4 macros</a>. You don’t need to know anything about the M4 language to use these macros; they’re already written for you, and all of the ones relevant to Autotools are defined in the documentation.</p>\r\n\r\n<p>Open the file in your favorite text editor. The <strong>AC_INIT</strong> macro may consist of the package name, version, an email address for bug reports, the project URL, and optionally the name of the source TAR file.</p>\r\n\r\n<p>The <strong><a href=\"https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Output.html#Output\" target=\"_blank\">AC_OUTPUT</a></strong> macro is much simpler and accepts no arguments.</p>\r\n\r\n<pre>AC_INIT([penguin], [2019.3.6], [seth@example.com])<br>\r\nAC_OUTPUT</pre>\r\n\r\n<p>If you were to run <strong>autoconf</strong> at this point, a <strong>configure</strong> script would be generated from your <strong>configure.ac</strong> file, and it would run successfully. That’s all it would do, though, because all you have done so far is define your project’s metadata and called for a configuration script to be created.</p>\r\n\r\n<p>The next macros you must invoke in your <strong>configure.ac</strong> file are functions to create a <a href=\"https://www.gnu.org/software/make/manual/html_node/Introduction.html\" target=\"_blank\">Makefile</a>. A Makefile tells the <strong>make</strong> command what to do (usually, how to compile and link a program).</p>\r\n\r\n<p>The macros to create a Makefile are <strong>AM_INIT_AUTOMAKE</strong>, which accepts no arguments, and <strong>AC_CONFIG_FILES</strong>, which accepts the name you want to call your output file.</p>\r\n\r\n<p>Finally, you must add a macro to account for the compiler your project needs. The macro you use obviously depends on your project. If your project is written in C++, the appropriate macro is <strong>AC_PROG_CXX</strong>, while a project written in C requires <strong>AC_PROG_CC</strong>, and so on, as detailed in the <a href=\"https://www.gnu.org/software/automake/manual/html_node/Programs.html#Programs\" target=\"_blank\">Building Programs and Libraries</a> section in the Autoconf documentation.</p>\r\n\r\n<p>For example, I might add the following for my C++ program:</p>\r\n\r\n<pre>AC_INIT([penguin], [2019.3.6], [seth@example.com])<br>\r\nAC_OUTPUT<br>\r\nAM_INIT_AUTOMAKE<br>\r\nAC_CONFIG_FILES([Makefile])<br>\r\nAC_PROG_CXX</pre>\r\n\r\n<p>Save the file. It’s time to move on to the Makefile.</p>\r\n\r\n<h3 id=\"autotools-makefile-generation\">Autotools Makefile generation</h3>\r\n\r\n<p>Makefiles aren’t difficult to <a href=\"https://opensource.com/article/18/8/what-how-makefile\" target=\"_blank\">write manually</a>, but Autotools can write one for you, and the one it generates will use the configuration options detected during the <code>./configure</code> step, and it will contain far more options than you would think to include or want to write yourself. However, Autotools can’t detect everything your project requires to build, so you have to add some details in the file <strong>Makefile.am</strong>, which in turn is used by <strong>automake</strong> when constructing a Makefile.</p>\r\n\r\n<p><strong>Makefile.am</strong> uses the same syntax as a Makefile, so if you’ve ever written a Makefile from scratch, then this process will be familiar and simple. Often, a <strong>Makefile.am</strong> file needs only a few variable definitions to indicate what files are to be built, and where they are to be installed.</p>\r\n\r\n<p>Variables ending in <strong>_PROGRAMS</strong> identify code that is to be built (this is usually considered the <em>primary</em> target; it’s the main reason the Makefile exists). Automake recognizes other primaries, like <strong>_SCRIPTS</strong>, <strong>_DATA</strong>, <strong>_LIBRARIES</strong>, and other common parts that make up a software project.</p>\r\n\r\n<p>If your application is literally compiled during the build process, then you identify it as a binary program with the <strong>bin_PROGRAMS</strong> variable, and then reference any part of the source code required to build it (these parts may be one or more files to be compiled and linked together) using the program name as the variable prefix:</p>\r\n\r\n<pre>bin_PROGRAMS = penguin<br>\r\npenguin_SOURCES = penguin.cpp</pre>\r\n\r\n<p>The target of <strong>bin_PROGRAMS</strong> is installed into the <strong>bindir</strong>, which is user-configurable during compilation.</p>\r\n\r\n<p>If your application isn’t actually compiled, then your project doesn’t need a <strong>bin_PROGRAMS</strong> variable at all. For instance, if your project is a script written in Bash, Perl, or a similar interpreted language, then define a <strong>_SCRIPTS</strong> variable instead:</p>\r\n\r\n<pre>bin_SCRIPTS = bin/penguin</pre>\r\n\r\n<p>Automake expects sources to be located in a directory called <strong>src</strong>, so if your project uses an alternative directory structure for its layout, you must tell Automake to accept code from outside sources:</p>\r\n\r\n<pre>AUTOMAKE_OPTIONS = foreign subdir-objects</pre>\r\n\r\n<p>Finally, you can create any custom Makefile rules in <strong>Makefile.am</strong> and they’ll be copied verbatim into the generated Makefile. For instance, if you know that a temporary value needs to be replaced in your source code before the installation proceeds, you could make a custom rule for that process:</p>\r\n\r\n<pre>all-am: penguin<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; touch bin/penguin.sh<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; <br>\r\npenguin: bin/penguin.sh<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @sed \"s|__datadir__|@datadir@|\" $&lt; &gt;bin/$@</pre>\r\n\r\n<p>A particularly useful trick is to extend the existing <strong>clean</strong> target, at least during development. The <strong>make clean</strong> command generally removes all generated build files with the exception of the Automake infrastructure. It’s designed this way because most users rarely want <strong>make clean</strong> to obliterate the files that make it easy to build their code.</p>\r\n\r\n<p>However, during development, you might want a method to reliably return your project to a state relatively unaffected by Autotools. In that case, you may want to add this:</p>\r\n\r\n<pre>clean-local:<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm config.status configure config.log<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm Makefile <br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm -r autom4te.cache/<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm aclocal.m4 <br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm compile install-sh missing Makefile.in</pre>\r\n\r\n<p>There’s a lot of flexibility here, and if you’re not already familiar with Makefiles, it can be difficult to know what your <strong>Makefile.am</strong> needs. The barest necessity is a primary target, whether that’s a binary program or a script, and an indication of where the source code is located (whether that’s through a <strong>_SOURCES</strong> variable or by using <strong>AUTOMAKE_OPTIONS</strong> to tell Automake where to look for source code).</p>\r\n\r\n<p>Once you have those variables and settings defined, you can try generating your build scripts as you see in the next section, and adjust for anything that’s missing.</p>\r\n\r\n<h3 id=\"autotools-build-script-generation\">Autotools build script generation</h3>\r\n\r\n<p>You’ve built the infrastructure, now it’s time to let Autotools do what it does best: automate your project tooling. The way the developer (you) interfaces with Autotools is different from how users building your code do.</p>\r\n\r\n<p>Builders generally use this well-known sequence:</p>\r\n\r\n<pre>$ ./configure<br>\r\n$ make<br>\r\n$ sudo make install</pre>\r\n\r\n<p>For that incantation to work, though, you as the developer must bootstrap the build infrastructure. First, run <strong>autoreconf</strong> to generate the configure script that users invoke before running <strong>make</strong>. Use the <strong>–install</strong> option to bring in auxiliary files, such as a symlink to <strong>depcomp</strong>, a script to generate dependencies during the compiling process, and a copy of the <strong>compile</strong> script, a wrapper for compilers to account for syntax variance, and so on.</p>\r\n\r\n<pre>$ autoreconf --install<br>\r\nconfigure.ac:3: installing \'./compile\'<br>\r\nconfigure.ac:2: installing \'./install-sh\'<br>\r\nconfigure.ac:2: installing \'./missing\'</pre>\r\n\r\n<p>With this development build environment, you can then create a package for source code distribution:</p>\r\n\r\n<pre>$ make dist</pre>\r\n\r\n<p>The <strong>dist</strong> target is a rule you get for \"free\"&nbsp;from Autotools.<br>\r\nIt’s a feature that gets built into the Makefile generated from your humble <strong>Makefile.am</strong> configuration. This target produces a <strong>tar.gz</strong> archive containing all of your source code and all of the essential Autotools infrastructure so that people downloading the package can build the project.</p>\r\n\r\n<p>At this point, you should review the contents of the archive carefully to ensure that it contains everything you intend to ship to your users. You should also, of course, try building from it yourself:</p>\r\n\r\n<pre>$ tar --extract --file penguin-0.0.1.tar.gz<br>\r\n$ cd penguin-0.0.1<br>\r\n$ ./configure <br>\r\n$ make <br>\r\n$ DESTDIR=/tmp/penguin-test-build make install</pre>\r\n\r\n<p>If your build is successful, you find a local copy of your compiled application specified by <strong>DESTDIR</strong> (in the case of this example, <strong>/tmp/penguin-test-build</strong>).</p>\r\n\r\n<pre>$ /tmp/example-test-build/usr/local/bin/example <br>\r\nhello world from GNU Autotools</pre>\r\n\r\n<h2 id=\"time-to-use-autotools\">Time to use Autotools</h2>\r\n\r\n<p>Autotools is a great collection of scripts for a predictable and automated release process. This toolset may be new to you if you’re used to Python or Bash builders, but it’s likely worth learning for the structure and adaptability it provides to your project.</p>\r\n\r\n<p>And Autotools is not just for code, either. Autotools can be used to build <a href=\"https://opensource.com/article/17/9/docbook\">Docbook</a> projects, to keep media organized (I use Autotools for my music releases), documentation projects, and anything else that could benefit from customizable install targets.</p>\r\n',78,25,0,'CC-BY-SA','autotools,build,make',0,0,1),
(3039,'2020-03-26','Making a Raspberry Pi status display',1608,'A project making use of my Pi 3A+, an old monitor and MagicMirror2','<h2 id=\"introduction\">Introduction</h2>\r\n<p>I have had a project on my <em>To Do</em> list for a while: to make a status display from a Raspberry Pi. My vision was to show the state of various things including some HPR stuff, and I had imagined setting up a Pi with a monitor and controlling it over SSH.</p>\r\n<p>I started on the project over the Christmas period 2019. I have a Raspberry Pi 3A+, which is a sort of souped-up Pi Zero, which I bought on a whim and hadn’t found a use for (Yannick reviewed this RPi model in show <a href=\"https://hackerpublicradio.org/eps.php?id=2711\" title=\"hpr2711 :: Raspberry Pi 3A+ Review\">2711</a>). I also had an old square Dell monitor from about 15 years ago which still worked (at least to begin with).</p>\r\n<p>I had imagined I’d write some software of my own with a web front end which ran various tasks to monitor things.</p>\r\n<p>However, in my researches I came across <em>MagicMirror<sup>2</sup></em> which I thought I might be able to use instead of writing my own thing.</p>\r\n<h2 id=\"long-notes\">Long notes</h2>\r\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"https://hackerpublicradio.org/eps/hpr3039/full_shownotes.html\">viewed here</a>.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>JavaScript programming language:\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/JavaScript\">Wikipedia entry</a></li>\r\n</ul></li>\r\n<li>Node.js JavaScript runtime environment:\r\n<ul>\r\n<li><a href=\"https://nodejs.org/en/\">Website</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Node.js\">Wikipedia entry</a></li>\r\n</ul></li>\r\n<li>Electron software framework:\r\n<ul>\r\n<li><a href=\"https://www.electronjs.org/\">Website</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Electron_%28software_framework%29\">Wikipedia entry</a></li>\r\n</ul></li>\r\n<li>MagicMirror<sup>2</sup>:\r\n<ul>\r\n<li><a href=\"https://github.com/MichMich/MagicMirror\">GitHub page</a></li>\r\n<li><a href=\"https://magicmirror.builders/\">Website</a></li>\r\n<li><a href=\"https://github.com/MichMich/MagicMirror/wiki/3rd-party-modules\">List of third-party modules</a></li>\r\n</ul></li>\r\n<li>Resources:\r\n<ul>\r\n<li>Example files:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3039/config.js\">config.js</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr3039/custom.css\">custom.css</a></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n',225,0,1,'CC-BY-SA','Raspberry Pi,VGA monitor,MagicMirror2,MQTT,Node.js,Electron',0,0,1),
(3042,'2020-03-31','The COVID-19 Work From Home Stream - Day 0',4021,'A couple of HPR characters decide to spend some of their social distancing time being social','<p>Tuesday 17.03.2020</p>\r\n<p>Guests: honkeymagoo, crvs, and Thaj</p>\r\n<ul>\r\n<li>How likely we are to get COVID-19</li>\r\n<li>Should we invest while the market is down</li>\r\n<li>How bad is the internet infrastructure in the US</li>\r\n<li>Learning Python\r\n<ul>\r\n<li><a href=\"https://grasshopper.app/\">Grasshopper</a></li>\r\n<li><a href=\"https://github.com/ubarredo/LearnPythonTheHardWay\">Learn Python tne Hard Way</a></li>\r\n<li><a href=\"https://exercism.io\">Excercism</a></li>\r\n<li>Klaatu\'s <a href=\"https://www.amazon.com/Programming-Book-S-Kenlon/dp/098478425X/ref=sr_1_1?dchild=1&amp;keywords=9780984784257&amp;linkCode=qs&amp;qid=1584490615&amp;s=books&amp;sr=1-1\">Programming Book</a></li>\r\n</ul></li>\r\n<li>Growing plants</li>\r\n<li>That Audiobook Club though...</li>\r\n<li>Video games</li>\r\n<li>Single Board Computers\r\n<ul>\r\n<li>OpenBSD on <a href=\"https://www.openbsd.org/arm64.html\">Raspberry Pi</a></li>\r\n</ul></li>\r\n<li>Why haven\'t you done a show about that Thaj?</li>\r\n<li>Emacs and org-mode</li>\r\n<li>Nano for the win</li>\r\n</ul>\r\n',270,0,1,'CC-BY-SA','COVID-19, Stock Markets, Emacs, Python, Programming, Audiobooks, Growing Food, Video Games, SBCs',0,0,1),
(3043,'2020-04-01','How I record for HPR',119,'The tools I use to record a show for HPR','<ol type=\"1\">\r\n<li><p>Sentry BT250 Bluetooth Headphones w/ mic<br />\r\n<a href=\"https://www.amazon.com/Wireless-Rechargeable-Stereo-Earbuds-Bluetooth/dp/B015NFWDX8\" class=\"uri\">https://www.amazon.com/Wireless-Rechargeable-Stereo-Earbuds-Bluetooth/dp/B015NFWDX8</a></p></li>\r\n<li><p>F-Droid - free open source apps for Android<br />\r\n<a href=\"https://f-droid.org/en/\" class=\"uri\">https://f-droid.org/en/</a></p></li>\r\n<li>Audio Recorder from F-Droid<br />\r\n<a href=\"https://f-droid.org/en/packages/com.github.axet.audiorecorder/\" class=\"uri\">https://f-droid.org/en/packages/com.github.axet.audiorecorder/</a><br />\r\nFeatures:\r\n<ul>\r\n<li>Mute incoming call audio while recording</li>\r\n<li>Variety of format encoding\r\n<ul>\r\n<li>ogg (default)</li>\r\n<li>wav</li>\r\n<li>flac</li>\r\n<li>m4a</li>\r\n<li>mp3</li>\r\n<li>opus</li>\r\n</ul></li>\r\n</ul></li>\r\n<li><p>X-plore Android file explorer<br />\r\n<a href=\"https://play.google.com/store/apps/details?id=com.lonelycatgames.Xplore&amp;hl=en_US\" class=\"uri\">https://play.google.com/store/apps/details?id=com.lonelycatgames.Xplore&amp;hl=en_US</a></p></li>\r\n<li>Audacity\r\n<ul>\r\n<li>Amplify tool</li>\r\n<li>Bass and Treble tool</li>\r\n</ul></li>\r\n</ol>\r\n',318,0,0,'CC-BY-SA','recording, bluetooth, android',0,0,1),
(3047,'2020-04-07','The COVID-19 Work From Home Stream - Day 1',2449,'A couple of HPR characters decide to spend some of their social distancing time being social','<p>Wednesday 18.03.2020 (2020-03-18)</p>\r\n<p>Guests: honkeymagoo, crvs, Lyle, Thaj</p>\r\n<ul>\r\n<li><a href=\"https://obsproject.com\">Open Broadcaster Studio</a></li>\r\n<li>A grocery store trip is a sign of the apocalypse?</li>\r\n<li>Bidets are the fix for TP shortages</li>\r\n<li>Insider details on the grocery business</li>\r\n<li>My beard is NOT negotiable</li>\r\n<li>Long term impacts of social distance\r\n<ul>\r\n<li>How are schools handling this?</li>\r\n</ul></li>\r\n<li>Matrix, IRC, and Microsoft Teams...OH MY!!</li>\r\n<li>Do you need another person for your HPR episode, call Thaj.</li>\r\n<li>Lyle has a <a href=\"https://i.imgur.com/GVEOiIB.jpg\">meme</a></li>\r\n<li>Lyle makes a <a href=\"https://cooking.nytimes.com/recipes/1018203-simple-crusty-bread-\">bread</a></li>\r\n<li>More Python</li>\r\n<li>ffmpeg</li>\r\n</ul>',270,0,1,'CC-BY-SA','OBS, Bidets, Grocery',0,0,1),
(3048,'2020-04-08','Alternatives to toilet paper',702,'A non-satirical and non-sarcastic review of alternatives to toilet paper.','<p>In some countries, people seem to be legitimately concerned about the availability of toilet paper. This episode offers alternatives to toilet paper in the hope of relieving people of additional stress around hygiene.\r\n</p><p>This is not a joke episode and contains no offensive language, but it is about a potentially sensitive subject, so it has been marked explicit as a precaution.</p>',78,100,1,'CC-BY-SA','hygiene',0,0,1),
(3051,'2020-04-13','The COVID-19 Work From Home Stream - Day 2',2552,'A few HPR characters decide to spend some of their social distancing time being social','<p>Thursday 19.03.2020</p>\r\n<p>Guests: honkeymagoo, Thaj</p>\r\n<ul>\r\n<li>Talk about creating video tutorials for work</li>\r\n<li>Still more talking about Python</li>\r\n<li>Plumble dies</li>\r\n<li>Is being open to technology based on age?</li>\r\n<li>How much farther will this virus shut things down?</li>\r\n<li>Oh no....politics!</li>\r\n<li>Healthcare in the US</li>\r\n</ul>',270,0,1,'CC-BY-SA','Healthcare, Python, COVID-19, Plumble, Politcs, Technology',0,0,1),
(3054,'2020-04-16','Coronavirus Thoughts',1101,'Where we are with this pandemic, and how should we respond.','<p>This is an attempt on my part to pull together what we know about the Coronavirus, and what measures we can take. It emphasizes the importance of social distancing, and evaluates our prospects for conquering the disease. <a href=\"https://www.palain.com/?page_id=731\" class=\"uri\">https://www.palain.com/?page_id=731</a></p>\r\n<ul>\r\n<li><a href=\"https://www.palain.com/?page_id=356\" class=\"uri\">https://www.palain.com/?page_id=356</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=358\" class=\"uri\">https://www.palain.com/?page_id=358</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=360\" class=\"uri\">https://www.palain.com/?page_id=360</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=402\" class=\"uri\">https://www.palain.com/?page_id=402</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=402\" class=\"uri\">https://www.palain.com/?page_id=402</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2685\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2685</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2695\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2695</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2705\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2705</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2870\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2870</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2880\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2880</a></li>\r\n<li><a href=\"https://www.theguardian.com/world/2020/apr/05/when-will-a-coronavirus-vaccine-be-ready\" class=\"uri\">https://www.theguardian.com/world/2020/apr/05/when-will-a-coronavirus-vaccine-be-ready</a></li>\r\n<li><a href=\"https://s2.washingtonpost.com/camp-rw/?e=endpbG5pa0B6d2lsbmlrLmNvbQ%3D%3D&s=5e8b05f4fe1ff6038cf6a56a&linknum=0&linktot=79\" class=\"uri\">https://s2.washingtonpost.com/camp-rw/?e=endpbG5pa0B6d2lsbmlrLmNvbQ%3D%3D&s=5e8b05f4fe1ff6038cf6a56a&linknum=0&linktot=79</a></li>\r\n<li><a href=\"https://www.jci.org/articles/view/138003\" class=\"uri\">https://www.jci.org/articles/view/138003</a></li>\r\n<li><a href=\"https://www.scientificamerican.com/podcast/science-talk/\" class=\"uri\">https://www.scientificamerican.com/podcast/science-talk/</a></li>\r\n<li><a href=\"https://fivethirtyeight.com/videos/why-we-shouldnt-hope-covid-19-is-seasonal-like-the-flu/\" class=\"uri\">https://fivethirtyeight.com/videos/why-we-shouldnt-hope-covid-19-is-seasonal-like-the-flu/</a></li>\r\n<li><a href=\"https://fivethirtyeight.com/features/why-we-still-need-to-test-widely-for-coronavirus/\" class=\"uri\">https://fivethirtyeight.com/features/why-we-still-need-to-test-widely-for-coronavirus/</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=731\" class=\"uri\">https://www.palain.com/?page_id=731</a></li>\r\n</ul>\r\n\r\n<hr />\r\n<small>Show notes added by Ken as they are released under a Creative Commons Attribution-ShareAlike 4.0 International License. </small>\r\n\r\n<p>\r\n   Well, since I am sitting at home maintaining a &#8220;social distance&#8221; I thought I would put down some thoughts about this pandemic and how we will be affected. But a disclaimer to be completely clear: I am not a doctor or a research scientist. I am retired, but I was once a college professor teaching \r\n   <em>\r\n   Statistics\r\n   </em>\r\n   and \r\n   <em>\r\n   Research Methods\r\n   </em>\r\n   . I think this helps me in some way to interpret the information I receive, but when I want authoritative information I look to real doctors, the CDC, and qualified researchers. If you want to know more about what I mean by qualified researchers, you might want to check out my series on interpreting studies:\r\n</p>\r\n<ul>\r\n   <li>\r\n      <a rel=\"noreferrer noopener\" href=\"https://www.palain.com/?page_id=356\" target=\"_blank\">\r\n      Scientific and Medical Reports\r\n      </a>\r\n   </li>\r\n   <li>\r\n      <a rel=\"noreferrer noopener\" href=\"https://www.palain.com/?page_id=358\" target=\"_blank\">\r\n      Problems With Studies\r\n      </a>\r\n   </li>\r\n   <li>\r\n      <a rel=\"noreferrer noopener\" href=\"https://www.palain.com/?page_id=360\" target=\"_blank\">\r\n      Evidence-Based Medicine\r\n      </a>\r\n   </li>\r\n   <li>\r\n      <a rel=\"noreferrer noopener\" href=\"https://www.palain.com/?page_id=402\" target=\"_blank\">\r\n      The Hierarchy of Evidence\r\n      </a>\r\n   </li>\r\n   <li>\r\n      <a rel=\"noreferrer noopener\" href=\"https://www.palain.com/?page_id=402\" target=\"_blank\">\r\n      Evaluating a Study\r\n      </a>\r\n   </li>\r\n</ul>\r\n<p>\r\n   And if you prefer audio to reading, you can download the audio versions at Hacker Public Radio:\r\n</p>\r\n<ul>\r\n   <li>\r\n      <a href=\"https://hackerpublicradio.org/eps.php?id=2685\" target=\"_blank\" rel=\"noreferrer noopener\">\r\n      Scientific and Medical Reports\r\n      </a>\r\n   </li>\r\n   <li>\r\n      <a href=\"https://hackerpublicradio.org/eps.php?id=2695\" target=\"_blank\" rel=\"noreferrer noopener\">\r\n      Problems With Studies\r\n      </a>\r\n   </li>\r\n   <li>\r\n      <a href=\"https://hackerpublicradio.org/eps.php?id=2705\" target=\"_blank\" rel=\"noreferrer noopener\">\r\n      Evidence-Based Medicine\r\n      </a>\r\n   </li>\r\n   <li>\r\n      <a href=\"https://hackerpublicradio.org/eps.php?id=2870\" target=\"_blank\" rel=\"noreferrer noopener\">\r\n      The Hierarchy of Evidence\r\n      </a>\r\n   </li>\r\n   <li>\r\n      <a href=\"https://hackerpublicradio.org/eps.php?id=2880\" target=\"_blank\" rel=\"noreferrer noopener\">\r\n      Evaluating  a Study\r\n      </a>\r\n   </li>\r\n</ul>\r\n<p>\r\n   So, with the preliminaries out of the way, what do we know? We know that this is a virus of a type called coronavirus, which makes it part of the family of viruses that include the common cold, SARS, and MERS. What distinguishes this new virus, technically called SARS-CoV2 (though I usually just call it covid-19, like most reports do) is that it is highly infectious and highly virulent. Highly infectious means it is easily passed from one person to another. Highly virulent means that it can cause death easily. It has been compared in this respect to the 1918 Flu pandemic, which we estimate infected 500 million people worldwide (about 1/3 of the population at that time) and killed at least 20 million to 50 million people, and perhaps more. Note that assigning a cause of death is not a precise science, and medical record keeping in many parts of the world was sketchy at best.\r\n</p>\r\n<h2>\r\n   What Can Help?\r\n</h2>\r\n<p>\r\n   The ultimate answer to this would be a vaccine. Thankfully, the anti-vaxxers have crawled back under whatever rocks they live under for the time being, but a vaccine is not the perfect answer right now. The good news is that coronavirus appears to be one that does not mutate a lot, which means a vaccine is likely to be more effective than the flu vaccine. Influenza virus changes every year and that makes it a bit of guesswork to figure out. \r\n   <a rel=\"noreferrer noopener\" href=\"https://www.theguardian.com/world/2020/apr/05/when-will-a-coronavirus-vaccine-be-ready\" target=\"_blank\">\r\n   Scientists are working on a vaccine right now in a crash program\r\n   </a>\r\n   , and again there is some good news on that front. First, Chinese scientists were able to DNA sequence the virus pretty quickly. They found that this virus shares 80-90% of its DNA with SARS, which is why it is named SARS-CoV2. Unfortunately, we don&#8217;t have a SARS vaccine because that outbreak died off before work was completed, but the work that was done is something we can build on. But in general, most researchers have said that it will take as much as 18 months even with a crash program. \r\n</p>\r\n<p>\r\n   Usually these take much longer. First you do animal studies, both for safety and for efficacy. For example, one of the early candidates for a SARS vaccine was causing harm to the animals who received it, though they think that problem has now been solved. If the animal trials are promising, you can move on to human trials Stage 1 is to test with a small number of healthy volunteers, looking specifically to test safety. You don&#8217;t want to administer a vaccine that kill everyone, or even any significant number of people.   If the candidate passes that test, Stage 2 is to administer the vaccine to a few hundred people in an area where the disease is rampant. If it looks like it is working, and no safety issues have arisen, a final trial can involve several thousand people. If it passes that, it can be approved for medical use and move into production. And that adds even more delays, since producing vaccine in large quantities takes a long time. According to Ronald Klain, Obama Administration&#8217;s Ebola Czar:\r\n</p>\r\n<blockquote>\r\n   <p>\r\n      Developing and testing the vaccine &#8212; hard as it is &#8212; isn&#8217;t the hardest part. Manufacturing hundreds of millions of doses &#8212; and getting people to take the vaccine &#8212; will be harder and take longer.\r\n   </p>\r\n   <cite>\r\n   <a href=\"https://s2.washingtonpost.com/camp-rw/?e=endpbG5pa0B6d2lsbmlrLmNvbQ%3D%3D&amp;s=5e8b05f4fe1ff6038cf6a56a&amp;linknum=0&amp;linktot=79\">\r\n   https://s2.washingtonpost.com/camp-rw/?e=endpbG5pa0B6d2lsbmlrLmNvbQ%3D%3D&amp;s=5e8b05f4fe1ff6038cf6a56a&amp;linknum=0&amp;linktot=79\r\n   </a>\r\n   </cite>\r\n</blockquote>\r\n<p>\r\n   Now, this process can be accelerated to some degree, but not by as much as you might think. Doing the research to find a candidate that might work will take time, and there is no short cut. That is why researchers say a crash program might deliver something in 18 months, as opposed to the decade or more many vaccines require. Sometimes when these studies are done, you get quick results that can lead to dropping some steps. For example, if you have a test group and a control group, and the test group recovers quickly while the control group is dying, any ethical researcher will stop the trial and give the remedy to everyone who needs it. But you are dealing with probabilities in this, and most people are not comfortable with that. They want yes or no answers, and sadly life does not give that all the time. If you are responsible for that decision, if anything goes wrong you will get all of the blame. I&#8217;m glad I don&#8217;t have to make that decision, though also apprehensive that the people who do make that decision may not be sane adults.\r\n</p>\r\n<p>\r\n   OK, if you we wait for the vaccine, what about medicines to cure the infection? Again, there is work being done here. Several different approaches are being studied. One which we know can work is called \r\n   <a rel=\"noreferrer noopener\" href=\"https://www.jci.org/articles/view/138003\" target=\"_blank\">\r\n   Convalescent Plasma\r\n   </a>\r\n   (aka Convalescent Blood). This takes plasma from people who have recovered from the disease, and gives it intravenously to someone seriously ill. It is an old approach, predating vaccines, but it does work. The transfusion of the plasma contains antibodies made by the person who recovered, and those antibodies can help someone with the disease. But the obvious problem is that it does not scale very well when new cases keep increasing. Other approaches are using drugs developed for different illnesses, in the hope that they are sufficiently similar to covid-19 so that the medication would be effective. This is good since those medications have already passed all of the safety tests, but we just don&#8217;t know enough right now. Some reports suggest HIV drugs can help, other reports say they don&#8217;t. And so this may bear fruit, but it may be a while yet. The medicine promoted by Donald Trump, hydroxychloroquine, has not been found effective in any good research, and should not be counted on as a valid cure.\r\n</p>\r\n<p>\r\n   And that brings us back to the things we know are effective at this point, which is preventing people from passing on the virus by \r\n   <em>\r\n   social distancing\r\n   </em>\r\n   , i.e. quarantine, and massive testing. If people stay home and do not interact with other people, they cannot pass the disease along and the outbreak will eventually die off. This will work if done properly. To see this, I will use an example I pulled from Steve Mirsky of the \r\n   <a href=\"https://www.scientificamerican.com/podcast/science-talk/\" target=\"_blank\" rel=\"noreferrer noopener\">\r\n   Scientific American Podcast\r\n   </a>\r\n   , which requires less than a minute of spreadsheet work. This uses the reproduction factor R0, which is the average number of people who get infected by each person with the virus.\r\n</p>\r\n<figure class=\"wp-block-table\">\r\n   <table>\r\n      <tbody>\r\n         <tr>\r\n            <td>\r\n               Round\r\n            </td>\r\n            <td>\r\n               R0=1.3\r\n            </td>\r\n            <td>\r\n               R0=2.5\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               1\r\n            </td>\r\n            <td>\r\n               1.3\r\n            </td>\r\n            <td>\r\n               2.5\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               2\r\n            </td>\r\n            <td>\r\n               1.7\r\n            </td>\r\n            <td>\r\n               6.3\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               3\r\n            </td>\r\n            <td>\r\n               2.2\r\n            </td>\r\n            <td>\r\n               15.6\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               4\r\n            </td>\r\n            <td>\r\n               2.9\r\n            </td>\r\n            <td>\r\n               39.1\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               5\r\n            </td>\r\n            <td>\r\n               3.7\r\n            </td>\r\n            <td>\r\n               97.7\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               6\r\n            </td>\r\n            <td>\r\n               4.8\r\n            </td>\r\n            <td>\r\n               244.1\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               7\r\n            </td>\r\n            <td>\r\n               6.3\r\n            </td>\r\n            <td>\r\n               610.4\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               8\r\n            </td>\r\n            <td>\r\n               8.2\r\n            </td>\r\n            <td>\r\n               1525.9\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               9\r\n            </td>\r\n            <td>\r\n               10.6\r\n            </td>\r\n            <td>\r\n               3814.7\r\n            </td>\r\n         </tr>\r\n         <tr>\r\n            <td>\r\n               10\r\n            </td>\r\n            <td>\r\n               13.8\r\n            </td>\r\n            <td>\r\n               9536.7\r\n            </td>\r\n         </tr>\r\n      </tbody>\r\n   </table>\r\n   <figcaption>\r\n      How the reproduction factor affects the spread\r\n   </figcaption>\r\n</figure>\r\n<p>\r\n   As we can see, with a factor of R0=1.3, which means each person infects on average 1.3 others, after ten rounds of infection it has only spread to 14 other people. But with R0=2.5, which doesn&#8217;t seem that much different, ten rounds means 9,536 people have the disease. Now, there are two primary factors affecting R0. One is the inherent infectiousness of the virus, which is high and out of our control. The other factor is how many people each person interacts with, and that is what we are trying to reduce through social distancing.\r\n</p>\r\n<p>\r\n   Testing is still important, even at this stage, because it does several good things. First, it helps with the allocation of resources if we know exactly where the worst spots are. Second, it saves time and equipment in hospitals if we know exactly who is sick. Third, this gets us data we need to plan for future outbreaks. This pandemic is not the last one we will face, and this one won&#8217;t be over soon either. We need to know everything we can about how it spreads. And finally, we need a robust testing regime in place before we can &#8220;safely&#8221; start to resume our lives. \r\n</p>\r\n<blockquote>\r\n   <p>\r\n      There’s also the fact that, eventually, we’re going to want to go back outside again. As the current protocols start to relax,&nbsp;\r\n      <a href=\"https://fivethirtyeight.com/videos/why-we-shouldnt-hope-covid-19-is-seasonal-like-the-flu/\">\r\n      a second wave of infections may arise,\r\n      </a>\r\n      &nbsp;especially if we don’t have a good grasp on where and how many cases we have in the U.S., said Dr. Eli Perencevich, a professor of medicine and epidemiology at the University of Iowa.\r\n   </p>\r\n   <p>\r\n      “We can’t stay in social distancing forever,” Perencevich said. “So we need to ramp up testing quickly.”\r\n   </p>\r\n   <cite>\r\n   <a href=\"https://fivethirtyeight.com/features/why-we-still-need-to-test-widely-for-coronavirus/\">\r\n   https://fivethirtyeight.com/features/why-we-still-need-to-test-widely-for-coronavirus/\r\n   </a>\r\n   </cite>\r\n</blockquote>\r\n<p>\r\n   So, the bottom line is that a vaccine is most likely 18 months away, medicines may be months away, and right now the best thing we can do as individuals is isolate.\r\n</p>\r\n\r\n',198,100,0,'CC-BY-SA','Health, Coronavirus, COVID-19',0,0,1),
(3049,'2020-04-09','What computers taught me about reality',1451,'Klaatu tells us what computers taught him about reality','<p>Some musings about what computers taught me about reality and perception.</p>',78,0,0,'CC-BY-SA','philosophy,system design',0,0,1),
(3044,'2020-04-02','mocp snooze tip',391,'A quick snooze tip when using mocp','<p>I use cordless headphones, I find this very handy when I want <code>mocp</code> to play for a set time then pause.</p>\r\n<p>Commands used</p>\r\n<ul>\r\n<li><p>Ctrl + r, to quickly find the command</p></li>\r\n<li><p><code>sleep 10m && mocp -G</code></p></li>\r\n<li><p><code>sleep 10m && mocp -M ~/.moc/audiobooks -G</code></p></li>\r\n<li><p><code>sleep 5h && iplayer-url</code></p></li>\r\n</ul>',201,0,1,'CC-BY-SA','Linux, bash, podcasts, audio',0,0,1),
(3056,'2020-04-20','Jitsi',764,'Jitsi is an open-source multiplatform videoconferencing ','<p>Jitsi is a collection of free and open-source multiplatform voice, videoconferencing and instant messaging applications for the web platform, Windows, Linux, Mac OS X and Android</p>\r\n<p>Jitsi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<small><small>(<b>Editor\'s Note</b>: show notes amended 2020-06-13 from comment)</small></small></p>\r\n<pre><code>systemctl stop docker\r\n\r\nrm -Rf /var/lib/docker\r\nrm -Rf ~/.jitsi-meet-cfg\r\n\r\n# change docker-data to your path you want to put images in\r\nmount --rbind /media/moredata/docker-data /var/lib/docker\r\n\r\napt-get remove --purge install docker-ce docker-ce-cli containerd.io\r\napt-get install docker-ce docker-ce-cli containerd.io\r\n\r\ncurl -L &quot;https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose\r\nchmod +x /usr/local/bin/docker-compose\r\n\r\ngit clone https://github.com/jitsi/docker-jitsi-meet &amp;&amp; cd docker-jitsi-meet\r\n\r\nsystemctl restart docker\r\n\r\ncp env.example .env\r\nmkdir -p ~/.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb}\r\n\r\ndocker-compose --log-level DEBUG up -d --force-recreate --remove-orphans\r\n\r\ntail -f `find /var/lib/docker/containers -iname &quot;*.log&quot; `\r\n\r\ndocker container ls\r\n\r\ndocker exec -it d4c89a799fd7 bash\r\n\r\n# side that will be controlled needs to run\r\nhttps://github.com/jitsi/jitsi-meet-electron/releases/latest</code></pre>\r\n<ul>\r\n<li><p><a href=\"https://rmccurdy.com/.scripts/videos/rmccurdy_com/HPR_Jitsi.mp4\" class=\"uri\">https://rmccurdy.com/.scripts/videos/rmccurdy_com/HPR_Jitsi.mp4</a></p></li>\r\n<li><p><a href=\"https://rmccurdy.com/.scripts/videos/rmccurdy_com/HPR_Jitsi.mp3\" class=\"uri\">https://rmccurdy.com/.scripts/videos/rmccurdy_com/HPR_Jitsi.mp3</a></p></li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','linux,debian,computers,software,internet,Jitsi,video,conferencing,open-source',0,0,1),
(3050,'2020-04-10','Linux Inlaws S01E04 What\'s in a name',4396,'Season 1, Episode 4. The episode where the legacy is revealed','<p>This is Linux Inlaws, a series on free and open source software, black humour, the revolution and freedom in general (this includes ideas and software) and generally having fun.</p>\r\n<p>Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.</p>\r\n<p>Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute t-rexes or other associated dinosaurs.</p>\r\n<p>In this show the lads Martin and Chris speak about the legacy, its name and also introduce Tech Support from the Dark Side, a new hotline helping politicians and other users in need of computer support to cope with reality.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Martin’s BBC podcast: <a href=\"https://www.bbc.co.uk/programmes/w13xttx2/episodes/downloads\" class=\"uri\">https://www.bbc.co.uk/programmes/w13xttx2/episodes/downloads</a></li>\r\n<li>Chris’ food for thought: <a href=\"https://en.wikipedia.org/wiki/Moon_landing_conspiracy_theories\" class=\"uri\">https://en.wikipedia.org/wiki/Moon_landing_conspiracy_theories</a></li>\r\n<li>Martin’s new laptop spec: <a href=\"https://www.asus.com/Laptops/ROG-Strix-SCAR-III/Tech-Specs\" class=\"uri\">https://www.asus.com/Laptops/ROG-Strix-SCAR-III/Tech-Specs</a></li>\r\n<li>Chris’ documentary: <a href=\"https://en.wikipedia.org/wiki/Terminator:_The_Sarah_Connor_Chronicles\" class=\"uri\">https://en.wikipedia.org/wiki/Terminator:_The_Sarah_Connor_Chronicles</a></li>\r\n</ul>\r\n',384,111,1,'CC-BY-SA','linux inlaws,communism,free and open source software',0,0,1),
(3052,'2020-04-14','Locating computers on a network',1322,'Ken explains some different ways to locate computers on the network','<h1>Locating computers on a network</h1>\r\n\r\n<p>Sometimes you may wish to locate a device on your network. It might be to find rogue devices, or to locate a new device be that a printer, an Internet of Things light bulb, or whatever. In my case I was trying to track down a RaspberryPi. Raspbian now lists the IP Addresses assigned to it when it first starts, but that requires a monitor to be connected.</p>\r\n\r\n<h2 id=\"locating-using-your-router\">Locating using your router.</h2>\r\n\r\n<p>This is by far the easiest way to find a new device but it is also the most manual. If you have access to the (WiFi) Router/<a href=\"https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol\">DHCP</a> server on your network then this should be a matter of logging in and getting the address from the menu area probably called <code>Network</code> or <code>LAN</code> or something like that. So first list all the computers that are on the network. Then turn on your pi, and see if a new one has joined. If you\'re lucky it may even be labeled <em>Raspberry Pi Foundation</em>.</p>\r\n\r\n<p>In my case I want to locate these devices automatically using a script. So below we will explore some ways that you can approach the problem of locating devices on your network. All of them rely on trying to find the mapping between an Ethernet MAC Address, and a IP Address. It will help to understand a little about how Ethernet works. This is a nice short overview, <a href=\"https://www.youtube.com/watch?v=5u52wbqBgEY\">How does Ethernet work? (animated)</a> by <a href=\"https://www.youtube.com/channel/UCXkx8hX8Xo4lb7T0_-yZzVg\">Janos Pasztor</a></p>\r\n\r\n<h2 id=\"arp\">ARP</h2>\r\n\r\n<p>I don\'t know the network device you will be using so I\'d like to share a few ways of doing this using the <a href=\"https://en.wikipedia.org/wiki/Address_Resolution_Protocol\">ARP</a> protocol. This provides a mapping between a device\'s permanent <a href=\"https://en.wikipedia.org/wiki/MAC_address\">MAC address</a> and their, often temporarily, assigned <a href=\"https://en.wikipedia.org/wiki/IP_address\">IP address</a>.</p>\r\n\r\n<p>When your computer <code>192.168.1.1</code> wants to talk to another device it will need to know the Ethernet <a href=\"https://en.wikipedia.org/wiki/MAC_address\">MAC address</a> of the other device. Let\'s assume it wants to connect to the local printer <code>192.168.1.2</code> that is on the same network, and it knows its IP Address. If your computer has already heard the printer communicate on the network, it will have already added the printer\'s IP address and MAC Address to its so called ARP table. Over time older entries will be removed from this table either because they are too old, or there were too many entries.</p>\r\n\r\n<p>Linux has a command called <code>arp</code> which will show you a list of the IP addresses mapped to the MAC/HWaddress address.</p>\r\n<pre><code># arp -n\r\nAddress                  HWtype  HWaddress           Flags Mask            Iface\r\n192.168.1.254            ether   ff:ee:dd:cc:bb:aa   C                     eno1\r\n192.168.1.2              ether   00:11:22:33:44:55   C                     eno1\r\n192.168.1.1              ether   00:aa:bb:cc:dd:ee   C                     eno1\r\n</code></pre>\r\n\r\n<p>From a <a href=\"https://en.wikipedia.org/wiki/Internet_Protocol\">Internet Protocol (IP)</a> point of view all your devices in your house are probably in the same <a href=\"https://en.wikipedia.org/wiki/Subnetwork\">Subnet(work)</a>. But what if you need to communicate outside your network? For example to ping a well known server <code>8.8.8.8</code> to check if you have an Internet Connection. The IP settings also include a <a href=\"https://en.wikipedia.org/wiki/Default_gateway\">Default gateway</a> to send all traffic not intended for the local network.</p>\r\n\r\n<h2 id=\"finding-the-default-gateway\">Finding the Default gateway</h2>\r\n\r\n<p>Your computer will have many IP Addresses configured but it\'s a good bet that the network you and your new pi are on is the same one as the default gateway is on. You can find the default gateway using the following command:</p>\r\n<pre><code>$ route -n | grep -E \'Destination|^0.0.0.0\'\r\nDestination     Gateway         Genmask         Flags Metric Ref    Use Iface\r\n0.0.0.0         192.168.1.254   0.0.0.0         UG    100    0        0 eno1\r\n</code></pre>\r\n\r\n<p>It uses <code>route</code> to show the route table showing IP Addresses and not network names. The first column is <code>Destination</code> and so a <code>0.0.0.0</code> there means <em>route everything else to</em> and the <em>to</em> we get from the second column <code>Gateway</code>, which is our gateway.</p>\r\n\r\n<p>You can also get the same information using the following command:</p>\r\n<pre><code>$ ip route show | grep default\r\ndefault via 192.168.1.254 dev eno1 proto dhcp metric 100\r\n</code></pre>\r\n\r\n<p>And now to just show the IP Address.</p>\r\n\r\n<pre><code>$ route -n | awk &#39;/^0.0.0.0/ {print $2}&#39;\r\n192.168.1.254\r\n</code></pre>\r\n\r\n\r\n<p>From an Ethernet point of view it needs to find the <a href=\"https://en.wikipedia.org/wiki/MAC_address\">MAC address</a> associated with your router/default gateway\'s IP address <code>192.168.1.254</code>, so that it can send Ethernet Frames to it. In our case the address is in the ARP table, but if it wasn\'t then your computer would broadcast to everyone on the network using a special address <code>ff:ff:ff:ff:ff:ff</code>. When the router/default gateway replies that entry will be added to the ARP table.</p>\r\n\r\n<pre><code>\r\n739  5.328679069  00:aa:bb:cc:dd:ee  ff:ff:ff:ff:ff:ff  ARP  42  Who has 192.168.1.254? Tell 192.168.1.1\r\n746  5.328911559  ff:ee:dd:cc:bb:aa  00:aa:bb:cc:dd:ee  ARP  60  192.168.1.254 is at ff:ee:dd:cc:bb:aa\r\n</code></pre>\r\n\r\n<p>Have a play with <a href=\"https://www.wireshark.org/\">WireShark</a> to see what is actually going on on your network. There is a good step by step walk through on <a href=\"https://en.wikiversity.org/wiki/Wireshark/Arp\">Wireshark/Arp</a> on wikiversity.</p>\r\n\r\n<p>All RaspberryPi computers have an Ethernet <a href=\"https://en.wikipedia.org/wiki/MAC_address\">MAC address</a> starting with <a href=\"https://hwaddress.com/company/raspberry-pi-foundation\"><code>b8:27:eb</code> or <code>dc:a6:32</code></a>. So if your computer and the new pi are on the same network you can look for new MAC addresses starting with <code>b8:27:eb</code> or <code>dc:a6:32</code>.</p>\r\n\r\n<h2 id=\"foiled-by-the-switch\">Foiled by the Switch</h2>\r\n\r\n<p>All is not plain sailing as most modern <a href=\"https://en.wikipedia.org/wiki/Local_area_network\">LAN</a>\'s use <a href=\"https://en.wikipedia.org/wiki/Network_switch\">switches</a> to split up the <a href=\"https://en.wikipedia.org/wiki/Broadcast_domain#Further_explanation\">broadcast domain</a>.</p>\r\n\r\n<blockquote cite=\"https://en.wikipedia.org/wiki/Broadcast_domain#Further_explanation\">\r\nSwitches act as buffers, receiving and analyzing the frames from each connected network segment. Frames destined for nodes connected to the originating segment are not forwarded by the switch. Frames destined for a specific node on a different segment are sent only to that segment. Only broadcast frames are forwarded to all other segments. This reduces unnecessary traffic and collisions.\r\n</blockquote>\r\n\r\n<p>What this means is that although all your computers may be on one big IP network, the devices may be connected to different switches. For example a WiFi Router downstairs, a Cabled Switch in the back room, and a network extender in the attic. All are filtering out unnecessary traffic. While that is a good thing, it does mean that it may not ever see the traffic from the new Pi.</p>\r\n\r\n<p>If we try and contact each and every IP Address on the network, that forces ARP \"Who has?\" traffic, and the answers that come back will be added to the arp table. There are a few ways to force this discovery.</p>\r\n\r\n<h2 id=\"discovery-by-ping\">Discovery by ping</h2>\r\n\r\n<p>One way to generate ARP traffic is to use the <a href=\"https://en.wikipedia.org/wiki/Ping_(networking_utility)\">ping</a> utility.</p>\r\n\r\n<blockquote cite=\"https://en.wikipedia.org/wiki/Ping_(networking_utility)n\">\r\nPing measures the round-trip time for messages sent from the originating host to a destination computer that are echoed back to the source. The name comes from active sonar terminology that sends a pulse of sound and listens for the echo to detect objects under water.\r\n</blockquote>\r\n\r\n<p>To ping an IP Address, just type <code>ping 192.168.1.1</code>. That will send out a continuous ping which you can stop by pressing and holding the <em>ctrl</em> key and then pressing the letter <em>c</em>.</p>\r\n\r\n<pre><code>$ ping 192.168.1.1\r\nPING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.\r\n64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=0.547 ms\r\n64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=0.493 ms\r\n64 bytes from 192.168.1.1: icmp_seq=3 ttl=63 time=0.422 ms\r\n64 bytes from 192.168.1.1: icmp_seq=4 ttl=63 time=0.466 ms\r\n^C\r\n--- 192.168.1.1 ping statistics ---\r\n4 packets transmitted, 4 received, 0% packet loss, time 3105ms\r\nrtt min/avg/max/mdev = 0.422/0.482/0.547/0.045 m\r\n</code></pre>\r\n\r\n<p>We don\'t actually care about the output, as the point here is to generate some traffic to see who is awake. So we can redirect output and errors to <a href=\"https://en.wikipedia.org/wiki/Null_device\">/dev/null</a>. So a good command to do this would be:</p>\r\n\r\n<pre><code>ping -n -c 1 -W 1 192.168.1.1 &gt;/dev/null 2&gt;&amp;1 &amp;</code></pre>\r\n\r\n<p>The options used are to limit the traffic and wait time as much as possible:</p>\r\n\r\n<pre><code>-n Numeric output only.  No attempt will be made to lookup symbolic names for host addresses.\r\n-c count. Stop after sending count ECHO_REQUEST packets. With deadline option, ping waits for count ECHO_REPLY packets, until the timeout expires.\r\n-W timeout. Time to wait for a response, in seconds. The option affects only timeout in absence of any responses, otherwise ping waits for two RTTs.\r\n</code></pre>\r\n\r\n<p>In this solution we will try and <a href=\"https://en.wikipedia.org/wiki/Ping_(networking_utility)\">ping</a> every host on the network. It would be a bit tedious to do each one by one, so we will make a script to do this for us. It\'s a very safe bet that your home network will have a private IP range of 192.168.???.0 to 192.168.???.255. This is not a safe assumption in an Office Environment but we can deal with that later.</p>\r\n\r\n<p>So we will try and find the <em>base</em> part of the subnet <code>192.168.1.1</code> which will be <code>192.168.1</code> and then we will ping each address in turn.</p>\r\n\r\n<pre><code>base=$( ip route show | awk -F &#39;\\\\.|/| &#39; &#39;/default/ {print $3&quot;.&quot;$4&quot;.&quot;$5}&#39; )\r\nfor node in {1..254}\r\ndo\r\n( ping -n -c 1 -W 1 ${base}.${node} &amp; )\r\ndone\r\n</code></pre>\r\n\r\n<p>I\'m assigning the <code>base</code> variable the first three parts of the IP Address and then I am cycling through all possible addresses sending out a <a href=\"https://en.wikipedia.org/wiki/Ping%20%28networking_utility%29\">ping</a> (a sort of hello message) to each. By wrapping the whole thing in <code>()</code> we can <em>fork</em> each to run at the same time.</p>\r\n\r\n<p>This will force some traffic between my computer and every computer on the network, which will fill up the arp table on my pc.</p>\r\n\r\n<pre><code># arp -n\r\nAddress                  HWtype  HWaddress           Flags Mask            Iface\r\n192.168.1.2              ether   00:11:22:33:44:55   C                     eno1\r\n192.168.1.1              ether   00:aa:bb:cc:dd:ee   C                     eno1\r\n192.168.1.10             ether   11:11:11:11:11:11   C                     eno1\r\n192.168.1.25             ether   22:22:22:22:22:22   C                     eno1\r\n192.168.1.3              ether   33:22:22:22:22:22   C                     eno1\r\n192.168.1.5              ether   b8:27:eb:11:11:11   C                     eno1\r\n</code></pre>\r\n\r\n<p>And now we find all the computers that are on, and responding to pings on the network. We can see that there is one that starts with <code>b8:27:eb|dc:a6:32</code>, and it has an IP Address of 192.168.1.5.</p>\r\n\r\n<pre><code># arp -n | grep -Ei &#39;b8:27:eb|dc:a6:32&#39; | awk &#39;{print $1}&#39;\r\n192.168.1.5\r\n</code></pre>\r\n\r\n<p>Putting it all together</p>\r\n\r\n<pre><code>base=$( ip route show | awk -F &#39;\\\\.|/| &#39; &#39;/default/ {print $3&quot;.&quot;$4&quot;.&quot;$5}&#39; )\r\nfor node in {1..254}\r\ndo\r\n  (ping -n -c 1 -W 1 ${base}.${node} &gt;/dev/null 2&gt;&amp;1 &amp;)\r\ndone\r\narp -n | grep -Ei &#39;b8:27:eb|dc:a6:32&#39; | awk &#39;{print $1}&#39;\r\n</code></pre>\r\n\r\n<h2 id=\"discovery-by-nmap\">Discovery by nmap</h2>\r\n\r\n<p>You should have <strong>permission in writing</strong> from your network administrator before you proceed with these steps.</p>\r\n\r\n<p>Here I am going to use some of the commands above together with the tools <a href=\"https://nmap.org/\">nmap</a> and <a href=\"https://github.com/nmav/ipcalc\">ipcalc</a> to locate and scan the network. This has the advantage of dealing with more exotic subnet masks.</p>\r\n\r\n<p>Find the default interface</p>\r\n\r\n<pre><code># route -n\r\nKernel IP routing table\r\nDestination     Gateway         Genmask         Flags Metric Ref    Use Iface\r\n0.0.0.0         192.168.1.254   0.0.0.0         UG    100    0        0 eno1\r\n....\r\n\r\n# route -n | grep -E &#39;^0.0.0.0&#39; | awk &#39;{print $8}&#39;\r\neno1\r\n</code></pre>\r\n\r\n<p>Find the ip and subnetmask for the default interface</p>\r\n<pre><code># ifconfig eno1 | grep &#39;inet &#39;\r\ninet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255\r\n\r\n# ifconfig eno1 | grep &#39;inet &#39; | awk &#39;{print $2&quot;/&quot;$4}&#39;\r\n192.168.1.1/255.255.255.0\r\n</code></pre>\r\n\r\n<p>Get the network from ipcalc</p>\r\n\r\n<pre><code># ipcalc 192.168.1.1/255.255.255.0\r\nAddress:        192.168.1.1\r\nNetwork:        192.168.1.0/24\r\nNetmask:        255.255.255.0 = 24\r\nBroadcast:      192.168.1.255\r\n\r\nAddress space:  Private Use\r\nAddress class:  Class C\r\nHostMin:        192.168.1.1\r\nHostMax:        192.168.1.254\r\nHosts/Net:      254\r\n\r\n# ipcalc 192.168.1.4/255.255.255.0 | grep &#39;Network&#39; | awk &#39;{print $NF}&#39;\r\n192.168.1.0/24\r\n</code></pre>\r\n<p>Now call nmap to give the ip address and MAC address</p>\r\n<pre><code># nmap -sn 192.168.1.0/24\r\nStarting Nmap 7.40 ( https://nmap.org ) at 2017-07-05 20:57 CEST\r\nNmap scan report for 192.168.1.2\r\nHost is up (0.0012s latency).\r\nMAC Address: 00:11:22:33:44:55 (Acme industries)\r\nNmap scan report for 192.168.1.5\r\nMAC Address: b8:27:eb:11:11:11 (Raspberry Pi Foundation)\r\nNmap scan report for local.lan (192.168.1.254)\r\nHost is up.\r\nNmap done: 256 IP addresses (2 hosts up) scanned in 3.51 seconds\r\n\r\n\r\n-sn (No port scan) This option tells Nmap not to do a port scan after host discovery, and only print out the available hosts that responded to the host discovery probes. This is often known as a “ping scan”, but you can also request that traceroute and NSE host scripts be run. In previous releases of Nmap, -sn was known as -sP.\r\n</code></pre>\r\n\r\n<h2 id=\"discovery-by-arp-scan\">Discovery by arp-scan</h2>\r\n\r\n<p>By far the easiest way to do this is using the dedicated tool called <a href=\"https://github.com/royhills/arp-scan\">arp-scan</a>, (<a href=\"https://linux.die.net/man/1/arp-scan\">Man Page</a>)</p>\r\n\r\n<pre><code># arp-scan --interface eno1 --localnet --numeric --ignoredups\r\nInterface: eno1, type: EN10MB, MAC: 20:47:47:ca:24:a6, IPv4: 192.168.10.14\r\nStarting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)\r\n192.168.1.2     00:11:22:33:44:55       Acme industries\r\n192.168.1.5     dc:a6:32:22:22:22       Raspberry Pi Trading Ltd\r\n192.168.1.233   b8:27:eb:11:11:11       Raspberry Pi Foundation\r\n192.168.1.254   e4:95:6e:00:00:00       IEEE Registration Authority\r\n\r\n12 packets received by filter, 0 packets dropped by kernel\r\nEnding arp-scan 1.9.7: 256 hosts scanned in 1.939 seconds (132.03 hosts/sec). 12 responded\r\n</code></pre>\r\n\r\n<p>Whichever option you chose I hope this helps you become more familiar with your network and the way it works.</p>\r\n',30,61,0,'CC-BY-SA','arp, ethernet, ip address, dhcp, wireshark, nmap, ping, route, router, arp-scan, wikiversity',0,0,1),
(3053,'2020-04-15','AudioBookClub 17 - Blood Witness',9328,'Straight out of the Freezer, the HPR Audiobook Club reviews Blood Witness by David Hitt','<h1 id=\"in-this-episode-the-hpr-audiobook-club-discusses-the-audiobook-blood-witness-by-david-hitt\">In this episode the HPR Audiobook Club discusses the audiobook <a href=\"https://www.scribl.com/books/PA513/blood-witness\">Blood Witness</a> by David Hitt</h1>\r\n<hr />\r\n<h1 id=\"non-spoiler-thoughts\">Non-Spoiler Thoughts</h1>\r\n<hr />\r\n<ul>\r\n<li>This book may or may not be offensive to some. We discuss.</li>\r\n<li>Audio quality was generally good, very few double reads.</li>\r\n<li>Thaj is annoyed by the transition sound.</li>\r\n<li>We generally enjoyed the theme music.</li>\r\n<li>We discuss the characters that we found the most interesting.</li>\r\n<li>Lyle apologizes for being unintentionally offensive.</li>\r\n<li>How do vampires work in this book anyways ?</li>\r\n</ul>\r\n<h1 id=\"beverage-reviews\">Beverage Reviews</h1>\r\n<hr />\r\n<p>As usual, the HPR AudioBook Club took some time to review the beverages that each of us were drinking during the episode</p>\r\n<ul>\r\n<li><strong>Thaj:</strong> Water, and a bit of something different. Thaj has had a rough week so he treated himself to <a href=\"https://www.worldmarket.com/product/daelmans-dutch-caramel-waffles.do\">Daelmans Wafers</a></li>\r\n<li><strong>x1101:</strong> <a href=\"https://redhook.com/beers/redhook-ipa\">Redhook Longhammer IPA</a></li>\r\n<li><strong>pokey:</strong> Pokey’s beverage in this episode is Twisted Cabernet Savaugnon.</li>\r\n<li><strong>FiftyOneFifty:</strong> <a href=\"https://www.beeradvocate.com/beer/profile/37795/147598/\">Mike’s Hard Smashed Apple Ale</a></li>\r\n</ul>\r\n<h1 id=\"things-we-talked-about\">Things We talked about</h1>\r\n<hr />\r\n<ul>\r\n<li>Pokey thinks the ending is not strong.</li>\r\n<li>He also finds some plot holes.</li>\r\n<li>There is a big door for a sequel.</li>\r\n<li>The logistics of becoming a vampire.</li>\r\n<li>Why \"Twilight\" sucks.</li>\r\n<li>How the characters react to becoming a vampire.</li>\r\n<li>The book wasn’t as graphic as we anticipated.</li>\r\n<li>We introduce… OneFiftyOneFifty!</li>\r\n<li>Fire!!!</li>\r\n<li>Sparks vs. allsparks</li>\r\n<li>Link in the shownotes…or not.</li>\r\n<li>Do you need a \"good person\" to cheer on in a story to enjoy it?</li>\r\n<li><a href=\"https://edictzero.wordpress.com/\">Edict Zero:FIS</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=-PSP2Adz5j8\">The Lab Rats - Devil’s Train</a></li>\r\n<li><a href=\"https://monsterjavaguns.com/\">https://monsterjavaguns.com/</a></li>\r\n<li>OK, so we gave up on the book and just talked about games.</li>\r\n</ul>\r\n<h1 id=\"our-next-audiobook\">Our Next Audiobook</h1>\r\n<hr />\r\n<p><a href=\"https://startrekcontinuingmission.com/\">Star Trek: The Continuing Mission</a></p>\r\n<h1 id=\"the-next-audiobook-club-recording\">The Next Audiobook Club Recording</h1>\r\n<hr />\r\n<p>Right now we are working through a backlog of older episode that have already been recorded. Once that ends we fully anticipate recording new episodes with listener participation.</p>\r\n<h1 id=\"further-recommendations\">Further Recommendations</h1>\r\n<hr />\r\n<ul>\r\n<li><a href=\"https://play.google.com/store/apps/details?id=com.watabou.pixeldungeon&amp;hl=en\">Pixel Dungeon</a></li>\r\n<li><a href=\"https://www.canakit.com/raspberry-pi-starter-kit.html\">Raspberry Pi 2 Kit</a></li>\r\n<li><a href=\"https://news.bbcimg.co.uk/media/images/81372000/jpg/_81372893_b_ivlqbu0aesbph.jpglarge.jpg\">Dollar Nemoy</a></li>\r\n</ul>\r\n<h1 id=\"feedback\">Feedback</h1>\r\n<hr />\r\n<p>Thank you very much for listening to this episode of the HPR AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you’ll consider joining us next time we record a new episode. Please leave a few words in the episode’s comment section.</p>\r\n<p>As always; remember to visit the HPR contribution page HPR could really use your <a href=\"https://hackerpublicradio.org/help_out.php\">help</a> right now.</p>\r\n<p>Sincerely, The HPR Audiobook Club</p>\r\n<p><em>P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.</em></p>\r\n<h1 id=\"our-audio\">Our Audio</h1>\r\n<hr />\r\n<p>This episode was processed using <a href=\"https://audacity.sourceforge.net/\">Audacity</a>. We’ve been making small adjustments to our audio mix each month in order to get the best possible sound. Its been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it’s not good at making everyone’s voice the same volume. We’re pretty happy with the way this month’s show turned out, so we’d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).</p>\r\n<p>We use the \"Truncate Silence\" effect with it’s default settings to minimize the silence between people speaking. When used with it’s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.</p>\r\n<p>Next we use the \"Compressor\" effect with the following settings:</p>\r\n<pre><code>Threshold: -30db\r\nNoise Floor: -50db\r\nRatio: 3:1\r\nAttack Time: 0.2sec\r\nDecay Time: 1.0 sec</code></pre>\r\n<p>\"Make-up Gain for 0db after compressing\" and \"compress based on peaks\" were both left un-checked.</p>\r\n<p>After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.</p>\r\n<p>We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.</p>\r\n<p>At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file’s metadata.</p>\r\n<p>At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.</p>\r\n<p>Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.</p>\r\n',157,53,1,'CC-BY-SA','HPR Audiobook Club,Audiobooks,Horror',0,0,1),
(3060,'2020-04-24','Running a local imap server',360,'Ken installs courier-imap locally to have a local backup of his mail.','<h1 id=\"setting-up-a-local-imap-server\">Setting up a local imap server</h1>\r\n<p>To install a local imap daemon that will only listen to localhost connections, made via ssh tunneling. This is for use as a local backup of your imap files, or for keeping a remote backup somewhere.</p>\r\n<p>This is not a mail delivery solution but rather a way to keep a backup of your email using to a <code>MailDir</code> directory that you can access using your email client. As each message is stored in its own file, you can also use normal tools like <code>find|sed|awk|grep</code> to find messages.</p>\r\n<p>This setup can be installed locally or remotely on, for example, a raspberry pi. In that case you can enable a portforwarding rule in <code>~/.ssh/config</code> to include something like <code>LocalForward 127.0.0.1:2143 127.0.0.1:143</code></p>\r\n<p>Install using <code>aptitude install courier-imap courier-authdaemon</code></p>\r\n<p>You can check the status using <code>systemctl status courier-imap.service courier-authdaemon.service</code></p>\r\n<p>Edit the file <code>/etc/courier/imapd</code> and modify the following settings:</p>\r\n<p>Address to listen on, can be set to a single IP address.</p>\r\n<pre><code>    &lt; ADDRESS=0\r\n    &gt; ADDRESS=127.0.0.1\r\n</code></pre>\r\n<p>Maximum number of IMAP servers started</p>\r\n<pre><code>    &lt; MAXDAEMONS=40\r\n    &gt; MAXDAEMONS=80\r\n</code></pre>\r\n<p>Maximum number of connections to accept from the same IP address</p>\r\n<pre><code>    &lt; MAXPERIP=20\r\n    &gt; MAXPERIP=40\r\n</code></pre>\r\n<p>The following setting is optional, and causes messages from the given folder to be automatically deleted after the given number of days.</p>\r\n<pre><code>    &lt; IMAP_EMPTYTRASH=Trash:7\r\n    &gt; #IMAP_EMPTYTRASH=Trash:7\r\n</code></pre>\r\n<p>Change the directory name of the maildir directory.</p>\r\n<pre><code>    &lt; MAILDIRPATH=Maildir\r\n    &gt; MAILDIRPATH=/home/pi/MailDir\r\n</code></pre>\r\n<p>Then restart the service using <code>systemctl restart courier-imap.service courier-authdaemon.service</code>.</p>\r\n<p>When I did this I got a strange error about but installing the package <code>gamin</code> fixed it. Which is a <em>Library providing the FAM File Alteration Monitor API</em>.</p>\r\n<pre><code>  Filesystem notification initialization error -- contact your mail\r\n  administrator (check for configuration errors with the FAM/Gamin library)\r\n</code></pre>\r\n<h3 id=\"links\">Links</h3>\r\n<ul>\r\n<li><a href=\"https://www.courier-mta.org/imap/documentation.html\">https://www.courier-mta.org/imap/documentation.html</a></li>\r\n<li><a href=\"https://www.faqforge.com/linux/fix-for-courier-imap-error-check-for-configuration-errors-with-the-famgamin-library/\">https://www.faqforge.com/linux/fix-for-courier-imap-error-check-for-configuration-errors-with-the-famgamin-library/</a></li>\r\n</ul>\r\n',30,0,0,'CC-BY-SA','courier, imap, MailDir, raspberrypi',0,0,1),
(3058,'2020-04-22','The COVID-19 Work From Home Stream - Day 3',6065,'A few HPR characters decide to spend some of their social distancing time being social','<p>Friday 2020-03-02</p>\r\n<ul>\r\n<li>A secret message left for Thaj (for the record it pronounced like the Taj in Taj Mahal)</li>\r\n<li>How do you use a bidet?</li>\r\n<li>The different ways to organize work from home</li>\r\n<li>Kids and working from home</li>\r\n<li><a href=\"https://www.youtube.com/watch?v=CdJ6VzIthRY&amp;feature=youtu.be\">Jon\'s video</a></li>\r\n<li><a href=\"https://lbry.com/\">LBRY</a></li>\r\n<li>Driving is not fun</li>\r\n<li>More ffmpeg talk</li>\r\n<li>Bidets come up again</li>\r\n<li>#oggcastplanet on Freenode</li>\r\n<li>Programming languages</li>\r\n<li>By the way...I run Arch</li>\r\n<li>Kevin Wisher and Thaj talk shop</li>\r\n<li>What is that accent?</li>\r\n</ul>\r\n',270,0,1,'CC-BY-SA','Bidets, ffmpeg, driving, Programming, Arch Linux, OggcastPlanet, education',0,0,1),
(3061,'2020-04-27','Parental Controls With Mike Ivy',2051,'We talk about Parental Controls and IOT device ','<ul>\r\n<li>Amazon free time</li>\r\n<li>Microsoft family safety live account</li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','IOT,hacking,amazon,android,firestick',0,0,1),
(3057,'2020-04-21','Formal verification with Coq',1271,'Tuula talks about formally verifying code','<p><a href=\"https://coq.inria.fr/\">Coq</a> is interactive theorem prover, which comes with its own programming language Gallina.</p>\r\n<p>If we wanted to write function that calculates resulting blood type based on two gene alleles, we could do it as following.</p>\r\n<p>Start by defining types that represents alleles and resulting blood type:</p>\r\n<pre><code>Inductive BloodTypeAllele : Type :=\r\n  | BloodTypeA\r\n  | BloodTypeB\r\n  | BloodTypeO.\r\n\r\nInductive BloodType : Type :=\r\n  | TypeA\r\n  | TypeB\r\n  | TypeAB\r\n  | TypeO.</code></pre>\r\n<p>Mapping between them is defined as follows:</p>\r\n<pre><code>Definition bloodType (a b : BloodTypeAllele) : BloodType :=\r\n  match a, b with\r\n  | BloodTypeA, BloodTypeA =&gt; TypeA\r\n  | BloodTypeA, BloodTypeO =&gt; TypeA\r\n  | BloodTypeA, BloodTypeB =&gt; TypeAB\r\n  | BloodTypeB, BloodTypeB =&gt; TypeB\r\n  | BloodTypeB, BloodTypeA =&gt; TypeAB\r\n  | BloodTypeB, BloodTypeO =&gt; TypeB\r\n  | BloodTypeO, BloodTypeA =&gt; TypeA\r\n  | BloodTypeO, BloodTypeB =&gt; TypeB\r\n  | BloodTypeO, BloodTypeO =&gt; TypeO\r\n  end.</code></pre>\r\n<p>Notice that the only way of getting <code>TypeO</code> blood is for both alleles to be <code>BloodTypeO</code>.</p>\r\n<p>We can state theorems about the code:</p>\r\n<pre><code>Theorem double_O_results_O_type :\r\n  bloodType BloodTypeO BloodTypeO = TypeO.\r\nProof.\r\n  reflexivity.\r\n  Qed.</code></pre>\r\n<p><code>double_O_results_O_type</code> states that <code>bloodType BloodTypeO BloodTypeO</code> will have value of <code>TypeO</code>. There’s also attached proof for this theorem.</p>\r\n<p>Second theorem is longer:</p>\r\n<pre><code>Theorem not_double_O_does_not_result_O_type :\r\n  forall (b1 b2 : BloodTypeAllele),\r\n  b1 &lt;&gt; BloodTypeO \\/ b2 &lt;&gt; BloodTypeO -&gt;\r\n  bloodType b1 b2 &lt;&gt; TypeO.\r\nProof.\r\n  intros.\r\n  destruct b1.\r\n  - destruct b2.\r\n    + discriminate.\r\n    + discriminate.\r\n    + discriminate.\r\n  - destruct b2.\r\n    + discriminate.\r\n    + discriminate.\r\n    + discriminate.\r\n  - destruct b2.\r\n    + discriminate.\r\n    + discriminate.\r\n    + destruct H.\r\n      * simpl. contradiction.\r\n      * simpl. contradiction.\r\nQed.</code></pre>\r\n<p>It states that if <code>bloodType</code> is applied with anything else than two <code>BloodTypeO</code>, the result will not be <code>TypeO</code>. Proof for this is longer. It goes through each and every combination of parameters and proves that the result isn’t <code>TypeO</code>. Mathematician could write this as: ∀ b1 b2, b1 ≠ BloodTypeO ∨ b2 ≠ BloodTypeO → bloodType b1 b2 ≠ TypeO.</p>\r\n<p>If code above is in module called <code>Genes</code>, we can add following at the end to instruct compiler to emit Haskell code:</p>\r\n<pre><code>Extraction Language Haskell.\r\nExtraction Genes.</code></pre>\r\n<p>Resulting code is as follows:</p>\r\n<pre><code>data BloodTypeAllele =\r\n   BloodTypeA\r\n | BloodTypeB\r\n | BloodTypeO\r\n\r\ndata BloodType =\r\n   TypeA\r\n | TypeB\r\n | TypeAB\r\n | TypeO\r\n\r\nbloodType :: BloodTypeAllele -&gt; BloodTypeAllele -&gt; BloodType\r\nbloodType a b =\r\n  case a of {\r\n   BloodTypeA -&gt; case b of {\r\n                  BloodTypeB -&gt; TypeAB;\r\n                  _ -&gt; TypeA};\r\n   BloodTypeB -&gt; case b of {\r\n                  BloodTypeA -&gt; TypeAB;\r\n                  _ -&gt; TypeB};\r\n   BloodTypeO -&gt;\r\n    case b of {\r\n     BloodTypeA -&gt; TypeA;\r\n     BloodTypeB -&gt; TypeB;\r\n     BloodTypeO -&gt; TypeO}}</code></pre>\r\n<p>Now we have Haskell code that started in Coq, has two properties formally verified and is ready to be integrated with rest of the system.</p>\r\n<p>Further reading:</p>\r\n<ul>\r\n<li><a href=\"https://softwarefoundations.cis.upenn.edu/\">Software Foundations</a></li>\r\n<li><a href=\"https://cel.archives-ouvertes.fr/file/index/docid/459139/filename/coq-hurry.pdf\">Coq in a Hurry</a></li>\r\n</ul>\r\n',364,0,0,'CC-BY-SA','Coq, Haskell, mathematics',0,0,1),
(3059,'2020-04-23','A quick intro to Snapcast',293,'A brief overview of Snapcast, an open source multi-room audio streaming system.','<p>Relevant links:</p>\r\n<ul>\r\n<li><a href=\"https://github.com/badaix/snapcast\">Snapcast</a></li>\r\n<li><a href=\"https://www.musicpd.org/\">MPD</a></li>\r\n<li><a href=\"https://mpv.io/\">mpv</a></li>\r\n<li><a href=\"https://github.com/badaix/snapdroid\">Snapdroid</a></li>\r\n<li><a href=\"https://github.com/atoomic/snapcast-volume-ui\">snapcast-volume-ui</a></li>\r\n<li><a href=\"https://github.com/badaix/snapcast/blob/master/doc/json_rpc_api/v2_0_0.md\">Snapcast JSON-RPC documentation</a></li>\r\n</ul>',386,0,1,'CC-BY-SA','opensource, selfhosted',0,0,1),
(3062,'2020-04-28','Vassal: How to play board games while remote',931,'How to do physical distancing while avoiding social distance using digitized boardgames','<p>A friend, a stranger and I played <a href=\"https://www.vassalengine.org/\">https://www.vassalengine.org/</a> together.</p>\r\n<p>We played the Carcasonne-simple 1.2 module downloaded from <a href=\"https://www.vassalengine.org/wiki/Module:Carcassonne\">https://www.vassalengine.org/wiki/Module:Carcassonne</a>.</p>\r\n<p>There are some things that may be confusing the first time, but the game engine works well, the rule- and tile-set we played worked well, text chat is surprisingly adequate for talking to people while playing, and I would like to play again some time.</p>\r\n<p>Original Fediverse post at <a href=\"https://libranet.de/display/0b6b25a8-675e-91bf-8b9d-5c6226360513\">https://libranet.de/display/0b6b25a8-675e-91bf-8b9d-5c6226360513</a>.</p>',311,95,0,'CC-BY-SA','game, board game, xmpp, remote, network game',0,0,1),
(3063,'2020-04-29','Pens, pencils, paper and ink - 1',879,'Looking at a few more of my writing implements','<h2 id=\"introduction\">Introduction</h2>\r\n<p>It’s been over four years since I did a show about fountain pens. It was in the <a href=\"https://hackerpublicradio.org/series/0023.html\" title=\"What&#39;s in My Toolkit\"><em>What’s in My Toolkit</em></a> series entitled <a href=\"https://hackerpublicradio.org/eps.php?id=1941\" title=\"What&#39;s in my case\"><em>What’s in my case</em></a>, show 1941 released on 2016-01-11.</p>\r\n<p>I thought it might be appropriate to visit the subject once again. I want to tell you about some new pens and pencils I have acquired, some inks I am enjoying and some of the notebooks I have bought.</p>\r\n<p>There’s too much for a single show here, so I’m making a mini-series of three shows. This also leaves the door open for more when the collection grows in the future!</p>\r\n<h2 id=\"long-notes\">Long notes</h2>\r\n<p>I have provided detailed notes with pictures for this episode, and these can be <a href=\"https://hackerpublicradio.org/eps/hpr3063/full_shownotes.html\">viewed here</a>.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Fountain pens:\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fountain_pen\">Wikipedia article</a></li>\r\n<li><a href=\"https://www.wikihow.com/Use-a-Fountain-Pen\">How to use a fountain pen</a></li>\r\n</ul></li>\r\n<li>Fountain pen revival:\r\n<ul>\r\n<li>Article in <em>“The Independent”</em>: <a href=\"https://www.independent.co.uk/news/long_reads/fountain-pens-stationery-writing-style-revival-a8707501.html\"><em>When a simple ballpoint just won’t do</em></a></li>\r\n</ul></li>\r\n<li>Reasons to use a fountain pen:\r\n<ul>\r\n<li><a href=\"https://www.youtube.com/watch?v=xVksqX7_650\">13 Reasons Why You Should Use a Fountain Pen</a></li>\r\n</ul></li>\r\n<li>Vacuum filling pens:\r\n<ul>\r\n<li>How to use a vacuum filler: <a href=\"https://www.youtube.com/watch?v=qTOSY8U2UIM\">Video from Goulet Pens</a></li>\r\n<li>TWSBI VAC-20 ink bottle: <a href=\"https://www.youtube.com/watch?v=JYMt1wEdWd4\">Video from Goulet Pens</a></li>\r\n</ul></li>\r\n<li>Pen brands:\r\n<ul>\r\n<li><a href=\"https://www.lamy.com\">LAMY</a></li>\r\n<li><a href=\"https://www.twsbi.com/\">TWSBI</a></li>\r\n<li><a href=\"https://www.pilotpen.com/\">Pilot</a></li>\r\n<li><a href=\"https://troikaus.com\">Troika</a> <em>(US site)</em></li>\r\n</ul></li>\r\n<li>HPR links:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1941\">hpr1941 :: What’s in my case</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2061\">hpr2061 :: Handwriting</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2273\">hpr2273 :: Fountain Pens</a></li>\r\n</ul></li>\r\n</ul>',225,112,1,'CC-BY-SA','fountain pen,ballpoint pen',0,0,1),
(3064,'2020-04-30','How I got started in Electronics',427,'How I got started in Electronics and some job stuff','<p>Links:</p>\r\n<ul>\r\n<li><a href=\"https://archive.org/search.php?query=forrest%20mims\" class=\"uri\">https://archive.org/search.php?query=forrest%20mims</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Forrest_Mims\" class=\"uri\">https://en.wikipedia.org/wiki/Forrest_Mims</a></li>\r\n<li><a href=\"https://www.newark.com/mcm-partnership\" class=\"uri\">https://www.newark.com/mcm-partnership</a></li>\r\n<li><p><a href=\"https://www.allelectronics.com/\" class=\"uri\">https://www.allelectronics.com/</a></p></li>\r\n<li><p>This is where I found the doubler circuit.<br />\r\n<a href=\"https://www.zpag.net/Electroniques/Kit/Radio_Shack_-_Engineer&#39;s_Mini-Notebook_-_Basic_Semiconductor_Circuits.pdf\" class=\"uri\">https://www.zpag.net/Electroniques/Kit/Radio_Shack_-_Engineer\'s_Mini-Notebook_-_Basic_Semiconductor_Circuits.pdf</a></p></li>\r\n<li><p>Close approximation of my first transformer.<br />\r\n<img src=\"https://archive.org/download/screenshotfrimar27171804cdt2020/screenshot_Fri%20Mar%2027%2017%3A18%3A04%20CDT%202020.png\" alt=\"https://archive.org/download/screenshotfrimar27171804cdt2020/screenshot_Fri%20Mar%2027%2017%3A18%3A04%20CDT%202020.png\" /></p></li>\r\n<li><p>Power supplies I had in my teens.<br />\r\n<img src=\"https://archive.org/download/screenshotfrimar27171804cdt2020/screenshot_Fri%20Mar%2027%2017%3A16%3A04%20CDT%202020.png\" alt=\"https://archive.org/download/screenshotfrimar27171804cdt2020/screenshot_Fri%20Mar%2027%2017%3A16%3A04%20CDT%202020.png\" /><br />\r\n<img src=\"https://archive.org/download/screenshotfrimar27171804cdt2020/screenshot_Fri%20Mar%2027%2017%3A40%3A31%20CDT%202020.png\" alt=\"https://archive.org/download/screenshotfrimar27171804cdt2020/screenshot_Fri%20Mar%2027%2017%3A40%3A31%20CDT%202020.png\" /></p></li>\r\n<li>Places I worked.\r\n<ul>\r\n<li>Manu-tronics<br />\r\n<a href=\"https://www.bizjournals.com/milwaukee/stories/1999/01/25/daily21.html\" class=\"uri\">https://www.bizjournals.com/milwaukee/stories/1999/01/25/daily21.html</a></li>\r\n<li>Bought out by Sanmina Corporation<br />\r\n<a href=\"https://www.sanmina.com/media-center/videos/kenosha-facility/\" class=\"uri\">https://www.sanmina.com/media-center/videos/kenosha-facility/</a></li>\r\n<li>Baxter Healthcare<br />\r\n<a href=\"https://www.baxter.com/\" class=\"uri\">https://www.baxter.com/</a></li>\r\n<li>Colleague 3 pump picture<br />\r\n<a href=\"https://drive.google.com/drive/folders/1tZlkSQi6gdpPc9UqGiDy2bzXuXcxZ-fl?usp=sharing\" class=\"uri\">https://drive.google.com/drive/folders/1tZlkSQi6gdpPc9UqGiDy2bzXuXcxZ-fl?usp=sharing</a></li>\r\n<li>Illinois Instrument (Systech Illinois)<br />\r\n<a href=\"https://www.systechillinois.com/en/products/ec900-process-oxygen-analyser\" class=\"uri\">https://www.systechillinois.com/en/products/ec900-process-oxygen-analyser</a></li>\r\n</ul></li>\r\n</ul>\r\n',318,0,0,'CC-BY-SA','electronics, soldering, trains, jobs',0,0,1),
(3105,'2020-06-26','Akaso EK7000 Pro',1009,'My experience with an inexpensive Waterproof action camera called the Akaso EK7000 Pro','<p>Action cameras are becoming very popular, and many incorporate a waterproof feature. If you want to try this with something less expensive than a GoPro, take a look at this review.</p>\r\n<ul>\r\n<li><a href=\"https://youtu.be/tucT47cn5II\" class=\"uri\">https://youtu.be/tucT47cn5II</a></li>\r\n<li><a href=\"https://www.palain.com/wp-content/uploads/2020/01/Camera.png\" class=\"uri\">https://www.palain.com/wp-content/uploads/2020/01/Camera.png</a></li>\r\n<li><a href=\"https://www.palain.com/wp-content/uploads/2020/01/Waterproof_Case-751x1024.png\" class=\"uri\">https://www.palain.com/wp-content/uploads/2020/01/Waterproof_Case-751x1024.png</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=xA7A5eYitLI\" class=\"uri\">https://www.youtube.com/watch?v=xA7A5eYitLI</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=L0guCNiJp5M\" class=\"uri\">https://www.youtube.com/watch?v=L0guCNiJp5M</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=1p4yOmvkyP4\" class=\"uri\">https://www.youtube.com/watch?v=1p4yOmvkyP4</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=NK1v_ECiJgo\" class=\"uri\">https://www.youtube.com/watch?v=NK1v_ECiJgo</a></li>\r\n<li><a href=\"https://www.palain.com/wp-content/uploads/2020/01/Removing-1024x764.png\" class=\"uri\">https://www.palain.com/wp-content/uploads/2020/01/Removing-1024x764.png</a></li>\r\n<li><a href=\"https://www.palain.com/wp-content/uploads/2020/04/20190601_004658.mov\" class=\"uri\">https://www.palain.com/wp-content/uploads/2020/04/20190601_004658.mov</a></li>\r\n<li><a href=\"https://www.palain.com/wp-content/uploads/2020/04/20190601_031004-1024x582.jpg\" class=\"uri\">https://www.palain.com/wp-content/uploads/2020/04/20190601_031004-1024x582.jpg</a></li>\r\n<li><a href=\"https://www.palain.com/photography/akaso-ek7000-pro/\" class=\"uri\">https://www.palain.com/photography/akaso-ek7000-pro/</a></li>\r\n</ul>\r\n',198,0,0,'CC-BY-SA','Camera, Waterproof Camera, Action camera',0,0,1),
(3068,'2020-05-06','Keeping track of downloads in Elm',791,'Tuula shows how to keep track of what data is being downloaded in Elm','<h2 id=\"background\">Background</h2>\r\n<p>I have page that requests several resources from server. To keep track what is going on, I initially had model like:</p>\r\n<pre><code>type alias Model =\r\n    { availableChassis : List Chassis\r\n    , chassisLoaded : Bool\r\n    , chassisLoading : Bool\r\n    ...\r\n    }</code></pre>\r\n<p>Problem with this is that I have to remember to check those boolean flags while rendering on screen. And it’s possible to have inconsistent state (both loading and loaded).</p>\r\n<h2 id=\"solution\">Solution</h2>\r\n<p>We can model state with algebraic datatypes and we don’t even have to write it by ourselves as there’s <a href=\"https://package.elm-lang.org/packages/krisajenkins/remotedata/latest\">RemoteData</a> library.</p>\r\n<p>Now we can change our model to following:</p>\r\n<pre><code>import RemoteData exposing (RemoteData(..), WebData)\r\n\r\ntype alias Model =\r\n    { availableChassis : WebData (List Chassis)\r\n    }</code></pre>\r\n<ul>\r\n<li><code>availableChassis</code> has four states it can be in:\r\n<ul>\r\n<li><code>NotAsked</code>, data isn’t available and it hasn’t been requested from server</li>\r\n<li><code>Loading</code>, data isn’t available, but it has been requested from server</li>\r\n<li><code>Success (List Chassis)</code>, data has been loaded from server</li>\r\n<li><code>Failure Http.Error</code>, there was error while loading data</li>\r\n</ul></li>\r\n</ul>\r\n<p>For example, while rendering the view, you could do</p>\r\n<pre><code>    case model.availableChassis of\r\n        NotAsked -&gt;\r\n            renderEmptyTable\r\n\r\n        Loading -&gt;\r\n            renderLoadingTable\r\n\r\n        Success chassis -&gt;\r\n            renderChassisList chassis\r\n\r\n        Failure error -&gt;\r\n            renderErrorMessage error</code></pre>\r\n',364,0,0,'CC-BY-SA','Elm, programming',0,0,1),
(3080,'2020-05-22','Ansible ping',440,'Troubleshooting a basic install of Ansible','Here are some steps you need to should take when setting up <a href=\"https://www.ansible.com/)\">Ansible</a> for the first time.\r\n\r\n<ul>\r\n<li><a href=\"#Install_the_software\">Install the software</a></li>\r\n<li><a href=\"#Confirm_ssh_working\">Confirm ssh working</a></li>\r\n<li><a href=\"#Create_a_Inventory/Host_file\">Create a Inventory/Host_file</a></li>\r\n<li><a href=\"#Ansible_Ping\">Ansible Ping</a></li>\r\n<li><a href=\"#Create_a_playbook\">Create a playbook</a></li>\r\n<li><a href=\"#Confirm_the_YAML_is_valid\">Confirm the YAML is valid</a></li>\r\n<li><a href=\"#Confirm_the_syntax_is_valid\">Confirm the syntax is valid</a></li>\r\n<li><a href=\"#Confirm_everything_works_together\">Confirm everything works together</a></li>\r\n</ul>\r\n\r\n<h3 id=\"Install_the_software\">Install the software</h3>\r\nFirst you need to <a href=\"https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html\">install</a> the <a href=\"https://www.ansible.com/)\">Ansible</a> software. On Fedora that is as simple as a <em>dnf install ansible</em>, or on debian <em>apt install ansible</em>.\r\n\r\n<h3 id=\"Confirm_ssh_working\">Confirm ssh working</h3>\r\n\r\nConfirm that you can connect to the servers via ssh as you would normally.\r\n\r\n<pre><code>ssh -i /home/my_user/.ssh/id_ed25519_pi my_user@192.168.0.1\r\nssh -i /home/my_user/.ssh/id_ed25519_pi your_username@192.168.1.2\r\n</code></pre>\r\n\r\n<h3 id=\"Create_a_Inventory/Host_file\">Create a Inventory/Host file</h3>\r\n\r\nTranslate the ssh commands into a <a href=\"https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html\">Inventory/Host</a> file. I am using a YAML in this example but other variants are available.\r\n\r\n<pre><code>all:\r\n  hosts:\r\n    my_server:\r\n      ansible_host: 192.168.0.1\r\n    your_server:\r\n      ansible_host: 192.168.1.2\r\n      ansible_ssh_user: your_username\r\n  vars:\r\n    ansible_connection: ssh\r\n    ansible_ssh_user: my_user\r\n    ansible_ssh_private_key_file: /home/my_user/.ssh/id_ed25519_pi\r\n</code></pre>\r\n\r\n<h3 id=\"Ansible_Ping\">Ansible Ping</h3>\r\nCheck that your server is up and reported correctly in your file by having <a href=\"https://www.ansible.com/)\">Ansible</a> ping it. This should allow you to determine if at least there is a command and control connection available.\r\n\r\n<pre><code>ansible --inventory-file my_inventory.yaml -m ping all\r\n</code></pre>\r\n\r\nThis uses the group <em>all</em> and will ping all servers under it. The reply below shows a positive and negative response. \r\n\r\n<pre><code>my_server | SUCCESS => {\r\n    \"ansible_facts\": {\r\n        \"discovered_interpreter_python\": \"/usr/bin/python\"\r\n    },\r\n    \"changed\": false,\r\n    \"ping\": \"pong\"\r\n}\r\nyour_server | UNREACHABLE! => {\r\n    \"changed\": false,\r\n    \"msg\": \"Failed to connect to the host via ssh: ssh: connect to host 192.168.1.2 port 22: No route to host\",\r\n    \"unreachable\": true\r\n}\r\n</code></pre>\r\n\r\nThe <em>msg</em> will give you a clue as to what is going wrong and you should try to ssh directly with the Ansible credentials again, and then try and ping using Ansible.\r\n<pre><code>ansible --inventory-file my_inventory.yaml -m ping your_server\r\n</code></pre>\r\n\r\nModify the Inventory file until you have managed to get a successful reply. \r\n\r\n<h3 id=\"Create_a_playbook\">Create a playbook</h3>\r\n\r\nWork on your playbook and verify that it is valid yaml.\r\n\r\n<pre><code>---\r\n- name: Test Ping\r\n  hosts: all\r\n  tasks:\r\n  - action: ping\r\n</code></pre>\r\n\r\n<h3 id=\"Confirm_the_YAML_is_valid\">Confirm the YAML is valid</h3>\r\nIf there is no reply all is good.\r\n<pre><code>yamllint ~/my_example.yaml\r\n</code></pre>\r\n\r\nIf there is no reply all is good. For your reference I will remove the <em>---</em> line and this is the response.\r\n<pre><code>yamllint ~/my_example.yaml\r\n/home/user/my_example.yaml\r\n  1:1       warning  missing document start \"---\"  (document-start)\r\n</code></pre>\r\n\r\n<h3 id=\"Confirm_the_syntax_is_valid\">Confirm the syntax is valid</h3>\r\nThen verify that the playbook is sane\r\n<pre><code>ansible-playbook --syntax-check ~/my_example.yaml\r\n</code></pre>\r\n\r\nIf there is no reply all is good. For your reference I will remove the <em>hosts</em> line and this is the response.\r\n<pre><code>ansible-playbook --syntax-check ~/my_example.yaml\r\nERROR! the field \'hosts\' is required but was not set\r\n</code></pre>\r\n\r\n<h3 id=\"Confirm_everything_works_together\">Confirm everything works together</h3>\r\n\r\nAfter that you should be able to run the playbook using.\r\n\r\n<pre><code>ansible-playbook --inventory-file my_inventory.yaml ~/my_example.yaml\r\n\r\nPLAY [Test Ping] ***************************************************************************************************\r\n\r\nTASK [Gathering Facts] *********************************************************************************************\r\n[WARNING]: Platform linux on host my_server is using the discovered Python interpreter at /usr/bin/python, but\r\nfuture installation of another Python interpreter could change this. See\r\nhttps://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.\r\nok: [my_server]\r\nfatal: [your_server]: UNREACHABLE! => {\"changed\": false, \"msg\": \"Failed to connect to the host via ssh: ssh: connect to host 192.168.1.2 port 22: No route to host\", \"unreachable\": true}\r\n\r\nTASK [ping] ********************************************************************************************************\r\nok: [my_server]\r\n\r\nPLAY RECAP *********************************************************************************************************\r\nmy_server                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \r\nyour_server                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0\r\n</code></pre>\r\n',30,0,0,'CC-BY-SA','ansible, ping, ssh',0,0,1),
(3084,'2020-05-28','AudioBookClub 18 - Star Trek: The Continuing Mission',6017,'The HPR Audiobook Club reviews the fan audio drama Star Trek: The Continuing Mission','<h1 id=\"in-this-episode-the-hpr_audiobookclub-discusses-star-trek-the-continuing-mission-created-by-sebastian-prooth-and-andy-tyrer\">In this episode, the HPR_AudioBookClub discusses <a href=\"https://startrekcontinuingmission.com/\">Star Trek The Continuing Mission</a> created by Sebastian Prooth and Andy Tyrer.</h1>\r\n<hr />\r\n<h1 id=\"non-spoiler-thoughts\">Non-Spoiler Thoughts</h1>\r\n<hr />\r\n<ul>\r\n<li>Thaj misses Star Trek, and this made me realize that (this has since changed)</li>\r\n<li>Voice acting is very good.</li>\r\n<li>It\'s hard to translate things like starship combat into an audio drama.</li>\r\n<li>Background sounds really sell the structure of these episodes as Star Trek.</li>\r\n<li>This proves that an abundance of canon is not a reason to reboot things. This finds a niche in an unexplored part of the timeline and works.</li>\r\n<li>The warp sound effect for jumping to warp is weird.</li>\r\n<li>We think LostnBronx should write a StarDrfiter Audiodrama for us to produce.</li>\r\n</ul>\r\n<h1 id=\"beverage-reviews\">Beverage Reviews</h1>\r\n<hr />\r\n<p>As usual, the HPR AudioBook Club took some time to review the beverages that each of us were drinking during the episode</p>\r\n<ul>\r\n<li><strong>Thaj:</strong> Water and something from Kroger that I think resembles chocolate ice cream.</li>\r\n<li><strong>x1101:</strong> Throwback style Mt. Dew made with real, diabetes inducing, sugar</li>\r\n<li><strong>pokey:</strong> Led Light Bulbs....wait what?!?!</li>\r\n<li><strong>FiftyOneFifty:</strong> Johnny Walker Black</li>\r\n</ul>\r\n<h1 id=\"things-we-talked-about\">Things We talked about</h1>\r\n<hr />\r\n<ul>\r\n<li>Recasting the captain was a bad idea.</li>\r\n<li>Thaj hates Cthulhu episodes of scifi shows.</li>\r\n<li>Which Star Trek is the best (the correct answer is DS9)</li>\r\n<li>Star Trek as an allegory for the real world.</li>\r\n<li>Pokey doesn\'t like time travel in Star Trek.</li>\r\n<li>And...we\'re back on DS9</li>\r\n<li>We geek about the different types of ships in Trek.</li>\r\n<li>Since we didn\'t talk about the audio drama that much, we did actually like it.</li>\r\n</ul>\r\n<h1 id=\"our-next-audiobook\">Our Next Audiobook</h1>\r\n<hr />\r\n<p><a href=\"https://scribl.com/books/PFC12/tincture-an-apocalyptic-proposition\">Tincture, An Apocalyptic Proposition</a></p>\r\n<h1 id=\"the-next-audiobook-club-recording\">The Next Audiobook Club Recording</h1>\r\n<hr />\r\n<p>Right now we are working through a backlog of older episode that have already been recorded. Once that ends we fully anticipate recording new episodes with listener participation.</p>\r\n<h1 id=\"further-recommendations\">Further Recommendations</h1>\r\n<hr />\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Stirling_engine\">Stirling Engines</a></li>\r\n<li><a href=\"https://nathanlowell.com/\">Nathan Lowell</a></li>\r\n<li>Pokey wouldn\'t mind a few cyborg modifications</li>\r\n<li><a href=\"https://www.panmacmillan.com/author/peterfhamilton\">Peter F. Hamilton</a></li>\r\n<li>Lock Picking</li>\r\n<li><a href=\"https://cs608829.vk.me/v608829353/ac55/QTzYhbf8oUc.jpg\">I Don\'t want to live on this planet anymore</a></li>\r\n<li>Cory Doctrow\'s <a href=\"https://craphound.com/makers/download/\">\"Makers\"</a></li>\r\n<li><a href=\"https://www.shapeways.com/product/T3ZY4LFDB/thorn-dice-set-with-decader\">3D printed metal dice</a></li>\r\n<li><a href=\"https://www.aliexpress.com/item/Practical-Portable-Casino-Spade-A-Poker-Card-Beer-Bottle-Opener-Stainless-Steel-Wine-Bottle-Opener-for/32243512631.html\">Ace of spaces credit card bottle opener</a></li>\r\n<li><a href=\"https://awesomestufftobuy.com/critical-hit-d20-ice-mold/\">Dice Ice</a></li>\r\n<li><a href=\"https://awesomestufftobuy.com/come-in-go-away-doormat/\">Doormat</a></li>\r\n</ul>\r\n<h1 id=\"feedback\">Feedback</h1>\r\n<hr />\r\n<p>Thank you very much for listening to this episode of the HPR AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time we record a new episode. Please leave a few words in the episode\'s comment section.</p>\r\n<p>As always; remember to visit the HPR contribution page HPR could really use your <a href=\"https://hackerpublicradio.org/help_out.php\">help</a> right now.</p>\r\n<p>Sincerely, The HPR Audiobook Club</p>\r\n<p><em>P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.</em></p>\r\n<h1 id=\"our-audio\">Our Audio</h1>\r\n<hr />\r\n<p>This episode was processed using <a href=\"https://audacity.sourceforge.net/\">Audacity</a>. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. Its been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).</p>\r\n<p>We use the \"Truncate Silence\" effect with it\'s default settings to minimize the silence between people speaking. When used with it\'s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.</p>\r\n<p>Next we use the \"Compressor\" effect with the following settings:</p>\r\n<pre><code>Threshold: -30db\r\nNoise Floor: -50db\r\nRatio: 3:1\r\nAttack Time: 0.2sec\r\nDecay Time: 1.0 sec\r\n</code></pre>\r\n<p>\"Make-up Gain for 0db after compressing\" and \"compress based on peaks\" were both left un-checked.</p>\r\n<p>After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.</p>\r\n<p>We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.</p>\r\n<p>At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata.</p>\r\n<p>At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.</p>\r\n<p>Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.</p>\r\n',270,0,1,'CC-BY-SA','Audiobooks, Audio Drama, Star Trek',0,0,1),
(3100,'2020-06-19','For your consideration - Makers Corner',4534,'Makers Corner is a tech oriented DIY podcast, from the Other Side Podcast Network','<p>\r\nI\'m amazed I didn\'t find this podcast earlier, epically as one half of the team is HPR Host <a href=\"https://hackerpublicradio.org/correspondents/0370.html\">Yannick</a>, and that we listed it on our Sister Project <a href=\"https://freeculturepodcasts.org/\">Free Culture Podcasts</a>.</p>\r\n<p>\r\nThis show is a sample episode I picked, but it is not a typical show. I wanted to give a bit more exposure to the interview.\r\n</p>\r\n<p>\r\nIn this episode, Nate talks about his oldest boy’s Electronic Engineering class. Then, <a href=\"https://twitter.com/pimoroni\">Jon</a> and <a href=\"https://twitter.com/gadgetoid\">Phil</a> join in to talk about the <a href=\"https://32blit.com/\">32Blit</a>. And finally, the guys have a look at the <a href=\"https://www.thingiverse.com/thing:1657541\">Monster Mouth Headphone Holder – Clampable</a>, from <a href=\"https://www.thingiverse.com/\">thingiverse</a>.</p>\r\n\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Website: <a href=\"https://makerscorner.tech\">https://makerscorner.tech</a></li>\r\n<li>RSS Feed: <a href=\"https://makerscorner.tech/feed/podcast/\">https://makerscorner.tech/feed/podcast/</a></li>\r\n<li><a href=\"https://twitter.com/pimoroni\">https://twitter.com/pimoroni</a></li>\r\n<li><a href=\"https://twitter.com/gadgetoid\">https://twitter.com/gadgetoid</a></li>\r\n<li><a href=\"https://www.thingiverse.com/\">https://www.thingiverse.com/</a></li>\r\n</ul>',30,75,0,'CC-BY-SA','pimoroni, gadgetoid, Monster Mouth Headphone Holder,Free Culture Podcasts',0,0,1),
(3074,'2020-05-14','For your consideration - Escape Pod',1773,'A sample episode from Escape Pod The Original Science Fiction Podcast','<p>\r\nIt\'s high time I submitted a sample episode from <a href=\"https://escapepod.org/\">Escape Pod</a>, one of the many excellent Podcasts from the <a href=\"https://www.escapeartists.net/\">Escape Artists</a>. They are a serious platform for the best science fiction out there today.\r\n</p>\r\n<p>\r\nWith so much choice, I can pick a recommendation that I think will be right up HPR\'s alley, and that is <a href=\"https://escapepod.org/2018/04/19/escape-pod-624-fandom-for-robots/\">Escape Pod 624: Fandom for Robots</a> released on April 19, 2018 written by Vina Jie-Min Prasad and Narrated by Trendane Sparks.\r\n</p>\r\n<p>\r\nThe sound files are published by under a Creative Commons Attribution-NonCommercial-NoDerivatives license <a href=\"https://creativecommons.org/licenses/by-nc-nd/3.0/\">https://creativecommons.org/licenses/by-nc-nd/3.0/</a>.\r\n</p>',30,75,1,'CC-BY-NC-ND','EA Podcasts, Escape Pod, Fandom for Robots, Vina Jie-Min Prasad, Trendane Sparks',0,0,1),
(3326,'2021-05-03','HPR Community News for April 2021',4825,'HPR Volunteers talk about shows released and comments posted in April 2021','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new hosts: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0393.html\" target=\"_blank\">Anonymous Host</a>, \n    <a href=\"https://hackerpublicradio.org/correspondents/0394.html\" target=\"_blank\">Trey</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3304\" target=\"_blank\">3304</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-04-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3304\" target=\"_blank\">Newsflash 21/01/04</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0393.html\" target=\"_blank\">Anonymous Host</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3305\" target=\"_blank\">3305</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-04-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3305\" target=\"_blank\">Nagios part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3306\" target=\"_blank\">3306</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-04-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3306\" target=\"_blank\">HPR Community News for March 2021</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3307\" target=\"_blank\">3307</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-04-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3307\" target=\"_blank\">Git worktree</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3308\" target=\"_blank\">3308</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-04-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3308\" target=\"_blank\">let\'s talk about Thunderbird</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3309\" target=\"_blank\">3309</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-04-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3309\" target=\"_blank\">Linux Inlaws S01E27: The Big Uncertainties in Life and beyond</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3310\" target=\"_blank\">3310</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-04-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3310\" target=\"_blank\">Layer Masks</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3311\" target=\"_blank\">3311</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-04-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3311\" target=\"_blank\">Bradley M. Kuhn\'s article from 2019 on Richard M. Stallman</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0393.html\" target=\"_blank\">Anonymous Host</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3312\" target=\"_blank\">3312</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-04-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3312\" target=\"_blank\">COVID Doldrums</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3313\" target=\"_blank\">3313</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-04-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3313\" target=\"_blank\">Zoom Update</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0273.html\" target=\"_blank\">ToeJet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3314\" target=\"_blank\">3314</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-04-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3314\" target=\"_blank\">Introduction... A little bit about me</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0394.html\" target=\"_blank\">Trey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3315\" target=\"_blank\">3315</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-04-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3315\" target=\"_blank\">tesseract optical character recognition</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3316\" target=\"_blank\">3316</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-04-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3316\" target=\"_blank\">FSF and RMS on election of Richard Stallman</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0393.html\" target=\"_blank\">Anonymous Host</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3317\" target=\"_blank\">3317</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-04-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3317\" target=\"_blank\">Reading a manifesto: Towards A Cooperative Technology Movement</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0311.html\" target=\"_blank\">clacke</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3318\" target=\"_blank\">3318</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-04-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3318\" target=\"_blank\">Modding a Wii classic with a DNS exploit</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3319\" target=\"_blank\">3319</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-04-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3319\" target=\"_blank\">Linux Inlaws S01E28: Politicians and artificial intelligence part 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3320\" target=\"_blank\">3320</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-04-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3320\" target=\"_blank\">YouTube Channels for Learning Spanish, Part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3321\" target=\"_blank\">3321</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-04-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3321\" target=\"_blank\">DNS66 URANDOM RANDOM</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3322\" target=\"_blank\">3322</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-04-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3322\" target=\"_blank\">Tune system performance with tuned</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3323\" target=\"_blank\">3323</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-04-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3323\" target=\"_blank\">The alternate Internet you never knew existed</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3324\" target=\"_blank\">3324</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-04-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3324\" target=\"_blank\">Infosec Podcasts Part 1  News and Current Events </a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0394.html\" target=\"_blank\">Trey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3325\" target=\"_blank\">3325</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-04-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3325\" target=\"_blank\">Games and rules</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 25 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 4 comments on\n4 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3291#comments\" target=\"_blank\">hpr3291</a></strong>\n(2021-03-15) \"<em>The New Audacity and Batch Processing Macros</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3291#4\" target=\"_blank\">Comment 4</a>:\nbrother mouse on 2021-04-04:\n\"audacity batch\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3296#comments\" target=\"_blank\">hpr3296</a></strong>\n(2021-03-22) \"<em>Spam Bot Honey Pot</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0293.html\" target=\"_blank\">Rho`n</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3296#2\" target=\"_blank\">Comment 2</a>:\nrtsn on 2021-04-13:\n\"nice\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3301#comments\" target=\"_blank\">hpr3301</a></strong>\n(2021-03-29) \"<em>K S P Kerbal Space Program! (Game)</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3301#1\" target=\"_blank\">Comment 1</a>:\nAaronb on 2021-04-17:\n\"Have you seen xkcd about Kerbal\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3303#comments\" target=\"_blank\">hpr3303</a></strong>\n(2021-03-31) \"<em>Slackware on RaspberryPi</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0326.html\" target=\"_blank\">Brian in Ohio</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3303#1\" target=\"_blank\">Comment 1</a>:\nZen_floater2 on 2021-04-01:\n\"Bravo\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 21 comments on 9 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3305#comments\" target=\"_blank\">hpr3305</a></strong>\n(2021-04-02) \"<em>Nagios part 2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3305#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-04-05:\n\"Adding my endorsement\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3308#comments\" target=\"_blank\">hpr3308</a></strong>\n(2021-04-07) \"<em>let\'s talk about Thunderbird</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3308#1\" target=\"_blank\">Comment 1</a>:\nHenry on 2021-04-09:\n\"Got some good tips ... thank you\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3311#comments\" target=\"_blank\">hpr3311</a></strong>\n(2021-04-12) \"<em>Bradley M. Kuhn\'s article from 2019 on Richard M. Stallman</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0393.html\" target=\"_blank\">Anonymous Host</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3311#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2021-04-12:\n\"bravery\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3311#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2021-04-13:\n\"Long history of supporting anonymous posts\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3311#3\" target=\"_blank\">Comment 3</a>:\nReto on 2021-04-13:\n\"RMS\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3311#4\" target=\"_blank\">Comment 4</a>:\nKen Fallon on 2021-04-14:\n\"Interview with RMS/FSF ?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3311#5\" target=\"_blank\">Comment 5</a>:\nKen Fallon on 2021-04-14:\n\"Interview with RMS/FSF ? - links\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3311#6\" target=\"_blank\">Comment 6</a>:\nBeeza on 2021-04-14:\n\"Richard Stallman\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3311#7\" target=\"_blank\">Comment 7</a>:\nTorao on 2021-04-16:\n\"Stallman\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3311#8\" target=\"_blank\">Comment 8</a>:\nCfish on 2021-04-19:\n\"The responsibility of leadership\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3317#comments\" target=\"_blank\">hpr3317</a></strong>\n(2021-04-20) \"<em>Reading a manifesto: Towards A Cooperative Technology Movement</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0311.html\" target=\"_blank\">clacke</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3317#1\" target=\"_blank\">Comment 1</a>:\nclacke on 2021-04-02:\n\"Errata\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3317#2\" target=\"_blank\">Comment 2</a>:\nCfish on 2021-04-20:\n\"Great show\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3317#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-04-22:\n\"Fantastic show!!!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3317#4\" target=\"_blank\">Comment 4</a>:\nclacke on 2021-04-28:\n\"A season for manifestos\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3317#5\" target=\"_blank\">Comment 5</a>:\nKevin O&#39;Brien on 2021-04-29:\n\"Keep it up\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3318#comments\" target=\"_blank\">hpr3318</a></strong>\n(2021-04-21) \"<em>Modding a Wii classic with a DNS exploit</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3318#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2021-04-21:\n\"sdcard and a usbstick\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3318#2\" target=\"_blank\">Comment 2</a>:\narcher72 on 2021-04-22:\n\"Re: sdcard and a usbstick\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3319#comments\" target=\"_blank\">hpr3319</a></strong>\n(2021-04-22) \"<em>Linux Inlaws S01E28: Politicians and artificial intelligence part 1</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3319#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2021-04-23:\n\"AI is misleading AP would be better\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3320#comments\" target=\"_blank\">hpr3320</a></strong>\n(2021-04-23) \"<em>YouTube Channels for Learning Spanish, Part 2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3320#1\" target=\"_blank\">Comment 1</a>:\nAaronb on 2021-04-26:\n\"Listening to Twit podcasts\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3321#comments\" target=\"_blank\">hpr3321</a></strong>\n(2021-04-26) \"<em>DNS66 URANDOM RANDOM</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3321#1\" target=\"_blank\">Comment 1</a>:\nThaj on 2021-04-26:\n\"Mission accomplished\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3324#comments\" target=\"_blank\">hpr3324</a></strong>\n(2021-04-29) \"<em>Infosec Podcasts Part 1  News and Current Events </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0394.html\" target=\"_blank\">Trey</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3324#1\" target=\"_blank\">Comment 1</a>:\nXoke on 2021-04-29:\n\"GRRRRR!\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-April/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-April/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"booth-kit-update\">Booth kit update</h3>\n<p>The FSF Europe have sent us a selection of stickers and leaflets to add to our booth kit(s).</p>\n<h3 id=\"posting-anonymously\">Posting Anonymously</h3>\n<ul>\n<li>HPR supports anonymous posting\n<ul>\n<li>Use Tor browser</li>\n<li>Sign up on a temporary email address <a href=\"https://en.wikipedia.org/wiki/Disposable_email_address\" class=\"uri\">https://en.wikipedia.org/wiki/Disposable_email_address</a></li>\n<li>Select your slot and check for the confirmation email</li>\n<li>Post your show as normal - but add a note to say it\'s an anonymous user.</li>\n</ul></li>\n</ul>\n<h3 id=\"older-hpr-shows-on-archive.org\">Older HPR shows on archive.org</h3>\n<p>The project to upload the <b>older</b> HPR shows to archive.org has been quiescent for a few years. The shows between 1 and 870 had not been uploaded prior to April 2021 (though some shows had been uploaded in batches in the early days, without notes etc).</p>\n<p>However, this <em>old show</em> project has been restarted this month, after new software had been written to help manage the process. At the time of writing 65 shows in the range 1-870 have been uploaded, with notes, and with the same range of audio formats used for current shows.</p>\n<p>Since we don\'t want to upload shows without summaries or tags the two projects are now tied together. So we will be all the more welcoming of tag and summary updates sent to the address referenced in the next section!</p>\n<p>The plan is to report the numbers uploaded each month in the AOB section of the Community News show notes.</p>\n<p>HPR shows on archive.org have the URL https://archive.org/details/hprXXXX where XXXX is the show number with leading zeroes. So for example, show 840\'s URL is: <a href=\"https://archive.org/details/hpr0840\" class=\"uri\">https://archive.org/details/hpr0840</a>.</p>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributors for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a>, <a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a></b></p>\n<p>Over the period tags and/or summaries have been added to 23 shows which were without them.</p>\n<p>There are now 384 shows which need a summary and/or tags.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3351,'2021-06-07','HPR Community News for May 2021',3956,'The HPR Matrons are doing the rounds.','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nThere were no new hosts this month.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3326\" target=\"_blank\">3326</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-05-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3326\" target=\"_blank\">HPR Community News for April 2021</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3327\" target=\"_blank\">3327</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-05-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3327\" target=\"_blank\">Looking into Ceph storage solution</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3328\" target=\"_blank\">3328</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-05-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3328\" target=\"_blank\">Pandas Part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3329\" target=\"_blank\">3329</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-05-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3329\" target=\"_blank\">Linux Inlaws S01E29: The (one and only) Linux Kernel Contributor Panel</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3330\" target=\"_blank\">3330</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-05-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3330\" target=\"_blank\">A Layer Mask Project</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3331\" target=\"_blank\">3331</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-05-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3331\" target=\"_blank\">Audio for Podcasting: Episode 1 - The Microphone</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3332\" target=\"_blank\">3332</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-05-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3332\" target=\"_blank\">My current Devices</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0129.html\" target=\"_blank\">JWP</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3333\" target=\"_blank\">3333</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-05-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3333\" target=\"_blank\">My TV Stand devices and Pine64.org</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0129.html\" target=\"_blank\">JWP</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3334\" target=\"_blank\">3334</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-05-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3334\" target=\"_blank\">Infosec Podcasts Part 2 - General Information Security</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0394.html\" target=\"_blank\">Trey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3335\" target=\"_blank\">3335</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-05-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3335\" target=\"_blank\">For your consideration, the Anarcho Book Club</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3336\" target=\"_blank\">3336</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-05-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3336\" target=\"_blank\">HPR 2020 - 2021 New Years Eve Show Episode 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0269.html\" target=\"_blank\">Honkeymagoo</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3337\" target=\"_blank\">3337</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-05-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3337\" target=\"_blank\">I like that the boat is stuck</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3338\" target=\"_blank\">3338</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-05-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3338\" target=\"_blank\">Using openssl s_client like telnet</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3339\" target=\"_blank\">3339</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-05-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3339\" target=\"_blank\">Linux Inlaws S01E30: Politicians and artificial intelligence part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3340\" target=\"_blank\">3340</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-05-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3340\" target=\"_blank\">Hacked?</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3341\" target=\"_blank\">3341</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-05-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3341\" target=\"_blank\">Linux on a serial Terminal - And Jorome\'s MainFrame Challenge</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0129.html\" target=\"_blank\">JWP</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3342\" target=\"_blank\">3342</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-05-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3342\" target=\"_blank\">HPR 2020 - 2021 New Years Eve Show Episode 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0269.html\" target=\"_blank\">Honkeymagoo</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3343\" target=\"_blank\">3343</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-05-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3343\" target=\"_blank\">The Forth programming language</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0326.html\" target=\"_blank\">Brian in Ohio</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3344\" target=\"_blank\">3344</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-05-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3344\" target=\"_blank\">Infosec Podcasts Part 3 - Infosec Career and Personal Development</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0394.html\" target=\"_blank\">Trey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3345\" target=\"_blank\">3345</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-05-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3345\" target=\"_blank\">Audio for Podcasting: Episode 2 - Equalization</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3346\" target=\"_blank\">3346</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-05-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3346\" target=\"_blank\">HPR 2020 - 2021 New Years Eve Show Episode 3</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0269.html\" target=\"_blank\">Honkeymagoo</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 12 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 5 comments on\n4 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2499#comments\" target=\"_blank\">hpr2499</a></strong>\n(2018-03-01) \"<em>Tuning around the HF 40Mtr band</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2499#3\" target=\"_blank\">Comment 3</a>:\nDave (thelovebug) on 2021-05-19:\n\"Coming to this late, but wow!\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2499#4\" target=\"_blank\">Comment 4</a>:\nMrX on 2021-05-29:\n\"Re: Coming to this late, but wow!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3297#comments\" target=\"_blank\">hpr3297</a></strong>\n(2021-03-23) \"<em>Nextcloud Application Updating</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0273.html\" target=\"_blank\">ToeJet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3297#1\" target=\"_blank\">Comment 1</a>:\nychaouche on 2021-05-02:\n\"safe ?\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3317#comments\" target=\"_blank\">hpr3317</a></strong>\n(2021-04-20) \"<em>Reading a manifesto: Towards A Cooperative Technology Movement</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0311.html\" target=\"_blank\">clacke</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3317#6\" target=\"_blank\">Comment 6</a>:\nAaron C on 2021-05-01:\n\"Raises an excellent point\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3324#comments\" target=\"_blank\">hpr3324</a></strong>\n(2021-04-29) \"<em>Infosec Podcasts Part 1  News and Current Events </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0394.html\" target=\"_blank\">Trey</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3324#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2021-05-01:\n\"Really liked the show\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 7 comments on 6 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3328#comments\" target=\"_blank\">hpr3328</a></strong>\n(2021-05-05) \"<em>Pandas Part 2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3328#1\" target=\"_blank\">Comment 1</a>:\nb-yeezi on 2021-05-05:\n\"Another great show\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3328#2\" target=\"_blank\">Comment 2</a>:\nb-yeezi on 2021-05-05:\n\"One more speed gain\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3331#comments\" target=\"_blank\">hpr3331</a></strong>\n(2021-05-10) \"<em>Audio for Podcasting: Episode 1 - The Microphone</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3331#1\" target=\"_blank\">Comment 1</a>:\nTrey on 2021-05-10:\n\"Great episode.  Thanks for the advice.\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3336#comments\" target=\"_blank\">hpr3336</a></strong>\n(2021-05-17) \"<em>HPR 2020 - 2021 New Years Eve Show Episode 1</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0269.html\" target=\"_blank\">Honkeymagoo</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3336#1\" target=\"_blank\">Comment 1</a>:\nHonkeymagoo on 2021-05-11:\n\"Thanking\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3337#comments\" target=\"_blank\">hpr3337</a></strong>\n(2021-05-18) \"<em>I like that the boat is stuck</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3337#1\" target=\"_blank\">Comment 1</a>:\nmpardo on 2021-05-18:\n\"mpardohpr@gmail.com\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3342#comments\" target=\"_blank\">hpr3342</a></strong>\n(2021-05-25) \"<em>HPR 2020 - 2021 New Years Eve Show Episode 2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0269.html\" target=\"_blank\">Honkeymagoo</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3342#1\" target=\"_blank\">Comment 1</a>:\nHonkeymagoo on 2021-05-11:\n\"Thanking\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3346#comments\" target=\"_blank\">hpr3346</a></strong>\n(2021-05-31) \"<em>HPR 2020 - 2021 New Years Eve Show Episode 3</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0269.html\" target=\"_blank\">Honkeymagoo</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3346#1\" target=\"_blank\">Comment 1</a>:\nHonkeymagoo on 2021-05-11:\n\"Thanking\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-May/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-May/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"reminder---stuff-you-need-to-know\">Reminder - <em>Stuff you need to know</em></h3>\n<ul>\n<li>HPR will stop as a project if there are not enough shows.</li>\n<li>We do not syndicate shows not produced for HPR.</li>\n<li>You are agreeing to license your show CC-BY-SA.</li>\n<li>You have permission to redistribute your show in its entirety.</li>\n<li>Your show will not be moderated.</li>\n<li>Your show will be signaled as containing explicit content.</li>\n<li>You determine where in the schedule your show will be released.</li>\n<li>We use UTF-8 end to end.</li>\n<li>Your show will be heard by an International Audience.</li>\n<li>We also need emergency shows.</li>\n<li>You will no longer be allowed to edit HPR pages on Wikipedia.</li>\n</ul>\n<h3 id=\"reminder---scheduling-guidelines\">Reminder - <em>Scheduling Guidelines</em></h3>\n<ol type=\"1\">\n<li>You must have your audio recording ready to upload before you pick a slot.</li>\n<li>Always try and fill any free slots that are available in the upcoming two weeks.</li>\n<li>If the queue is filling up then please consider leaving some slots free for new contributors.</li>\n<li>If you have a non urgent show then find a empty week and schedule it then.</li>\n<li>If you are uploading a series of shows, consider scheduling one every two weeks.</li>\n</ol>\n<h3 id=\"older-hpr-shows-on-archive.org\">Older HPR shows on archive.org</h3>\n<p>This month 96 additional shows in the range 1-870 have been uploaded to the Internet Archive.</p>\n<p>Since we don\'t want to upload shows without summaries or tags the <em>old shows</em> and <em>tag and summary</em> projects are now tied together. So we will be all the more welcoming of tag and summary updates submitted as described on the <a href=\"https://hackerpublicradio.org/report_missing_tags.php\">summary page</a>.</p>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></b></p>\n<p>Over the period tags and/or summaries have been added to 7 shows which were without them.</p>\n<p>There are currently 377 shows which need a summary and/or tags.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3077,'2020-05-19','Video conference Push to Talk',457,'Building the push to talk button missing from many video conference tools','<p>For the sake of archival, \"state of the world\" refers to the COVID-19 pandemic.</p>\r\n<p>The code and CAD files for this project can be found <a href=\"https://github.com/DanNixon/pulseaudio-ptt\">here</a>.</p>\r\n<p>Relevant links:</p>\r\n<ul>\r\n<li><a href=\"https://www.freedesktop.org/wiki/Software/PulseAudio/\">PulseAudio</a> is the sound server used by many Linux distributions</li>\r\n<li><a href=\"https://pypi.org/project/pulsectl/\">pulsectl</a> is a Python library that allows you to control a PulseAudio server</li>\r\n<li><a href=\"https://www.adafruit.com/category/168\">NeoPixels</a> are cool addressable LEDs</li>\r\n<li>The <a href=\"https://www.pjrc.com/teensy/\">Teensy</a> is a small but powerful microcontroller development board</li>\r\n<li><a href=\"https://pythonhosted.org/pyserial/\">pySerial</a> is a library allowing you to use serial ports in Python</li>\r\n<li><a href=\"https://platformio.org/\">PlatformIO</a> is a tool for making software development for embedded platforms easy</li>\r\n</ul>\r\n<p>Early prototype:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3077/01_prototype.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3077/01_prototype_thumbnail.jpg\" title=\"Prototype\" alt=\"Electronic parts assembled for testing\" style=\"width:50.0%;height:50.0%\" /></a></p>\r\n<p>Assembled electronics fitted into case ready to be closed:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3077/02_pre_assembly.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3077/02_pre_assembly_thumbnail.jpg\" title=\"Pre-assembly\" alt=\"Electronics fitted into case ready for case to be closed\" style=\"width:50.0%;height:50.0%\" /></a></p>\r\n<p>View of the top of the case, showing Cherry switch and NeoPixel LED indicator:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3077/03_top.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3077/03_top_thumbnail.jpg\" title=\"Top view\" alt=\"View of the top of the finished device showing button and indicator LED\" style=\"width:50.0%;height:50.0%\" /></a></p>\r\n<p>View of the bottom of the case, showing USB port and some of the nicer M3 screws from my parts bin:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3077/04_bottom.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3077/04_bottom_thumbnail.jpg\" title=\"Bottom view\" alt=\"View of bottom of the finished device showing screws and USB port\" style=\"width:50.0%;height:50.0%\" /></a></p>\r\n<p>Plugged in and powered on, showing the muted state:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3077/05_muted.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3077/05_muted_thumbnail.jpg\" title=\"Muted state\" alt=\"Device showing the muted state\" style=\"width:50.0%;height:50.0%\" /></a></p>\r\n<p>Button pushed, showing the unmuted/mic live state:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3077/06_unmuted.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3077/06_unmuted_thumbnail.jpg\" title=\"Unmuted state\" alt=\"Device with the button pushed showing the unmuted state\" style=\"width:50.0%;height:50.0%\" /></a></p>\r\n',386,103,1,'CC-BY-SA','arduino, linux audio, electronics, hardware',0,0,1),
(3067,'2020-05-05','Getting my Python3 code working in Python2',1526,'What I had to do to get my raspberry Pi PifaceCAD board working after a Debian upgrade.','<p>I have a raspberry Pi model B with the original Pifacecad add on board</p>\r\n<p>I recently upgraded the operating system on my raspberry pi from Wheezy (Debian 7) to Jessie (Debian 8), all seemed fine till I tried to run my Python3 project. It reported that the <code>pifacecad</code> module wasn’t present. I tried to install the module using the standard <code>apt-get</code> command given in the Pifacecad documentation. It installed OK for python 2 but It would not install for python 3 as there was a dependency issue with the <code>python-lirc</code> library. I’m guessing the upgrade broke something.</p>\r\n<p>I installed a fresh minimal installation of raspbian Stretch (Debian 9) onto a new SD card and ran the standard installation command in the Pifacecad documentation. It all installed but there was a warning about Spi which I had forgotten to enable. I enabled this using the <code>raspi-config</code> util and rebooted the pi.</p>\r\n<p>I then tested the installation by running the <code>sys-info.py</code> example that is mentioned in the installation documentation that comes with the pifacecad board.</p>\r\n<p>Running this example gave a warning saying that the pifacecad hardware could not be found at this point I gave up and decided instead to run my project in python 2.</p>\r\n<p>Of course at first the code wouldn’t run using python 2 and I had to do a bit of digging around to find out what was going wrong.</p>\r\n<p>You may find this useful in the unlikely event that you have a project written in python 3 that you want to run in python 2, it might also be useful if you’re going in the other direction.</p>\r\n<p>One other thing that I briefly stumbled upon was that I believe there is a tool available that attempts to convert python 2 code to python 3 I don’t know anything about it and didn’t bother looking to see if there is a tool to go in the opposite direction which is what I needed. I’ve included a link to the tool below <a href=\"https://docs.python.org/2/library/2to3.html\" class=\"uri\">https://docs.python.org/2/library/2to3.html</a></p>\r\n<p>I’ve got the two versions of code loaded into the excellent graphical diff tool <code>meld</code> and I’ll just briefly cover the things that I had to change.</p>\r\n<p>Link to meld diff tool: <a href=\"https://meldmerge.org/\" class=\"uri\">https://meldmerge.org/</a></p>\r\n<p>After some mucking about I got it partially working by installing Piface module for Python 2.7</p>\r\n<p>Had to do the following changes to get the code working in Python 2.7:</p>\r\n<ul>\r\n<li><p>Changed first line of code from python3 to python2 so that code was run using the correct interpreter</p></li>\r\n<li><p>Print statement fixed by see<br />\r\n<a href=\"https://stackoverflow.com/questions/32032697/how-to-use-from-future-import-print-function\" class=\"uri\">https://stackoverflow.com/questions/32032697/how-to-use-from-future-import-print-function</a></p></li>\r\n<li>Python 3 uses the urllib.request command. For Python 3 I used</li>\r\n</ul>\r\n<pre><code>    urllib.request.urlopen(url).read()</code></pre>\r\n<blockquote>\r\n<p><a href=\"https://docs.python.org/3/library/urllib.request.html\" class=\"uri\">https://docs.python.org/3/library/urllib.request.html</a></p>\r\n</blockquote>\r\n<ul>\r\n<li>Python 2 uses the urllib2 command. For Python 2 I used the following</li>\r\n</ul>\r\n<pre><code>    urllib2.urlopen(url).read()</code></pre>\r\n<blockquote>\r\n<p><a href=\"https://docs.python.org/2/library/urllib2.html\" class=\"uri\">https://docs.python.org/2/library/urllib2.html</a></p>\r\n</blockquote>\r\n<ul>\r\n<li><p><code>hostname --all</code> has different output on this version of Debian, now includes mac address which I did not want.</p></li>\r\n<li><p>Getting the wifi ESSID information. I used <code>iwconfig</code> to get this information. The path to iwconfig command changed in this version of Debian and I now had to give the full path to get it to work.</p></li>\r\n<li><p>Python 2 and 3 seemed to handle strings differently when converting from an array to a plain string.</p></li>\r\n<li><p>Python 3 handles input different from python 2</p></li>\r\n<li><p>If python 2 comes across a non numeric value it quits with an exception</p>\r\n<ul>\r\n<li>so for python 2 I used the command</li>\r\n</ul>\r\n<pre><code>      raw_input()</code></pre>\r\n<ul>\r\n<li>for python 3 I used the command</li>\r\n</ul>\r\n<pre><code>      input()</code></pre></li>\r\n</ul>\r\n<p>Two article about incorporating future statements in Python 2<br />\r\n<a href=\"https://docs.python.org/3/library/__future__.html\" class=\"uri\">https://docs.python.org/3/library/__future__.html</a><br />\r\n</p>\r\n<p><a href=\"https://simeonvisser.com/posts/how-does-from-future-import-work-in-python.html\" class=\"uri\">https://simeonvisser.com/posts/how-does-from-future-import-work-in-python.html</a></p>\r\n<p>Related shows about my PiFaceCAD add on board for the raspberry pi</p>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2933\">hpr2933 :: A walk through my PifaceCAD Python code – Part 1</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2951\">hpr2951 :: A walk through my PifaceCAD Python code – Part 2</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2963\">hpr2963 :: A walk through my PifaceCAD Python code – Part 3</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2976\">hpr2976 :: A walk through my PifaceCAD Python code – Part 4</a></li>\r\n</ul>\r\n',201,38,1,'CC-BY-SA','Python, Programming, Linux, Raspberry Pi',0,0,1),
(3069,'2020-05-07','Linux Inlaws S01E05 Porn and Skynet',4029,'This is Linux Inlaws, a series on free and open source software, black humour, the revolution','<p>Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.</p>\r\n<p>Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute t-rexes or other associated dinosaurs.</p>\r\n<ul>\r\n<li>Ubuntu 20.04: <a href=\"https://wiki.ubuntu.com/FocalFossa/ReleaseNotes\" class=\"uri\">https://wiki.ubuntu.com/FocalFossa/ReleaseNotes</a></li>\r\n<li>Kernel 5.6: <a href=\"https://itsfoss.com/linux-kernel-5-6\" class=\"uri\">https://itsfoss.com/linux-kernel-5-6</a></li>\r\n<li>Wireguard: <a href=\"https://www.wireguard.com\" class=\"uri\">https://www.wireguard.com</a></li>\r\n<li>Python 2.7.18: <a href=\"https://mail.python.org/archives/list/python-dev@python.org/message/OFCIETIXLX34X7FVK5B5WPZH22HXV342/\" class=\"uri\">https://mail.python.org/archives/list/python-dev@python.org/message/OFCIETIXLX34X7FVK5B5WPZH22HXV342/</a></li>\r\n<li>Python 404: <a href=\"https://www.python.org/dev/peps/pep-0404\" class=\"uri\">https://www.python.org/dev/peps/pep-0404</a></li>\r\n<li>RTPM: <a href=\"https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol\" class=\"uri\">https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol</a></li>\r\n<li>webRTC: <a href=\"https://en.wikipedia.org/wiki/WebRTC\" class=\"uri\">https://en.wikipedia.org/wiki/WebRTC</a></li>\r\n<li>MPEG: <a href=\"https://en.wikipedia.org/wiki/MPEG-4\" class=\"uri\">https://en.wikipedia.org/wiki/MPEG-4</a></li>\r\n<li>VP9: <a href=\"https://en.wikipedia.org/wiki/VP9\" class=\"uri\">https://en.wikipedia.org/wiki/VP9</a></li>\r\n<li>Audio compression: <a href=\"https://en.wikipedia.org/wiki/Data_compression#Audio\" class=\"uri\">https://en.wikipedia.org/wiki/Data_compression#Audio</a></li>\r\n<li>Container formats: <a href=\"https://en.wikipedia.org/wiki/Comparison_of_video_container_formats\" class=\"uri\">https://en.wikipedia.org/wiki/Comparison_of_video_container_formats</a></li>\r\n</ul>',384,111,1,'CC-BY-SA','linux inlaws, communism, free and open source software, adult entertainment, skynet',0,0,1),
(3070,'2020-05-08','making vim xdg compatible',3070,'move your vim configuration out of the home directory','<h1 id=\"xdg-vim-config\">xdg vim config</h1>\r\n<p>To make vim load an alternative config file either use an alias or the VIMINIT variable. i.e. place either <code>alias vim=\"vim -u ~/.config/vim/vimrc\"</code> or <code>VIMINIT=\"source ~/.config/vim/vimrc\"</code> in your <code>.bashrc</code> (ironically, that one is still in my home folder).</p>\r\n<p>Once that is loaded, you should source the following file after \"nocompatible\"</p>\r\n<pre><code>&quot; file: ~/.config/vim/xdg.vim\r\nif empty($XDG_CACHE_HOME)\r\n    let $XDG_CACHE_HOME=$HOME.&quot;/.cache&quot;\r\nendif\r\n\r\nif empty($XDG_CONFIG_HOME)\r\n    let $XDG_CONFIG_HOME=$HOME.&quot;/.config&quot;\r\nendif\r\n\r\nif empty($XDG_DATA_HOME)\r\n    let $XDG_DATA_HOME=$HOME.&quot;/.local/share&quot;\r\nendif\r\n\r\nset directory=$XDG_CACHE_HOME/vim/swap,~/,/tmp\r\nset backupdir=$XDG_CACHE_HOME/vim/backup,~/,/tmp\r\nset undodir=$XDG_CACHE_HOME/vim/undo,~/,/tmp\r\nset viminfo+=n$XDG_CACHE_HOME/vim/viminfo\r\nset runtimepath+=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$XDG_DATA_HOME/vim/bundle/Vundle.vim,$VIM,$VIMRUNTIME\r\nlet $MYVIMRC=$XDG_CONFIG_HOME.&quot;/vim/vimrc&quot;\r\n</code></pre>\r\n<p>With this file in place you should call it from your vimrc</p>\r\n<pre><code>&quot; file: ~/.config/vim/vimrc\r\nset nocompatible\r\nfiletype off\r\nsource $HOME/.config/vim/xdg.vim\r\ncall vundle#begin()\r\nlet vundle#bundle_dir = expand(&quot;$XDG_DATA_HOME/vim/bundle&quot;)\r\n\r\n&quot; include your calls to Plugin here\r\n\r\ncall vundle#end()\r\nfiletype plugin indent on\r\nsyntax on\r\n\r\nsource ~/.config.\r\n</code></pre>\r\n<p>Note that it is important that all the paths are defined BEFORE Vundle (or whatever is your plugin manager) is called, since the path to it is defined in <code>xdg.vim</code>.</p>\r\n<p>You can check my full vim config at <a href=\"https://gitlab.com/crvs/dotfiles/-/tree/master/.config/vim\">gitlab</a>.</p>\r\n<h2 id=\"references\">References</h2>\r\n<p>The vim script I modified my config from - <a href=\"https://gist.github.com/dkasak/6ae1c6bf0d771155f23b\">https://gist.github.com/dkasak/6ae1c6bf0d771155f23b</a></p>\r\n',385,82,1,'CC-BY-SA','vim, configuration, XDG',0,0,1),
(3071,'2020-05-11','Bash snippet - quotes inside quoted strings',799,'How to add quotes to quoted strings in Bash','<h2 id=\"bash-and-quoted-strings\">Bash and quoted strings</h2>\r\n<p>An issue I just hit in Bash was that I had a quoted string, and I wanted to enclose it in quotes. How to do this?</p>\r\n<p>This is the umpteenth time I have stumbled over this issue, and I realised I had found out how to solve it a while back but the information hadn’t rooted itself into my mind!</p>\r\n<p>I have always been less clear in my mind about quoted strings in Bash than I should be, so, assuming others might have similar confusion I thought I’d try and clarify things in the form of an HPR show.</p>\r\n<h3 id=\"the-problem\">The problem</h3>\r\n<p>The thing I was having difficulties with was an <code>alias</code> definition of a useful pipeline:</p>\r\n<pre><code>nmap -sn 192.168.0.0/24 | awk &#39;/^Nmap scan report/{print &quot;&quot;; print; next}{print}&#39;</code></pre>\r\n<p>This uses <code>nmap</code> (see Ken’s show <a href=\"https://hackerpublicradio.org/eps.php?id=3052\" title=\"hpr3052 :: Locating computers on a network\">3052</a> for a discussion of its use) piped into an <code>awk</code> one-liner that formats the information returned by <code>nmap</code>.</p>\r\n<p>The <code>alias</code> command can be used to store such a command or command sequence as a single simple command. It’s usually added to the <code>~/.bashrc</code> file so it gets added to every Bash shell you start up (note <em>Bash Tips #22</em>, currently being written, will cover these startup files).</p>\r\n<p>An <code>alias</code> definition looks something like this:</p>\r\n<pre><code>alias la=&#39;ls -Al&#39;</code></pre>\r\n<p>The alias itself <code>\'la\'</code> is defined as the command <code>ls -Al</code>.</p>\r\n<p>So how to make my <code>nmap</code> sequence into an alias given that the commands contain both single and double quotes?</p>\r\n<h3 id=\"quoted-strings-in-bash\">Quoted strings in Bash</h3>\r\n<p>Bash is (to my mind) a bit weird with quoted strings.</p>\r\n<p>There are two sorts of quotes in Bash (leaving aside the <em>backquote</em> or <em>backtick</em> – <code>`</code>):</p>\r\n<ul>\r\n<li><p>Single quotes, also called <em>hard</em> quotes (<code>\'</code>). The literal value of characters between the quotes is preserved. Single quotes are not allowed, even if preceded by backslash escape characters.</p></li>\r\n<li><p>Double quotes, also called <em>soft</em> quotes (<code>\"</code>). Certain characters within the quotes have special meanings, such as <code>\'$\'</code> and <code>\'&bsol;\'</code>. Double quotes are allowed in the string when preceded by a backslash.</p></li>\r\n</ul>\r\n<p>There’s a more comprehensive treatment of these quoting types (and others) in the <a href=\"https://www.gnu.org/software/bash/manual/html_node/Quoting.html\" title=\"Bash Reference Manual: 3.1.2 Quoting\">Bash Reference Manual</a>.</p>\r\n<h3 id=\"changing-quotes-and-concatenating-strings\">Changing quotes and concatenating strings</h3>\r\n<p>To make a variable containing a string with embedded quotes you can do this:</p>\r\n<pre><code>$ x=&#39;string1&#39;&quot;&#39;&quot;&#39;string2&#39;\r\n$ echo $x\r\nstring1&#39;string2</code></pre>\r\n<p>What we did here was close <code>\'string1\'</code>, start a new string enclosed in double quotes <code>\"\'\"</code>, then append a second string <code>\'string2\'</code>. Bash treats the three strings as one, but they have to be contiguous. There must be no intervening spaces<a href=\"#fn1\" class=\"footnote-ref\" id=\"fnref1\"><sup>1</sup></a>.</p>\r\n<p>This solution is rather ugly. You could also use Bash string concatenation to do this, though it’s more long-winded:</p>\r\n<pre><code>$ x=&#39;string1&#39;\r\n$ x+=&quot;&#39;&quot;\r\n$ x+=&#39;string2&#39;\r\n$ echo $x\r\nstring1&#39;string2</code></pre>\r\n<p>The same principles hold for double quotes of course:</p>\r\n<pre><code>$ x=&quot;string1&quot;&#39;&quot;&#39;&quot;string2&quot;\r\n$ echo $x\r\nstring1&quot;string2</code></pre>\r\n<p>You’d probably not want to do this though.</p>\r\n<h3 id=\"using-backslashes\">Using backslashes</h3>\r\n<p>You can use backslashes to escape double quotes inside a <em>double</em> quoted string in Bash as we have seen.</p>\r\n<pre><code>$ x=&quot;string1&bsol;&quot;string2&quot;\r\n$ echo $x\r\nstring1&quot;string2</code></pre>\r\n<p>However, as discussed earlier, it’s not possible to use backslashes to escape single quotes inside a single quoted string in Bash. However, outside a string a backslashed character is <em>escaped</em>. For example, if you have files which have spaces in their names, you can quote the name or use the backslash escape to protect the spaces<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a>:</p>\r\n<pre><code>$ ls -l a&bsol; file&bsol; with&bsol; spaces.awk\r\n-rw-r--r-- 1 hprdemo hprdemo 0 Apr 22 22:25 &#39;a file with spaces.awk&#39;</code></pre>\r\n<p>So, knowing this, you can exit a string, concatenate with a backslashed quote then restart a string like this:</p>\r\n<pre><code>$ x=&#39;string1&#39;&bsol;&#39;&#39;string2&#39;\r\n$ echo $x\r\nstring1&#39;string2</code></pre>\r\n<h3 id=\"solution\">Solution</h3>\r\n<p>So now we can see how to achieve the alias definition I wanted earlier:</p>\r\n<pre><code>alias show_network=&#39;nmap -sn 192.168.0.0/24 | awk &#39;&bsol;&#39;&#39;/^Nmap scan report/{print &quot;&quot;; print; next}{print}&#39;&bsol;&#39;&#39;&#39;\r\n\r\n</code></pre>\r\n<h3 id=\"epilogue\">Epilogue</h3>\r\n<p>There’s more to be said about this subject, but too much of this stuff is not healthy.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><p>Ken Fallon’s HPR show where he describes <code>nmap</code>: <a href=\"https://hackerpublicradio.org/eps.php?id=3052\">hpr3052 :: Locating computers on a network</a></p></li>\r\n<li>Bash Reference Manual:\r\n<ul>\r\n<li><a href=\"https://www.gnu.org/software/bash/manual/html_node/Quoting.html\">Quoting</a></li>\r\n</ul></li>\r\n<li>Stack Overflow articles:\r\n<ul>\r\n<li><a href=\"https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash\">Difference between single and double quotes in Bash</a></li>\r\n<li><a href=\"https://stackoverflow.com/questions/3834839/how-to-escape-a-double-quote-inside-double-quotes\">How to escape a double quote inside double quotes</a></li>\r\n</ul></li>\r\n</ul>\r\n<section class=\"footnotes\">\r\n<hr />\r\n<ol>\r\n<li id=\"fn1\"><p>This is quite an artificial example to make a point. You wouldn’t do things this way in reality. Using <code>x=\'string1\'\"\'string2\"</code> would also work (<code>\'string1\'</code> in single quotes, and <code>\"\'string2\'\"</code> in double quotes). Also, you could just write <code>x=\"string1\'string2\"</code> and stop all the messing about, but that would not be much of an example!<a href=\"#fnref1\" class=\"footnote-back\">↩</a></p></li>\r\n<li id=\"fn2\"><p>The backslash is making the space a literal space, otherwise Bash would see it as an argument delimiter, and would look for the files <code>\'a\'</code>, <code>\'file\'</code>, <code>\'with\'</code> and <code>\'spaces.awk\'</code> to list details about!<a href=\"#fnref2\" class=\"footnote-back\">↩</a></p></li>\r\n</ol>\r\n</section>\r\n',225,42,1,'CC-BY-SA','Bash,quotes',0,0,1),
(3072,'2020-05-12','The joy of pip-tools and pyenv-virtualenv',1441,'How to manage your dependencies and environment isolation when developing in Python','<p>TL;DL: What I end up recommending is that you use pip-tools for your dependency management needs, and pyenv-virtualenv for your environment management needs. In the show I explain why you would want these things.</p>\r\n\r\n<p>I talk about these tools:</p>\r\n\r\n<ul>\r\n  <li><a href=\"https://virtualenv.pypa.io/\">virtualenv</a></li>\r\n  <li><a href=\"https://python-poetry.org/\">poetry</a></li>\r\n  <li><a href=\"https://pipenv.pypa.io/\">pipenv</a></li>\r\n  <li><a href=\"https://github.com/jazzband/pip-tools/\">pip-tools</a></li>\r\n  <li><a href=\"https://virtualenvwrapper.readthedocs.io/\">virtualenvwrapper</a></li>\r\n  <li><a href=\"https://github.com/pyenv/pyenv\">pyenv</a></li>\r\n  <li><a href=\"https://github.com/pyenv/pyenv-virtualenv\">pyenv-virtualenv</a></li>\r\n</ul>\r\n\r\n<p>I mention in passing, and as fodder for further shows:</p>\r\n\r\n<ul>\r\n  <li><a href=\"https://reproducible-builds.org/\">reproducible builds</a></li>\r\n  <li><a href=\"https://nixos.org/nix/\">Nix</a></li>\r\n  <li><a href=\"https://tox.readthedocs.io/\">tox</a></li>\r\n  <li>I also owe you a show on my awesome bash prompt that shows me which environment I am in.</li>\r\n</ul>\r\n\r\n<h2 id=\"install-pyenv-and-pyenv-virtualenv\">Install pyenv and pyenv-virtualenv</h2>\r\n\r\n<pre><code>git clone https://github.com/pyenv/pyenv ~/.pyenv\r\ngit clone https://github.com/pyenv/pyenv-virtualenv ~/.pyenv/plugins/pyenv-virtualenv\r\n</code></pre>\r\n\r\n<p>Add to <code>~/.bash_profile</code>:</p>\r\n\r\n<pre><code>export PYENV_ROOT=$HOME/.pyenv\r\nexport PATH=$PYENV_ROOT/bin:$PATH\r\n</code></pre>\r\n\r\n<p>Add to <code>~/.bash_profile</code> (optional):</p>\r\n\r\n<pre><code>eval \"$(pyenv init -)\"\r\neval \"$(pyenv virtualenv-init -)\"\r\n</code></pre>\r\n\r\n<p>The optional bits provide you with the <code>pyenv shell</code> functionality for setting a session-specific Python version, and automatic activation of the virtualenv. Most of the time you don’t need activation, scripts and commands run just fine via the shims, but some tooling around Python may sometimes need to know which virtualenv you’re in.</p>\r\n\r\n<p>Run the export and eval lines in your shell to have the configuration work immediately. Alternatively, do <code>su - yourusername</code> to login to a new session that runs the profile. The <code>-</code> is important.</p>\r\n\r\n<p>You might be able to get away with just opening a new tab or window in your terminal. Whether that runs the profile depends on your settings.</p>\r\n\r\n<h2 id=\"set-up-your-pyenv-virtualenv-for-your-project\">Set up your pyenv virtualenv for your project</h2>\r\n\r\n<pre><code># Creates the virtualenv named my-project-env using \r\n# the python named system (your system default python)\r\npyenv virtualenv system my-project-env  \r\ncd /path/to/my-project\r\npyenv local my-project-env\r\n</code></pre>\r\n\r\n<p>Your system Python may or may not work for this. You might have to install pip and virtualenv. It might still break with some message about <code>ensurepip</code> failing (currently both Nix (20.09pre) python and Ubuntu (18.04) python are failing for me, and older Anaconda pythons also had a broken venv). In that case, use pyenv to install a Python that works, and use that instead of the system python:</p>\r\n\r\n<pre><code>pyenv install miniconda3-latest\r\npyenv virtualenv miniconda3-latest my-project-env\r\ncd /path/to/my-project\r\npyenv local my-project-env\r\n</code></pre>\r\n\r\n<h2 id=\"install-pip-tools\">Install pip-tools</h2>\r\n\r\n<p>You’ll want to do this inside the virtual environment that you want to manage. Don’t install pip-tools globally.</p>\r\n\r\n<pre><code>cd /path/to/my/project\r\n# And, assuming you have the shims on your $PATH\r\n# and you set the pyenv local as shown previously\r\npython -m pip install pip-tools\r\n</code></pre>\r\n\r\n<p>Now put your requirements in <code>requirements.in</code>, one on each line, in the form you would give them to <code>pip</code> on the command line:</p>\r\n\r\n<pre><code>somepackage &gt;=3, &lt;4\r\notherpackage &lt;7\r\n</code></pre>\r\n\r\n<p>Compile <code>requirements.in</code> to a <code>requirements.txt</code>:</p>\r\n\r\n<pre><code>python -m piptools compile\r\n</code></pre>\r\n\r\n<p>You could run the shorter command <code>pip-compile</code> for convenience, but using the long form with <code>-m</code> looks it up through your configured Python, and makes it less likely for you to surprise yourself and run a tool in a different virtualenv than you expected. Same with <code>python -m pip</code> above.</p>\r\n\r\n<p>Your <code>requirements.txt</code> will look something like this:</p>\r\n\r\n<pre><code>otherpackage==6.9.3          # via -r requirements.in\r\nsomepackage==3.4.2           # via -r requirements.in\r\ntransitivedependency==2.7.6  # via somepackage\r\n</code></pre>\r\n\r\n<p>It helpfully tells you where everything is from!</p>\r\n\r\n<p>Now to actually install these things you <code>python -m pip -r requirements.txt</code>.</p>\r\n\r\n<p>Now you’re good to go! Happy hacking!</p>',311,38,1,'CC-BY-SA','python,pyenv,virtualenv,virtualenvwrapper,poetry,pipenv,pip-tools',0,0,1),
(3076,'2020-05-18','Keep calm and Virion',3526,'A COVID-19 lockdown chat from Scotland','<h2 id=\"introduction\">Introduction</h2>\r\n<p>Two HPR hosts from Scotland get together over Mumble to chat about all manner of stuff.</p>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0268.html\">Andrew Conway</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></li>\r\n</ul>\r\n<h2 id=\"apology\">Apology</h2>\r\n<p>Dave’s sound was a bit muffled in this recording. It turns out that it’s important which USB port the microphone (Zoom recorder) is plugged into. Who knew!</p>\r\n<h2 id=\"notes\">Notes</h2>\r\n<p>Some of the topics we discussed</p>\r\n<ul>\r\n<li>Accent differences in Scotland\r\n<ul>\r\n<li>What is <em>Butcher Meat</em>? Is it an Edinburgh expression?</li>\r\n</ul></li>\r\n<li>The Fish Van from <a href=\"https://en.wikipedia.org/wiki/Pittenweem\" title=\"A fishing village in Fife\">Pittenweem</a>\r\n<ul>\r\n<li>The mysterious non-Crab Crab meat</li>\r\n<li>Dressed and live crabs in <a href=\"https://en.wikipedia.org/wiki/Cromer\" title=\"A town on the Norfolk coast\">Cromer</a></li>\r\n</ul></li>\r\n<li>Handling enforced isolation; the response to COVID-19</li>\r\n<li>The type of disposable masks sold for DIY use can be impractical</li>\r\n<li>Supermarket online shopping and delivery versus local shopping</li>\r\n<li>The etiquette of distancing when out walking or cycling for exercise during the lockdown</li>\r\n<li>Cycling anecdotes\r\n<ul>\r\n<li><a href=\"https://www.slime.com/uk/products/bike/sealants/tube-sealant.php\" title=\"Slime tube sealant\">Slime</a> tube sealant</li>\r\n<li>Old railway lines turned to cycle paths (e.g. <a href=\"https://en.wikipedia.org/wiki/Balerno_line\" title=\"Balerno railway line, now a walkway\">Balerno line</a> in Edinburgh, <a href=\"https://en.wikipedia.org/wiki/Marriott&#39;s_Way\" title=\"Marriott&#39;s Way, Norfolk, originally a railway line\">Marriott’s Way</a> in Norfolk)</li>\r\n</ul></li>\r\n<li>Industrial archaeology and historical buildings\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Water_of_Leith\" title=\"Water of Leith\">Water of Leith</a>, Edinburgh</li>\r\n<li>Paper making (<a href=\"https://en.wikipedia.org/wiki/Esparto\" title=\"Esparto grass\">Esparto grass</a>)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/River_Kelvin\" title=\"River Kelvin\">River Kelvin</a>, Glasgow</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/William_Thomson,_1st_Baron_Kelvin\" title=\"Lord Kelvin\">Lord Kelvin</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Warrender_Baths\" title=\"Warrender Baths, Edinburgh\">Warrender Baths</a>, Edinburgh</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Govanhill_Baths\" title=\"Govanhill Baths, Glasgow\">Govanhill Baths</a>, Glasgow (ref. <em>steamie</em>)</li>\r\n</ul></li>\r\n<li>Electronics\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/ESP8266\" title=\"Low-cost Wi-Fi microchip\">ESP8266</a>, <a href=\"https://en.wikipedia.org/wiki/ESP32\" title=\"Microcontroller with integrated Wi-Fi and dual-mode Bluetooth\">ESP32</a></li>\r\n<li><a href=\"https://sonoff.tech/\" title=\"Home automation\">Sonoff</a> home automation</li>\r\n</ul></li>\r\n<li>D&amp;D sessions\r\n<ul>\r\n<li>Initiated by <a href=\"https://hackerpublicradio.org/correspondents/0078.html\">Klaatu</a> in New Zealand</li>\r\n</ul></li>\r\n<li>Shortages during the pandemic: toilet rolls, flour, etc\r\n<ul>\r\n<li>Supply chains: wholesale versus domestic</li>\r\n</ul></li>\r\n<li><em>Dracula</em> by Bram Stoker\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Whitby\" title=\"A coastal town in Yorkshire\">Whitby</a>, Yorkshire</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Brașov\" title=\"A city in Transylvania, Romania\">Brașov</a>, Transylvania, Romania.\r\n<ul>\r\n<li>Called <em>Corona</em> at one point in its history.</li>\r\n<li>Near to <a href=\"https://en.wikipedia.org/wiki/Bran_Castle\" title=\"Bran Castle, near Brașov\">Bran Castle</a>, known outside Romania as Dracula’s Castle.</li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Pittenweem\">Pittenweem</a>, a fishing village in Fife</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Cromer\">Cromer</a>, a town on the Norfolk coast, famous for its crabs</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Whitby\">Whitby</a>, a seaside town in North Yorkshire</li>\r\n</ul>\r\n',225,0,1,'CC-BY-SA','Virus,Virion,COVID-19',0,0,1),
(3090,'2020-06-05','Locating Computer on a Enterprise Network',2388,'advanced nmap tips','<p>\r\nIn this episode operat0r responds to <a href=\"https://hackerpublicradio.org/eps.php?id=3052\">hpr3052 :: Locating computers on a network</a>, with more tips and tricks. Then he continues through a detailed exercise in using nmap on the corporate network.\r\n</p>\r\n<p>\r\nThe expanded commands can be found <a href=\"https://hackerpublicradio.org/eps/hpr3090.txt\">here</a>.\r\n</p>',36,61,1,'CC-BY-SA','nmap,hacking,computers,networking,scripting,bash,shell',0,0,1),
(3073,'2020-05-13','Matchbox and Diecast Restoration',182,'A short episode about my New hobby restoring Matchbox and other Diecast models','<p>\r\nToday\'s show is about my recently started hobby of restoring Matchbox models. I talked about this on the New Year show and Ken said it deserved a show in its own right.\r\n</p>\r\n<p>\r\nSo today I briefly talk about how I got into the hobby through watching YouTube Videos of Marty\'s Matchbox Makeovers, and my first restoration pictured below. Enjoy.\r\n</p>\r\n<p>\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3073.jpg\">\r\n<img src=\"https://hackerpublicradio.org/eps/hpr3073_thumbnail.jpg\" title=\"\" alt=\"Photo of a silver matchbox car\" ></a>\r\n</p>\r\n\r\n\r\n<h3>Links:</h3>\r\n<ul>\r\n<li><a href=\"https://www.youtube.com/channel/UCLM7pRUW6CmqqoAic24wbpQ\">https://www.youtube.com/channel/UCLM7pRUW6CmqqoAic24wbpQ</a></li>\r\n</ul>\r\n\r\n',338,114,0,'CC-BY-SA','Matchbox, Diecast Models, Restoration',0,0,1),
(3078,'2020-05-20','Coronavirus Update 2020-05-07',878,'Where we are with this pandemic, and how should we respond?','<p>This is an update to my earlier show to pull together what we know about the Coronavirus on this date, and what measures we can take. It focuses on the lack of solid information at this point and suggests a prudent course to stay safe. <a href=\"https://www.palain.com/health-topics/coronavirus-update-20200507/\" class=\"uri\">https://www.palain.com/health-topics/coronavirus-update-20200507/</a></p>\r\n<ul>\r\n<li><a href=\"https://www.palain.com/health-topics/scientific-and-medical-reports/\" class=\"uri\">https://www.palain.com/health-topics/scientific-and-medical-reports/</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2685\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2685</a></li>\r\n<li><a href=\"https://www.cdc.gov/flu/about/burden/2017-2018.htm\" class=\"uri\">https://www.cdc.gov/flu/about/burden/2017-2018.htm</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/All_models_are_wrong\" class=\"uri\">https://en.wikipedia.org/wiki/All_models_are_wrong</a></li>\r\n<li><a href=\"https://www.healthdata.org/covid/updates\" class=\"uri\">https://www.healthdata.org/covid/updates</a></li>\r\n<li><a href=\"https://www.medpagetoday.com/infectiousdisease/covid19/86127\" class=\"uri\">https://www.medpagetoday.com/infectiousdisease/covid19/86127</a></li>\r\n<li><a href=\"https://www.cnn.com/2020/05/04/health/us-coronavirus-monday/index.html\" class=\"uri\">https://www.cnn.com/2020/05/04/health/us-coronavirus-monday/index.html</a></li>\r\n<li><a href=\"https://www.palain.com/health-topics/coronavirus-update-20200507/\" class=\"uri\">https://www.palain.com/health-topics/coronavirus-update-20200507/</a></li>\r\n</ul>\r\n\r\n<hr />\r\n\r\n<p>\r\nExtracted from <a href=\"https://www.palain.com/health-topics/coronavirus-update-20200507/\">Palain.com</a> under the tearms of Creative Commons Attribution-ShareAlike 4.0 International License. \r\n</p>\r\n\r\n<h1 >Coronavirus Update 20200507</h1>\r\n\r\n<p>The coronavirus pandemic is continuing throughout most of the world, and I wanted to put down some observations on where we stand today. First, note that I put the date in the title. This is because the situation in some ways changes day-by-day, even though there are continuities. That makes it a dangerous place to be because it is human nature to look for the latest news and jump on it if it looks good. And that is a prime mistake because we do not in fact know enough at this point to be confident in these news reports. I would refer you to my earlier essay, <a rel=\"noreferrer noopener\" href=\"https://www.palain.com/health-topics/scientific-and-medical-reports/\" target=\"_blank\">Scientific and Medical Reports</a>, which is highly relevant right now. While I could not have predicted this pandemic when I wrote it, it contains basic principles that are <em>always</em> relevant. </p>\r\n\r\n\r\n\r\n<p>The nature of the press is that it is like the carnivorous plant in the movie <em>Little Shop of Horrors</em>, always crying \"Feed Me!\" And of course we are all interested if not to say anxious for any news on the course of this disease and where it is taking us. What this means is that you will see a unstoppable stream of news stories touting the latest study on one or another aspect of this. Add in the desire of politicians to spin things to their advantage, and you have a recipe for disaster. To keep sane, remember a few basic principles:</p>\r\n\r\n\r\n\r\n<ul><li>One study proves nothing. There are lots of studies, and many of them are one-and-done without having any effect on medical practice. If there is an interesting result, it merely indicates an area for further study.</li><li>Study results are only meaningful when they have withstood peer review and have been replicated by other scientists. This process does produce good results, but only with time. Only in movies do scientists go into the lab and come out 24 hours later with the answer.</li><li>If you really want to know when all of this will end, there are only two answers. It can end very soon with an accompanying loss of life because the virus is still spreading. This is starting to show up in places that ignore the science. Going outside without a mask and carrying on as usual is not brave, it is stupid.</li><li>The other answer is that a gradual relaxation of isolation can happen if it guided by sound science. Unfortunately, as just explained, that sound science is still being sought, and will take time.</li><li>When you see the vast majority of doctors and scientists saying the same thing, that is your best assurance the information is accurate. </li><li>Right now the number one priority is testing, testing, testing.</li></ul>\r\n\r\n\r\n\r\n<p>So, with that background, do we know anything at this point? Yes, we do. But we also have a lot of unanswered questions.</p>\r\n\r\n\r\n\r\n<h2>Second Wave?</h2>\r\n\r\n\r\n\r\n<p>The first big question is whether there will be a second wave, and this is something that every qualified epidemiologist I have heard from says is guaranteed. And the reason is that a certain \"fatigue\" sets in with staying in isolation, and at least some people will convince themselves they don’t need to do it. They are wrong, and they will guarantee that second wave. In the 1918 Flu Pandemic, the second wave was far worse than the first wave. And don’t forget there was a third wave in that pandemic until it petered out in 1920. The best thing you can do is keep isolated if at all possible, and follow all of the guidelines: </p>\r\n\r\n\r\n\r\n<ul><li>Wear a mask if you must go out, such as for groceries.</li><li>Many stores are offering special hours for seniors. If you are one, take advantage.</li><li>After a shopping trip, wash or disinfect items carefully. Remember that soap is all you need to defeat the virus, but use disinfectant wipes when soap is not practical.</li><li>After returning, strip and place all of your clothes in the washer. The detergent should kill any virus that is there.</li><li>Wash your hands with soap frequently.</li><li>Try not to touch your face.</li><li>Maintain at least two meters distance from anyone not in your household when you do go out.</li><li>Try to stay fit. I go for walks in my neighborhood if there aren’t too many others out, and when there is someone else out, I give them a wide separation. I also do gardening in my own yard, and exercise in my home. That won’t prevent you from getting the disease, but it may prevent you from dying of it.</li></ul>\r\n\r\n\r\n\r\n<p>Yeah, this is all of the stuff we have been hearing all along. But annoying as it is, it <em>does</em> work if you do it.</p>\r\n\r\n\r\n\r\n<h2>Is the virus mutating?</h2>\r\n\r\n\r\n\r\n<p>Yes. In other news, water is wet. Face it, mutation is what organisms do, and that has been true for billions of years. The question you really have is \"Is it getting worse?\" And right now the answer is \"We don’t know.\" Sorry I can’t give you any more determinative answer, but we are only at the \"one study\" phase right now, and we are a ways off from the \"peer-reviewed, replicated consensus\" phase that will resolve this. There are indications that at least this virus does not mutate as much as influenza, but even that may require more study.</p>\r\n\r\n\r\n\r\n<h2>Am I Immune?</h2>\r\n\r\n\r\n\r\n<p>We would all love to know if we are immune. This requires two big things to give a good answer. First, does having the disease and then recovering give you immunity? And the sad truth is that we don’t know yet. The common cold is a coronavirus, and you never get immunity. Influenza is a virus, and getting it one year provides no immunity the next. And if getting it once does provide immunity, we still need testing to discover this. The number one priority right now in all locations should be testing, testing, testing. That is the prerequisite for doing any decent epidemiology. There was a report (note: <em>one study</em>) out of South Korea that indicated that some people could get the disease twice, but they re-analyzed the data and decided that it might have been false positives. That is the kind of thing that happens when scientists are trying to do a year’s worth of work in few weeks, which is what they are doing.</p>\r\n\r\n\r\n\r\n<h2>Is It More Infectious Than We Thought?</h2>\r\n\r\n\r\n\r\n<p>Again, very unclear. And even less clear is what this implies. An argument is being made that if the rate of infection is higher, given the number of deaths, that would imply it is less lethal. And that is being used to argue in favor of this not being a big deal, so reopen everything. But to put it in perspective, in the 2017-2018 flu season, which was on the high end of deaths, we had <a href=\"https://www.cdc.gov/flu/about/burden/2017-2018.htm\">61 thousand deaths in the U.S</a>. Today, in just over 2 months, we have 75 thousand deaths in the US, and that is with all of the extraordinary measures we put in place to keep people safe. To make an argument that Covid-19 is no more dangerous than the flu is to be criminally stupid at best.</p>\r\n\r\n\r\n\r\n<h2>Didn’t They Predict More Deaths?</h2>\r\n\r\n\r\n\r\n<p>Why yes, they did. A widely used model in the US is from the Institute for Health Metrics and Evaluation (IHME), at the University of Washington. And they have issued forecasts that ranged from hundreds of thousands of deaths to around 60,000 deaths. Clearly they have no idea what they are doing, right? Not so fast. As the statistician <a href=\"https://en.wikipedia.org/wiki/All_models_are_wrong\">George Box</a> famously said, \"All models are wrong but some are useful\". In this case you have to factor in two things. One is uncertainty, of course. To forecast how many people will die, it helps to know how many people <em>have</em> died, and this has been subject to fierce debate. </p>\r\n\r\n\r\n\r\n<p>And here it gets difficult, since one argument is over what counts as a Covid-19 death. And since every one of our 50 states has their own health reporting system, there is a wide disparity. One example of this is the idea of \"excess deaths\". If a given area has a pretty regular death rate for a number of years, and suddenly that death rate jumps 500% in the midst of a pandemic, it is reasonable to suspect those \"excess deaths\" are a result of the coronavirus. But if those deaths get counted, others will argue that it is inflating the numbers, and that only a positive coronavirus serum test should count. Since each state does this differently, this leads to the odd result that the disease appears more or less lethal depending on your state of residence. And that means politicians have incentive to get the numbers they want.</p>\r\n\r\n\r\n\r\n<p>The other factor complicating things is the phenomenon known as the \"self-preventing\" prophecy. You see, the initial high estimates tended to be \"This is what will happen if you don’t take strong measures\", and of course they were very high. And we know that governments like the UK and the US looked at those predictions, and started to take some stronger measures. So after a little bit, new predictions came out that were lower <em>as a result</em> of those measures. And now we are seeing misguided efforts to get people to go out and resume normal life, and <em>as a result</em> the newest forecasts are going up again. This is a feedback loop, in other words. </p>\r\n\r\n',198,100,0,'CC-BY-SA','Health, Coronavirus',0,0,1),
(3115,'2020-07-10','Pest Control',2291,'Talk about pest control','<ul>\r\n<li><a href=\"https://smile.amazon.com/s?k=Mosquito+Dunk\" class=\"uri\">https://smile.amazon.com/s?k=Mosquito+Dunk</a>\r\n<ul>\r\n<li>essentra ic3 for outdoors (30-90days)</li>\r\n<li>bee Friendly Mavrik Perimeter for indoor/outdoor OR bad for bees 4 oz of bifen (30-90days)</li>\r\n<li>delta dust for cracks / walls etc ( 6 -8 mos nasty stuff … )</li>\r\n<li>Syngenta Advion Cockroach Gel Bait ( only when you have issues with above approach or infestation )</li>\r\n<li><a href=\"https://www.stihlusa.com/products/sprayers/backpack-sprayers/sr450/\" class=\"uri\">https://www.stihlusa.com/products/sprayers/backpack-sprayers/sr450/</a> ( blower I use for outside ~$700USD I spray neighbors for $20USD to create a perimeter around my house :P )</li>\r\n<li>use normal pump sprayer for indoors suggest using a metal tip for finer mist on baseboards etc youtube for best approach… I DO NOT spray surfaces that people touch .. some folks spray ‘safe’ indoor stuff on carpet and couches … I spray under/around/behind</li>\r\n</ul></li>\r\n<li>FULL TANK ( ~3.5 gal )GETS:\r\n<ul>\r\n<li>4 oz of bifen OR .5oz of Mavrik</li>\r\n<li>12 of essentra ic3</li>\r\n</ul></li>\r\n<li>Pump Sprayer gets:\r\n<ul>\r\n<li>1gal water</li>\r\n<li>.5oz bifen or .1 Mavrik</li>\r\n</ul></li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','Pest Control,bugs,DIY,Home Improvement',0,0,1),
(3082,'2020-05-26','RFC 5005 Part 1 – Paged and archived feeds? Who cares?',2108,'An interview with two passionate RFC 5005 fans on how to handle big Atom feeds','<p>This conversation took almost an hour, so I split it into two shows:</p>\r\n\r\n<ul>\r\n  <li>Part 1 talks mostly about the RFC itself, what it means and why.</li>\r\n  <li>Part 2 goes into personal experiences with the RFC and with syndication in general, in particular in the context of web comics. This is part 1.</li>\r\n</ul>\r\n\r\n<h2 id=\"the-why\">The why</h2>\r\n\r\n<p>When serving most RSS/Atom feed readers today, you have to choose: Do you make a complete feed with all the things you ever published, or do you make a shorter feed with just the latest entries?</p>\r\n\r\n<p>This is a trade-off with pros and cons, and it seems like a trade-off you have to make, but a solution to let your Atom feed have the cake and eat it too existed already 13 years ago, if only any of our feed readers would adhere to it: RFC 5005, <em>Feed Paging and Archiving</em></p>\r\n\r\n<h2 id=\"the-what\">The what</h2>\r\n\r\n<p><a href=\"https://tools.ietf.org/html/rfc5005\">https://tools.ietf.org/html/rfc5005</a> was published in September 2007</p>\r\n\r\n<ul>\r\n  <li>The XML namespace for RFC 5005 elements is <code>https://purl.org/syndication/history/1.0</code>, aliased as <code>fh</code> below.</li>\r\n  <li>Section 2 defines the <em>complete feed</em>: It is one document (Atom file) that contains the entire set the feed describes. The document is marked with an <code>fh:complete</code> element.</li>\r\n  <li>Section 3 defines the <em>paged feed</em>: It is a series of documents connected with Atom <code>link</code> elements with <code>rel</code> set to the <em>link relations</em> <code>first</code>, <code>last</code>, <code>previous</code> or <code>next</code>.</li>\r\n  <li>Section 4 defines the <em>archived feed</em>: It has a <em>subscription document</em> that may change at any time, and a series of <em>archive documents</em> that are expected to have stable contents and URIs. The link relations defined are <code>current</code>, <code>prev-archive</code> and <code>next-archive</code>. The semantics are clearer: <code>prev-archive</code> refers to previously published entries, and because the contents are stable you can stop when you see a URI to a document you already have. Archive documents are marked with the <code>fh:archive</code> element.</li>\r\n</ul>\r\n\r\n<h2 id=\"the-who\">The who</h2>\r\n\r\n<p>In this show I’m talking to:</p>\r\n\r\n<h3 id=\"fluffy\">fluffy</h3>\r\n\r\n<ul>\r\n  <li>Federated social web:<br />\r\n<a href=\"https://queer.party/@fluffy\">https://queer.party/@fluffy</a></li>\r\n  <li>Writes and makes things in several creative fields:<br />\r\n<a href=\"https://beesbuzz.biz/\">https://beesbuzz.biz/</a></li>\r\n  <li>Publ is like a static site generator, but dynamic. It produces RFC 5005 archive feeds, of course:<br />\r\n<a href=\"https://publ.beesbuzz.biz/\">https://publ.beesbuzz.biz/</a></li>\r\n  <li>Thoughts on ephemeral content vs content worth archiving and how they relate to protocols:<br />\r\n<a href=\"https://beesbuzz.biz/blog/5709-Keeping-it-personal\">https://beesbuzz.biz/blog/5709-Keeping-it-personal</a></li>\r\n</ul>\r\n\r\n<h3 id=\"jamey\">Jamey</h3>\r\n\r\n<ul>\r\n  <li>Federated social web:<br />\r\n<a href=\"https://toot.cat/@jamey\">https://toot.cat/@jamey</a></li>\r\n  <li>Blog:<br />\r\n<a href=\"https://minilop.net/\">https://minilop.net/</a></li>\r\n  <li>Made a prototype full-history reader that follows RFC 5005 links:<br />\r\n<a href=\"https://reader.minilop.net/\">https://reader.minilop.net/</a></li>\r\n  <li>Made a webcomic reader mostly mentioned in Part 2:<br />\r\n<a href=\"https://www.comic-rocket.com/\">https://www.comic-rocket.com/</a></li>\r\n  <li>Made a WordPress plugin implementing RFC 5005:<br />\r\n<a href=\"https://github.com/jameysharp/wp-fullhistory\">https://github.com/jameysharp/wp-fullhistory</a></li>\r\n  <li>Made an RFC 5005 archive feed synthesizer for sites with a predictable post frequency and URL structure:<br />\r\n<a href=\"https://github.com/jameysharp/predictable/\">https://github.com/jameysharp/predictable/</a><br />\r\nHosted at <a href=\"https://fh.minilop.net/\">https://fh.minilop.net/</a></li>\r\n  <li>Was on HPR 9 years ago, talking about Xorg!<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=0825\">https://hackerpublicradio.org/eps.php?id=0825</a></li>\r\n</ul>\r\n\r\n<h2 id=\"conversation-notes\">Conversation notes</h2>\r\n\r\n<ul>\r\n  <li>Google Reader was terminated 2013-07-01, all subscription data permanently gone on 2013-07-15:<br />\r\n<a href=\"https://www.google.com/reader/about/\">https://www.google.com/reader/about/</a></li>\r\n  <li>Mastodon had Atom feeds with paging, but the feeds went away when OStatus went away:<br />\r\n<a href=\"https://github.com/tootsuite/mastodon/pull/11247\">https://github.com/tootsuite/mastodon/pull/11247</a></li>\r\n  <li>HTML4 does indeed define the HTML link relations:<br />\r\n<a href=\"https://www.w3.org/TR/html4/types.html#h-6.12\">https://www.w3.org/TR/html4/types.html#h-6.12</a><br />\r\nIt has <code>prev</code> rather than the <code>previous</code> of RFC 5005, but mentions that some browsers support <code>previous</code> as an alias.</li>\r\n  <li>HTML5 also defines the HTML link relations:<br />\r\n<a href=\"https://html.spec.whatwg.org/multipage/links.html\">https://html.spec.whatwg.org/multipage/links.html</a><br />\r\nHere <code>previous</code> is a lower-case <em>must</em> for historical reasons.</li>\r\n  <li>IANA manages the Registry of Link Relations:<br />\r\n<a href=\"https://www.iana.org/assignments/link-relations/link-relations.xhtml\">https://www.iana.org/assignments/link-relations/link-relations.xhtml</a><br />\r\nIt references RFC 5005 for the Section 4 relations, but not the Section 3 ones.</li>\r\n  <li>RFC 5005 singles out its own Section 3 (<em>Paged Feeds</em>) as the best-effort, loose, discouraged model.\r\n    <ul>\r\n      <li>Section 3:\r\n        <blockquote>Therefore, clients SHOULD NOT present paged feeds as coherent or complete, or make assumptions to that effect.</blockquote>\r\n      </li>\r\n      <li>Section 4:\r\n        <blockquote>Unlike paged feeds, archived feeds enable clients to do this without losing entries.</blockquote>\r\n      </li>\r\n    </ul>\r\n  </li>\r\n  <li>I’m confused about it in the show, but the RFC is clear that an <em>archived feed</em> has one dynamic <em>subscription document</em>, which points to a chain of immutable <em>archive documents</em>.</li>\r\n  <li>Back in 2002, Aaron Swartz published his joke MIME-header-based <em>RSS 3</em>:<br />\r\n<a href=\"https://www.aaronsw.com/weblog/000574\">https://www.aaronsw.com/weblog/000574</a><br />\r\nThe cultural context at the time and the rivalry between RSS 0.91+, RSS 1.0, RSS 2.0 and Atom deserves a show of its own.</li>\r\n</ul>\r\n',311,0,0,'CC-BY-SA','rss,atom,rfc,interview,feedreader,podcatcher',0,0,1),
(3083,'2020-05-27','Mumbling while on lockdown',3021,'Two Edinburgh-based hosts have a chat from their respective houses','<h2 id=\"introduction\">Introduction</h2>\r\n<p>Two HPR hosts based in Edinburgh got together over Mumble to have a chat during the COVID-19 lockdown.</p>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0201.html\">MrX</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></li>\r\n</ul>\r\n<h2 id=\"apology\">Apology</h2>\r\n<p>Dave’s sound was a bit distorted in this recording. Having had recent problems using the Zoom recorder as a microphone, this time the in-built microphone was resorted to, with even worse results it turned out. See the <a href=\"#sound-processing\">Sound processing</a> section below if you want to know more.</p>\r\n<h2 id=\"notes\">Notes</h2>\r\n<p>Some of the topics we discussed</p>\r\n<ul>\r\n<li>Locations for recording. Ambient noises.</li>\r\n<li>WiFi versus ethernet. Dave has a 5-port switch on his dining table (not 8-port).</li>\r\n<li>ADSL routers</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/NSLU2\" title=\"Linksys NSLU2\">Linksys NSLU2</a> <code>\"</code><em>SLUG</em><code>\"</code></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/SheevaPlug\" title=\"SheevaPlug\">SheevaPlug</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/CUPS\" title=\"Common Unix Printing System\">CUPS</a> - printing and scanning with old non-networked printers</li>\r\n<li><em>Legacy computing experiences</em>:\r\n<ul>\r\n<li>Diablo exchangeable disks</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Line_printer\" title=\"Line printer\">Line printers</a>. Fan-fold 132 column paper</li>\r\n<li>Punched card experiences. Card sequence numbers. <a href=\"https://en.wikipedia.org/wiki/IBM_card_sorter\" title=\"Card sorter\">Card sorters</a>.</li>\r\n<li>Checking disks for warped platters</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Magnetic_tape_data_storage\" title=\"Magnetic tape data storage\">Magnetic tapes</a>; recovering from damage.</li>\r\n</ul></li>\r\n<li>8-track tapes</li>\r\n<li><a href=\"https://mocft.co.uk/\" title=\"Museum of Communication, Burntisland, Fife\">Museum of Communication, Fife</a>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Strowger_switch\" title=\"Strowger switch\">Strowger switch</a> electromechanical stepping switch telephone exchange system</li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/NSLU2\">Linksys NSLU2</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/SheevaPlug\">SheevaPlug</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/CUPS\">CUPS</a> - Common Unix Printing System</li>\r\n<li><a href=\"https://mocft.co.uk/\">Museum of Communication, Burntisland, Fife</a></li>\r\n</ul>\r\n<h3 id=\"sound-processing\">Sound processing</h3>\r\n<p><small> The recording was made in multichannel mode in anticipation of problems. The distorted channel was processed by using the <em>Clip Fix</em> effect in Audacity, which didn’t seem to change much except reduce the sound level. It was also necessary to find and remove sounds produced by the <em>push to talk</em> key presses. Removal meant replacing these sounds by silence so the two channels would not get out of step. After this the two channels were merged together and silences truncated. </small></p>\r\n<p><small> Lessons learned: don’t use a built-in microphone if you can help it! </small></p>\r\n</article>\r\n',225,0,1,'CC-BY-SA','COVID-19,lockdown',0,0,1),
(3081,'2020-05-25','Why do formal verification?',1120,'Tuula talks about testing and formal verification of software','<p>In episode <a href=\"https://hackerpublicradio.org/eps.php?id=3057\">3057</a> I talked about formal verification of software and forgot to mention why one would want to do it. This episode hopefully answers to that.</p>\r\n<p>While formal verification is powerful tool, it’s also rather cumbersome and slow to use. In some cases you’re better off with traditional ways of testing.</p>',364,0,0,'CC-BY-SA','testing, verification, mathematics',0,0,1),
(3079,'2020-05-21','Linux Inlaws S01E06 Porn and Trump',4779,'The lads discuss Audacity, KDEnlive, Blender, PwC, The Current War, Better Things, and Pamela Adlon','<p>This is Linux Inlaws, a series on free and open source software, black humour, the revolution and freedom in general (this includes ideas and software) and generally having fun.</p>\r\n<p>Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.</p>\r\n<p>Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute T-Rexes or other associated dinosaurs.</p>\r\n<p>Links:</p>\r\n<ul>\r\n<li>Audacity: <a href=\"https://www.audacityteam.org\" class=\"uri\">https://www.audacityteam.org</a></li>\r\n<li>Audacity OSX work-around: <a href=\"https://forum.audacityteam.org/viewtopic.php?t=105586\" class=\"uri\">https://forum.audacityteam.org/viewtopic.php?t=105586</a></li>\r\n<li>KDEnlive: <a href=\"https://kdenlive.org\" class=\"uri\">https://kdenlive.org</a></li>\r\n<li>Blender: <a href=\"https://www.blender.org\" class=\"uri\">https://www.blender.org</a></li>\r\n<li>PwC mishap: <a href=\"https://www.theregister.co.uk/2020/05/06/pwc_azure_squatting\" class=\"uri\">https://www.theregister.co.uk/2020/05/06/pwc_azure_squatting</a></li>\r\n<li>The Current War: <a href=\"https://en.wikipedia.org/wiki/The_Current_War\" class=\"uri\">https://en.wikipedia.org/wiki/The_Current_War</a></li>\r\n<li>Rick and Morty: <a href=\"https://www.adultswim.com/videos/rick-and-morty\" class=\"uri\">https://www.adultswim.com/videos/rick-and-morty</a></li>\r\n<li>Better Things: <a href=\"https://en.wikipedia.org/wiki/Better_Things_(TV_series)\" class=\"uri\">https://en.wikipedia.org/wiki/Better_Things_(TV_series)</a></li>\r\n<li>Pamela Adlon: <a href=\"https://twitter.com/pamelaadlon\" class=\"uri\">https://twitter.com/pamelaadlon</a></li>\r\n</ul>',384,111,1,'CC-BY-SA','Audacity, KDEnlive, Blender, PwC mishap, The Current War, Better Things, Pamela Adlon',0,0,1),
(3087,'2020-06-02','Phonetic alphabet',114,'The NATO phonetic alphabet recited once.','<p>The NATO phonetic alphabet. Play this a few times until it\'s ingrained in your memory banks. It\'ll change the way you communicate.</p>\r\n<p>\r\n<a href=\"https://en.wikipedia.org/wiki/NATO_phonetic_alphabet\">Wikipedia</a>\r\n</p>',78,43,0,'CC-BY-SA','nato, alphabet, communication',0,0,1),
(3088,'2020-06-03','Matchbox Restoration Part 2',307,'Second episode discussing restoring Matchbox diecast models Tony talks tools and materials needed ','<h3 id=\"matchbox-hpr-episode-2-equipment\">Matchbox HPR Episode 2 – Equipment</h3>\r\n<p>Hello all those in HPR land. This is Tony Hughes coming to you from Blackpool in the UK. I hope you are all keeping well at the current time of restrictions due to the Corona Virus.</p>\r\n<p>In this the second of my recordings talking about restoring of Matchbox and other Die-cast models, I am going to talk of the equipment you will find essential, and some other things that while at the start you could live without, as you get into the hobby you may find extremely useful.</p>\r\n<p>So the first thing you will need is a drill for drilling the posts out on the model, both to aid in dismantling them and if you plan to reassemble with the aid of small screws, to drill the hole in the post for tapping to accommodating the screws. This can be a hand held wired or cordless drill or if you have a workshop with a drill press, all the better as this can be used in several ways during the reassembly of the models. That is on my wish list as I don’t have one at the moment.</p>\r\n<p>Secondly you will need a set of modelling files for removing the burr on axles, to remove these and the plastic wheels of the base of the model to allow for repainting if required.</p>\r\n<p>Wire brushes for cleaning the remains of any paint that didn’t get removed by the paint stripper.</p>\r\n<p>Hemostat Clamp Tweezers or crocodile clips on a rod, for use to hold the model during spray painting</p>\r\n<p>Additionally, although you can start doing restorations without these, the following will become very useful to help save time and achieve better finishes of the completed restoration.</p>\r\n<p>Rotary Tool, the most well known is the Dremel but there are many other manufacturers of similar tools at more economic cost. However beware you do get what you pay for and you may find buying the cheapest you can find a false economy. My cheap Lidl rotary tool which I have had for a few years but barely used, failed after 5 months of use a few weeks ago. The chuck ring thread striped and it will no longer hold bits in the chuck. The rotary tool makes the removal of the axles a very quick job, and cleaning paint stripped castings with a wire rotary brush is a breeze.</p>\r\n<p>Another thing you may find useful is a small spray booth with an extractor fan and filter for removing over-spray from the area you are painting in if doing this indoors, particularly if your workshop is in the house. Although one YouTube modeller I follow sprays his models on the cooker with the cooker extractor fan on to achieve a similar result when painting indoors.</p>\r\n<p>Finally you may wish to put a compressor and spray gun on your wish list if you get hooked as this gives you a far better range of colours you can paint in, as you can mix your own shades. Some in this community are sticklers for trying to get an exact match to the original colour of the model, others like me at the moment are happy to use shop bought spray paint cans.</p>\r\n<p>Small table vice for holding the model. A set of helping hands for the same during painting, particularly when painting fine details.</p>\r\n<p>So that’s the tools, now the consumables:</p>\r\n<ul>\r\n<li>Gloves – Rubber washing up gloves to protect from some of the chemicals used to strip paint.</li>\r\n<li>Latex gloves for using when spray painting as you have more control while wearing these rather than the looser fitting rubber washing up gloves.</li>\r\n<li>Work gloves to use when drilling or using other tools.</li>\r\n<li>Paint face mask to prevent inhaling fumes.</li>\r\n<li>Paint stripper, I use B&amp;Q’s DIAL own brand paint stripper. I also use caustic soda for the same thing, occasionally one will work when the other failed to remove the paint, it depends on the original paint applied to the model.</li>\r\n<li>Model filler for repairing dents in the casting</li>\r\n<li>Wire wool and several grades of wet and dry sanding paper to smooth models after filler has been used.</li>\r\n<li>Super glue, useful for repairs where a quick setting medium is needed.</li>\r\n<li>Cans of spray paint to repaint the model, both primer and the final colour. You may also want a can or two of a clear coat to give that extra protection after painting or giving a gloss finish if the paint was a matt or satin finish.</li>\r\n<li>Not essential at the start but I also use a UV resin glue that cures very quickly after exposure to a UV light torch, this can be added and cured in layers if needed and remains flexible so can be useful for repairs on cables as well as my modelling.</li>\r\n<li>Finally you need your first model to start work on, these can be found in charity shops, online auction sites or maybe in your loft or garage if you have any of your childhood models kicking around needing to be re-loved.</li>\r\n</ul>\r\n<p>Later in the series I’ll talk about other things you may add to the consumables list as you get more into the hobby. So that’s it for this episode. In the next episode I’ll talk you through me dismantling a model for restoration.</p>\r\n<p>This is Tony Hughes for HPR signing off for this episode. Keep safe and I’ll be back soon.</p>\r\n',338,114,0,'CC-BY-SA','Matchbox Cars, Diecast Models, Restoration, Tools and materials.',0,0,1),
(3089,'2020-06-04','For my Entertainment',425,'How I have my file server and media center put together','<h3>Reasoning.</h3>\r\n<p>I have a file server with Slackware running on a Pi4. I wanted to make the<br />movies and TV Shows easily accessible on the TV without using a DVD or Blu ray<br />player.</p>\r\n<p>It would give my wife and I a chance to sit and watch a show without much<br />fuss. The latest show we are on is Sue Thomas F.B. Eye.<br />The main character, Sue has been deaf from about the age of 4 years.<br />She is adept at reading lips and learned to speak despite being deaf.</p>\r\n<p><a title=\"Sue Thomas F.B. Eye\" href=\"https://en.wikipedia.org/wiki/Sue_Thomas:_F.B.Eye\">https://en.wikipedia.org/wiki/Sue_Thomas:_F.B.Eye</a></p>\r\n<h3>Hardware.</h3>\r\n<p>The Pi4 is enclosed in a stripped out power supply that died on me. The fan<br />still worked, so I wired it to the Pi on the 5v line. It runs at half the<br />speed it was designed for, but that makes it run almost silent. With the<br />heatsinks added, stays about 35C when idle and 50C when encoding video.</p>\r\n<h3>Pi Networking.</h3>\r\n<p>I have 2 Pi\'s connected via ethernet. One is on 192.168.2.5 with a gateway of<br />192.168.2.6, with the other on 192.168.2.6 with a gateway of 192.168.2.5.<br />Essentially just a crossover network. The reason for this is running Kodi on Pi4<br />has choppy video, but is better at running video encoding. So I linked it to a<br />Pi3 to run Kodi via a samba share from the Pi4.</p>\r\n<p>Used OSMC for the kodi interface.<br />It was the distribution that was stable on my Pi and booted right to the Kodi<br />interface.</p>\r\n<p><a title=\"OSMC - Open Source Media Center\" href=\"https://osmc.tv/download/\">https://osmc.tv/download/</a></p>\r\n<p><code>lsblk</code> - List block devices<br /><code>dd status=progress if=osmc.img of=/devsdX</code></p>\r\n<h3>Installing Slackware.</h3>\r\n<p>Get sources<br /><a title=\"Get Slackware ARM\" href=\"https://sarpi.fatdog.eu/index.php?p=getslack\">https://sarpi.fatdog.eu/index.php?p=getslack</a></p>\r\n<pre><code>root@mynixbox:/tmp# mkdir /slackarm\r\nroot@mynixbox:/tmp# mount /dev/sdc1 /slackarm\r\nroot@mynixbox:/tmp# cd /slackarm\r\nroot@mynixbox:/slackarm#</code></pre>\r\n<p>To download Slackware ARM 14.2, type the following at the command prompt:</p>\r\n<p><code>root@mynixbox:/slackarm# rsync -Prv --delete<br />ftp.slackware.uk::slackwarearm/slackwarearm-14.2 .</code></p>\r\n<p>[FatDog says ...] DON\'T forget the period \".\" at the end of the rsync command<br />or it won\'t work!</p>\r\n<p>I made a directory called extras, under the /slackarm directory</p>\r\n<p><a title=\"Sarpi sources for Slackware current\" href=\"https://sarpi.fatdog.eu/index.php?p=rpi4getcurrent\">https://sarpi.fatdog.eu/index.php?p=rpi4getcurrent</a></p>\r\n<p><code>upgradepkg --install-new</code> (for each of these packages, after finishing the main Slackware installation.)</p>\r\n<h5>System Packages</h5>\r\n<p><code>kernel_sarpi4-5.4.40-armv7l-1_slackcurrent_13May20_sp1.txz <br />\r\nkernel-modules-sarpi4-5.4.40-armv7l-1_slackcurrent_13May20_sp1.txz <br />\r\nsarpi4-boot-firmware-armv7l-1_slackcurrent_13May20_sp1.txz\r\nsarpi4-hacks-4.0-armv7l-1_slackcurrent_13May20_sp1.txz</code></p>\r\n<h3>Partitioning example</h3>\r\n<p>After mounting the sd card listed by the lsblk command, run <br />cfdisk /dev/mmcblk0 to partition the card.</p>\r\n<pre><code>mmcblk0 179:0 0 59.5G 0 disk <br />|-mmcblk0p2 179:2 0 4G 0 part [SWAP]<br />|-mmcblk0p3 179:3 0 55.3G 0 part /<br />`-mmcblk0p1 179:1 0 150M 0 part <br />root@slack-server:mark # df -h / <br />Filesystem Size Used Avail Use% Mounted on /dev/root 55G 25G 28G 48% /\r\n\r\nmkfs.vfat /dev/mmcblk0p1<br />mkswap /dev/mmcblk0p2</code></pre>\r\n<h3>Samba snippet</h3>\r\n<pre><code>[MediaServer.Movies]<br />path = /mnt/media2/Movies/<br />writable = no<br />browsable = yes<br />read only = no<br />guest ok = no<br />public = no</code></pre>\r\n<h3>fstab snippet (Kodi)</h3>\r\n<pre><code>//192.168.2.5/MediaServer.Movies /mnt/Movies cifs noauto,users,username=mark,password=*********** 0 0</code></pre>\r\n<h3>Script to connect to the wifi network</h3>\r\n<pre><code>mark@osmc:~$ cat /usr/bin/net.sh<br><br />#!/bin/bash<br />connmanctl enable wifi<br />connmanctl connect wifi_HASH_managed_psk</code></pre>\r\n<h3>Systemd service file</h3>\r\n<pre><code>mark@osmc:~$ cat /lib/systemd/system/net.service<br /><br>[Unit]<br />Description=Wifi network auto connect on boot<br />After=http-time.service\r\n<br>[Service]<br />Type=simple<br />Restart=always<br />ExecStart=/bin/bash /usr/bin/net.sh <br />\r\n[Install]<br />WantedBy=multi-user.target</code></pre>\r\n\r\n<h3>Edit:</h3>\r\n<p>Since I sent the show notes, I had problems using the GUI way to set up<br /> a static IP address on the OSMC section. Here is a more concise way to go about\r\nit.</p>\r\n<p><a href=\"https://discourse.osmc.tv/t/solved-setting-ip-static/1439/14\">https://discourse.osmc.tv/t/solved-setting-ip-static/1439/14</a></p>\r\n<p>It seems OSMC uses connman, so in order to create an ethernet static IP:</p>\r\n<ol>\r\n<li>\r\n<p>Create a config file with your editor:</p>\r\n<pre><code>sudo vim /var/lib/connman/osmc.config\r\n</code></pre>\r\n</li>\r\n<li>\r\n<p>Add the following contents:</p>\r\n<pre><code>[global]\r\nName = OSMC\r\nDescription = OSMC static network configuration\r\n[service_osmc]\r\nType = ethernet\r\nIPv4 = 192.168.0.21/255.255.255.0/192.168.0.1\r\nNameservers = 8.8.8.8,8.8.4.4\r\n</code></pre>\r\n<p>Make sure to change the <code>IPv4</code> line to match your own network/netmask/gateway and <code>Nameservers</code> to use the ones you want.</p>\r\n</li>\r\n<li>\r\n<p>Reboot your RPi or restart the connman service:</p>\r\n<pre><code>sudo systemctl restart connman\r\n</code></pre>\r\n</li>\r\n</ol>\r\n<p>If you opt to restart connman, you&rsquo;ll loose the connection.</p>\r\n',318,0,0,'CC-BY-SA','Raspberry Pi, Kodi, OSMC, Networking, Slackware, Sarpi Project',0,0,1),
(3104,'2020-06-25','HPR AudioBook Club 19 - Tincture: An Apocalyptic Proposition',7607,'The HPR Audiobook Club reviews the audiobook Tincture by Matthew D. Jordan','<h2 id=\"in-this-episode-the-hpr_audiobookclub-discusses-tincture-an-apocalyptic-proposition-written-by-matthew-d-jordan\">In this episode, the HPR_AudioBookClub discusses <a href=\"https://scribl.com/books/PFC12/tincture-an-apocalyptic-proposition\">Tincture: An Apocalyptic Proposition</a> written by Matthew D. Jordan</h2>\r\n<hr />\r\n<h2 id=\"non-spoiler-thoughts\">Non-Spoiler Thoughts</h2>\r\n<hr />\r\n<ul>\r\n<li>If you don\'t like knowing what is going on until halfway through the book, then this book is for you.</li>\r\n<li>The book uses a very interesting type of speech that was all kinda dig.</li>\r\n<li>Some of us liked this book so much that we mainlined the <a href=\"https://scribl.com/books/PCA29/tincture-and-the-devil-pulls-six-guns\">sequel</a> immediately.</li>\r\n<li>This feels a lot like \"The Dark Tower\" series by Stephen King, and even references it.</li>\r\n<li>We talk about the use of Hebrew in the character names in the story.</li>\r\n<li>The music for the book is excellent, and matches the story very well.</li>\r\n<li>How do you make alcohol in the apocalypse?</li>\r\n<li>This also feels a lot like the Fallout games.</li>\r\n<li>The return of PLOT BULLETS!!!!</li>\r\n</ul>\r\n<h2 id=\"beverage-reviews\">Beverage Reviews</h2>\r\n<hr />\r\n<p>As usual, the HPR AudioBook Club took some time to review the beverages that each of us were drinking during the episode</p>\r\n<ul>\r\n<li><strong>Thaj:</strong> Made my own tincture of homemade iced tea and lemonade mixed. Tastes good. Thaj still can\'t grow lemons though :(</li>\r\n<li><strong>x1101:</strong> <a href=\"https://cdn.bourbonbanter.com/wp-content/uploads/2013/07/wildturkeyrarebreedbourbon.jpg?090fad\">Wild Turkey Rare Breed</a></li>\r\n<li><strong>pokey:</strong> I have <a href=\"https://www.beeradvocate.com/beer/profile/10272/39258/\">beer</a> this month it\'s pretty good. I Like it, but I don\'t love it. I also bought a few of the credit card sized tools that we talked about on our last episode. In short they are interesting, but mostly not very useful.</li>\r\n<li><strong>FiftyOneFifty:</strong> <a href=\"https://www.shiner.com/beer/prickly-pear\">Shiner Prickly Pear</a>. This unusual beer came as a complete surprise to me because I was frankly expecting a sweet peary. Instead I was confronted by a very dry, only slightly hoppy (20 IBU) beer without much flavor but a lasting aftertaste that is slightly sweet. Those Shiner boys aren\'t messing around, they make beer with cactus. I really did not enjoy the first beer but by the end of the six it is growing on me. Though it would be refreshing on a hot day, I doubt I will be buying it again.</li>\r\n</ul>\r\n<h2 id=\"things-we-talked-about\">Things We talked about</h2>\r\n<hr />\r\n<ul>\r\n<li>We talk about the connections to \"The Dark Tower\"</li>\r\n<li><a href=\"https://i44.tinypic.com/2ptqn4o.jpg\">\"Blue\" Irons (Marcs/Afulan/Rolands guns)</a></li>\r\n<li><a href=\"https://www.gunblast.com/images/SHOT2003_Day1/DSC05601.jpg\">Another big gun</a></li>\r\n<li>Is this time travel, dimension travel, or something entirely different?</li>\r\n<li>The ties to Judeo-Christian mythology is interesting to Thaj.</li>\r\n<li>Is getting the answers about the setting what you really want?</li>\r\n<li>The book doesn\'t exactly get guns right...</li>\r\n</ul>\r\n<h2 id=\"our-next-audiobook\">Our Next Audiobook</h2>\r\n<hr />\r\n<p><a href=\"https://scribl.com/books/P2A75/quarter-share\">Quarter Share</a> by Nathan Lowell</p>\r\n<h2 id=\"the-next-audiobook-club-recording\">The Next Audiobook Club Recording</h2>\r\n<hr />\r\n<p>Right now we are working through a backlog of older episode that have already been recorded. Once that ends we fully anticipate recording new episodes with listener participation.</p>\r\n<h2 id=\"further-recommendations\">Further Recommendations</h2>\r\n<hr />\r\n<ul>\r\n<li><a href=\"https://www.homewetbar.com/images/prod/flask-set-skull84585.jpg\">Skull Flash</a></li>\r\n<li>That IT life</li>\r\n<li>Automating Android</li>\r\n<li><a href=\"https://play.google.com/store/apps/details?id=com.keramidas.TitaniumBackup&amp;hl=en\">Titanium Backup</a></li>\r\n<li>What happened to Lyle\'s cookbook?</li>\r\n<li>CyanogenMod v. CyanogenOS</li>\r\n<li>Thaj predicts the name change to LineageOS</li>\r\n<li>OpenStreetMap</li>\r\n<li>Automated Cars</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Hill%2BKnowlton_Strategies\">H&amp;K</a></li>\r\n</ul>\r\n<h2 id=\"feedback\">Feedback</h2>\r\n<hr />\r\n<p>Thank you very much for listening to this episode of the HPR AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time we record a new episode. Please leave a few words in the episode\'s comment section.</p>\r\n<p>As always; remember to visit the HPR contribution page HPR could really use your <a href=\"https://hackerpublicradio.org/help_out.php\">help</a> right now.</p>\r\n<p>Sincerely, The HPR Audiobook Club</p>\r\n<p><em>P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.</em></p>\r\n<h2 id=\"our-audio\">Our Audio</h2>\r\n<hr />\r\n<p>This episode was processed using <a href=\"https://audacity.sourceforge.net/\">Audacity</a>. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. Its been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).</p>\r\n<p>We use the \"Truncate Silence\" effect with it\'s default settings to minimize the silence between people speaking. When used with it\'s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.</p>\r\n<p>Next we use the \"Compressor\" effect with the following settings:</p>\r\n<pre><code>Threshold: -30db\r\nNoise Floor: -50db\r\nRatio: 3:1\r\nAttack Time: 0.2sec\r\nDecay Time: 1.0 sec\r\n</code></pre>\r\n<p>\"Make-up Gain for 0db after compressing\" and \"compress based on peaks\" were both left un-checked.</p>\r\n<p>After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.</p>\r\n<p>We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.</p>\r\n<p>At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the <code>.aup</code> file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata.</p>\r\n<p>At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.</p>\r\n<p>Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.</p>\r\n',157,53,1,'CC-BY-SA','HPR Audiobook Club, Audiobooks, SciFi, Western',0,0,1),
(3091,'2020-06-08','fuguserv',2628,'Fuguita OpenBSD server - building a new wifi-router / server','<ul>\r\n<li><p>Where you can go to get your copy of the fuguita OS.<br />\r\n<a href=\"https://fuguita.org\" class=\"uri\">https://fuguita.org</a></p></li>\r\n<li><p>Additional book references.<br />\r\n<a href=\"https://nostarch.com/pf3\" class=\"uri\">https://nostarch.com/pf3</a><br />\r\n<a href=\"https://nostarch.com/obenbsd2e\" class=\"uri\">https://nostarch.com/obenbsd2e</a></p></li>\r\n</ul>\r\n<p>The files I cover in the <code>/etc/</code> directory first..</p>\r\n<p><code>dhclient.conf</code></p>\r\n<pre><code>interface &quot;em0&quot; {\r\n#      ignore domain-name-servers;\r\n      reject 192.168.1.1;\r\n}\r\n#supersede domain-name-servers 127.0.0.1;</code></pre>\r\n<p><code>dhcpd.conf</code></p>\r\n<pre><code>option domain-name-servers 192.168.1.1;\r\nsubnet 192.168.1.0 netmask 255.255.255.0 {\r\n        option routers 192.168.1.1;\r\n        range 192.168.1.40 192.168.1.190;\r\n        host myserver {\r\n                fixed-address 192.168.1.2;\r\n                hardware ethernet 00:00:00:00:00:00;\r\n                }\r\n        host darkstar {\r\n                fixed-address 192.168.1.210;\r\n                hardware ethernet a0:d3:7a:42:aa:1d;\r\n                }\r\n        host zenbig   {\r\n                fixed-address  192.168.1.215;\r\n                hardware ethernet 14:d6:4d:aa:6c:c6;\r\n                }\r\n        host zenstar  {\r\n                fixed-address 192.168.1.205;\r\n                hardware ethernet 2c:6e:85:bf:72:91;\r\n                }\r\n        host mini10   {\r\n                fixed-address 192.168.1.200;\r\n                hardware ethernet 88:25:2C:B2:94:8C;\r\n                }\r\n        host nexus9   {\r\n                fixed-address 192.168.1.195;\r\n                hardware ethernet 44:91:60:9e:d2:73;\r\n                }\r\n        host diningpi {\r\n                fixed-address 192.168.1.197;\r\n                hardware ethernet b8:27:eb:09:bb:1e;\r\n                }\r\n        host think330 {\r\n                fixed-address 192.168.1.193;\r\n                hardware ethernet 50:5B:C2:E5:CA:F5;\r\n                }\r\n        host largedongle1 {\r\n                fixed-address 192.168.1.211;\r\n                hardware ethernet 00:C0:CA:82:EC:30;\r\n                }\r\n        host largedongle2 {\r\n                fixed-address 192.168.1.212;\r\n                hardware ethernet 00:C0:CA:82:E6:29;\r\n                }</code></pre>\r\n<p><code>dhcpd.interfaces</code></p>\r\n<pre><code>athn0</code></pre>\r\n<p><code>hostname.athn0</code></p>\r\n<pre><code>inet            192.168.1.5    255.255.255.0    192.168.1.255\r\nmedia           autoselect\r\nmediaopt        hostap\r\nchan            4\r\nwpa\r\nnwid            fuguserv\r\nwpakey          1234567890ABCD#\r\nup</code></pre>\r\n<p><code>hostname.bridge0</code></p>\r\n<pre><code>add vether0\r\nadd em0\r\nadd athn0\r\nblocknonip vether0\r\nblocknonip em0\r\nblocknonip athn0\r\nup</code></pre>\r\n<p><code>hostname.em0</code></p>\r\n<pre><code>dhcp\r\ninet6 autoconf</code></pre>\r\n<p><code>hostname.vether0</code></p>\r\n<pre><code>inet 192.168.1.1 255.255.255.0 192.168.1.255</code></pre>\r\n<p><code>pf.conf</code></p>\r\n<pre><code>nt_if=&quot;{ vether0 em0 athn0 }&quot;\r\nbroken=&quot;224.0.0.22 127.0.0.0/8 192.168.0.0/16 172.16.0.0/12\r\n        10.0.0.0/8 169.254.0.0/16 192.0.2.0/24\r\n        198.51.100.0/24, 203.0.113.0/24,\r\n        169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32&quot;\r\ntable &lt;bruteforce&gt; persist\r\nset block-policy drop\r\nset loginterface egress\r\nset skip on lo0\r\nmatch in all scrub (no-df random-id max-mss 1440)\r\nmatch out on egress inet from !(egress:network) to any nat-to (egress:0)\r\nantispoof quick for (egress)\r\nblock quick from &lt;bruteforce&gt;\r\nblock in quick on egress from { $broken no-route urpf-failed } to any\r\nblock in quick inet6 all\r\nblock return out quick inet6 all\r\n#block return out quick log on egress proto { tcp udp } from any to any port 53\r\nblock return out quick log on egress from any to { no-route $broken }\r\nblock in all\r\npass out quick inet keep state\r\npass in on $int_if inet\r\npass in on egress inet proto tcp from any to (egress) port 22 keep state (max-src-conn 40, max-src-conn-rate 40/172800 ,overload &lt;bruteforce&gt; flush global)\r\npass in quick on $int_if proto udp from any to ! 192.168.1.1 port 123 rdr-to 192.168.1.1</code></pre>\r\n<p><code>sysctl.conf</code></p>\r\n<pre><code>net.inet.ip.forwarding=1\r\nnet.inet.ip.redirect=0\r\nkern.bufcachepercent=50\r\nnet.inet.ip.ifq.maxlen=1024\r\nnet.inet.tcp.mssdflt=1440\r\nmachdep.allowaperture=2 # See xf86(4)\r\nmachdep.lidaction=0\r\nnet.inet6.ip6.forwarding=0\r\nnet.inet6.ip6.mforwarding=0\r\nhw.smt=1</code></pre>\r\n<p><code>rc.conf.local</code></p>\r\n<pre><code>check_quotas=NO\r\ndhcpd_flags=&quot;vether0&quot;\r\nntpd_flags=&quot;&quot;\r\n#pkg_scripts=dnscrypt_proxy -config /etc/dnscrypt-proxy.toml\r\nsndiod_flags=NO\r\nunbound_flags=&quot;&quot;</code></pre>\r\n<p><code>/var/unbound/etc/unbound.conf</code></p>\r\n<pre><code># $OpenBSD: unbound.conf,v 1.14 2018/12/16 20:41:30 tim Exp $\r\nserver:\r\n    username: _unbound\r\n    directory: /var/unbound\r\n    chroot: /var/unbound\r\n\r\n    interface: 192.168.1.1\r\n    interface: 127.0.0.1\r\n    do-ip6: no\r\n\r\n    access-control: 127.0.0.0/8 allow\r\n    access-control: 192.168.1.0/24 allow\r\n    hide-identity: yes\r\n    hide-version: yes\r\n    do-not-query-localhost: no\r\n\r\n    tcp-upstream: yes\r\n\r\n    private-address: 10.0.0.0/8\r\n    private-address: 172.16.0.0/12\r\n    private-address: 192.168.0.0/16\r\n\r\nremote-control:\r\n        control-enable: yes\r\n        control-use-cert: no\r\n        control-interface: /var/run/unbound.sock\r\n\r\nforward-zone:\r\n    name: &quot;.&quot;\r\n    forward-addr: 127.0.0.1</code></pre>\r\n',377,0,0,'CC-BY-SA','FuguIta, OpenBSD, Wifi-Routers, Servers, Portable, Memory_resident',0,0,1),
(3092,'2020-06-09','Pens, pencils, paper and ink - 2',1256,'Looking at more writing equipment','<h2 id=\"introduction\">Introduction</h2>\r\n<p>This is the second in a short series about pens, pencils, writing paper and ink. In this episode we will look at three more fountain pens (two lower-priced and one around £50), a mechanical pencil and some paper.</p>\r\n<h2 id=\"long-notes\">Long notes</h2>\r\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"https://hackerpublicradio.org/eps/hpr3092/full_shownotes.html\">viewed here</a>.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Pen brands:\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Kaweco\">Kaweco</a> Wikipedia page</li>\r\n<li><a href=\"https://www.mrpen.co.uk/contents/en-uk/d184.html\">Italix</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Uni-ball\">uni-ball</a> Wikipedia page (maker of Kuru Toga)</li>\r\n</ul></li>\r\n<li>Reviews:\r\n<ul>\r\n<li>The Well Appointed Desk: <a href=\"https://www.wellappointeddesk.com/2020/02/pen-review-platinum-prefounte-fountain-pen/\">Platinum Prefounte</a></li>\r\n</ul></li>\r\n<li>Calligraphy Skills\r\n<ul>\r\n<li><a href=\"https://www.calligraphy-skills.com/italic-calligraphy.html\">Italic calligraphy</a></li>\r\n<li><a href=\"https://www.calligraphy-skills.com/italic-lettering.html\">Italic lettering</a></li>\r\n</ul></li>\r\n<li>Paper brands:\r\n<ul>\r\n<li><a href=\"https://www.bloc-rhodia.com/index-en.html\">Rhodia</a></li>\r\n</ul></li>\r\n<li>HPR links:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1941\">hpr1941 :: What’s in my case</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2061\">hpr2061 :: Handwriting</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2273\">hpr2273 :: Fountain Pens</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=3063\">hpr3063 :: Pens, pencils, paper and ink - 1</a></li>\r\n</ul></li>\r\n</ul>\r\n',225,112,1,'CC-BY-SA','fountain pen,mechanical pencil,paper',0,0,1),
(3093,'2020-06-10','Response to Linux Inlaws S01E06 (hpr 3079) on NeXT',430,'Response to Linux Inlaws S01E06 (hpr 3079) regarding NeXT, NeXTSTEP, and what would become Mac OS X.','<p>Some clarification on NeXT as I ramble on about all things NeXT, what would become \"Mac OS X\" (now \"macOS\"), and a harbinger of what was to come.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/NeXTSTEP\" class=\"uri\">https://en.wikipedia.org/wiki/NeXTSTEP</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/NeXT_Computer#Legacy\" class=\"uri\">https://en.wikipedia.org/wiki/NeXT_Computer#Legacy</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/OpenStep\" class=\"uri\">https://en.wikipedia.org/wiki/OpenStep</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Rhapsody_(operating_system)\" class=\"uri\">https://en.wikipedia.org/wiki/Rhapsody_(operating_system)</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Darwin_(operating_system)\" class=\"uri\">https://en.wikipedia.org/wiki/Darwin_(operating_system)</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/A/UX\" class=\"uri\">https://en.wikipedia.org/wiki/A/UX</a></li>\r\n</ul>',152,0,0,'CC-BY-SA','NeXT, NeXTSTEP, OPENSTEP, Rhapsody, Darwin, MacOSX, OSX, macOS, AUX',0,0,1),
(3098,'2020-06-17','Matchbox Restoration Part 3',191,'In this the 3rd in the series Tony discusses dismantling the castings of the MK10 Jaguar','<h2 id=\"hpr-matchbox-show-episode-3\">HPR Matchbox show Episode 3</h2>\r\n<p>Good day to all in HPR land, this is Tony Hughes coming to you again from Blackpool in the UK. To recap this is the 3rd in a series of shows about my hobby of restoring Matchbox and other Die-cast models. In the first 2 shows I introduced the concept and discussed the tools and other equipment you would need to start this hobby.</p>\r\n<p>In this episode I have decided to return to where it all started with the Matchbox No28 the Jaguar Mk10. Please refer to the show notes for the pictures of the process as we move along. You can see in the first picture the 4 castings used in this process.</p>\r\n<p>Picture 000:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3098/img_000.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3098/img_000_thumbnail.jpg\" alt=\"Picture 000\" /></a></p>\r\n<p>This is a lovely little casting and is a nice introduction to the techniques used in the process. Also I have several of these that I can strip down to their components and that should give us enough quality parts to reassemble at least one good example, hopefully one or two more.</p>\r\n<p>The next picture shows you the base of the model and that there is a mushroomed post that needs to be drilled out at the rear of the model, the front of the base is retained by a tab, which once the post is removed and the base released, this can be slid forward to free the tab.</p>\r\n<p>Picture 001:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3098/img_001.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3098/img_001_thumbnail.jpg\" alt=\"Picture 001\" /></a></p>\r\n<p>I drilled out this post. The post is drilled out with a 4mm drill bit, and as you can see in the next picture on this particular casting I was a little over zealous and damaged the base a little, although as it is the base it’s not a major issue.</p>\r\n<p>Picture 003:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3098/img_003.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3098/img_003_thumbnail.jpg\" alt=\"Picture 003\" /></a></p>\r\n<p>I then released the base by prying it off the remainder of the post with a small flat bladed screwdriver to lever it of the body. This now allowed the removal of the inner plastic forming the seating and holding a small plastic suspension piece. In the next picture you can see the casting without any internals but with the plastic window unit still held in place with another shallow mushroom post.</p>\r\n<p>Picture 005:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3098/img_005.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3098/img_005_thumbnail.jpg\" alt=\"Picture 005\" /></a></p>\r\n<p>Being very careful not to be too aggressive drilling this mushroom holding the windscreen unit, it is removed, again with a 4mm drill bit, so that a little pressure from a flat blade slid between the roof and the glassing unit will allow it to pop out without it breaking. It usually takes several attempts of a little drilling, trying with the flat blade, then if not coming free, a little more drilling until it pops off.</p>\r\n<p>Picture 006:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3098/img_006.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3098/img_006_thumbnail.jpg\" alt=\"Picture 006\" /></a></p>\r\n<p>Picture 006x:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3098/img_006x.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3098/img_006x_thumbnail.jpg\" alt=\"Picture 006x\" /></a></p>\r\n<p>This process was repeated with the other 3 castings and the result is shown in the next picture</p>\r\n<p>Picture 008:<br />\r\n<a href=\"https://hackerpublicradio.org/eps/hpr3098/img_008.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3098/img_008_thumbnail.jpg\" alt=\"Picture 008\" /></a></p>\r\n<p>As you can see the casting on the upper left of the image still has the bonnet (Hood) attached, this would not come off without me risking damaging it, so I was hoping that once the paint is removed that this will help it to come free. You will have to wait for the next instalment to find out what happened next. I’ve got to keep you wanting some more of this rambling tale.</p>\r\n<p>So until next time this is Tony Hughes saying goodbye to all those in HPR land. Keep safe until the next instalment.</p>\r\n',338,114,0,'CC-BY-SA','Matchbox Cars, Diecast Models, Restoration, dismantling the model',0,0,1),
(3094,'2020-06-11','Holy crud! I have a kinesis advantage 2 keyboard!',275,'Sigflup does a review of the Kinesis Advantage 2 keyboard','<h3>Kinesis Advantage 2 Keyboard</h3>\r\n\r\n<p><img src=\"https://theadesilva.com/keyboard.jpg\" alt=\"Kinesis Advantage 2 Keyboard\"/></p>',115,0,0,'CC-BY-SA','keyboards',0,0,1),
(3097,'2020-06-16','Linux Inlaws S01E07 The Big Blue Button',3895,'The lads talk to Fred Dixon, product manager for BigBlueButton.','<p>In this episode our two chaps welcome Fred Dixon, product manager for BigBlueButton, on the show to talk about the project, its history and if it will finally run on Fedora and CentOS.</p>\r\n<p>Surrounding musings include how to hack the GDM login screen, why Martin is <i>not</i> behind the recent Easyjet hack and poxes as well as anti-poxes.</p>\r\n<h2>Shownotes:</h2>\r\n<ul>\r\n<li>BigBlueButton: <a href=\"https://bigbluebutton.org\" target=_blank>https://bigbluebutton.org</a></li>\r\n<li><a href=\"https://www.theregister.co.uk/2020/05/19/easyjet_hack_9million_2000_credit_cards\" target=_blank>The Easyjet hack</a></li>\r\n<li>How to hack the GDM login screen in Focal Fossa: <a href=\"https://github.com/PRATAP-KUMAR/focal_gdm3_login_theme_complete_hack\" target=_blank>https://github.com/PRATAP-KUMAR/focal_gdm3_login_theme_complete_hack</a></li>\r\n<li>The Ubuntu logo for the GDM3 login screen for Focal Fossa and previous Ubuntu versions can be found at: /usr/share/plymouth/ubuntu-logo.png. Simply truncate this to zero bytes and the logo will be gone from the login screen</li>\r\n<li>Virgy\'s open source website: <a href=\"https://www.websiteplanet.com/blog/what-is-open-source-software\" target=_blank>https://www.websiteplanet.com/blog/what-is-open-source-software</a></li>\r\n</ul>\r\n',384,111,1,'CC-BY-SA','BigBlueButton, GDM, Focal Fossa, Ubuntu',0,0,1);
