(3131,'2020-08-03','HPR Community News for July 2020',7227,'Warning Ken and Dave discuss some disturbing agricultural practices. Listener discretion is advised.','<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=3108\" target=\"_blank\">3108</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3108\" target=\"_blank\">Fuguita as a Desktop</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=3109\" target=\"_blank\">3109</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3109\" target=\"_blank\">Matchbox Restoration Part 4</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3110\" target=\"_blank\">3110</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3110\" target=\"_blank\">Finding an Android phone to run LineageOS</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=3111\" target=\"_blank\">3111</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-07-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3111\" target=\"_blank\">HPR Community News for June 2020</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=3112\" target=\"_blank\">3112</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-07-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3112\" target=\"_blank\">finishing the frame on the long wheelbase recumbent</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=3113\" target=\"_blank\">3113</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3113\" target=\"_blank\">OpenJDK 15 - Unsafe Garbage</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=3114\" target=\"_blank\">3114</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3114\" target=\"_blank\">Using the Akaso EK7000 Pro</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=3115\" target=\"_blank\">3115</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3115\" target=\"_blank\">Pest Control</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=3116\" target=\"_blank\">3116</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-07-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3116\" target=\"_blank\">Unscripted ramblings on a walk:  Crisis at The Manor</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0241.html\" target=\"_blank\">Christopher M. Hobbs</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3117\" target=\"_blank\">3117</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-07-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3117\" target=\"_blank\">The joy of retro computing</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0111.html\" target=\"_blank\">knightwise</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3118\" target=\"_blank\">3118</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3118\" target=\"_blank\">Linux Inlaws S01E10 The Python Bumper 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=3119\" target=\"_blank\">3119</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3119\" target=\"_blank\">Converting to FFS2</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=3120\" target=\"_blank\">3120</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3120\" target=\"_blank\">How open are roleplaying games?</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3121\" target=\"_blank\">3121</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-07-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3121\" target=\"_blank\">Opposing Views on Tattoos</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0215.html\" target=\"_blank\">Windigo</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3122\" target=\"_blank\">3122</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-07-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3122\" target=\"_blank\">Devuan review - and commentary</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=3123\" target=\"_blank\">3123</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3123\" target=\"_blank\">Arduino controlled Christmas lights</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=3124\" target=\"_blank\">3124</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3124\" target=\"_blank\">Matchbox Restoration Part 5</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3125\" target=\"_blank\">3125</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3125\" target=\"_blank\">GIMP: The Canvas</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=3126\" target=\"_blank\">3126</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-07-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3126\" target=\"_blank\">Metrics part II</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3127\" target=\"_blank\">3127</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-07-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3127\" target=\"_blank\">HPR AudioBook Club 20 - Quarter Share</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0157.html\" target=\"_blank\">HPR_AudioBookClub</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3128\" target=\"_blank\">3128</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3128\" target=\"_blank\">Linux Inlaws S01E11 The Python Bumper 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=3129\" target=\"_blank\">3129</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3129\" target=\"_blank\">Followup on HPR3122</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=3130\" target=\"_blank\">3130</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3130\" target=\"_blank\">More Quick Tips</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</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 33 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 5 comments on\n3 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2774#comments\" target=\"_blank\">hpr2774</a></strong>\n(2019-03-21) \"<em>CJDNS and Yggdrasil</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0374.html\" target=\"_blank\">aldenp</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2774#6\" target=\"_blank\">Comment 6</a>:\nSam on 2020-07-19:\n\"hpr2774 :: CJDNS and Yggdrasil\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3097#comments\" target=\"_blank\">hpr3097</a></strong>\n(2020-06-16) \"<em>Linux Inlaws S01E07 The Big Blue Button</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>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3097#1\" target=\"_blank\">Comment 1</a>:\nan anonymous listener on 2020-07-02:\n\"free software licensing\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3097#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-07-02:\n\"Good interview\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3106#comments\" target=\"_blank\">hpr3106</a></strong>\n(2020-06-29) \"<em>Linux Inlaws S01E09 Postgres</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>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3106#1\" target=\"_blank\">Comment 1</a>:\nBob on 2020-07-03:\n\"Levels\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3106#2\" target=\"_blank\">Comment 2</a>:\nBruce Momjian on 2020-07-07:\n\"Amazon\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 28 comments on 12 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3108#comments\" target=\"_blank\">hpr3108</a></strong>\n(2020-07-01) \"<em>Fuguita as a Desktop</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=3108#1\" target=\"_blank\">Comment 1</a>:\nLuna Jernberg on 2020-07-01:\n\"Firefox Flatpak\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3108#2\" target=\"_blank\">Comment 2</a>:\nKlaatu on 2020-07-27:\n\"SD Card + encrypted hard drive\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3109#comments\" target=\"_blank\">hpr3109</a></strong>\n(2020-07-02) \"<em>Matchbox Restoration Part 4</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3109#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2020-07-04:\n\"Very cool topic\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3111#comments\" target=\"_blank\">hpr3111</a></strong>\n(2020-07-06) \"<em>HPR Community News for June 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><li><a href=\"https://hackerpublicradio.org/eps.php?id=3111#1\" target=\"_blank\">Comment 1</a>:\ncrvs on 2020-07-07:\n\"On math @ HPR\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3115#comments\" target=\"_blank\">hpr3115</a></strong>\n(2020-07-10) \"<em>Pest Control</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=3115#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-07-12:\n\"surprise\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3116#comments\" target=\"_blank\">hpr3116</a></strong>\n(2020-07-13) \"<em>Unscripted ramblings on a walk:  Crisis at The Manor</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0241.html\" target=\"_blank\">Christopher M. Hobbs</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3116#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-07-13:\n\"network\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3116#2\" target=\"_blank\">Comment 2</a>:\nWindigo on 2020-07-14:\n\"Co-op hosting\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3116#3\" target=\"_blank\">Comment 3</a>:\nbk on 2020-07-15:\n\"Please tell us about how you built the Manor\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3117#comments\" target=\"_blank\">hpr3117</a></strong>\n(2020-07-14) \"<em>The joy of retro computing</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0111.html\" target=\"_blank\">knightwise</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3117#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-07-15:\n\"computer learning today\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3118#comments\" target=\"_blank\">hpr3118</a></strong>\n(2020-07-15) \"<em>Linux Inlaws S01E10 The Python Bumper 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=3118#1\" target=\"_blank\">Comment 1</a>:\nGuido on 2020-07-15:\n\"Nice episode on a weird language\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3119#comments\" target=\"_blank\">hpr3119</a></strong>\n(2020-07-16) \"<em>Converting to FFS2</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=3119#1\" target=\"_blank\">Comment 1</a>:\nan anonymous listener on 2020-07-23:\n\"security is hard\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3119#2\" target=\"_blank\">Comment 2</a>:\nGumnos on 2020-07-29:\n\"OpenBSD on a Mini10\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3121#comments\" target=\"_blank\">hpr3121</a></strong>\n(2020-07-20) \"<em>Opposing Views on Tattoos</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0215.html\" target=\"_blank\">Windigo</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3121#1\" target=\"_blank\">Comment 1</a>:\nKlaatu on 2020-07-29:\n\"Team Mrs. Honeyhume\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3121#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-07-31:\n\"I have an aversion to tattoos\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3122#comments\" target=\"_blank\">hpr3122</a></strong>\n(2020-07-21) \"<em>Devuan review - and commentary</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=3122#1\" target=\"_blank\">Comment 1</a>:\nbittin on 2020-07-21:\n\"Politics\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#2\" target=\"_blank\">Comment 2</a>:\nDan on 2020-07-21:\n\"Purposely misleading episode\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#3\" target=\"_blank\">Comment 3</a>:\nKen Fallon on 2020-07-21:\n\"Updated show notes\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#4\" target=\"_blank\">Comment 4</a>:\ndraxil on 2020-07-21:\n\"Very interesting listen\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#5\" target=\"_blank\">Comment 5</a>:\nb-yeezi on 2020-07-22:\n\"Interesting but misleading title\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#6\" target=\"_blank\">Comment 6</a>:\nKo on 2020-07-23:\n\"Misuse of HPR\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#7\" target=\"_blank\">Comment 7</a>:\nKen Fallon on 2020-07-24:\n\"Apologies to Zen_Floater2\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#8\" target=\"_blank\">Comment 8</a>:\nx on 2020-07-26:\n\"Good!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#9\" target=\"_blank\">Comment 9</a>:\nigottrolledintolisteningtothis on 2020-07-27:\n\"Title should be\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#10\" target=\"_blank\">Comment 10</a>:\nbrian-in-ohio on 2020-07-31:\n\"the ruling\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3126#comments\" target=\"_blank\">hpr3126</a></strong>\n(2020-07-27) \"<em>Metrics part II</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3126#1\" target=\"_blank\">Comment 1</a>:\nDave Morriss on 2020-07-29:\n\"Etymology of \'geodesic\'\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3126#2\" target=\"_blank\">Comment 2</a>:\nsesamemucho on 2020-07-31:\n\"Special thanks\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3129#comments\" target=\"_blank\">hpr3129</a></strong>\n(2020-07-30) \"<em>Followup on HPR3122</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=3129#1\" target=\"_blank\">Comment 1</a>:\nJan on 2020-07-30:\n\"Zen_Floater2  asked for Comments  on \"Explicit or not\"\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3129#2\" target=\"_blank\">Comment 2</a>:\nbrian-in-ohio on 2020-07-31:\n\"supreme court ruling\"</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/2020-July/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-July/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 contributors for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a>, <a href=\"https://hackerpublicradio.org/correspondents/0382.html\">Daniel Persson</a></b></p>\n<p>Over the period tags and/or summaries have been added to 81 shows which were without them.</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),
(2819,'2019-05-23','Reply to Knightwise - podcasts',493,'I provide a slightly different view on podcasts to that recently given by Knightwise.','<p>Knightwise, in <a href=\"https://hackerpublicradio.org/eps.php?id=2798\">HPR 2798</a>, made the argument that podcasts are better if they are done by \"pirates\", i.e. not by corporations, but by individuals with something to say. While I see some merit in this view, I think the more significant feature of podcasts is that it gets us away from \"broadcasting\" (shows aimed at the lowest common denominator) and towards \"narrowcasting\", an environment where small niche interests can find an audience and thrive since podcasting does not require a lot of resources. But I do appreciate the chance to hear some radio programs that I would not otherwise be able to listen to when they are offered as podcasts.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.npr.org/podcasts/583350334/science-friday\" class=\"uri\">https://www.npr.org/podcasts/583350334/science-friday</a></li>\r\n<li><a href=\"https://www.bbc.co.uk/programmes/b00snr0w\" class=\"uri\">https://www.bbc.co.uk/programmes/b00snr0w</a></li>\r\n<li><a href=\"https://www.palain.com\" class=\"uri\">https://www.palain.com</a></li>\r\n</ul>',198,75,0,'CC-BY-SA','podcasts, narrowcasting, broadcasting',0,0,1),
(2849,'2019-07-04','2018-2019 New Years Eve show part 5',7759,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 5</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019</p>\r\n<ul>\r\n<li>Sans Holiday Hack Challenge<br />\r\n<a href=\"https://www.holidayhackchallenge.com/2018/\">https://www.holidayhackchallenge.com/2018/</a></li>\r\n<li>Hack The Box<br />\r\n<a href=\"https://www.hackthebox.eu/\">https://www.hackthebox.eu/</a></li>\r\n<li>Over the Wire<br />\r\n<a href=\"https://overthewire.org/wargames/\">https://overthewire.org/wargames/</a></li>\r\n<li>Under the Wire<br />\r\n<a href=\"https://underthewire.tech/\">https://underthewire.tech/</a></li>\r\n<li>Gnome Boxes<br />\r\n<a href=\"https://en.wikipedia.org/wiki/GNOME_Boxes\">https://en.wikipedia.org/wiki/GNOME_Boxes</a></li>\r\n<li>Talking about headsets</li>\r\n<li>Mobile operating systems</li>\r\n<li>Plasma Mobile<br />\r\n<a href=\"https://www.plasma-mobile.org/\">https://www.plasma-mobile.org/</a></li>\r\n<li>Kansas Linux Fest<br />\r\n<a href=\"https://kansaslinuxfest.org/\">https://kansaslinuxfest.org/</a></li>\r\n<li>FreeNas<br />\r\n<a href=\"https://freenas.org/?\">https://freenas.org/</a></li>\r\n<li>Talking Desktop Environments</li>\r\n<li>GPD mini laptops<br />\r\n<a href=\"https://www.gpd.hk/\">https://www.gpd.hk/</a></li>\r\n<li>Gemini PDA<br />\r\n<a href=\"https://www.indiegogo.com/projects/gemini-pda-android-linux-keyboard-mobile-device--2#/\">https://www.indiegogo.com/projects/gemini-pda-android-linux-keyboard-mobile-device--2#/</a></li>\r\n<li>usb-c<br />\r\n<a href=\"https://en.wikipedia.org/wiki/USB-C\">https://en.wikipedia.org/wiki/USB-C</a></li>\r\n<li>Talking uefi<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface\">https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface</a></li>\r\n<li>Boxing day<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Boxing_Day\">https://en.wikipedia.org/wiki/Boxing_Day</a></li>\r\n<li>UK vs US</li>\r\n<li>More Brexit talk<br />\r\n<a href=\"https://www.bbc.com/news/uk-politics-32810887\">https://www.bbc.com/news/uk-politics-32810887</a></li>\r\n<li>year 2038 problem<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Year_2038_problem\">https://en.wikipedia.org/wiki/Year_2038_problem</a></li>\r\n<li>LXQT desktop<br />\r\n<a href=\"https://lxqt.org/\">https://lxqt.org/</a></li>\r\n<li>Enlightenment desktop<br />\r\n<a href=\"https://www.enlightenment.org/\">https://www.enlightenment.org/</a></li>\r\n<li>gnome boxes<br />\r\n<a href=\"https://wiki.gnome.org/Apps/Boxes\">https://wiki.gnome.org/Apps/Boxes</a></li>\r\n</ul>\r\n\r\n\r\n',159,121,1,'CC-BY-SA','HPR new years show, new years, community',0,0,1),
(2850,'2019-07-05','NIST Cybersecurity Framework',1702,'What NIST suggests as a framework to improve security at the  Enterprise level','<p>The National Institute of Standards and Technology of the US Government issued the NIST Cybersecurity Framework, which has recommendations for private companies and mandates for U.S. Government agencies. For people who work in information security in an Enterprise environment, this framework may be of interest, so we will take a walk through it.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/National_Institute_of_Standards_and_Technology\" class=\"uri\">https://en.wikipedia.org/wiki/National_Institute_of_Standards_and_Technology</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/NIST_Cybersecurity_Framework\" class=\"uri\">https://en.wikipedia.org/wiki/NIST_Cybersecurity_Framework</a></li>\r\n<li><a href=\"https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.04162018.pdf\" class=\"uri\">https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.04162018.pdf</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=997\" class=\"uri\">https://www.zwilnik.com/?page_id=997</a></li>\r\n</ul>',198,74,0,'CC-BY-SA','Enterprise, Security',0,0,1),
(2860,'2019-07-19','Encryption and Quantum Computing',757,'How will quantum computing affect the security of encryption?','<p>The Quantum Computer is supposed to be a game changer that renders encryption useless. But is this true? We look at how quantum computing will affect encryption going forward, and show that we are already working on quantum-resistant encryption.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=530\" class=\"uri\">https://www.zwilnik.com/?page_id=530</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1620\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=1620</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Utah_Data_Center\" class=\"uri\">https://en.wikipedia.org/wiki/Utah_Data_Center</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Quantum_computing\" class=\"uri\">https://en.wikipedia.org/wiki/Quantum_computing</a></li>\r\n<li><a href=\"https://csrc.nist.gov/Projects/Post-Quantum-Cryptography\" class=\"uri\">https://csrc.nist.gov/Projects/Post-Quantum-Cryptography</a></li>\r\n<li><a href=\"https://www.nist.gov/programs-projects/information-security-and-privacy-advisory-board-ispab\" class=\"uri\">https://www.nist.gov/programs-projects/information-security-and-privacy-advisory-board-ispab</a></li>\r\n<li><a href=\"https://csrc.nist.gov/Projects/Post-Quantum-Cryptography/Round-2-Submissions\" class=\"uri\">https://csrc.nist.gov/Projects/Post-Quantum-Cryptography/Round-2-Submissions</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=999\" class=\"uri\">https://www.zwilnik.com/?page_id=999</a></li>\r\n</ul>',198,74,0,'CC-BY-SA','Encryption, Quantum Computing',0,0,1),
(2870,'2019-08-02','Hierarchy of Evidence',865,'All studies are not the same. Some are better than others.','<p>The idea of a Hierarchy of Evidence is that there is a ranking of studies of different kinds in terms of how persuasive they are. It is not enough to simply say that “A study shows…” without also looking at what kind of study it is how powerful the results are. We look at the different kinds of studies and rank them from top to bottom.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Hierarchy_of_evidence\" class=\"uri\">https://en.wikipedia.org/wiki/Hierarchy_of_evidence</a></li>\r\n<li><a href=\"https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2707010/\" class=\"uri\">https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2707010/</a></li>\r\n<li><a href=\"https://www.phru.nhs.uk/casp/rcts.htm\" class=\"uri\">https://www.phru.nhs.uk/casp/rcts.htm</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Cohort_study\" class=\"uri\">https://en.wikipedia.org/wiki/Cohort_study</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Framingham_Heart_Study\" class=\"uri\">https://en.wikipedia.org/wiki/Framingham_Heart_Study</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Case-control_studies\" class=\"uri\">https://en.wikipedia.org/wiki/Case-control_studies</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Cross-sectional_study\" class=\"uri\">https://en.wikipedia.org/wiki/Cross-sectional_study</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Case_reports\" class=\"uri\">https://en.wikipedia.org/wiki/Case_reports</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</ul>',198,100,0,'CC-BY-SA','Health, Medicine, Evidence, Science, Studies',0,0,1),
(2880,'2019-08-16','Evaluating a Study',861,'We\'ve developed the standards to judge, so now let\'s do an example!','<p>We take the ideas we have developed over the previous episodes and use them to evaluate a a study I found online. These are things anyone can do with just a little work on Google, and the payoff is to have a good idea of whether or not you are looking at a quality study</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.medicalnewstoday.com/\" class=\"uri\">https://www.medicalnewstoday.com/</a></li>\r\n<li><a href=\"https://www.medicalnewstoday.com/articles/324558.php\" class=\"uri\">https://www.medicalnewstoday.com/articles/324558.php</a></li>\r\n<li><a href=\"https://mediabiasfactcheck.com/medical-news-today/\" class=\"uri\">https://mediabiasfactcheck.com/medical-news-today/</a></li>\r\n<li><a href=\"https://www.quora.com/How-can-I-find-a-replication-of-a-study\" class=\"uri\">https://www.quora.com/How-can-I-find-a-replication-of-a-study</a></li>\r\n<li><a href=\"https://en.m.wikipedia.org/wiki/Web_of_Science\" class=\"uri\">https://en.m.wikipedia.org/wiki/Web_of_Science</a></li>\r\n<li><a href=\"https://www.nature.com/articles/s41551-019-0356-9#MOESM1\" class=\"uri\">https://www.nature.com/articles/s41551-019-0356-9#MOESM1</a></li>\r\n<li><a href=\"https://www.nature.com/natbiomedeng/\" class=\"uri\">https://www.nature.com/natbiomedeng/</a></li>\r\n<li><a href=\"https://www.nature.com/articles/s41551-019-0356-9\" class=\"uri\">https://www.nature.com/articles/s41551-019-0356-9</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=404\" class=\"uri\">https://www.palain.com/?page_id=404</a></li>\r\n</ul>',198,100,0,'CC-BY-SA','Health, Medicine, Evidence, Science, Studies',0,0,1),
(2855,'2019-07-12','2018-2019 New Years Eve show part 6',8486,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 6</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019</p>\r\n<ul>\r\n<li>The Makerz Podcast<br />\r\n<a href=\"https://podnutz.com/category/themakerz/\">https://podnutz.com/category/themakerz/</a></li>\r\n<li>Tronxy X1<br />\r\n<a href=\"https://all3dp.com/1/tronxy-x1-3d-printer-review/\">https://all3dp.com/1/tronxy-x1-3d-printer-review/</a></li>\r\n<li>SBC talk</li>\r\n<li>Apple Talk</li>\r\n<li>Linux on mobile</li>\r\n<li>more 3d printing talk</li>\r\n<li><a href=\"https://www.newmodeus.com/shop/\">https://www.newmodeus.com/shop/</a></li>\r\n<li>new years food traditions</li>\r\n<li>Cats</li>\r\n<li>The Last Centurion<br />\r\n<a href=\"https://www.amazon.com/Last-Centurion-John-Ringo/dp/1439132917\">https://www.amazon.com/Last-Centurion-John-Ringo/dp/1439132917</a></li>\r\n<li><a href=\"https://www.chewy.com/\">https://www.chewy.com/</a></li>\r\n</ul>',159,121,1,'CC-BY-SA','HPR new years show, new years, community',1,0,1),
(2832,'2019-06-11','How I got started in Linux',168,'This is a very brief introduction on what got me into using Linux.','<p>This is just a brief intro into my introduction to Linux.</p>\r\n',378,29,0,'CC-BY-SA','linux, introduction',0,0,1),
(2836,'2019-06-17','Interview with Wendy Hill',1576,'In this episode, Yannick talks with Wendy Hill about her use of opensource software in her job','<p>Wendy Hill is a photographer. And by that, I don’t mean she takes pictures of her kids on Sundays at the baseball game. Although, if she was to do that, it would probably turn out to be great pictures. No, Wendy is a professional photographer, and to run her business, she uses free and opensource software.</p>\r\n<p>Wait… no Photoshop? No Illustrator? How is that possible? Wendy joined me on Mumble earlier this year – that’s 2019 for you, visitors from the future – and we discussed about that.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.wendyhillphoto.com/\" class=\"uri\">https://www.wendyhillphoto.com/</a></li>\r\n<li><a href=\"https://launchpad.net/lubuntu\" class=\"uri\">https://launchpad.net/lubuntu</a></li>\r\n</ul>\r\n',370,78,0,'CC-BY-SA','opensource,photography,lubuntu,darktable,Rapid Photo Downloader,displaycal,gimp',0,0,1),
(2831,'2019-06-10','Interview with Robbie Ferguson',2347,'In this episode, Yannick talks with Robbie Ferguson about the Nagios Enterprise Monitoring System','<p>When it comes to monitoring your network, and the machines on it, you have a lot of options. But, let’s face it : none of those are easy to implement, and configuring a monitoring tool, whether it’s an open-source or a proprietary one, is often complex and time consuming.</p>\r\n<p>Well, someone took that matter into their own hands, and made <a href=\"https://nemslinux.com/\">NEMS</a>. What is NEMS, how can it help us, and what infrastructure does it require? Those are a few of the questions I asked <a href=\"https://baldnerd.com/\">Robbie Ferguson</a>, the maintainer of NEMS, who joined me on Easter week-end for a little chat.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://nemslinux.com/\" class=\"uri\">https://nemslinux.com/</a></li>\r\n<li><a href=\"https://twitter.com/NEMSLinux\" class=\"uri\">https://twitter.com/NEMSLinux</a></li>\r\n<li><a href=\"https://baldnerd.com/\" class=\"uri\">https://baldnerd.com/</a></li>\r\n</ul>\r\n',370,78,0,'CC-BY-SA','nagios,network,monitoring,opensource,single board computer,sbc,raspberrypi,odroid',0,0,1),
(2837,'2019-06-18','parallax live desktops in android',1040,'Parallax_Wallpaper, mouse gigglers, system d Youtube background play and more ! ','<h2 id=\"parallax-live-desktops-in-android\">parallax live desktops in android</h2>\r\n<ul>\r\n<li><p><a href=\"https://www.linkedin.com/pulse/caffeine-pfft-espresso-robert-mccurdy/\" class=\"uri\">https://www.linkedin.com/pulse/caffeine-pfft-espresso-robert-mccurdy/</a><br />\r\nlinkedin Cafinee.exe MouseGiggler espresso autohotkey</p></li>\r\n<li><p>Systemd linkedin<br />\r\n<a href=\"https://www.linkedin.com/pulse/initd-dead-long-live-robert-mccurdy/\" class=\"uri\">https://www.linkedin.com/pulse/initd-dead-long-live-robert-mccurdy/</a></p></li>\r\n<li><p>linkedin youtube in background<br />\r\n<a href=\"https://www.linkedin.com/pulse/play-youtube-background-robert-mccurdy/\" class=\"uri\">https://www.linkedin.com/pulse/play-youtube-background-robert-mccurdy/</a><br />\r\nViewers can download</p></li>\r\n<li><p><a href=\"https://f-droid.org/repo/org.schabi.newpipe_71.apk\" class=\"uri\">https://f-droid.org/repo/org.schabi.newpipe_71.apk</a></p></li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','youtube downloader,systemd,linux,autohotkey',0,0,1),
(2829,'2019-06-06','Discussion around fair use clips on HPR',1391,'A request for comments on not publishing clips with known fair use samples','<h1>Request for comments</h1>\r\n<p>Hi All,</p>\r\n<p>Under safe harbor provisions, we as volunteers are usually insulated from any copyright issues that may arise in the shows. \"We do not vet, edit, moderate or in any way censor any of the shows on the network, we trust you to do that.\"</p>\r\n<p>This we got by accident <a href=\"https://hackerpublicradio.org/stuff_you_need_to_know.php#not_moderated\">because</a> \"This is a long standing tradition arising from the fact that HPR is a community of peers who believe that any host has as much right to submit shows as any other.\"</p>\r\n<p>In the show notes associated with hpr2829 on 2019-06-06, the host included the following text \"For all included materials: If anyone feels they have right to any material in this show please let me know and I will comply.\"</p>\r\n<p>This violates the HPR <a href=\"https://hackerpublicradio.org/stuff_you_need_to_know.php#permission\">upload policy</a>.</p>\r\n<p>\"Never include content, for example music, in your show that you do not have permission to redistribute. Try to avoid using any content in your show that can not be redistributed under a Creative Commons Attribution-ShareAlike 3.0 Unported license. If you are redistributing under another Creative Commons License or by arranged permission please make note of the restrictions when you upload your show. We can then signal that, so that others who redistribute HPR content can filter your show out.\"</p>\r\n<p>As it was clear that they were not in compliance, I contacted the host. The host has been very helpful and has already removed some of the content but commented \"There are still 2 audio clips included. I claim I can use them on the basis off fair use principles.\"</p>\r\n<p>While the host may be correct, if they are not, then it is me and not the host that will be held responsible for posting it. I do not want that responsibility.</p>\r\n<p>Under the current HPR rules I am allowed to reject this submission.</p>\r\n<p>Before I do, I would appreciate as much feedback as possible on this topic so that we can gauge the opinions of the HPR Community as a whole.</p>\r\n<p>Regards,</p>\r\n<p>Ken. </p>\r\n\r\n<p>The discussion <a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-May/014446.html\">thread</a> remains open and is open to all by joining the <a href=\"https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org\">Maillist</a>.</p>',109,0,0,'CC-BY-SA','HPR, Policy Change, Legal, DMCA, TWAT, Fair Use, PacketSniffers, Copyright',0,0,1),
(2827,'2019-06-04','Unscripted ramblings from my garage about my first CTF event',832,'I briefly discss a CTF event I was invited to and what I plan to bring with me.','<h2 id=\"unscripted-ramblings-about-an-upcoming-ctf-event.\">Unscripted ramblings about an upcoming CTF event.</h2>\r\n<h3 id=\"hak5-items-mentioned-hak5.org\">Hak5 items mentioned (hak5.org):</h3>\r\n<ul>\r\n<li>WiFi Pineapple</li>\r\n<li>Bash Bunny (erroneously referred to as a ‘rabbit’)</li>\r\n<li>USB Rubber Ducky</li>\r\n<li>Packet Squirrel</li>\r\n<li>LAN Turtle (unmentioned but I’ll bring one)</li>\r\n</ul>\r\n<h3 id=\"software-mentioned\">Software mentioned:</h3>\r\n<ul>\r\n<li>MetaSploit: <a href=\"https://metasploit.com\">metasploit.com</a></li>\r\n<li>Ronin: <a href=\"https://ronin-ruby.github.io\">ronin-ruby.github.io</a></li>\r\n<li>Maltego: <a href=\"https://www.paterva.com/web7/\">www.paterva.com/web7/</a></li>\r\n<li>Burpsuite: <a href=\"https://portswigger.net/burp/\">portswigger.net/burp/</a></li>\r\n<li>SET: <a href=\"https://trustedsec.com/social-engineer-toolkit-set/\">trustedsec.com/social-engineer-toolkit-set/</a></li>\r\n<li>Parrot Linux: <a href=\"https://parrotsec.org\">parrotsec.org</a></li>\r\n</ul>\r\n<h3 id=\"my-info\">My info:</h3>\r\n<ul>\r\n<li>Chat with us on irc.freenode.net in #manor\r\n<ul>\r\n<li>More info at <a href=\"https://manor.space\" class=\"uri\">https://manor.space</a></li>\r\n</ul></li>\r\n<li>My little business: <a href=\"https://ascia.tech\" class=\"uri\">https://ascia.tech</a></li>\r\n<li>Email: <a href=\"mailto:cmhobbs@member.fsf.org\">cmhobbs@member.fsf.org</a>\r\n<ul>\r\n<li>1200 0808 F968 47AB F489 91A3 FE26 6FFB 1A77 0868</li>\r\n</ul></li>\r\n<li>Other shows by me (in case this one doesn’t get linked)\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0241.html\" class=\"uri\">https://hackerpublicradio.org/correspondents/0241.html</a></li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>CTF: Capture the flag; <a href=\"https://en.wikipedia.org/wiki/Capture_the_flag_(disambiguation)\">Wikipedia disambiguation page</a>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Wargame_(hacking)\">Cyber-security challenge</a></li>\r\n</ul></li>\r\n</ul>\r\n',241,0,0,'CC-BY-SA','ctf, hacking, security, infosec, events, conventions, gear',0,0,1),
(2833,'2019-06-12','Jeroen chats with Joep Piscaer',1176,'Interviewing Joep Piscaer during Loadays in Antwerpen, Belgium','<p>In this show an Interview with Joep Piscaer, recorded during the recent Loadays conference in Antwerpen, Belgium.</p>\r\n<p>Schedule of recent Loadays event: <a href=\"https://cfp.loadays.org/2019/schedule/\">https://cfp.loadays.org/2019/schedule/</a></p>\r\n<p>I mention the \"Cut the crap podcast\", made by Ryan Caligiuri.</p>\r\n<p>And specifically episode 145 as an excellent example of his podcast quality:</p>\r\n<p><a href=\"https://player.fm/series/the-cut-the-crap-show/ep-145-stronger-develop-the-resilience-you-need-to-succeed-with-dr-george-everly\">https://player.fm/series/the-cut-the-crap-show/ep-145-stronger-develop-the-resilience-you-need-to-succeed-with-dr-george-everly</a></p>\r\n<p>At the end of the podcast I a refer to the \"Follow your Gift\" talk, by Steve Harvey.</p>\r\n<p>You can find a recording of this talk on YouTube at <a href=\"https://www.youtube.com/watch?v=3x3rEg2qvcQ\">https://www.youtube.com/watch?v=3x3rEg2qvcQ</a></p>\r\n\r\n',369,78,0,'CC-BY-SA','loadays, ryan caligiuri, steve harvey',0,0,1),
(2834,'2019-06-13','My favorite desktop and android applications',1757,'Moving right along with shows from the requests list, I combine two program lists.','<p>Desktop:</p>\r\n<ul>\r\n<li>xfce4-terminal</li>\r\n<li>globaltime (orage)</li>\r\n<li>xfce4 notes</li>\r\n<li>thunar</li>\r\n<li>firefox</li>\r\n<li>Emacs</li>\r\n<li>claws-mail</li>\r\n<li>weechat</li>\r\n<li>mupdf</li>\r\n<li>gtk-redshift</li>\r\n<li>asunder</li>\r\n<li>keepassx</li>\r\n<li>lucky backup</li>\r\n<li>virtualbox/kvm</li>\r\n<li>xlog</li>\r\n<li>gpredict</li>\r\n<li>arduino ide</li>\r\n<li>tor browser bundle</li>\r\n<li>ledger wallet</li>\r\n<li>xmame</li>\r\n<li>freedoom</li>\r\n<li>rRootage</li>\r\n<li>dia</li>\r\n<li>fbreader</li>\r\n<li>gnumeric/libreoffice</li>\r\n<li>mandelbulber2</li>\r\n<li>gqrx</li>\r\n<li>transmission</li>\r\n<li>xastir</li>\r\n<li>youtube-dl gui</li>\r\n<li>zenmap</li>\r\n<li>mpv</li>\r\n</ul>\r\n<p>Android</p>\r\n<ul>\r\n<li>LineageOS</li>\r\n<li>built in phone</li>\r\n<li>signal</li>\r\n<li>built in fm radio</li>\r\n<li>built in camera</li>\r\n<li>2048</li>\r\n<li>acrylic paint</li>\r\n<li>amsatdroid free</li>\r\n<li>antennapod</li>\r\n<li>aprsdroid</li>\r\n<li>audiofx</li>\r\n<li>barcode scanner</li>\r\n<li>binaural beats</li>\r\n<li>blockinger</li>\r\n<li>blowtorch</li>\r\n<li>built in calendar</li>\r\n<li>call recorder</li>\r\n<li>chroma doze</li>\r\n<li>built in clock</li>\r\n<li>cloudlibrary</li>\r\n<li>built in contacts</li>\r\n<li>danmaku death</li>\r\n<li>echolink</li>\r\n<li>equate</li>\r\n<li>f-droid</li>\r\n<li>fbreader</li>\r\n<li>fennec f-droid</li>\r\n<li>red cross first aid</li>\r\n<li>flashlight</li>\r\n<li>freegal music</li>\r\n<li>gadgetbridge</li>\r\n<li>built in gallery</li>\r\n<li>ghost commander</li>\r\n<li>gobandroid</li>\r\n<li>hoopla</li>\r\n<li>iz2uuf morse code trainer</li>\r\n<li>libby</li>\r\n<li>lightning</li>\r\n<li>mobilinkd tnc</li>\r\n<li>mupdf</li>\r\n<li>netguard</li>\r\n<li>o’reilly</li>\r\n<li>orbot, orfox</li>\r\n<li>osmand~</li>\r\n<li>red cross pet first aid</li>\r\n<li>plumble</li>\r\n<li>propel graviton</li>\r\n<li>radiodroid (radio-browser.info)</li>\r\n<li>recorder</li>\r\n<li>roblox</li>\r\n<li>rpn</li>\r\n<li>sealnote</li>\r\n<li>sim card</li>\r\n<li>simple world clock</li>\r\n<li>space trader</li>\r\n<li>spotify</li>\r\n<li>suntimes, suntimes alarms</li>\r\n<li>survival manual</li>\r\n<li>termux</li>\r\n<li>timber</li>\r\n<li>tsumego pro</li>\r\n<li>ttrss-reader</li>\r\n<li>unifi</li>\r\n<li>vlc</li>\r\n<li>webtube</li>\r\n<li>weechat-android</li>\r\n<li>wifianalyzer</li>\r\n<li>wikipedia</li>\r\n<li>yalp store</li>\r\n<li>yorecast</li>\r\n</ul>\r\n',241,0,0,'CC-BY-SA','programs, linux, android, apps, applications, lists, favorites',0,0,1),
(2841,'2019-06-24','How I got into Linux (and then some...)',1864,'A response to the request for \"how i got into linux\" and a little of my history with Linux/BSD','<p>Basically what it says on the tin. Most distros I mention can be easily searched for. I meander through a discussion of how I got into Linux and where I am with it now.</p>',241,29,0,'CC-BY-SA','linux, intro, story, discourse, bsd',0,0,1),
(2858,'2019-07-17','Vehicle designer for a space game',1404,'Tuula talks about modeling vehicle designer for their space game','<p>This episode is about modeling vehicle designer that can be used to design all kinds of vehicles available in the game. It relates to episode about <a href=\"https://hackerpublicradio.org/eps.php?id=2818\">performing research</a>.</p>\r\n<h2 id=\"major-parts\">Major parts</h2>\r\n<p>Two major parts about vehicle designer are components and chassis.</p>\r\n<p>Components are modular pieces of vehicle that are assembled on chassis. They can, among other things, be things lie star sails, astrolabe navigators or long range sensor. Each component is defined by two values <code>ComponentId</code> and <code>ComponentLevel</code>. If you know these two values, you’ll be able to find out details of the component. <code>ComponentId</code> tells what component it is and <code>ComponentLevel</code> the general knowledge of it. When component is first discovered as a result of research, it’s just a prototype and as a such doesn’t function particularly well. Further research refines it and factories are able to produce higher quality components.</p>\r\n<p>Full definition of component is show below:</p>\r\n<pre><code>data Component = Component\r\n    { componentId :: ComponentId\r\n    , componentLevel :: ComponentLevel\r\n    , componentName :: ComponentName\r\n    , componentDescription :: ComponentDescription\r\n    , componentWeight :: Weight\r\n    , componentSlot :: ComponentSlot\r\n    , componentType :: [ ComponentPower ]\r\n    , componentCost :: RawResources ResourceCost\r\n    , componentChassisType :: ChassisType\r\n    }\r\n    deriving (Show, Read, Eq, Ord)</code></pre>\r\n<p>Two particularly interesting fields are <code>componentSlot</code> and <code>componentType</code>. <code>componentSlot</code> has type of <code>ComponentSlot</code> and defines what kind of slot the component occupies in chassis. As there are limited amount of slots in each chassis, designer needs to make compromises on what components to install. <code>componentType</code> has type of <code>ComponentPower</code>, which defines what component does in general. It could be sensor or provide supplies for the vehicle for example.</p>\r\n<p>Technology requirements are defined by function: <code>componentRequirements :: ComponentId -&gt; Maybe Technology</code>. It defines which technology unlock a given component. Part of the definition is show below. Each and every <code>ComponentId</code> has to be handled.</p>\r\n<pre><code>componentRequirements ShipLongRangeSensors = Just HighSensitivitySensors\r\ncomponentRequirements ShipBridge = Nothing\r\ncomponentRequirements VehicleWheeledMotiveSystem = Nothing\r\ncomponentRequirements VehicleHoverMotiveSystem = Just HoverCrafts\r\n...</code></pre>\r\n<p>Second major part of the designer are chassis. They’re stored in database, as I wanted a bit more flexible system than hardcoding as I did with components. Following piece of configuration is used to define database table and generated data for Haskell code. Most of the fields are probably easy enough to guess. <code>type</code> with type of <code>ChassisType</code> defines if this particular chassis is for example a land vehicle or a space ship. Various slot fields on other hand define amount of particular slots that the chassis offers.</p>\r\n<pre><code>Chassis json\r\n    name ChassisName\r\n    tonnage Weight\r\n    type ChassisType\r\n    technology Technology Maybe\r\n    armourSlots SlotAmount\r\n    innerSlots SlotAmount\r\n    outerSlots SlotAmount\r\n    sensorSlots SlotAmount\r\n    weaponSlots SlotAmount\r\n    engineSlots SlotAmount\r\n    motiveSlots SlotAmount\r\n    sailSlots SlotAmount\r\n    deriving Show Read Eq</code></pre>\r\n<p>Not all chassis are equal and some (probably pretty much every one of them) have some sort of requirements that has to be fulfilled when designing a vehicle. For example, space ships require a bridge for captain and star sails. Bawley, smallest of the working ships has room for two star sails, but requires only one of them to be installed in order to be a valid design. Flyboat on the other hand is smaller ship built for speed and always requires two set of sails.</p>\r\n<p>This data is stored in <code>required_component</code> table and represented as <code>RequiredComponent</code> data. Both are generated from the definition show below:</p>\r\n<pre><code>RequiredComponent json\r\n    chassisId ChassisId\r\n    componentType ComponentType\r\n    level ComponentLevel\r\n    amount ComponentAmount\r\n    deriving Show Read Eq</code></pre>\r\n<h2 id=\"designing-a-vehicle\">Designing a vehicle</h2>\r\n<p>With all that data, we can now design a vehicle. Process is roughly the following:</p>\r\n<ul>\r\n<li>based on completed research, get a list of chassis that are available</li>\r\n<li>select chassis from the list</li>\r\n<li>based on the selected chassis and completed research, get a list of components that are available</li>\r\n<li>select components to install</li>\r\n<li>remember to check that maximum tonnage isn’t exceeded and that there’s enough slots and requirements are met</li>\r\n<li>fill in name</li>\r\n<li>save into database</li>\r\n</ul>\r\n<p>Completed design is saved in two different tables. First one <code>design</code> holds info like name of the design, faction that design belongs to and used chassis. <code>planned_component</code> holds info about which components are planned to be installed and in what quantity.</p>\r\n<pre><code>Design json\r\n    name Text\r\n    ownerId FactionId\r\n    chassisId ChassisId\r\n    deriving Show Read Eq</code></pre>\r\n<p>and</p>\r\n<pre><code>PlannedComponent json\r\n    designId DesignId\r\n    componentId ComponentId\r\n    level ComponentLevel\r\n    amount ComponentAmount\r\n    deriving Show Read Eq</code></pre>\r\n<p>As a little teaser, below is an screenshot of what the vehicle designer currently looks like.</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2858_1.png\" alt=\"Screenshot of vehicle designer showing chassis and components\" /></p>\r\n<h2 id=\"finally\">Finally</h2>\r\n<p>Thanks for interest. If you have questions or comments, best way to reach me nowadays is either by email or in fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','haskell',0,0,1),
(2859,'2019-07-18','2018-2019 New Years Eve show part 7',10714,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 7</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019</p>\r\n<ul>\r\n<li>Trucking</li>\r\n<li>Patrick Stewart and Bret Spiner<br />\r\n<a href=\"https://www.youtube.com/watch?v=l5zQIKeh9B4\">https://www.youtube.com/watch?v=l5zQIKeh9B4</a><br />\r\n<a href=\"https://www.youtube.com/watch?v=EvJ7xR4D1ZI\">https://www.youtube.com/watch?v=EvJ7xR4D1ZI</a></li>\r\n<li>Self Defense</li>\r\n<li>The origin of Irish coffee</li>\r\n<li>Calendars</li>\r\n<li>Sleep</li>\r\n<li>The Pine Book<br />\r\n<a href=\"https://www.pine64.org/pinebook/\">https://www.pine64.org/pinebook/</a></li>\r\n<li>Guns</li>\r\n<li>Tanks</li>\r\n<li>AmazFit Bip<br />\r\n<a href=\"https://us.amazfit.com/shop/bip?variant=336750\">https://us.amazfit.com/shop/bip?variant=336750</a></li>\r\n<li>Canes</li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','HPR new years show, new years, community',0,0,1),
(2842,'2019-06-25','What\'s in my Bag an update to hpr2065',225,'This is a short update show on what I carry in my Geek Bag','<p>Hello HPR land, this is Tony Hughes again coming to you from Blackpool in the UK.</p>\r\n<p>During my last episode, which was my 50th for HPR, I realized that my ‘Bag’ has changed considerably since recording my episode hpr2065 about it back in July 2016. So this is an update on what I currently carry in my ‘Geek’ Bag when out and about.</p>\r\n<p>I have several laptops which are used for different things at different times so may or may not be in the bag/bags depending on what I am doing. This is the list:</p>\r\n<ul>\r\n<li>Lenovo X230i</li>\r\n<li>Toshiba z30</li>\r\n<li>Dells E6220 x 2, E7250, E7440 and E6540</li>\r\n</ul>\r\n<p>Recently I have moved more to Dell laptops and the Dell E7440 is a great compromise of portability and usability with its 14&quot; 1080p screen, but if I want light and long battery life the Toshiba z30 is a fantastic little PC with all day battery life and a great 13.3&quot; screen.</p>\r\n<p>But all the others have their place in the bag, for demonstrating Linux Distros at events or at my LUG.</p>\r\n<p>So the next thing that makes it into the bag is my ZoomH2 recorder that goes with me for recording interviews at events I attend, with the intention of producing HPR shows.</p>\r\n<p>I also have some tools, the first is a little set of a screwdriver and small driver bits made by Draper this is handy for laptop tear downs as it has all the necessary bit heads needed to work on electronics. I also carry a small set of pliers and a wire cutter in the bag.</p>\r\n<p>I also carry a 10000mA battery pack for charging my mobile phone if needed while out and about. In conjunction with this a I carry several micro USB charging cables and a USB C cable for the increasing number of USB C devices around these days.</p>\r\n<p>In the bag are also a couple of 128Gb SSD’s as spares for quick swap outs, if I don’t want to wipe a drive but wish to test a new OS, or for those times the only solution to helping someone rescue an older laptop is to stick an SSD into it.</p>\r\n<p>I generally carry my 1Tb portable USB3 HDD around with me as I store a large number of current Linux ISO files for burning to a flash drive to create boot discs. With that it goes without saying that I have a few spare flash drives in the bag for just this use. I also usually carry a few SD cards for creating Raspberry Pi images if needed.</p>\r\n<p>Other items include a USB WiFi card as a backup if I have a WiFi malfunction, or I’m working on a machine without its own WiFi card.</p>\r\n<p>Well that’s about it for what I’m currently carrying in my bag, but before I go a bit of sad news. Many of you have heard me talk of my latest bargains from the Computer Auction I have frequented since 2006. Well sadly NO MORE, Northern Realisations after 20 years of trading have closed their doors for the last time, so I need to find another source of cheap PC equipment. As they say: <em>All good things come to an end</em>.</p>\r\n<p>Well that’s it for this episode, this is Tony Hughes signing off for Hacker Public Radio.</p>\r\n<ul>\r\n<li><p><a href=\"https://www.keithstead.com/and_more/reviews/zoomh2.html\" class=\"uri\">https://www.keithstead.com/and_more/reviews/zoomh2.html</a></p></li>\r\n<li><p><a href=\"https://www.realnorth.co.uk/\" class=\"uri\">https://www.realnorth.co.uk/</a></p></li>\r\n</ul>\r\n',338,0,0,'CC-BY-SA','Linux, PC\'s, Laptops, Geek Bag',0,0,1),
(2847,'2019-07-02','earbuds',902,'My trials with earbuds and custom setups','<p>operat0r discusses his trials with earbuds and custom setups.</p>',36,0,0,'CC-BY-SA','earbuds,hacking,music,diy',0,0,1),
(2856,'2019-07-15','Mint Mobile Security Rant',1185,'Settle in for a Mint Mobile Security Rant ','<p>\r\nYou can also use call forwarding to forward calls to your google voice number. Mint does not seem to stay connected all the time.\r\n</p>',36,0,1,'CC-BY-SA','Mint Mobile,ANdroid,Phones,4G,VoIP,google voice',0,0,1),
(2861,'2019-07-22','Safety Razors',870,'I go over some of my thoughts on Safety Razors Etc','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B01859QHJU/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1\" class=\"uri\">https://smile.amazon.com/gp/product/B01859QHJU/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1</a></li>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B01M2Y82H8/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1\" class=\"uri\">https://smile.amazon.com/gp/product/B01M2Y82H8/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1</a></li>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B000684Z70/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;th=1\" class=\"uri\">https://smile.amazon.com/gp/product/B000684Z70/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;th=1</a></li>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B0022RB080/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1\" class=\"uri\">https://smile.amazon.com/gp/product/B0022RB080/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1</a></li>\r\n</ul>\r\n',36,0,0,'CC-BY-SA','shaving,safety,razor,health,grooming',0,0,1),
(2886,'2019-08-26','INFOSECOND',1136,'Thoughts around IT and Information Security','<p>\r\nIn todays show, operat0r shares his personal thoughts around information security and getting into the field. He also talks about ways to get support from your local community.\r\n</p>',36,0,1,'CC-BY-SA','information security,careers',0,0,1),
(2853,'2019-07-10','Feeding the beast',424,'How the swedes are killing their hardcash and feeding the beast','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.bankid.com/\" class=\"uri\">https://www.bankid.com/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Swish_(payment)\" class=\"uri\">https://en.wikipedia.org/wiki/Swish_(payment)</a></li>\r\n</ul>',309,0,0,'CC-BY-SA','bankid, swish, cash, payment, digitalization, sweden',0,0,1),
(2839,'2019-06-20','Sample episode of the Distrohoppers Digest podcast',2231,'We bring you the first episode of the new Creative Commons show the Distrohoppers Digest','<p>\r\nThis is a sample episode of the new Creative Commons tech podcast. It\'s brought to us by Moss and our own <a href=\"https://hackerpublicradio.org/correspondents/0338.html\">Tony Hughes</a>. From the blurb:\r\n</p>\r\n\r\n<quote>\r\nWe are two Blokes who love Linux and trying out new stuff, we thought it would be interesting to share our experience of trying new Linux and BSD distributions and how we found it trying to live with them as our daily driver for up to a Month at a time, by recording a podcast about how we got on.\r\n</quote>\r\n\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://distrohoppersdigest.blogspot.com/\">https://distrohoppersdigest.blogspot.com/</a></li>\r\n<li><a href=\"https://distrohoppersdigest.blogspot.com/feeds/posts/default\">https://distrohoppersdigest.blogspot.com/feeds/posts/default</a></li>\r\n<li><a href=\"https://distrohoppersdigest.blogspot.com/feeds/posts/default?alt=rss\">https://distrohoppersdigest.blogspot.com/feeds/posts/default?alt=rss</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0338.html\">https://hackerpublicradio.org/correspondents/0338.html</a></li>\r\n<li><a href=\"https://mintcast.org/\">https://mintcast.org/</a></li>\r\n</ul>',30,0,0,'CC-BY-NC-SA','Distrohoppers Digest, mintCast, linux, bsd',0,0,1),
(2844,'2019-06-27','The Sony TC-222-A Portable Reel-To-Reel Tape Recorder',1868,'I talk about my latest thrift-store gadget, a 1969 Sony portable reel-to-reel tape recorder','<p>In this episode I talk about my new 1969 <a href=\"https://flic.kr/s/aHsmEcunXZ\" target=\"_blank\">Sony TC-222-A</a> portable reel-to-reel tape recorder. I found it about 3 weeks ago at <a href=\"https://www.handupthrift.com/\" target=\"_blank\">Hand-Up Thrift store</a> in Lafayette Louisiana for $5. It was in partially working condition, without a power cord, and in need of some work. I cleaned the contact points, overhauled the fast-forward idler wheel, lubricated both of the tape shafts, replaced the belts, hacked an old electric razor cord to work as a power cord, and tightened up the record linkage. One thing I still can\'t get working is recording using the microphone.</p>\r\n\r\n<p>I spend about half of this episode talking about trying to make a super-long recording fit on a 5-inch reel and playing at 4.8 cm/second. I use Kimiko Ishizaka\'s wonderful <a href=\"https://kimiko-piano.com/open-goldberg\" target=\"_blank\">Open Goldberg Variations</a> and <a href=\"https://music.kimiko-piano.com/album/bach-well-tempered-clavier-book-1\" target=\"_blank\">Open Well-Tempered Clavier</a> as the music. To do this, I speeded up all of the tracks to play at 4x speed, for which I use the following script to loop through all mp3s in the current directory and subject them to the appropriate <a href=\"https://linux.die.net/man/1/sox\" target=\"_blank\">sox</a> command:</p>\r\n\r\n<pre>\r\n#!/bin/bash\r\n\r\nfor i in *.mp3; do\r\n# speed em up 4x\r\n  infile=$(basename $i)\r\n  stem=$(basename \"$i\" .mp3)\r\n  outfile=\"$stem\"_4x.mp3\r\n  sox $infile $outfile speed 4.0\r\n  sleep .1\r\ndone\r\n</pre>\r\n\r\n<p>It worked! Well. The script and <code>sox</code> command worked. Recording the 4x-speed audio at 19 cm/second and then playing back at 4.8 cm/second also mostly worked, I just had a very poor-quality tape so it sounded pretty bad. The speed was just about right, though. In fact when I compared pitch against my piano, it was EXACTLY right. I may try again with a better tape. (BTW I said my tape was \"old new stock,\" but obviously I meant \"new old stock.\")</p>\r\n\r\n<h3>Photo Album (click image)</h3>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157709041025907\" title=\"Sony TC-222-A Portable Reel-to-Reel Tape Recorder\"><img src=\"https://live.staticflickr.com/65535/48046250816_552453ece7.jpg\" width=\"500\" height=\"375\" alt=\"Sony TC-222-A Portable Reel-to-Reel Tape Recorder\"></a></p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li>Video: <a href=\"https://www.youtube.com/watch?v=52BbX_aP1sQ\" target=\"_blank\">The Sony TC-222-A in action</a></li>\r\n	<li><a href=\"https://www.youtube.com/user/Techmoan\" target=\"_blank\">Techmoan</a>: one of my favorite YouTube channels</li>\r\n	<li>Music bumpers are from Kimiko Ishizaka\'s <em>The Open Goldberg Variations</em>: <a href=\"https://www.opengoldbergvariations.org/\" target=\"_blank\">https://www.opengoldbergvariations.org/</a>, used by permission of their <a href=\"https://creativecommons.org/publicdomain/zero/1.0/\" target=\"_blank\">CC0 1.0 Universal (CC0 1.0) Public Domain Dedication license</a>.</li>\r\n	<li><a href=\"https://www.vintage-electronics.net/\" target=\"_blank\">Vintage Electronics</a>, my source for replacement belts, replacement lamps for my Marantz receiver, etc. </li>\r\n</ul>',238,0,0,'CC-BY-SA','Music,Recording,Audio,Tape,Reel-To-Reel,Open-Reel,Recording Devices,Tape Speeds,Bash Scripting',0,0,1),
(2843,'2019-06-26','Afrikan Tähti (or Star of Africa)',678,'Tuula talks about one of the most important Finnish board game ever','<p>For more information about the game and history behind it, have a look at the following links:</p>\r\n<ul>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Afrikan_t%C3%A4hti\">https://en.wikipedia.org/wiki/Afrikan_t%C3%A4hti</a></li>\r\n<li>Board Game Geek: <a href=\"https://www.boardgamegeek.com/boardgame/5130/afrikan-tahti\" class=\"uri\">https://www.boardgamegeek.com/boardgame/5130/afrikan-tahti</a></li>\r\n</ul>\r\n',364,95,0,'CC-BY-SA','finnish, childhood favourite',0,0,1),
(2851,'2019-07-08','An introduction to the work of fire fighters',1847,'A small introduction into the work of fire fighters ','<p>Some general basic knowledge of fire fighting. Also an invitation to ask questions in the comments.</p>',369,0,0,'CC-BY-SA','fire fighting, fire brigade',0,0,1),
(2868,'2019-07-31','Custom data with Persistent',1202,'Tuula explains how to serialize custom data with Persistent','<p>Podcast episode is about two things, serializing custom data with Persistent and <code>IsString</code> typeclass.</p>\r\n<p>I’m using Persistent in conjunction with Yesod (web framework). Process in short is that data is defined in <code>/config/models</code> file that is used in compile time to generate data type definitions for Haskell. Same information is used to create schema for the database when Yesod application starts. It can even do simple migrations if schema changes, but I wouldn’t recommend using that in production.</p>\r\n<p>Persistent maps information between database and program written in Haskell. There’s pre-existing mappings for things like text and various kinds of numbers. In case one wants to use custom data type, compiler can automatically generate needed mapping. This automatic generation works well with enumerations and very complex data.</p>\r\n<p>For example, following piece defines enumeration <code>BuildingType</code> that is mapped in <code>varchar</code> field in database. Enumeration is thus stored as text.</p>\r\n<pre><code>data BuildingType = SensorStation\r\n    | ResearchComplex\r\n    | Farm\r\n    | ParticleAccelerator\r\n    | NeutronDetector\r\n    | BlackMatterScanner\r\n    | GravityWaveSensor\r\n    deriving (Show, Read, Eq)\r\n\r\nderivePersistField &quot;BuildingType&quot;</code></pre>\r\n<p>For newtypes, automatic deriving works too, but generates (in my opinion) extra information that isn’t needed. This extra information causes data saved as text. For those cases, manual mapping can be used.</p>\r\n<p>Our example is for <code>StarDate</code>, which is just glorified <code>Int</code>. I’m using newtype to make <code>StarDate</code> distinct from any other <code>Int</code>, even when it behaves just like <code>Int</code>.</p>\r\n<pre><code>newtype StarDate = StarDate { unStarDate :: Int }\r\n    deriving (Show, Read, Eq, Num, Ord)\r\n\r\ninstance PersistField StarDate where\r\n    toPersistValue (StarDate n) =\r\n        PersistInt64 $ fromIntegral n\r\n\r\n    fromPersistValue (PersistInt64 n) =\r\n        Right $ StarDate $ fromIntegral n\r\n\r\n    fromPersistValue _ =\r\n        Left &quot;Failed to deserialize&quot;\r\n\r\n\r\ninstance PersistFieldSql StarDate where\r\n    sqlType _ = SqlInt64</code></pre>\r\n<p>One more trick, that doesn’t directly relate to Persistent is <code>IsString</code> type class. Instead of having to specify all the time what type text literal is, one can let compiler to deduce it from usage.</p>\r\n<p>For example, if I had a newtype like:</p>\r\n<pre><code>newtype PlanetName = PlanetName { unPlanetName :: Text }</code></pre>\r\n<p>I can turn on OverloadedStrings pragma and create <code>IsString</code> instance:</p>\r\n<pre><code>instance IsString PlanetName where\r\n    fromString = PlanetName . fromString</code></pre>\r\n<p>Now I can write: <code>placeName = &quot;Earth&quot;</code> instead of <code>placeName = PlanetName &quot;Earth&quot;</code> and compiler can deduce correct type based on how the <code>placeName</code> is used.</p>\r\n<p>Thanks for listening, if you have any questions or comments, you can reach me via email or in the fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','haskell, persistent, database',0,0,1),
(2890,'2019-08-30','Penguicon 2019 Report',843,'Penguicon 2019 took place on May 3-5, 2018 in Southfield, Michigan','<p>Penguicon 2019 is a combined technology and science fiction convention in Southfield, Michigan, a suburb of Detroit, and presents over 500 hours of programming over the entire weekend. Of this, around 100 hours are open source, tech-related. In this episode I tell you about my own personal experience at Penguicon this year.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://2019.penguicon.org/\" class=\"uri\">https://2019.penguicon.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Saladin_Ahmed\" class=\"uri\">https://en.wikipedia.org/wiki/Saladin_Ahmed</a></li>\r\n<li><a href=\"https://www.mikeymason.com/\" class=\"uri\">https://www.mikeymason.com/</a></li>\r\n<li><a href=\"https://zedshaw.com/\" class=\"uri\">https://zedshaw.com/</a></li>\r\n<li><a href=\"https://www.facebook.com/CraftyCelts/posts/d41d8cd9/233607537127/\" class=\"uri\">https://www.facebook.com/CraftyCelts/posts/d41d8cd9/233607537127/</a></li>\r\n<li><a href=\"https://www.sophiabrueckner.com/\" class=\"uri\">https://www.sophiabrueckner.com/</a></li>\r\n<li><a href=\"https://www.facebook.com/public/Karen-Corbeill\" class=\"uri\">https://www.facebook.com/public/Karen-Corbeill</a></li>\r\n<li><a href=\"https://www.youtube.com/playlist?list=PLwO8CTSLTkii9S_vhEOsyJ17RI3jjBZ95\" class=\"uri\">https://www.youtube.com/playlist?list=PLwO8CTSLTkii9S_vhEOsyJ17RI3jjBZ95</a></li>\r\n<li><a href=\"https://www.allhandsactive.org/\" class=\"uri\">https://www.allhandsactive.org/</a></li>\r\n<li><a href=\"https://www.zwilnik.com\" class=\"uri\">https://www.zwilnik.com</a></li>\r\n</ul>\r\n',198,96,0,'CC-BY-SA','Penguicon, Open Source, Convention',0,0,1),
(2852,'2019-07-09','Gnu Awk - Part 16',2564,'Winding up the Gnu Awk series','<h2 id=\"introduction\">Introduction</h2>\r\n<p>This is the sixteenth and final episode of the <code>\'</code><a href=\"https://hackerpublicradio.org/series/0094.html\" title=\"Learning Awk\">Learning Awk</a><code>\'</code> series which is being produced by <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" title=\"b-yeezi\">b-yeezi</a> (BY) and <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" title=\"Dave Morriss\">Dave Morriss</a> (DM).</p>\r\n<p>We are using this as an opportunity to have a round-table discussion about the series, about Awk, and where we recommend the listeners should go from here. Including this one we have produced 16 episodes covering the features most likely to be used in pipelines on the command line or in simple shell and awk scripts.</p>\r\n<p><small> Note that although the HPR site will list this episode as having a single host, in fact it has two! Plans are afoot to enhance the HPR database so we can eventually indicate this properly. </small></p>\r\n<h2 id=\"topics-discussed\">Topics Discussed</h2>\r\n<ul>\r\n<li>The series\r\n<ul>\r\n<li>Started in 2016 (first show released 2016-07-13)</li>\r\n<li>Finishing in 2019</li>\r\n<li>16 episodes in total</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Why are we finishing the series?\r\n<ul>\r\n<li>We have probably reached the limit of what is useful on the command line or in shell scripts or even in manageable-sized Awk scripts</li>\r\n<li>Awk shows its limitations as we go on and doesn’t compare well with more modern text processing languages</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Our personal experiences with Awk\r\n<ul>\r\n<li>BY:\r\n<ul>\r\n<li>Started with sed and awk when first moving to Linux in 2011</li>\r\n<li>(ongoing) Exploring and cleaning client data</li>\r\n<li>(ongoing) Personal scripts when adding python or other tool would be overkill</li>\r\n</ul></li>\r\n<li>DM:\r\n<ul>\r\n<li>Working with VAX/VMS in the 1980’s. No very good text processing features built-in, so Gnu Awk (and sed) was a great way to handle the data we were using to generate accounts for new students each year. Could easily spot bad records, do some data validation (for example impossible dates of birth).</li>\r\n<li>Later in the late 1980’s and early 1990’s more Unix systems came on the scene running HP-UX, Ultrix, SunOS, Solaris, OSF/1, True64 Unix, and awk was very much used there.</li>\r\n<li>Later still we moved to Linux; initially Fedora but later RHEL, and of course awk figured in the list of tools there as well.</li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>What have we left out? Why?\r\n<ul>\r\n<li>User-defined functions are pretty clunky and hard to use</li>\r\n<li>Multi-dimensional arrays: other languages do this better</li>\r\n<li>Internationalization: assumes you’re writing <em>big</em> awk programs</li>\r\n<li>The <code>gawk</code> debugger: quite clever but probably overkill for this series</li>\r\n<li>Extensions written in C and C++: some come with <code>gawk</code> and look quite good, but this subject is out of scope</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>What to use as an alternative to Awk?\r\n<ul>\r\n<li>DM moved from <code>gawk</code> to Perl (version 4) in the 1980’s and later to Perl version 5. This might have engendered an <em>awk</em>y, <em>Bash</em>y mindset that’s hard to shake off. Not the recommended place to start these days.</li>\r\n<li>BY moved from <code>gawk</code> to Python and R for large projects. For interactive <em>Bash</em>y exploration, moved to <a href=\"https://github.com/BurntSushi/xsv\" title=\"XSV\">XSV</a>, <a href=\"https://harelba.github.io/q/\" title=\"q to run SQL on csv files\">q</a>, and <a href=\"https://csvkit.readthedocs.io/en/latest/\" title=\"CSV Kit\">csv-kit</a> for most use cases.</li>\r\n<li>These tools have built-in convenience features, like accounting for headers, data types, and file encodings</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>What’s next?\r\n<ul>\r\n<li>It is planned to turn the notes for this series into a combined document which will be available on the HPR site and on archive.org. There is no timescale for this at the moment</li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.gnu.org/software/gawk/manual/html_node/index.html\"><em>GNU Awk User’s Guide</em></a>\r\n<ul>\r\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Internationalization\"><em>Internationalization with gawk</em></a></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li><a href=\"https://catonmat.net/proof-that-sed-is-turing-complete\"><em>A proof that Unix utility sed is Turing complete</em></a></li>\r\n<li><a href=\"https://mutagen.readthedocs.io/en/latest/\"><em>Mutagen</em></a> - discussed as an alternative way to access audio metadata (<em>tags</em>) from Python</li>\r\n<li><a href=\"https://github.com/BurntSushi/xsv\"><em>XSV</em></a></li>\r\n<li><a href=\"https://csvkit.readthedocs.io/en/latest/\"><em>csvkit</em></a></li>\r\n<li><a href=\"https://harelba.github.io/q/\"><em>Run SQL on CSV files with <b>q</b></em></a></li>\r\n</ul>\r\n<ul>\r\n<li>Links to all of the shows in this series on HPR:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2114\"><em>Gnu Awk - Part 1</em></a> - episode 2114</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2129\"><em>Gnu Awk - Part 2</em></a> - episode 2129</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2143\"><em>Gnu Awk - Part 3</em></a> - episode 2143</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2163\"><em>Gnu Awk - Part 4</em></a> - episode 2163</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2184\"><em>Gnu Awk - Part 5</em></a> - episode 2184</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2238\"><em>Gnu Awk - Part 6</em></a> - episode 2238</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2330\"><em>Gnu Awk - Part 7</em></a> - episode 2330</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2438\"><em>Gnu Awk - Part 8</em></a> - episode 2438</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2476\"><em>Gnu Awk - Part 9</em></a> - episode 2476</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2526\"><em>Gnu Awk - Part 10</em></a> - episode 2526</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2554\"><em>Gnu Awk - Part 11</em></a> - episode 2554</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2610\"><em>Gnu Awk - Part 12</em></a> - episode 2610</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2804\"><em>Gnu Awk - Part 13</em></a> - episode 2804</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2816\"><em>Gnu Awk - Part 14</em></a> - episode 2816</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2824\"><em>Gnu Awk - Part 15</em></a> - episode 2824</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2852\"><em>Gnu Awk - Part 16</em></a> - episode 2852</li>\r\n</ul></li>\r\n</ul>\r\n',225,94,1,'CC-BY-SA','Gnu Awk, advanced features',0,0,1),
(2854,'2019-07-11','Telling myself something In The Morning',374,'There was a need for some software, so I wrote some','<ul>\r\n<li>Source for In The Morning: <a href=\"https://gitlab.com/jezra/in-the-morning\" class=\"uri\">https://gitlab.com/jezra/in-the-morning</a></li>\r\n<li>Bottle Framework: <a href=\"https://bottlepy.org\" class=\"uri\">https://bottlepy.org</a></li>\r\n</ul>',243,25,0,'CC-BY-SA','python, programming',0,0,1),
(2857,'2019-07-16','Creating CounterParty Collectible Tokens for the Bitcorn Game',995,'How to create Bitcorn collectibles: tokens issued on Bitcoin blockchain, used in Bitcorn Farms game','<p>Bitcorn is an idle farming game created with and played using Bitcoin tokens using the CounterParty protocol. I’ll walk you through how it all works, how to get started and what all that means.</p>\r\n<p>In this episode we’ll walk through the basics of creating and submitting a Bitcorn collectible card to be included in the game, along with setting up a wallet so you can buy and sell them.</p>\r\n',379,110,0,'CC-BY-SA','bitcorn, bitcoin, collectibles',0,0,1),
(2862,'2019-07-23','Art vs. Commerce In Storytelling',830,'Lostnbronx examines stories as both art and products.','<p>In this final episode of \"Random Elements of Storytelling\", Lostnbronx looks at the question of art vs. commerce.</p>\r\n<p>When is a story a product? When is it a work of passion? Can it be both? In a era of interactive storytelling, what is the difference between a story teller and an audience? And where do art, commerce, creativity, and consumption intersect?</p>\r\n<p>Lostnbronx wanders over hill and dale, and likely fails to adequately explain anything at all.</p>\r\n',107,105,0,'CC-BY-SA','stories, storytelling, art, commerce, lostnbronx',0,0,1),
(2900,'2019-09-13','Better Social Media 01 - Introduction',711,'We don\'t have to use Twitter and Facebook. There are alternatives.','<p>While many people like to use social media, platforms like Twitter and Facebook are very unsatisfying, not to mention inimical to your security and privacy. Fortunately there are alternatives we can try, and in this series I want to explore a few of them. <a href=\"https://www.zwilnik.com/?page_id=1025\" class=\"uri\">https://www.zwilnik.com/?page_id=1025</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://elplatt.com/\" class=\"uri\">https://elplatt.com/</a></li>\r\n<li><a href=\"https://litmus.com/blog/email-client-market-share-trends-first-half-of-2018\" class=\"uri\">https://litmus.com/blog/email-client-market-share-trends-first-half-of-2018</a></li>\r\n<li><a href=\"https://www.amazon.com/dp/B07H7G7CMN/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1\" class=\"uri\">https://www.amazon.com/dp/B07H7G7CMN/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1</a></li>\r\n<li><a href=\"https://mewe.com/\" class=\"uri\">https://mewe.com/</a></li>\r\n<li><a href=\"https://ello.co/\" class=\"uri\">https://ello.co/</a></li>\r\n<li><a href=\"https://diasporafoundation.org/\" class=\"uri\">https://diasporafoundation.org/</a></li>\r\n<li><a href=\"https://pluspora.com/\" class=\"uri\">https://pluspora.com/</a></li>\r\n<li><a href=\"https://www.bitchute.com/\" class=\"uri\">https://www.bitchute.com/</a></li>\r\n<li><a href=\"https://joinmastodon.org/\" class=\"uri\">https://joinmastodon.org/</a></li>\r\n<li><a href=\"https://textile.photos/\" class=\"uri\">https://textile.photos/</a></li>\r\n<li><a href=\"https://pixelfed.org/\" class=\"uri\">https://pixelfed.org/</a></li>\r\n<li><a href=\"https://www.wire.com/\" class=\"uri\">https://www.wire.com/</a></li>\r\n<li><a href=\"https://www.signal.org/\" class=\"uri\">https://www.signal.org/</a></li>\r\n<li><a href=\"https://gnu.io/social/\" class=\"uri\">https://gnu.io/social/</a></li>\r\n<li><a href=\"https://www.scuttlebutt.nz/\" class=\"uri\">https://www.scuttlebutt.nz/</a></li>\r\n<li><a href=\"https://mediagoblin.org/\" class=\"uri\">https://mediagoblin.org/</a></li>\r\n<li><a href=\"https://freenetproject.org/author/freenet-project-inc.html\" class=\"uri\">https://freenetproject.org/author/freenet-project-inc.html</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1025\" class=\"uri\">https://www.zwilnik.com/?page_id=1025</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','Fediverse, social media, federated',0,0,1),
(2910,'2019-09-27','Better Social Media 02 - Pluspora',582,'Pluspora was advertised as the federated alternative to Google Plus.','<p>Pluspora is an instance of the Diaspora software that was specifically designed to appeal to users of Google Plus. So when Google Plus disappeared, many people moved over to this platform. <a href=\"https://www.zwilnik.com/?page_id=1027\" class=\"uri\">https://www.zwilnik.com/?page_id=1027</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://pluspora.com/\" class=\"uri\">https://pluspora.com/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/GNU_General_Public_License\" class=\"uri\">https://en.wikipedia.org/wiki/GNU_General_Public_License</a></li>\r\n<li><a href=\"https://diasporafoundation.org/formatting\" class=\"uri\">https://diasporafoundation.org/formatting</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Markdown\" class=\"uri\">https://en.wikipedia.org/wiki/Markdown</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1027\" class=\"uri\">https://www.zwilnik.com/?page_id=1027</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','Fediverse, social media, federated',0,0,1),
(2920,'2019-10-11','Better Social Media 03 - MeWe',729,'MeWe was advertised as another popular alternative to Google Plus.','<p>MeWe is another platform that was advertised to users left high-and-dry by the closure of Google Plus. It is not federated, but does make strong claims of privacy protection, and is the slickest alternative I have seen to Google Plus. So when Google Plus disappeared, many people moved over to this platform. <a href=\"https://www.zwilnik.com/?page_id=1030\" class=\"uri\">https://www.zwilnik.com/?page_id=1030</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://mewe.com/\" class=\"uri\">https://mewe.com/</a></li>\r\n<li><a href=\"https://mewepro.com/\" class=\"uri\">https://mewepro.com/</a></li>\r\n<li><a href=\"https://mewe.com/store\" class=\"uri\">https://mewe.com/store</a></li>\r\n<li><a href=\"https://mewe.com/#\" class=\"uri\">https://mewe.com/#</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1030\" class=\"uri\">https://www.zwilnik.com/?page_id=1030</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative',0,0,1),
(2930,'2019-10-25','Better Social Media 04 - Diaspora',886,'Diaspora was the original alternative platform when it went up against Facebook.','<p>I don’t know if Diaspora was the first of the alternatives to come along, but it was certainly the first I was aware of. It got a lot of attention for the college students who first put it together (and remember that Facebook was originally created by a college student, Mark Zuckerberg). The four students, Ilya Zhitomirskiy, Dan Grippi, Max Salzberg, and Raphael Sofaer, were inspired by a speech Eben Moglen gave to the Internet society’s New York Chapter, where he described centralized social networks as “Spying for free”. The students chose the name Diaspora, which is a Greek word that means a “scattered or dispersed population” to reflect the idea that instead of a centralized platform, Diaspora would consist of independent nodes, called pods, each running a copy of the free software which is open source and licensed under the GNU-AGPL-3.0 license. <a href=\"https://www.zwilnik.com/?page_id=1032\" class=\"uri\">https://www.zwilnik.com/?page_id=1032</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://diasporafoundation.org/\" class=\"uri\">https://diasporafoundation.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/GNU_General_Public_License\" class=\"uri\">https://en.wikipedia.org/wiki/GNU_General_Public_License</a></li>\r\n<li><a href=\"https://softwarefreedom.org/\" class=\"uri\">https://softwarefreedom.org/</a></li>\r\n<li><a href=\"https://web.archive.org/web/20111002003516/https://blog.diasporafoundation.org/2011/09/21/diaspora-means-a-brighter-future-for-all-of-us.html\" class=\"uri\">https://web.archive.org/web/20111002003516/https://blog.diasporafoundation.org/2011/09/21/diaspora-means-a-brighter-future-for-all-of-us.html</a></li>\r\n<li><a href=\"https://podupti.me/\" class=\"uri\">https://podupti.me/</a></li>\r\n<li><a href=\"mailto:ahuka@pod.haxxors.com\">ahuka@pod.haxxors.com</a></li>\r\n<li><a href=\"https://pod.haxxors.com/i/394c80269066\" class=\"uri\">https://pod.haxxors.com/i/394c80269066</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1032\" class=\"uri\">https://www.zwilnik.com/?page_id=1032</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, federated, Fediverse',0,0,1),
(2940,'2019-11-08','Better Social Media 05 - Mastodon',778,'Mastodon is the federated alternative to Twitter.','<p>As mentioned earlier, Diaspora was one of the earliest alternative, privacy-respecting social media platforms, but it was focused on being an alternative to Facebook (and it has done this fairly well). But that leaves the other big platform of the social world, Twitter. Mastodon is a nice federated alternative to Twitter and a nicer place to be. <a href=\"https://www.zwilnik.com/?page_id=1034\" class=\"uri\">https://www.zwilnik.com/?page_id=1034</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://joinmastodon.org/\" class=\"uri\">https://joinmastodon.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Identi.ca\" class=\"uri\">https://en.wikipedia.org/wiki/Identi.ca</a></li>\r\n<li><a href=\"https://pump.io/\" class=\"uri\">https://pump.io/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Gamergate_controversy\" class=\"uri\">https://en.wikipedia.org/wiki/Gamergate_controversy</a></li>\r\n<li><a href=\"https://blog.joinmastodon.org/2018/07/cage-the-mastodon/\" class=\"uri\">https://blog.joinmastodon.org/2018/07/cage-the-mastodon/</a></li>\r\n<li><a href=\"https://mastodon.social/about/more\" class=\"uri\">https://mastodon.social/about/more</a></li>\r\n<li><a href=\"https://instances.noct.zone/\" class=\"uri\">https://instances.noct.zone/</a></li>\r\n<li><a href=\"https://instances.social/list#lang=&amp;allowed=&amp;prohibited=&amp;users=\" class=\"uri\">https://instances.social/list#lang=&amp;allowed=&amp;prohibited=&amp;users=</a></li>\r\n<li><a href=\"https://mwl.io/\" class=\"uri\">https://mwl.io/</a></li>\r\n<li><a href=\"https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md\" class=\"uri\">https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md</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</ul>\r\n',198,108,0,'CC-BY-SA','Fediverse, social media, federated, alternative',0,0,1),
(2863,'2019-07-24','Simplified application architectures for improved security',955,'A thought experiment in whether reducing runtime dependencies can improve security and how to do it.','<p>Before the days of the PC, application architectures were often very simple - being little more than the executable itself and any input files. The constraints of the early PC’s very limited resources required new architectures to make the most of those resources.</p>\r\n<p>We now have a situation where most applications either install, or require the presence of, multiple runtime dependencies. Each dependency has an interface which allows communication between itself and the application, but every interface presents an attack surface with the potential to be exploited by a malicious 3rd party.</p>\r\n<p>Modern computers do not have those same resource constraints yet we are still developing applications using the principles that applied 3 decades ago.</p>\r\n<p>Re-usable functionality can be internalised through static linking at compile-time or by code inclusion (along the lines of a .h file in C/C++)</p>\r\n<p>To change from using tried and tested methods is never convenient, but with concern for cyber security high and rising, has the time come to exchange convenience for simpler application architectures that should reduce vulnerabilities?</p>\r\n<p>…And may a move to new (or is it old) architectures deliver a big win for open source software?</p>\r\n',246,0,0,'CC-BY-SA','Application development, Application architecture, Security',0,0,1),
(2864,'2019-07-25','One weird trick to add a --help option to your awk scripts',1213,'Klaatu demonstrates two ways to add a --help message to your awk scripts','<p>\r\nThe first method is in Awk itself.\r\n</p>\r\n\r\n<pre><code>\r\n#!/usr/bin/awk -f\r\n#\r\n# USAGE EXAMPLE:\r\n# echo the input of some var\r\n# $ foo -v var=8\r\n#\r\n\r\nBEGIN {\r\n    if (length(var) == 0) {\r\n        printf \"%s %s\\n\", ENVIRON[\"_\"], \"is a proof-of-concept help message\";\r\n        printf \"%s\\n\", \"Usage:\";\r\n        printf \"%s\\n\", \"------\";\r\n        printf \"%s %s %s\\n\", \"$\", ENVIRON[\"_\"], \"-v var=NUM\";\r\n        printf \"%s\\n\", \"substitute NUM with the number you want echoed\";\r\n        exit\r\n    }\r\n    else {\r\n        printf \"%s %s\\n\", \"You have entered \", var;\r\n    }\r\n}\r\n</code></pre>\r\n\r\n<p>\r\nThe disadvantage to this is that it only provides a help message if no option is provided. If you actually type <code>--help</code>, then you get Awk\'s help message, which is not useful in this context.\r\n</p>\r\n\r\n<p>\r\nThe shell script wrapper method uses the shell to parse options, which are then passed to an embedded Awk script:\r\n</p>\r\n\r\n<pre><code>\r\n#!/bin/sh\r\n\r\nif [ \"${1}\" = \"--help\" -o \"${1}\" = \"-h\" -o \"${1}\" = \"\" ]; then\r\n    echo \"This is a help message.\"\r\n    exit\r\nfi\r\n\r\n/usr/bin/awk -v var=\"${1}\" \'\r\n\r\nBEGIN {\r\nprintf \"%s %s\\n\", \"You provided\", var;\r\n}\'\r\n</code></pre>\r\n</p>\r\n\r\n<p>\r\nThe disadvantage here is only that you\'re not just writing an Awk script, you\'re writing a shell script with embedded Awk. I can\'t think of a reason not to do it this way (even though in the script that served as the inspiration for this episode, I don\'t use this method).\r\n</p>\r\n\r\n',78,94,0,'CC-BY-SA','awk,option,help,arg',0,0,1),
(2866,'2019-07-29','Intro to Bitcoin for techies',1915,'Survey of Bitcoin: blockchains, blocks, transactions, miners, PoW, hashing, addresses, wallets','<p>This is a broad introduction to Bitcoin from a technical perspective. We do not talk about finance or economics, and we don’t compare distributed ledger technologies. We’re not addressing exchanges, layer 2 technologies, mainstream adoption, etc.</p>\r\n<p>We’re also going to avoid going deep into forks, fungibility, mining or the math of Bitcoin.</p>\r\n<p>In this episode we introduce these fundamental Bitcoin topics:</p>\r\n<ul>\r\n<li>What is Bitcoin?</li>\r\n<li>Blockchains and blocks</li>\r\n<li>What are transactions?</li>\r\n<li>What are miners and what do they do?</li>\r\n<li>Proof of Work in Bitcoin - SHA256 hashing</li>\r\n<li>Bitcoin consensus mechanism</li>\r\n<li>How do wallets work?</li>\r\n<li>Brief discussion about various types of wallets and wallet security</li>\r\n</ul>\r\n<p>I hope this is accessible and informative and look forward to doing more in the future.</p>',379,110,0,'CC-BY-SA','bitcoin, blockchain, cryptocurrency',0,0,1),
(2873,'2019-08-07','Death Angel - Card game',1045,'Short description of Death Angel card game','<p>For more information, have a look at BoardGameGeek: <a href=\"https://boardgamegeek.com/boardgame/71721/space-hulk-death-angel-card-game\" class=\"uri\">https://boardgamegeek.com/boardgame/71721/space-hulk-death-angel-card-game</a></p>\r\n',364,95,0,'CC-BY-SA','cardgame',0,0,1),
(2878,'2019-08-14','Type classes in Haskell',1168,'Tuula explains what type classes are and how to use them','<h2 id=\"background\">Background</h2>\r\n<p>Type classes are Haskell’s way of doing ad hoc polymorphics or overloading. They are used to defined set of functions that can operate more than one specific type of data.</p>\r\n<h2 id=\"equality\">Equality</h2>\r\n<p>In Haskell there’s no default equality, it has to be defined.</p>\r\n<p>There’s two parts to the puzzle. First is type class <code>Eq</code> that comes with the standard library and defines function signatures for equality and non-equality comparisons. There’s type parameter <code>a</code> in the definition, which is filled by user when they define instance of <code>Eq</code> for their data. In that instance definition, <code>a</code> is filled with concrete type.</p>\r\n<pre><code>class  Eq a where\r\n  (==) :: a -&gt; a -&gt; Bool\r\n  (/=) :: a -&gt; a -&gt; Bool\r\n\r\n  x /= y = not (x == y)</code></pre>\r\n<p>Definition above can be read as “class Eq a that has two functions with following signatures and implementations”. In other words, given two <code>a</code>, this function determines are they equal or not (thus <code>Bool</code> as return type). <code>/=</code> is defined in terms of <code>==</code>, so it’s enough to define one and you get other one for free. But you can still define both if you’re so included (maybe some optimization case).</p>\r\n<p>If we define our own <code>Size</code> type, like below, we can compare sizes:</p>\r\n<pre><code>data Size = Small | Medium | Large\r\n    deriving (Show, Read)\r\n\r\ninstance Eq Size where\r\n    Small == Small = True\r\n    Medium == Medium = True\r\n    Large == Large = True\r\n    _ == _ = False</code></pre>\r\n<p>And here’s couple example comparisons.</p>\r\n<pre><code>&gt; Small == Small\r\nTrue\r\n&gt; Large /= Large\r\nFalse</code></pre>\r\n<p>Writing these by hand is both tedious and error prone, so we usually use automatic derivation for them. Note how the second line now reads <code>deriving (Show, Read, Eq)</code>.</p>\r\n<pre><code>data Size = Small | Medium | Large\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<h2 id=\"hierarchy-between-type-classes\">Hierarchy between type classes</h2>\r\n<p>There can be hierarchy between type classes, meaning one requires presence of another. Common example is <code>Ord</code>, which is used to order data.</p>\r\n<pre><code>class Eq a =&gt; Ord a where\r\n    compare :: a -&gt; a -&gt; Ordering\r\n    (&lt;) :: a -&gt; a -&gt; Bool\r\n    (&gt;=) :: a -&gt; a -&gt; Bool\r\n    (&gt;) :: a -&gt; a -&gt; Bool\r\n    (&lt;=) :: a -&gt; a -&gt; Bool\r\n    max :: a -&gt; a -&gt; a\r\n    min :: a -&gt; a -&gt; a</code></pre>\r\n<p>This definition can be read as “class Ord a, where a has instance of Eq, with pile of functions as follows”. <code>Ord</code> has default implementation for quite many of these, in terms of others, so it’s enough to implement either <code>compare</code> or <code>&lt;=</code>.</p>\r\n<p>For our <code>Size</code>, instance of <code>Ord</code> could be defined as:</p>\r\n<pre><code>instance Ord Size where\r\n    Small &lt;= _ = True\r\n    Medium &lt;= Small = False\r\n    Medium &lt;= _ = True\r\n    Large &lt;= Large = True\r\n    Large &lt;= _ = False</code></pre>\r\n<h2 id=\"writing-generic-code\">Writing generic code</h2>\r\n<p>There’s lots and lots of type classes in standard library:</p>\r\n<ul>\r\n<li><code>Num</code> for numeric operations</li>\r\n<li><code>Integral</code> for integer numbers</li>\r\n<li><code>Floating</code> for floating numbers</li>\r\n<li><code>Show</code> for turning data into strings</li>\r\n<li><code>Read</code> for turning strings to data</li>\r\n<li><code>Enum</code> for sequentially ordered types (these can be enumerated)</li>\r\n<li><code>Bounded</code> for things with upper and lower bound</li>\r\n<li>and so on…</li>\r\n</ul>\r\n<p>Type classes allow you to write really generic code. Following is contrived example using <code>Ord</code> and <code>Show</code>:</p>\r\n<pre><code>check :: (Ord a, Show a) =&gt; a -&gt; a -&gt; String\r\ncheck a b =\r\n    case compare a b of\r\n        LT -&gt;\r\n            show a ++ &quot; is smaller than &quot; ++ show b\r\n        GT -&gt;\r\n            show a ++ &quot; is greater than &quot; ++ show b\r\n        EQ -&gt;\r\n            show a ++ &quot; and &quot; ++ show b ++ &quot; are equal&quot;</code></pre>\r\n<p>Check takes two parameters that are same type and that type has to have <code>Ord</code> and <code>Show</code> instances. <code>Ord</code> is for ordering and <code>Show</code> is for turning data into string (handy for displaying it). The end result is string telling result of comparison. Below is some examples of usage. Note how our function can handle different types of data: <code>Size</code>, <code>Int</code> and <code>[Int]</code>.</p>\r\n<pre><code>&gt; check Medium Small\r\n&quot;Medium is greater than Small&quot;\r\n&gt; check Small Large\r\n&quot;Small is smaller than Large&quot;\r\n&gt; check 7 3\r\n&quot;7 is greater than 3&quot;\r\n&gt; check [1, 2] [1, 1, 1]\r\n&quot;[1, 2] is greater than [1, 1, 1]&quot;</code></pre>\r\n<p>There are many extensions to type classes that add more behaviour. These aren’t part of standard Haskell, but can be enabled with a pragma definition or compiler flag. They can be somewhat more complicated to use, have special cases that need careful consideration, but offer interesting options.</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>Thank you for listening. Question, comments and feedback welcome. Best way to catch me nowadays is either by email or in fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','type class',0,0,1),
(2883,'2019-08-21','Pass the pigs',318,'Tuula talks about their childhood game pass the pigs','<p>For more information, have a look at <a href=\"https://boardgamegeek.com/boardgame/2593/pass-pigs\" class=\"uri\">https://boardgamegeek.com/boardgame/2593/pass-pigs</a></p>\r\n',364,95,0,'CC-BY-SA','dice game',0,0,1),
(2950,'2019-11-22','NotPetya and Maersk: An Object Lesson',861,'Looking at an object lesson for proper IT management processes and the cost of failure','<p>We previously looked at the NIST Security Framework, which lays out how organizations should manage their network security. That may have seemed a bit dry, so let’s look at this case study to put some flesh on those dry bones. Failing to manage your security risks properly can have significant consequences.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=997\" class=\"uri\">https://www.zwilnik.com/?page_id=997</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2850\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2850</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1045\" class=\"uri\">https://www.zwilnik.com/?page_id=1045</a></li>\r\n</ul>\r\n',198,74,0,'CC-BY-SA','IT Management, Security',0,0,1),
(2898,'2019-09-11','Modeling people in space game',1315,'Tuula talks how they approach modeling people in space game','<p>People are what makes dynasty simulators interesting and this episode will be about them. There isn’t much code this time, mainly just how data is organized. Topic is long and split over several episodes.</p>\r\n<p>Some people in game are controlled by computer, while some are controlled by player. There’s no difference on what each can do in game, computer is basically just filling in for players when there aren’t enough players.</p>\r\n<p>There’s plenty of data about people, spread over several entities and database tables. Main one is <code>Person</code>, which stores name, gender, sex, date of birth and some stats (and then some more).</p>\r\n<p>There are lots of various ways of naming people and I chose to model three for the starters:</p>\r\n<pre><code>data PersonName =\r\n    RegularName FirstName FamilyName (Maybe Cognomen)\r\n    | SimpleName FirstName (Maybe Cognomen)\r\n    | RegalName FirstName FamilyName RegnalNumber (Maybe Cognomen)\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>The higher the rank, more complicated names you tend to have (for some reason). Later on I’ll try and see if I can add more varied names, like matronyms and patronyms.</p>\r\n<p>Sex and gender I’m modeling with simple system of two enumerations, sex can be <code>Female</code>, <code>Male</code> or <code>Intersex</code>, while gender has values <code>Man</code>, <code>Woman</code>, <code>Agender</code> and <code>Nonbinary</code>. System is coarse, but should be enough to get started with the game. Later on, this can be expanded to more nuanced system.</p>\r\n<p>Traits are defining features of people. These include things like brave, coward, ambitious, content, honest and such. Values are binary, character either is brave or not. And character can’t be brave and coward at the same time.</p>\r\n<p>Relations are modeled as <code>PersonRelation</code> and thus stored in <code>person_relation</code> table:</p>\r\n<pre><code>Relation json\r\n    originatorId PersonId\r\n    targetId PersonId\r\n    type RelationType\r\n    visibility RelationVisibility\r\n    deriving Show Read Eq</code></pre>\r\n<p>I find this corner of the puzzle particular interesting. This models who is parent or child, who is friend or rival. Interconnected web created by relations isn’t completely visible to players (or any other person in game). Relations have visibility, modeled as <code>RelationVisibility</code>, which tells how visible it is. Public ones are known by everyone, family relations are limited to small group of people and secret relations are only known by those who are in the fold. One aspect of the game is acquiring this information.</p>\r\n<p>Intel is modeled as <code>HumanIntelligence</code> and stored in <code>human_intelligence</code> table:</p>\r\n<pre><code>HumanIntelligence json\r\n    personId PersonId\r\n    ownerId PersonId\r\n    level PersonIntel\r\n    deriving Show Read Eq</code></pre>\r\n<p>Essentially it just lists which character has what information about certain other character. So when displaying information to players, this table has to be referenced in order to know how much to reveal to them.</p>\r\n<p>Different types of intels are listed as <code>PersonIntel</code>:</p>\r\n<pre><code>data PersonIntel =\r\n    Stats\r\n    | Demesne\r\n    | FamilyRelations\r\n    | SecretRelations\r\n    | Opinions OpinionIntel\r\n    | Traits\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>Person related data is sent back to client in <code>PersonReport</code> record (I’m not copying it here as it’s relatively large). We can have a look on how one field is processed.</p>\r\n<p>For example, in case of traits. <code>PersonReport</code> has field <code>personReportTraits :: !(Maybe [TraitReport])</code>. Exclamation mark in the beginning of type instructs Haskell that this value should be computed immediately when record is created and not left for later. I’m doing this as I know for sure that it’ll always be used and there’s no advantage on delaying computation for the time when it might be needed.</p>\r\n<p>Report creating (high level):</p>\r\n<pre><code>personReportTraits = if Traits `elem` targetIntel\r\n                        then Just $ traitReport &lt;$&gt; targetTraits\r\n                        else Nothing</code></pre>\r\n<p>That first checks that <code>Traits</code> level of intel is available and then creates list of trait reports (one for each trait person has). These have things like trait name, description, trait type and how long the trait is valid. Having separate name and description fields makes it easier to work on client side as I don’t have to come up with descriptions there anymore. I can just use what the server sends to me and be happy.</p>\r\n<p>Comments, questions and feedback are welcome. Best way to catch me nowadays is email or fediverse where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','modelling,data',0,0,1),
(2867,'2019-07-30','The Kenwood TS940S Automatic Tuning Unit',784,'I cover the Automatic Tuning unit on my Kenwood TS940S, re comment from HPR2668','<p>In this episode I let you hear the operation of my Kenwood TS940S automatic tuning unit. It had been a while since I’d last transmitted and I was a bit nervous that it might not even work – apparently it still does.</p>\r\n<ul>\r\n<li><p>Link to my original show that had a comment from Michael<br />\r\nhpr2668 :: Explaining the controls on my Amateur HF Radio Part 3<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2668\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2668</a></p></li>\r\n<li><p>Link to article about the Kenwood TS940-S<br />\r\n<a href=\"https://www.universal-radio.com/catalog/hamhf/ts940s.html\" class=\"uri\">https://www.universal-radio.com/catalog/hamhf/ts940s.html</a></p></li>\r\n<li><p>Information on the Automatic Tuning Unit located internally within the Kenwood TS940S apparently its an optional Unit with Part number AT-940<br />\r\n<a href=\"https://www.universal-radio.com/catalog/hamhf/at940.html\" class=\"uri\">https://www.universal-radio.com/catalog/hamhf/at940.html</a></p></li>\r\n<li><p>if you really want to dive into more detail about Tuning units feel free to follow this link in wikipedia.<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Antenna_tuner\" class=\"uri\">https://en.wikipedia.org/wiki/Antenna_tuner</a></p></li>\r\n<li><p>Dipole information from wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Dipole_antenna\" class=\"uri\">https://en.wikipedia.org/wiki/Dipole_antenna</a></p></li>\r\n<li><p>40M band allocation information from Wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/40-meter_band\" class=\"uri\">https://en.wikipedia.org/wiki/40-meter_band</a></p></li>\r\n<li><p>Noise Blanker information from wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Noise_blanker\" class=\"uri\">https://en.wikipedia.org/wiki/Noise_blanker</a></p></li>\r\n</ul>\r\n',201,43,1,'CC-BY-SA','Amateur, Radio, Ham',0,0,1),
(2865,'2019-07-26','The YouTube channels I really like',857,'Just some random thoughts on some random youtube channels','<ul>\r\n<li><p>The Late Show with Stephen Colbert<br />\r\n(<a href=\"https://www.youtube.com/channel/UCMtFAi84ehTSYSE9XoHefig\" class=\"uri\">https://www.youtube.com/channel/UCMtFAi84ehTSYSE9XoHefig</a>)</p></li>\r\n<li><p>CuriousMarc<br />\r\nApollo AGC Part 1: Restoring the computer that put man on the Moon<br />\r\n(<a href=\"https://www.youtube.com/watch?v=2KSahAoOLdU\" class=\"uri\">https://www.youtube.com/watch?v=2KSahAoOLdU</a>)</p></li>\r\n<li><p>Virtual AGC — AGS — LVDC — Gemini<br />\r\n(<a href=\"https://github.com/virtualagc/virtualagc\" class=\"uri\">https://github.com/virtualagc/virtualagc</a>)<br />\r\n(<a href=\"https://www.ibiblio.org/apollo/\" class=\"uri\">https://www.ibiblio.org/apollo/</a>)</p></li>\r\n<li><p>Moshix<br />\r\n(<a href=\"https://www.youtube.com/user/moshe5760\" class=\"uri\">https://www.youtube.com/user/moshe5760</a>)</p></li>\r\n<li><p>Death Wears Bunny Slippers<br />\r\n(<a href=\"https://www.youtube.com/channel/UCd50A5qLv8FemVufSvDgkCQ\" class=\"uri\">https://www.youtube.com/channel/UCd50A5qLv8FemVufSvDgkCQ</a>)</p></li>\r\n</ul>\r\n',369,0,0,'CC-BY-SA','apollo,agc,youtube',0,0,1),
(2888,'2019-08-28','Pattern matching in Haskell',1236,'Tuula talks about one of their favourite features in Haskell','<p>Pattern matching is one of those features of Haskell that immediately got me interested as it reduces amount of branching inside of functions I write. Basic idea is that if value constructors are for making data, pattern matching is for taking it apart.</p>\r\n<p>First example is a function that takes a <code>Bool</code> and returns a respective <code>String</code>:</p>\r\n<pre><code>boolToString :: Bool -&gt; String\r\nboolToString n =\r\n    if n\r\n        then &quot;True&quot;\r\n        else &quot;False&quot;</code></pre>\r\n<p>Nothing too fancy, just an <code>if</code> expression inside a function. We can move that <code>if</code> out of there though and define exactly same functionality, but with patterns:</p>\r\n<pre><code>boolToString :: Bool -&gt; String\r\nboolToString True =\r\n    &quot;True&quot;\r\n\r\nboolToString False =\r\n    &quot;False&quot;</code></pre>\r\n<p>There’s one definition for <code>boolToString</code>, but two different patterns used.</p>\r\n<p>Second example is bit more complex, this time we have <code>Maybe Int</code> that is being turned into <code>String</code>. <code>Maybe</code> has two value constructors <code>Nothing</code> and <code>Just a</code>. We have two cases for <code>Just</code>, specific one for when it’s <code>Just 1</code> and more general one <code>Just n</code> that takes care of rest of the cases.</p>\r\n<pre><code>isBig :: Maybe Int -&gt; String\r\nisBig Nothing =\r\n    &quot;Not at all&quot;\r\n\r\nisBig (Just 1) =\r\n    &quot;Just perfect&quot;\r\n\r\nisBig (Just n) =\r\n    if n &lt; 10\r\n        then &quot;Just slightly&quot;\r\n        else &quot;Definitely is&quot;</code></pre>\r\n<p>Some example usage:</p>\r\n<pre><code>&gt; isBig Nothing\r\n&quot;Not at all&quot;\r\n&gt; isBig $ Just 0\r\n&quot;Just perfect&quot;\r\n&gt; isBig $ Just 50\r\n&quot;Definitely is&quot;</code></pre>\r\n<p>Pattern matching isn’t limited to algebraic datatypes that we have been working with so far. We can do same things with records. Below is an function used to calculate total fee when cost and customer are known. Each customer can have their own discount percentage, but in addition we’re giving 10% discount to VIP customers:</p>\r\n<pre><code>data Customer = Customer\r\n    { customerName :: String\r\n    , customerDiscountPct :: Double\r\n    , vipCustomer :: Bool\r\n    }\r\n\r\ntotalFee :: Double -&gt; Customer -&gt; Double\r\ntotalFee bill cust@(Customer { vipCustomer = True }) =\r\n    bill * 0.9 * customerDiscountPct cust\r\n\r\ntotalFee bill cust =\r\n    bill * customerDiscountPct cust</code></pre>\r\n<p>There’s two cases of <code>totalFee</code> function. First one is for when passed in <code>Customer</code> has <code>vipCustomer</code> field <code>True</code>. Second one takes care of general case. In the first case we’re using <code>@</code> to bind <code>Customer</code> as a whole to <code>cust</code> name.</p>\r\n<p>Lists can be matched too. The basic idea is exactly the same:</p>\r\n<ul>\r\n<li><code>(x:xs)</code> matches a list with at least one item, <code>x</code> is first item, <code>xs</code> is rest of the items (might be an empty list)</li>\r\n<li><code>(x:y:_)</code> matches two first items in a list of at least two items, <code>x</code> is first, <code>y</code> is second, <code>_</code> is rest</li>\r\n<li><code>[]</code> matches empty list</li>\r\n<li><code>(x:[])</code> matches list of exactly one item</li>\r\n</ul>\r\n<p>Underscore <code>_</code> matches to everything without binding value to a name. This is useful when you don’t care about exact value, so you don’t want to give it a name. One could give it a name, but compiler will issue a warning if there are unused values in the code.</p>\r\n<p>Next example is recursively counting amount if items in a list using pattern matching:</p>\r\n<pre><code>count :: [a] -&gt; Int\r\ncount [] =\r\n    0\r\n\r\ncount (x:xs) =\r\n    1 + count xs</code></pre>\r\n<p>Fibonacci series is series of number which starts with 0, 1 and then rest of the numbers are sum of two previous ones: 0, 1, 1, 2, 3, 5, 8…</p>\r\n<p>To calculate number in series, we can write following code (this is extremely slow way of calculating them by the way):</p>\r\n<pre><code>fibonacci :: Int -&gt; Int\r\nfibonacci 0 =\r\n    0\r\n\r\nfibonacci 1 =\r\n    1\r\n\r\nfibonacci n =\r\n    fibonacci (n - 1) + fibonacci (n - 2)</code></pre>\r\n<p>Last trick in our sleeve for now is <code>case</code> expression. This allows us to do pattern matching inside of a function. Otherwise it works in the same way. Our fibonacci function could be defined as:</p>\r\n<pre><code>fibonacci :: Int -&gt; Int\r\nfibonacci n =\r\n    case n of\r\n        0 -&gt;\r\n            0\r\n\r\n        1 -&gt;\r\n            1\r\n\r\n        n -&gt;\r\n            fibonacci (n - 1) + fibonacci (n - 2)</code></pre>\r\n<p>Questions, comments and feedback are welcome. Best way to catch me nowadays is either email or in fediverse where I’m <code>Tuula@mastodon.social</code></p>\r\n',364,107,0,'CC-BY-SA','pattern matching',0,0,1),
(2869,'2019-08-01','building a bike, following in John Kulp\'s footsteps',694,'turning a couple of old bikes into a long wheel base recumbent','<ul>\r\n<li><p>recycled recumbent<br />\r\n<a href=\"https://sites.google.com/site/recycledrecumbents/home\" class=\"uri\">https://sites.google.com/site/recycledrecumbents/home</a></p></li>\r\n<li><p>wisil recumbent<br />\r\n<a href=\"https://www.wisil.recumbents.com/home/\" class=\"uri\">https://www.wisil.recumbents.com/home/</a></p></li>\r\n<li><p>hpr 1282<br />\r\n<a href=\"https://www.hackerpublicradio.org/eps.php?id=1282\" class=\"uri\">https://www.hackerpublicradio.org/eps.php?id=1282</a></p></li>\r\n<li><p>cj hoyle<br />\r\n<a href=\"https://www.youtube.com/user/cjhoyle\" class=\"uri\">https://www.youtube.com/user/cjhoyle</a></p></li>\r\n<li><p>toledo bike<br />\r\n<a href=\"https://www.toledobikes.org/\" class=\"uri\">https://www.toledobikes.org/</a></p></li>\r\n</ul>\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent, recycle',0,0,1),
(2872,'2019-08-06','Shoe Lace Tips',472,'In this episode I give some shoe lace tips','<p>In this episode I give some shoe lace tips</p>\r\n<ul>\r\n<li><p>Shoe Laces Ted Talk with over 6.5 million views<br />\r\n<a href=\"https://www.ted.com/talks/terry_moore_how_to_tie_your_shoes?language=en\" class=\"uri\">https://www.ted.com/talks/terry_moore_how_to_tie_your_shoes?language=en</a></p></li>\r\n<li><p>Some further info on the shoe lace knot from the wonderful wikipedia site<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Shoelace_knot\" class=\"uri\">https://en.wikipedia.org/wiki/Shoelace_knot</a></p></li>\r\n<li><p>Fast tie shoe laces recommended for anyone in a hurry<br />\r\n<a href=\"https://www.amazon.co.uk/Gritin-Elastic-Laces-Black-Reflective/dp/B07GYM9RC8/ref=cts_sp_3_vtp\" class=\"uri\">https://www.amazon.co.uk/Gritin-Elastic-Laces-Black-Reflective/dp/B07GYM9RC8/ref=cts_sp_3_vtp</a></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','hacks, tips',0,0,1),
(2874,'2019-08-08','Repair of G.E. Variable Speed Cassette Recorder',1228,'I talk about repairing a 1997 handheld cassette recorder and demonstrate its use.','<p>I found a pretty cool little handheld cassette recorder at Salvation Army Thrift Store for 99 cents yesterday. It was non-functioning. I was able to get it working again by 1. cleaning corrosion from battery compartment; 2. replacing the nasty gooey belt; 3.  repairing the battery compartment, which had a broken-off spring for one of the battery\'s negative connections. The most interesting feature of the device is that it has a variable-speed knob for playback at higher speed. I demonstrate this in the podcast.</p>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157709909168017\" title=\"G.E. Variable Speed Cassette Recorder Repair\" target=\"_blank\"><img src=\"https://live.staticflickr.com/65535/48384093097_f35a19caaa.jpg\" width=\"500\" height=\"281\" alt=\"G.E. Variable Speed Cassette Recorder Repair\"></a></p>\r\n\r\n<h2>Links to Stuff Mentioned in the Episode</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://www.flickr.com/photos/137675441@N05/albums/72157709909168017\" target=\"_blank\">Flickr Photo Album</a></li>\r\n	<li><a href=\"https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=assorted+cassette+belts&_sacat=0\" target=\"_blank\">Assorted cassette deck belts on eBay</a></li>\r\n	<li><a href=\"https://kahoot.com/\" target=\"_blank\">Kahoot!</a> Make Learning Awesome.</li>\r\n</ul>\r\n\r\n\r\n',238,0,0,'CC-BY-SA','Recording, Audio, Tape, Cassette, Recording Devices, Tape Speeds, Electronics, Repair',0,0,1),
(2875,'2019-08-09','cutting up the frames',456,'you\'ve got to crack some eggs to make an omelette','<h2 id=\"drawings\">Drawings</h2>\r\n<p><a href=\"https://sites.google.com/site/recycledrecumbents/ez-clone-drawings\" class=\"uri\">https://sites.google.com/site/recycledrecumbents/ez-clone-drawings</a></p>\r\n<h2 id=\"pictures\">Pictures</h2>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/picture01-one-of-the-donors.jpg\" alt=\"picture01-one-of-the-donors.jpg\" /><br />\r\nOne of the donors</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/picture02-dross.jpg\" alt=\"picture02-dross.jpg\" /><br />\r\nDross</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/picture03-the-gold.jpg\" alt=\"picture03-the-gold.jpg\" /><br />\r\nThe gold</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/picture04-first-cut.jpg\" alt=\"picture04-first-cut.jpg\" /><br />\r\nFirst cut</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/picture05-cutting-tubes.jpg\" alt=\"picture05-cutting-tubes.jpg\" /><br />\r\nCutting tubes</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/picture06-workmate.jpg\" alt=\"picture06-workmate.jpg\" /><br />\r\nWorkmate</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/picture07-frame2-parts.jpg\" alt=\"picture07-frame2-parts.jpg\" /><br />\r\nFrame 2 parts</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/picture08-frame1-parts.jpg\" alt=\"picture08-frame1-parts.jpg\" /><br />\r\nFrame 1 parts</p>\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent, recycle',0,0,1),
(2876,'2019-08-12','Sausage Orzotto',2543,'A favorite recipe, dictated while it is cooked.','<p>This recipe has been heavily adapted from one I received from <a href=\"https://www.hellofresh.com\">Hello Fresh</a> - credit where credit\'s due!</p>\r\n<p>Ingredients:</p>\r\n<ul>\r\n<li>1 lb (500g) Sausage (chicken or pork works)</li>\r\n<li>1 ½ cups (192g) Orzo</li>\r\n<li>2 tbsp (40g) Butter</li>\r\n<li>Olive oil</li>\r\n<li>Zucchini</li>\r\n<li>Shallot</li>\r\n<li>1 - 2 tbsp (20-40g) Italian Seasoning</li>\r\n<li>Pepper</li>\r\n<li>2 cups (475ml) water</li>\r\n<li>1 tsp (4g) stock concentrate</li>\r\n<li>16oz (450g?? One normal can, whatever that is) Crushed or diced tomatoes</li>\r\n<li>1 cup (226g) Mozzarella cheese (shredded)</li>\r\n<li>Panko Breadcrumbs</li>\r\n<li>Salt (Optional)</li>\r\n</ul>\r\n<ol>\r\n<li>Mince half the shallot (or all of it, I\'m not the boss of you). Trim and shred the zucchini. Prepare a mixing bowl lined with a paper towel.</li>\r\n<li>Preheat oven to 500 F</li>\r\n<li>Drizzle some oil into a large oven-proof pan (if you\'ve got one) and cook the sausage, with half the Italian seasoning, over medium heat, breaking it into bite-sized pieces as you cook it. Transfer to the mixing bowl for later.</li>\r\n<li>Add another drizzle of olive oil, and shred the zucchini into the pan. Add shallot, and cook until the zucchini shrinks to ⅔ of its size (about 5 minutes). Transfer to the mixing bowl with the sausage.</li>\r\n<li>Wipe out the pan with a paper towel. Melt 1 tbsp of butter over medium heat, and add orzo, stirring pretty frequently for 2-3 minutes.</li>\r\n<li>Stir in the rest of the Italian seasoning, along with the water, tomatoes, and stock concentrate. Bring to a boil and stir until orzo is done - around 12 - 14 minutes.</li>\r\n<li>Drain excess liquid from the zucchini and sausage.</li>\r\n<li>Mix sausage &amp; zucchini into orzo mixture, with 1 tbsp of butter. Season with salt &amp; pepper, if you want.</li>\r\n<li>If you don\'t have an oven-proof pan, you\'re going to want to transfer everything over to a large baking dish of some kind. 13x9&quot; works for me.</li>\r\n<li>Cover the mixture in mozzarella cheese and panko breadcrumbs - in that order!</li>\r\n<li>Place dish in the oven for 2-3 minutes, until the breadcrumbs are toasted.</li>\r\n</ol>\r\n<p>Note: If these metric measurements seem crazy, they probably are.</p>\r\n',196,0,1,'CC-BY-SA','food,cooking',0,0,1),
(2877,'2019-08-13','Using Zenity with Pdmenu',1358,'Zenity is a rather cool program that will display GTK+ dialogs from a script','<h2 id=\"overview\">Overview</h2>\r\n<p>I use <code>pdmenu</code> a lot to help me do work on my main desktop PC. I did an HPR show on <a href=\"https://hackerpublicradio.org/eps.php?id=2443\" title=\"hpr2443 :: pdmenu\"><code>pdmenu</code></a> on 13 December 2017 and the author <a href=\"https://joeyh.name/\" title=\"Joey Hess\">Joey Hess</a> responded in show <a href=\"https://hackerpublicradio.org/eps.php?id=2459\" title=\"hpr2459 :: free software&#39;s long tail\">2459</a>.</p>\r\n<p>In the intervening time I have also integrated <a href=\"https://help.gnome.org/users/zenity/\" title=\"Zenity Manual\"><code>Zenity</code></a> into my menus. This is a GUI tool which generates a number of different pop-up windows known as <em>dialogs</em>, which can display information, or into which information can be typed. The capabilities provided by <code>pdmenu</code> are a little too basic to enable me to do what I need to do.</p>\r\n<p>I thought it might be of interest to show some examples of how I use this tool with <code>pdmenu</code>.</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/hpr2877/full_shownotes.html\">viewed here</a>.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Pdmenu:\r\n<ul>\r\n<li><a href=\"https://joeyh.name/code/pdmenu/\">Pdmenu website</a></li>\r\n<li><a href=\"https://joeyh.name/\">Joey Hess</a></li>\r\n</ul></li>\r\n<li>Zenity\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Zenity\">Wikipedia page</a></li>\r\n<li><a href=\"https://help.gnome.org/users/zenity/\">Zenity Manual</a></li>\r\n</ul></li>\r\n</ul>\r\n',225,42,1,'CC-BY-SA','zenity,Bash scripting,pdmenu,GTK+',0,0,1),
(2879,'2019-08-15','Describing how I listen to podcasts PART 1',1877,'This episode badly covers the console audio player moc.','<p>In this series I cover how I listen to podcasts and how the process has change over the years. This episode badly covers the console audio player <code>moc</code>.</p>\r\n<ul>\r\n<li><p>Link to HPR 2112 (Home Server) episode mentioned in this podcast<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2112\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2112</a></p></li>\r\n<li><p>My first MP3 player was a Jelly Bean shaped MP3 player apparently known as an S1 MP3 player<br />\r\n<a href=\"https://en.wikipedia.org/wiki/S1_MP3_player\" class=\"uri\">https://en.wikipedia.org/wiki/S1_MP3_player</a></p></li>\r\n<li><p>Sansa Clip info on wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Sansa_Clip#Sansa_Clip\" class=\"uri\">https://en.wikipedia.org/wiki/Sansa_Clip#Sansa_Clip</a></p></li>\r\n<li><p>Raspberry Pi<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Raspberry_Pi\" class=\"uri\">https://en.wikipedia.org/wiki/Raspberry_Pi</a></p></li>\r\n<li><p>Music On Console (MOC) is an ncurses-based console audio player for Linux/UNIX<br />\r\n</p>\r\n<ul>\r\n<li><p>Here is a link to information about moc on wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Music_on_Console\" class=\"uri\">https://en.wikipedia.org/wiki/Music_on_Console</a></p></li>\r\n<li>On a Debian based system Moc can be installed by issuing the following command<br />\r\n</li>\r\n</ul>\r\n<pre><code>      sudo apt-get install moc</code></pre>\r\n<ul>\r\n<li>Link to Moc, Music On Console homepage<br />\r\n<a href=\"https://moc.daper.net/\" class=\"uri\">https://moc.daper.net/</a></li>\r\n</ul></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Ncurses',0,0,1),
(2884,'2019-08-22','TASCAM Porta 02 MiniStudio 4-Track Cassette Recorder Demonstration',4636,'I demonstrate the use of a vintage home studio device','<p>I discuss and demonstrate the latest retro gadget I found at the flea market last weekend, a TASCAM Porta 02 MiniStudio 4-Track Cassette Recorder. It was in a bin full of junk—filthy, lacking its power supply, and I got it for only $5. I hacked a power supply, disassembled it completely, washed everything thoroughly, and put it back together. It worked perfectly with the exception of the pause button. This has been one of the most fun projects I can remember, especially because my daughter is into it too, and she\'s learning how to make multi-track recordings. I always wanted a 4-track when I was in high school but never had one. Now I do!</p>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157710065663101\" title=\"TSACAM Porta 02 4-Track Recording Demonstration\"><img src=\"https://live.staticflickr.com/65535/48445093092_64359d6b68.jpg\" width=\"500\" height=\"375\" alt=\"TSACAM Porta 02 4-Track Recording Demonstration\"></a></p>\r\n\r\n<h2>Links to info about stuff I mentioned</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://flic.kr/s/aHsmFL2UUv\" target=\"_blank\">Flickr album with photos from this recording session</a></li>\r\n	<li><a href=\"https://flic.kr/s/aHsmFyCT82\" target=\"_blank\">Flickr album with photos from the TASCAM machine restoration</a></li>\r\n	<li>My earlier episode about the Marantz recorder: <a href=\"https://hackerpublicradio.org/eps.php?id=1844\">hpr1844 :: The Marantz PMD 660 Professional Solid State Recorder</a></li>\r\n	<li>My video of the TASCAM testing, power supply hack, disassembly, and cleaning: <a href=\"https://youtu.be/HhM6UwBhykM\" target=\"_blank\">Watch on YouTube</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Multitrack_recording\" target=\"_blank\">Multitrack recording</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/G%C3%BCiro\" target=\"_blank\">Güiro</a> (mine is metal)</li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Claves\" target=\"_blank\">Clave</a> (instrument) and <a href=\"https://en.wikipedia.org/wiki/Clave_(rhythm)\" target=\"_blank\">clave rhythm</a> (you heard the 2-3 clave rhythm on this podcast)</li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Harmonica#Diatonic_harmonicas\" target=\"_blank\">Diatonic harmonica</a></li>\r\n	<li>	<a href=\"https://en.wikipedia.org/wiki/Chromatic_harmonica\" target=\"_blank\">Chromatic harmonica</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Microphone\" target=\"_blank\">Microphone types</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Phantom_power\" target=\"_blank\">Phantom power</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Clipping_(audio)\" target=\"_blank\">Clipping</a></li>\r\n	<li>EQ: <a href=\"https://en.wikipedia.org/wiki/Equalization_(audio)\" target=\"_blank\">Equalization</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Audio_mixing_(recorded_music)\">Mixing</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Mastering_(audio)\">Mastering</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Demo_(music)\">Demo Recordings</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Portastudio\">The TASCAM PortaStudio</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/David_Mead_(musician)\" target=\"_blank\">David Mead</a> (his first two albums were with RCA, not Polygram</li>\r\n	<li>My first test recording on the restored TASCAM Porta 02: <a href=\"https://soundcloud.com/jonkulp/tascam-4-track-cassette-recorder-test-1-vamos-a-bailar\" target=\"_blank\">Listen on Soundcloud</a></li>\r\n</ul>\r\n',238,0,0,'CC-BY-SA','Multi-Track Recording, Recording Devices, Home Recording Studios, Cassette Tapes, Vintage Recording ',0,0,1),
(2881,'2019-08-19','Automatically split album into tracks in Audacity',250,'Inspired by a Jon Kulp show, Ken splits a large recording based on silence between tracks','<p>\r\nIn this show Ken, recalls <a href=\"https://hackerpublicradio.org/eps.php?id=1771\">hpr1771 :: Audacity: Label Tracks</a> by <a href=\"https://hackerpublicradio.org/correspondents/0238.html\">Jon Kulp</a> to add Labels to an large audio file.\r\n</p>\r\n\r\n<ul>\r\n<li>Tidy up the audio to the point where you are happy with it, but do not truncate silence.</li>\r\n<li>Find the first break in the audio and check how long it is. In my case it was 4 seconds.</li>\r\n<li>Select the entire track and select <em>Analyze>Silence Finder</em></li>\r\n<li>Change <em>Maximum duration of silence</em> to just under the length of the break. In my case I set it to 3 seconds</li>\r\n<li>This will then create a series of labels on a new Label track</li>\r\n<li>Edit the names of each as desired.</li>\r\n<li>Select File > Export > Export Multiple</li>\r\n<li>Select Split Files based on Labels</li>\r\n<li>Name files using Label/Track Name</li>\r\n</ul>',30,0,1,'CC-BY-SA','Audacity, hpr1771, Detect Silence, Split Track, Label',0,0,1),
(3156,'2020-09-07','HPR Community News for August 2020',4202,'HPR Volunteers talk about shows released and comments posted in August 2020','<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/0387.html\" target=\"_blank\">Cedric De Vroey</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=3131\" target=\"_blank\">3131</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3131\" target=\"_blank\">HPR Community News for July 2020</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=3132\" target=\"_blank\">3132</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-08-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3132\" target=\"_blank\">Keeping track of where I am</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=3133\" target=\"_blank\">3133</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-08-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3133\" target=\"_blank\">Quick tip - Using MPV with Youtube links</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=3134\" target=\"_blank\">3134</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-08-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3134\" target=\"_blank\">Tomorrowland 2020</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=3135\" target=\"_blank\">3135</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-08-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3135\" target=\"_blank\">Quick Tips for May 20 20</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=3136\" target=\"_blank\">3136</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3136\" target=\"_blank\">Matchbox Restoration Part 6</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3137\" target=\"_blank\">3137</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-08-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3137\" target=\"_blank\">Coronavirus Update 2020-07-30</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=3138\" target=\"_blank\">3138</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-08-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3138\" target=\"_blank\">Linux Inlaws S01E12: Reminiscing in FLOSS Weekly</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=3139\" target=\"_blank\">3139</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-08-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3139\" target=\"_blank\">MIDI Sysex</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=3140\" target=\"_blank\">3140</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-08-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3140\" target=\"_blank\">GIMP: Selection Tools</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=3141\" target=\"_blank\">3141</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3141\" target=\"_blank\">Lessons learnt from Magic the Gathering game design</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=3142\" target=\"_blank\">3142</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-08-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3142\" target=\"_blank\">tcsh</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=3143\" target=\"_blank\">3143</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-08-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3143\" target=\"_blank\">LibreOffice 7.0 Released!</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=3144\" target=\"_blank\">3144</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-08-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3144\" target=\"_blank\">Pentesting: Insecure Object Reference</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3145\" target=\"_blank\">3145</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-08-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3145\" target=\"_blank\">A light bulb moment, part 1</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=3146\" target=\"_blank\">3146</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3146\" target=\"_blank\">Help Me Help you with HPR eps!</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=3147\" target=\"_blank\">3147</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-08-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3147\" target=\"_blank\">NIST\'s Quantum Cryptography Update</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=3148\" target=\"_blank\">3148</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-08-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3148\" target=\"_blank\">Why Open Source matters (to me)</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3149\" target=\"_blank\">3149</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-08-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3149\" target=\"_blank\">HPR AudioBook Club 21  - The Terrible Business of Salmon and Dusk</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0157.html\" target=\"_blank\">HPR_AudioBookClub</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3150\" target=\"_blank\">3150</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-08-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3150\" target=\"_blank\">GIMP: Paint Tools</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=3151\" target=\"_blank\">3151</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3151\" target=\"_blank\">How I listen to podcasts</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</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 23 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 2 comments on\n2 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3119#comments\" target=\"_blank\">hpr3119</a></strong>\n(2020-07-16) \"<em>Converting to FFS2</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>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3119#3\" target=\"_blank\">Comment 3</a>:\nZen_Floater2 on 2020-08-13:\n\"reply back to Gumnos\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3123#comments\" target=\"_blank\">hpr3123</a></strong>\n(2020-07-22) \"<em>Arduino controlled Christmas lights</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=3123#1\" target=\"_blank\">Comment 1</a>:\nArcher72 on 2020-08-03:\n\"Funny story\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 21 comments on 8 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3131#comments\" target=\"_blank\">hpr3131</a></strong>\n(2020-08-03) \"<em>HPR Community News for July 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><li><a href=\"https://hackerpublicradio.org/eps.php?id=3131#1\" target=\"_blank\">Comment 1</a>:\nZen_Floater2 on 2020-08-13:\n\"I\'ve learned much.and I\'d like to share much as well...\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3134#comments\" target=\"_blank\">hpr3134</a></strong>\n(2020-08-06) \"<em>Tomorrowland 2020</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=3134#1\" target=\"_blank\">Comment 1</a>:\nfatherfinch on 2020-08-07:\n\"Great Energy\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3134#2\" target=\"_blank\">Comment 2</a>:\ncatn0b0t on 2020-08-10:\n\"TML 2020\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3137#comments\" target=\"_blank\">hpr3137</a></strong>\n(2020-08-11) \"<em>Coronavirus Update 2020-07-30</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=3137#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-08-11:\n\"some \'smart\' people may not take a vaccine\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-08-12:\n\"Why it matters\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#3\" target=\"_blank\">Comment 3</a>:\nZen_Floater2 on 2020-08-13:\n\"The Squirrel from the Magical Forrest\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#4\" target=\"_blank\">Comment 4</a>:\nSkepticalA on 2020-08-16:\n\"Condescending\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#5\" target=\"_blank\">Comment 5</a>:\nBob on 2020-08-16:\n\"Fact Checks on one of your claims\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#6\" target=\"_blank\">Comment 6</a>:\nbrian-in-ohio on 2020-08-16:\n\"sympathy\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#7\" target=\"_blank\">Comment 7</a>:\nAhuka on 2020-08-16:\n\"Clarification\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#8\" target=\"_blank\">Comment 8</a>:\nZen_Floater2 on 2020-08-19:\n\"Detailed research Corbit Report\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#9\" target=\"_blank\">Comment 9</a>:\nAnon on 2020-08-21:\n\"Conspiracy Theories: Last Week Tonight with John Oliver\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3138#comments\" target=\"_blank\">hpr3138</a></strong>\n(2020-08-12) \"<em>Linux Inlaws S01E12: Reminiscing in FLOSS Weekly</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=3138#1\" target=\"_blank\">Comment 1</a>:\nAhuka on 2020-08-12:\n\"Excellent Interview\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3138#2\" target=\"_blank\">Comment 2</a>:\nClaudioM on 2020-08-14:\n\"Agree with Ahuka. Great Interview!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3138#3\" target=\"_blank\">Comment 3</a>:\nbrian-in-ohio on 2020-08-16:\n\"follow up question\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3138#4\" target=\"_blank\">Comment 4</a>:\nan anonymous listener on 2020-08-21:\n\"volume\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3139#comments\" target=\"_blank\">hpr3139</a></strong>\n(2020-08-13) \"<em>MIDI Sysex</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3139#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-08-16:\n\"the voice\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3139#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2020-08-18:\n\"Voice\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3143#comments\" target=\"_blank\">hpr3143</a></strong>\n(2020-08-19) \"<em>LibreOffice 7.0 Released!</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=3143#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-08-19:\n\"slackware\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3144#comments\" target=\"_blank\">hpr3144</a></strong>\n(2020-08-20) \"<em>Pentesting: Insecure Object Reference</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3144#1\" target=\"_blank\">Comment 1</a>:\nb-yeezi on 2020-08-20:\n\"I deal with this all the time\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3148#comments\" target=\"_blank\">hpr3148</a></strong>\n(2020-08-26) \"<em>Why Open Source matters (to me)</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3148#1\" target=\"_blank\">Comment 1</a>:\nZen_Floater2 on 2020-08-29:\n\"Vic 20\"</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/2020-August/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-August/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 contributors for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a>, <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 12 shows which were without them.</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),
(3176,'2020-10-05','HPR Community News for September 2020',4187,'HPR Volunteers talk about shows released and comments posted in September 2020','<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=3152\" target=\"_blank\">3152</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3152\" target=\"_blank\">My Pocket Knives</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=3153\" target=\"_blank\">3153</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3153\" target=\"_blank\">Fixing eBooks with Calibre and pdfcrop</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=3154\" target=\"_blank\">3154</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-09-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3154\" target=\"_blank\">Make NextCloud your next cloud</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3155\" target=\"_blank\">3155</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-09-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3155\" target=\"_blank\">LastPass Security Dashboard</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=3156\" target=\"_blank\">3156</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-09-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3156\" target=\"_blank\">HPR Community News for August 2020</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=3157\" target=\"_blank\">3157</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3157\" target=\"_blank\">Compost</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=3158\" target=\"_blank\">3158</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3158\" target=\"_blank\">Fingerprint access control? LOL... </a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3159\" target=\"_blank\">3159</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-09-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3159\" target=\"_blank\">Vivaldi - The Four Seasons</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3160\" target=\"_blank\">3160</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-09-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3160\" target=\"_blank\">GIMP: Transform Tools</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=3161\" target=\"_blank\">3161</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-09-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3161\" target=\"_blank\">How I manage podcast listening</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=3162\" target=\"_blank\">3162</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3162\" target=\"_blank\">Introduction to Ansible</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=3163\" target=\"_blank\">3163</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3163\" target=\"_blank\">Linux Inlaws S01E13: The road to communism and freedom</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=3164\" target=\"_blank\">3164</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-09-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3164\" target=\"_blank\">I\'m Learning Spanish</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=3165\" target=\"_blank\">3165</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-09-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3165\" target=\"_blank\">Spanish Tools Continued</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=3166\" target=\"_blank\">3166</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-09-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3166\" target=\"_blank\">Using Ansible to mirror a Git repo</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=3167\" target=\"_blank\">3167</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3167\" target=\"_blank\">A ramble with the Pentland Squires (part 1)</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=3168\" target=\"_blank\">3168</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3168\" target=\"_blank\">FreeBSD Jails and iocage</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=3169\" target=\"_blank\">3169</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-09-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3169\" target=\"_blank\">Ludwig van Beethoven with a hint of Chopin</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3170\" target=\"_blank\">3170</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-09-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3170\" target=\"_blank\">GIMP: Color Tools</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=3171\" target=\"_blank\">3171</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-09-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3171\" target=\"_blank\">A Week On Soylent</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0107.html\" target=\"_blank\">lostnbronx</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3172\" target=\"_blank\">3172</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3172\" target=\"_blank\">A ramble with the Pentland Squires (part 2)</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=3173\" target=\"_blank\">3173</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3173\" target=\"_blank\">Manage your Raspberry Pi fleet with Ansible</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</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 2 comments on\n2 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3138#comments\" target=\"_blank\">hpr3138</a></strong>\n(2020-08-12) \"<em>Linux Inlaws S01E12: Reminiscing in FLOSS Weekly</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>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3138#5\" target=\"_blank\">Comment 5</a>:\nRobert on 2020-09-02:\n\"..._---_\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3146#comments\" target=\"_blank\">hpr3146</a></strong>\n(2020-08-24) \"<em>Help Me Help you with HPR eps!</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=3146#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-09-05:\n\"Keep doing what you\'re doing\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 13 comments on 6 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3152#comments\" target=\"_blank\">hpr3152</a></strong>\n(2020-09-01) \"<em>My Pocket Knives</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3152#1\" target=\"_blank\">Comment 1</a>:\nReto on 2020-09-24:\n\"Link to the other knive podcast\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3154#comments\" target=\"_blank\">hpr3154</a></strong>\n(2020-09-03) \"<em>Make NextCloud your next cloud</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3154#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2020-09-11:\n\"Nextcloud and self hosting\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3158#comments\" target=\"_blank\">hpr3158</a></strong>\n(2020-09-09) \"<em>Fingerprint access control? LOL... </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3158#1\" target=\"_blank\">Comment 1</a>:\nBeeza on 2020-09-11:\n\"The need for \"meta procedures\"\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3158#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-09-11:\n\"Fantastic show!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3161#comments\" target=\"_blank\">hpr3161</a></strong>\n(2020-09-14) \"<em>How I manage podcast listening</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3161#1\" target=\"_blank\">Comment 1</a>:\nReto on 2020-09-24:\n\"Sansa MP3 Players\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3161#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-09-27:\n\"Rockbox and Sansa players\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3161#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2020-09-27:\n\"My Rockbox/Sansa experience\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3161#4\" target=\"_blank\">Comment 4</a>:\nDave Morriss on 2020-09-29:\n\"No more Sansa Clip Plus\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3167#comments\" target=\"_blank\">hpr3167</a></strong>\n(2020-09-22) \"<em>A ramble with the Pentland Squires (part 1)</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3167#1\" target=\"_blank\">Comment 1</a>:\nAaron on 2020-09-27:\n\"Nice conversation, thanks for sharing it\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3167#2\" target=\"_blank\">Comment 2</a>:\nZen_Floater2 on 2020-09-27:\n\"Squirrels love local chit-chat\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3167#3\" target=\"_blank\">Comment 3</a>:\nDave Morriss on 2020-09-29:\n\"Thanks for the feedback\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3168#comments\" target=\"_blank\">hpr3168</a></strong>\n(2020-09-23) \"<em>FreeBSD Jails and iocage</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=3168#1\" target=\"_blank\">Comment 1</a>:\n0xf10e on 2020-09-27:\n\"Why an additional disk/zpool?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3168#2\" target=\"_blank\">Comment 2</a>:\nnorrist on 2020-09-28:\n\"2nd disk for iocage\"</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/2020-September/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-September/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/0215.html\">Windigo</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>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),
(2889,'2019-08-29','Describing how I listen to podcasts PART 2',1052,'In this episode I cover the hardware I\'ve used over the years to listen to podcasts.','<h3 id=\"short-summary\">Short Summary</h3>\r\n<p>In this series I cover how I listen to podcasts and how the process has change over the years. In this episode I cover the hardware I’ve used over the years to listen to podcasts.</p>\r\n<ul>\r\n<li><p>Link to HPR 2112 (Home Server) episode mentioned in this podcast<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2112\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2112</a></p></li>\r\n<li><p>Link to HPR 2106 (Hpodder) Episode mentioned in this podcast<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2106\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2106</a></p></li>\r\n<li><p>The cordless headphones I use are analogue cordless headphones they operate in the UHF 860 MHz RF spectrum and use Frequency modulation</p></li>\r\n<li><p>(Picture 01) shows a pair of JVC cordless headphones, these were my first pair of cordless headphones, from memory they were reasonably comfortable and lasted a reasonably long time, they eventually gave way when the strap along the top completely split if you look carefully you can see evidence of this in the picture. <img src=\"https://hackerpublicradio.org/eps/hpr2889/Picture-01.JPG\" alt=\"Picture-01.JPG\" /></p></li>\r\n<li><p>I think my 2nd set pair of cordless headphones were made by Phillips, unfortunately I don’t have a picture of these. The headphones were too big and kept falling from my head.</p></li>\r\n<li><p>(Picture 02) shows a pair of Sony headphones that I can’t even remember owning! I’ve lost count of how many cordless headphones I’ve owned over the years, these were also too big and regularly fell off my head, there are probably other pairs which I have forgotten about. It took a lot of trial an error to find a pair that would fit properly. <img src=\"https://hackerpublicradio.org/eps/hpr2889/Picture-02.JPG\" alt=\"Picture-02.JPG\" /></p></li>\r\n<li><p>I think my 3rd set of cordless headphones were a cheap pair from Liddles, unfortunately I don’t have a picture of these again these were also too big.</p></li>\r\n<li><p>(Picture 03) Shows my current set of cordless headphones, unfortunately my camera refused to work while taking this picture so you’ll not be able to identify the manufacturer which is a great pity as they are absolutely great also the lighting in here is very bad so you won’t be able to make out the writing printed on them :) <img src=\"https://hackerpublicradio.org/eps/hpr2889/Picture-03.JPG\" alt=\"Picture-03.JPG\" /></p></li>\r\n<li><p>Compaq N610C laptop<br />\r\n<img src=\"https://1.bp.blogspot.com/_73lLV6srqwY/SxB7dASme9I/AAAAAAAAAVU/QsNP-O2chaU/s1600/missionaccomplished.jpg\" alt=\"https://1.bp.blogspot.com/_73lLV6srqwY/SxB7dASme9I/AAAAAAAAAVU/QsNP-O2chaU/s1600/missionaccomplished.jpg\" /></p></li>\r\n<li><p>Screen<br />\r\n<a href=\"https://en.wikipedia.org/wiki/GNU_Screen\" class=\"uri\">https://en.wikipedia.org/wiki/GNU_Screen</a></p></li>\r\n<li><p>EEE PC Laptop<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Asus_Eee_PC\" class=\"uri\">https://en.wikipedia.org/wiki/Asus_Eee_PC</a></p></li>\r\n<li><p>Pictures (04 and 05) are of my Nokia N810 <img src=\"https://hackerpublicradio.org/eps/hpr2889/Picture-04.JPG\" alt=\"Picture-04.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2889/Picture-05.JPG\" alt=\"Picture-05.JPG\" /></p></li>\r\n<li><p>Below is a link from wikipedia covering the Nokia N810.<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nokia_N810\" class=\"uri\">https://en.wikipedia.org/wiki/Nokia_N810</a></p></li>\r\n<li><p>Links to shows where klaatu references the Nokia N770 which came out before the Nokia N810 but is very similar<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=0228\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=0228</a><br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=0416\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=0416</a></p></li>\r\n<li><p>Nexus 7, first generation<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nexus_7_(2012)\" class=\"uri\">https://en.wikipedia.org/wiki/Nexus_7_(2012)</a></p></li>\r\n<li><p>Psion 3C<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Psion_Series_3#Psion_Series_3c\" class=\"uri\">https://en.wikipedia.org/wiki/Psion_Series_3#Psion_Series_3c</a></p></li>\r\n<li><p>Raspberry pi<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Raspberry_Pi\" class=\"uri\">https://en.wikipedia.org/wiki/Raspberry_Pi</a></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, PDA, hardware',0,0,1),
(2908,'2019-09-25','Modeling opinions in space game',2104,'Tuula talks about modeling opinions','<p>We continue with people, this time focusing on opinions. This episode has somewhat more code than previous one, so following along with the shownotes might be a good idea. I’m trying to minimize amount of code I read out aloud.</p>\r\n<h2 id=\"intro\">Intro</h2>\r\n<p>One person’s opinion of another is expressed as <code>OpinionScore</code> that ranges from -100 to 100.</p>\r\n<p>Computing the score is based on intelligence player has available to them. Internally we have <code>ReportResult</code> that tracks score, reasons for the score and confidence level about the results. It’s defined as:</p>\r\n<pre><code>data ReportResult =\r\n    FeelingLevel OpinionScore\r\n    | ReasonsLevel OpinionScore [OpinionReason]\r\n    | DetailedLevel OpinionScore [OpinionReason]\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>We’re going to be adding up these results quite a bit, so we define <code>SemiGroup</code> and <code>Monoid</code> instances for it. When two results are combined, scores are added together, lists of reasons are concatenated and the lowest confidence level is used. This is written as:</p>\r\n<pre><code>instance Semigroup ReportResult where\r\n    (FeelingLevel s1) &lt;&gt; (FeelingLevel s2) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (FeelingLevel s1) &lt;&gt; (ReasonsLevel s2 _) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (FeelingLevel s1) &lt;&gt; (DetailedLevel s2 _) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (ReasonsLevel s1 _) &lt;&gt; (FeelingLevel s2) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (ReasonsLevel s1 r1) &lt;&gt; (ReasonsLevel s2 r2) = ReasonsLevel (s1 &lt;&gt; s2) (r1 &lt;&gt; r2)\r\n    (ReasonsLevel s1 r1) &lt;&gt; (DetailedLevel s2 r2) = ReasonsLevel (s1 &lt;&gt; s2) (r1 &lt;&gt; r2)\r\n    (DetailedLevel s1 _) &lt;&gt; (FeelingLevel s2) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (DetailedLevel s1 r1) &lt;&gt; (ReasonsLevel s2 r2) = ReasonsLevel (s1 &lt;&gt; s2) (r1 &lt;&gt; r2)\r\n    (DetailedLevel s1 r1) &lt;&gt; (DetailedLevel s2 r2) = DetailedLevel (s1 &lt;&gt; s2) (r1 &lt;&gt; r2)\r\n\r\n\r\ninstance Monoid ReportResult where\r\n    mempty = DetailedLevel mempty mempty</code></pre>\r\n<h2 id=\"opinion-based-on-traits\">Opinion based on traits</h2>\r\n<p>Current system compares two lists of traits. For example, two brave characters like each other slightly better than if one of them would be coward. Comparison is done by <code>traitPairOpinion</code> function, which definition I’m omitting as it’s rather long and not too interesting. It’s signature is: <code>traitPairOpinion :: TraitType -&gt; TraitType -&gt; Maybe (OpinionScore, OpinionReason)</code>. So, given two traits, tells how that pair affects to opinion and reasoning for it.</p>\r\n<p>In order to have nicer format for out data, we introduce a helper function:</p>\r\n<pre><code>traitPairScore :: TraitType -&gt; TraitType -&gt; (OpinionScore, [OpinionReason])\r\ntraitPairScore a b =\r\n    case traitPairOpinion a b of\r\n            Nothing -&gt;\r\n                mempty\r\n\r\n            Just (s, r) -&gt;\r\n                (s, [r])</code></pre>\r\n<p>This is because <code>(OpinionScore, OpinionReason)</code> isn’t monoid, but <code>(OpinionScore, [OpinionReason])</code> is, which means we can combine them with <code>&lt;&gt;</code>.</p>\r\n<p>Actual score calculation based on traits, we do it like this:</p>\r\n<pre><code>traitScore :: [TraitType] -&gt; [PersonIntel] -&gt; [TraitType] -&gt; [PersonIntel] -&gt; ReportResult\r\ntraitScore originatorTraits originatorIntel targetTraits targetIntel =\r\n    if (Traits `elem` originatorIntel) &amp;&amp; (Traits `elem` targetIntel)\r\n        then DetailedLevel score reasons\r\n        else FeelingLevel score\r\n    where\r\n        (score, reasons) = mconcat $ traitPairScore &lt;$&gt; originatorTraits &lt;*&gt; targetTraits</code></pre>\r\n<p>The interesting part is <code>mconcat $ traitPairScore &lt;$&gt; originatorTraits &lt;*&gt; targetTraits</code>. Function <code>traitPairScore</code> expects two <code>TraitType</code> values as parameters, but we’re calling it with two lists of such values. First step is to use <code>&lt;$&gt;</code> and list of values, which produces a list of partially applied functions. Second step is to use <code>&lt;*&gt;</code> to call each and every of those functions with values from second list. Result is a list of results that were obtained by calling <code>traitPairScore</code> with every combination of elements from two lists. Final step is to take this list of <code>ReportResult</code> values and combine them to single result with <code>mconcat</code>.</p>\r\n<p>Finally, based on available intel, <code>ReportResult</code> of correct level is created.</p>\r\n<h2 id=\"opinion-based-on-relations\">Opinion based on relations</h2>\r\n<p>Score based on relations is similar, but a bit convoluted (or rather, a lot more).</p>\r\n<p>Intel here has two dimensions. One of them is relationship visibility (is it public, family relation or secret relation), another is level of detail: <code>BaseOpinionIntel</code>, <code>ReasonsForOpinions</code> and <code>DetailedOpinions</code>.</p>\r\n<p><code>relationScore</code> is the entry point for calculation:</p>\r\n<pre><code>relationScore :: [PersonIntel] -&gt; [Relation] -&gt; ReportResult\r\nrelationScore intel relations =\r\n    mconcat $ (relReport oIntel score) &lt;$&gt; visibilities\r\n    where\r\n        score = mconcat $ (relationTypeScore . relationType) &lt;$&gt; relations\r\n        visibilities = mkUniq $ relationVisibility &lt;$&gt; relations\r\n        oIntel = mkUniq $ mapMaybe (\\case\r\n                                        Opinions x -&gt;\r\n                                            Just x\r\n\r\n                                        _ -&gt;\r\n                                            Nothing)\r\n                                   intel</code></pre>\r\n<p>Code has to take into account of what level of intel we have about opinions and on what detail: <code>oIntel</code>. On the other hand, <code>visibilities</code> is unique relation visibilities that exists in relations in this particular case and <code>score</code> is computed based on relations.</p>\r\n<p>Function <code>relReport</code> creates final report. It takes into account on what level of intel we have, by doing: <code>matching = safeHead $ reverse $ sort $ filter (\\x -&gt; opinionIntelVisibility x == visibility) intel</code>. This finds highest level intel we have about this particular relationship visibility. Based on the highest level of available intel <code>ReportResult</code> is created with correct confidence level. Ie. if there’s no specific intel, we get <code>FeelingLevel</code> report. If there’s intel about why particular person has certain opinion, we get <code>ReasonsLevel</code> report. Whole definition of function is below:</p>\r\n<pre><code>relReport :: [OpinionIntel]\r\n    -&gt; (OpinionScore, [OpinionReason])\r\n    -&gt; RelationVisibility\r\n    -&gt; ReportResult\r\nrelReport intel (score, reasons) visibility =\r\n    case matching of\r\n        Nothing -&gt;\r\n            FeelingLevel score\r\n\r\n        Just (BaseOpinionIntel _) -&gt;\r\n            FeelingLevel score\r\n\r\n        Just (ReasonsForOpinions _) -&gt;\r\n            ReasonsLevel score reasons\r\n\r\n        Just (DetailedOpinions _) -&gt;\r\n            DetailedLevel score reasons\r\n    where\r\n        matching = safeHead $ reverse $ sort $ filter (\\x -&gt; opinionIntelVisibility x == visibility) intel</code></pre>\r\n<h2 id=\"opinion-report\">Opinion report</h2>\r\n<p>To pull all this together, we combine results of these two functions. Based on given information, it’ll compute <code>traitsRep</code> and <code>relationsRep</code>. These two are combined with <code>&lt;&gt;</code> as explained earlier in episode:</p>\r\n<ul>\r\n<li>scores are summed up</li>\r\n<li>reason lists are concatenated</li>\r\n<li>confidence level is lowest of two</li>\r\n</ul>\r\n<pre><code>opinionReport :: [TraitType]\r\n    -&gt; [PersonIntel]\r\n    -&gt; [TraitType]\r\n    -&gt; [PersonIntel]\r\n    -&gt; [Relation]\r\n    -&gt; OpinionReport\r\nopinionReport originatorTraits originatorIntel targetTraits targetIntel targetRelations =\r\n    reportResultToOpinionResult $ traitsRep &lt;&gt; relationsRep\r\n    where\r\n        traitsRep = traitScore originatorTraits originatorIntel targetTraits targetIntel\r\n        relationsRep = relationScore originatorIntel targetRelations</code></pre>\r\n<p>Finally <code>ReportResult</code> is transformed to <code>OpinionReport</code>, which can be sent to client.</p>\r\n<p><code>OpinionReport</code> has three levels:</p>\r\n<ul>\r\n<li><code>BaseOpinionReport</code> only tells if feeling is positive, neutral or negative</li>\r\n<li><code>OpinionReasonReport</code> has feeling and in addition to reasoning</li>\r\n<li><code>DetailedOpinionReport</code> has exact (more or less) score and reasoning</li>\r\n</ul>\r\n<pre><code>data OpinionReport =\r\n    BaseOpinionReport OpinionFeeling\r\n    | OpinionReasonReport OpinionFeeling [OpinionReason]\r\n    | DetailedOpinionReport OpinionScore [OpinionReason]\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>Actual transformation is shown here:</p>\r\n<pre><code>reportResultToOpinionResult :: ReportResult -&gt; OpinionReport\r\nreportResultToOpinionResult (FeelingLevel score) =\r\n    BaseOpinionReport $ scoreFeeling score\r\n\r\nreportResultToOpinionResult (ReasonsLevel score reasons) =\r\n    OpinionReasonReport (scoreFeeling score) reasons\r\n\r\nreportResultToOpinionResult (DetailedLevel score reasons) =\r\n    DetailedOpinionReport (clamp (-100) 100 score) reasons</code></pre>\r\n<h2 id=\"note-about-incorrectness\">Note about incorrectness</h2>\r\n<p>Reports are based on intel and this might lead into incorrect results. In case of player’s own avatar, they have full intel (ie. they know all relations, all traits and so on.) Therefore opinion about some other person is based wholly on what we know about them.</p>\r\n<p>But in case of gauging somebody else’s opinion about us or person A’s opinion of person B, when A or B isn’t us, there’s chance of misjudging things. We might not know everything about them, or we might know more about A than B knows about them. In short, opinion shown for player, is just best effort guess.</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>Questions, comments and feedback is welcome. Even better is if you record your own HPR episode. Best way to reach me nowadays is by email or in fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n<p>ad astra!</p>\r\n',364,107,0,'CC-BY-SA','haskell, game development',0,0,1),
(2903,'2019-09-18','What is PMEM',453,'Persistent memory (PMEM), also known as storage-class memory','<h3 id=\"what-is-persistent-memory\">What is persistent memory?</h3>\r\n<p>In brief, PMEM is next generation memory technology whose data transfer speed is as good as DRAM (50-300 ns, 100 times faster than SSDs) and unlike DRAM, it can even retain the data after reboots.</p>\r\n<p>In detail persistent memory (PMEM) is a solid-state high-performance byte-addressable memory device that resides on the memory bus. Being on the memory bus allows PMEM to have DRAM-like access to data, which means that it has nearly the same speed and latency of DRAM and the nonvolatility of NAND flash. NVDIMM (nonvolatile dual in-line memory module) and Intel 3D XPoint DIMMs (also known as Optane DC persistent memory modules) are two examples of persistent memory technologies.</p>\r\n<p>Persistent memory, such as Intel® Optane™ DC Persistent Memory, provides a future-proofed solution. Installed alongside traditional RAM, PMEM has many of the advantages of DRAM, including low latency access. But it comes in greater capacities. Intel® Optane™ DC, for example, will be available in 128GB, 256GB and 512GB sizes.</p>\r\n<h3 id=\"persistent-memory-benefits\">Persistent Memory Benefits</h3>\r\n<p>Persistent memory in the data center allows applications to run without incurring the latency penalty of going out to storage.</p>\r\n<p>The main advantages of persistent memory include:</p>\r\n<ul>\r\n<li>Provides access latencies less than those of flash SSDs.</li>\r\n<li>Increases throughput more than flash storage.</li>\r\n<li>Cheaper than DRAM.</li>\r\n<li>PMEM is cacheable. This is a huge advantage over PCIe interconnect, which cannot be cached in the CPU.</li>\r\n<li>Real-time access to data; allows ultrafast access to large datasets.</li>\r\n<li><p>Data persists in memory after power interruption, like flash.</p></li>\r\n<li>Persistent Memory Use Cases\r\n<ul>\r\n<li>Fraud detection</li>\r\n<li>Cyberthreat analysis</li>\r\n<li>Web-scale personalization</li>\r\n<li>Financial trading</li>\r\n<li>Internet of Things (IoT)</li>\r\n</ul></li>\r\n</ul>\r\n<pre><code>    Non       \\\r\n    Volatile  /- Non-volatile: you plug it off and on again, and the Information is still there\r\n\r\n    Double    \\\r\n    In-line   | DIMM: This the HW format\r\n    Memory    |\r\n    Module    /</code></pre>\r\n<h3 id=\"persistent-memory-vs.-nvram\">Persistent Memory Vs. NVRAM</h3>\r\n<p>Nonvolatile random-access memory (NVRAM) is random-access memory that retains its information even if there is no power. If power is lost before the data is written to disk, you don’t lose the data because it can be recovered from NVRAM. NVRAM uses battery backup to keep data persistent. During this time it can flash the data out to a flash device that is attached directly. In most cases, NVRAM resides on the PCIe bus.</p>\r\n<p>PMEM or NVDIMM-N can also be backed up by battery. It resides only on the memory bus.</p>\r\n<h3 id=\"where-pmem-is-going\">Where PMEM is going</h3>\r\n<p>It’s no wonder that this sort of ‘in-memory’ computing has exploded in recent years. According to Gartner, 75 percent of cloud-native application development will use in-memory/PMEM computing by 2019, and by 2021, at least 25 percent of large and global organisations will adopt platforms using in-memory technologies.</p>\r\n<h3 id=\"drawbacks-of-pmem\">Drawbacks of PMEM</h3>\r\n<ul>\r\n<li>PMEM is a local store.</li>\r\n<li>Host failures can result in loss of availability.</li>\r\n<li>In the case of catastrophic errors you may lose all data and must take manual steps to reformat the PMEM.</li>\r\n</ul>\r\n<h2 id=\"reference-notes\">Reference Notes</h2>\r\n<ul>\r\n<li><a href=\"https://www.netapp.com/us/info/what-is-persistent-memory.aspx\" class=\"uri\">https://www.netapp.com/us/info/what-is-persistent-memory.aspx</a></li>\r\n<li><a href=\"https://www.intel.co.uk/content/www/uk/en/it-management/cloud-analytic-hub/pmem-next-generation-storage.html\" class=\"uri\">https://www.intel.co.uk/content/www/uk/en/it-management/cloud-analytic-hub/pmem-next-generation-storage.html</a></li>\r\n<li><a href=\"https://vthinkbeyondvm.com/vsphere-6-7-what-is-pmem-and-how-vsphere-drs-works-with-pmem-configured-vms/\" class=\"uri\">https://vthinkbeyondvm.com/vsphere-6-7-what-is-pmem-and-how-vsphere-drs-works-with-pmem-configured-vms/</a></li>\r\n<li><a href=\"https://docs.vmware.com/en/VMware-vSphere/6.7/com.vmware.vsphere.resmgmt.doc/GUID-EB72D358-9C2C-4FBD-81A9-A145E155CE31.html\" class=\"uri\">https://docs.vmware.com/en/VMware-vSphere/6.7/com.vmware.vsphere.resmgmt.doc/GUID-EB72D358-9C2C-4FBD-81A9-A145E155CE31.html</a></li>\r\n<li><a href=\"https://vmsplice.net/~stefan/nvdimm_slides_public.pdf\" class=\"uri\">https://vmsplice.net/~stefan/nvdimm_slides_public.pdf</a></li>\r\n<li><a href=\"https://www.theregister.co.uk/2018/09/07/persistent_memory_whirlwind_is_spinning_up/\" class=\"uri\">https://www.theregister.co.uk/2018/09/07/persistent_memory_whirlwind_is_spinning_up/</a></li>\r\n</ul>\r\n',129,0,0,'CC-BY-SA','Pmem, intel, memory, storage',0,0,1),
(2882,'2019-08-20','ONICS Part 1:  Basic Commands',1364,'In this episode I review some basic commands for manipulating packet captures','<p>Background</p>\r\n<ul>\r\n<li>It\'s been about 6 years since I talked about my project ONICS in HPR 1350</li>\r\n<li>ONICS stands for Open Network Inpection Command Suite</li>\r\n<li>I created ONICS as because I thought it would be neat to have a suite of tools that could manipulate packets on the command line in a way similar to how tools lik sed, awk, grep, cut, and so forth manipulate text.</li>\r\n</ul>\r\n<p>Installing</p>\r\n<ul>\r\n<li>Not currently maintained in any package distributions</li>\r\n<li>Maintainers who are interested in doing so are welcome</li>\r\n<li>Install by source</li>\r\n</ul>\r\n<pre><code>    $ git clone https://gitlab.com/catlib/catlib\r\n    $ cd catlib\r\n    $ make\r\n    $ cd ..\r\n    $ git clone https://gitlab.com/onics/onics\r\n    $ cd onics\r\n    $ ./configure\r\n    $ make\r\n    $ make test\r\n    $ sudo make install\r\n    $ make veryclean\r\n</code></pre>\r\n<ul>\r\n<li>Can always uninstall cleanly from the source directory</li>\r\n</ul>\r\n<pre><code>    $ make uninstall\r\n</code></pre>\r\n<ul>\r\n<li>Alternate to installation is to stop at \'make test\' and then add to \'onics/bin\' and \'onics/scripts\' to your path.</li>\r\n</ul>\r\n<p>Documentation</p>\r\n<ul>\r\n<li><p>Manpages are available in onics/doc directory if you aren\'t installing locally. They are quite extensive.</p></li>\r\n<li><p>If installed locally, starting with:</p></li>\r\n</ul>\r\n<pre><code>    $ man onics\r\n</code></pre>\r\n<p>XPKT Format</p>\r\n<ul>\r\n<li><p>PCAP format is outdated and not very extensible</p>\r\n<ul>\r\n<li>I want to be able to annotate with interface IDs, flow IDs, packet numbers, classification info, header offsets, etc...</li>\r\n</ul></li>\r\n<li><p>First and foremost, the file header prevents just <code>cat</code>ing files together.</p>\r\n<ul>\r\n<li>it makes merging live streams more difficult</li>\r\n<li>pcapng improves things but still has global file header</li>\r\n</ul></li>\r\n</ul>\r\n<p>First Programs</p>\r\n<ul>\r\n<li>Let\'s first capture in the traditional way</li>\r\n</ul>\r\n<pre><code>    $ sudo tcpdump -i eth0 -c 5 -w file1.pcap\r\n</code></pre>\r\n<ul>\r\n<li>First program is to capture packets from the wire:</li>\r\n</ul>\r\n<pre><code>    $ sudo pktin eth0 &gt; file2.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>If not running as root</li>\r\n</ul>\r\n<pre><code>    $ sudo chown myname file1.pcap file2.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Let\'s dump them:</li>\r\n</ul>\r\n<pre><code>    $ tcpdump -r file1.pcap\r\n    $ xpktdump file2.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Now lets convert the PCAP to XPKT</li>\r\n</ul>\r\n<pre><code>    $ pc2xpkt file1.pcap file1.xpkt\r\n      or\r\n    $ pc2xpkt file1.pcap &gt; file1.xpkt\r\n      or\r\n    $ pc2xpkt &lt; file1.pcap &gt; file1.xpkt\r\n      or\r\n    $ cat file1.pcap | pc2xpkt &gt; file1.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Now we can dump file1 using xpktdump:</li>\r\n</ul>\r\n<pre><code>    $ xpktdump file1.xpkt\r\n</code></pre>\r\n<p>Something we can\'t do w/ tcpdump</p>\r\n<ul>\r\n<li>Lets now merge them one after another</li>\r\n</ul>\r\n<pre><code>    $ cat file1.xpkt file2.xpkt &gt; merged.xpkt\r\n    $ xpktdump merged.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Of course there\'s a simpler way</li>\r\n</ul>\r\n<pre><code>    $ cat file1.xpkt file2.xpkt | xpktdump\r\n</code></pre>\r\n<p>Convert back to pcap:</p>\r\n<ul>\r\n<li>Let\'s convert file2 to PCAP</li>\r\n</ul>\r\n<pre><code>    $ xpkt2pc file2.xpkt file2.pcap\r\n      or\r\n    $ xpkt2pc &lt; file2.xpkt &gt; file2.pcap\r\n      or\r\n    $ xpkt2pc file2.xpkt &gt; file2.pcap\r\n      or\r\n    $ cat file2.xpkt | xpkt2pc &gt; file2.pcap\r\n</code></pre>\r\n<ul>\r\n<li>Let\'s look at the stream using tcpdump:</li>\r\n</ul>\r\n<pre><code>    $ tcpdump -r file2.pcap\r\n</code></pre>\r\n<ul>\r\n<li>If we didn\'t want to actually store as a PCAP</li>\r\n</ul>\r\n<pre><code>    $ xpkt2pc file2.xpkt | tcpdump -r -\r\n</code></pre>\r\n<ul>\r\n<li>Let\'s concatenate and dump using tcpdump</li>\r\n</ul>\r\n<pre><code>    $ cat file1.xpkt file2.xpkt | xpkt2pc | tcpdump -r | less\r\n</code></pre>\r\n<p>Sending packets:</p>\r\n<pre><code>    $ sudo tcpdump -i eth0  # in one terminal\r\n    $ sudo pktout -i eth0 file1.xpkt\r\n      or\r\n    $ sudo pktout -i eth0 &lt; file1.xpkt\r\n      or\r\n    $ cat file1.xpkt | sudo pktout -i eth0\r\n</code></pre>\r\n<p>Summary</p>\r\n<ul>\r\n<li>XPKT is a versatile, extensible, self-contained packet trace format</li>\r\n<li>ONICS\' most basic tools are pktin, pktout, pc2xpkt and xpkt2pc</li>\r\n<li>We\'ve demonstrated how the ONICS design supports leveraging the power of the UNIX command line for packets</li>\r\n<li>This is only the VERY beginning. ONICS has over 20 binaries and 30 scripts for manipulating packets.</li>\r\n</ul>\r\n',259,61,0,'CC-BY-SA','networking, command-line, tools',0,0,1),
(2887,'2019-08-27','Stardrifter RPG Playtest Part 01',2202,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode begins a limited series covering the first playtest of a new role-playing game, based upon my Stardrifter series of books and short stories. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this first episode, as well as the next, we we go over the rules of the game, and discuss them in some detail.\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2892,'2019-09-03','Stardrifter RPG Playtest Part 02',2247,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode is Part 2 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this part, we continue to go over the rules of the game, and discuss them in some detail.\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n</p>',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2897,'2019-09-10','Stardrifter RPG Playtest Part 03',2446,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode is Part 3 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this part, we continue to go over the rules of the game, and then start into the adventure!\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n</p>',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2902,'2019-09-17','Stardrifter RPG Playtest Part 04',3286,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode is Part 4 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this part, the characters have a job prospect...but is it legitimate, or are they being conned?\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n</p>',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2907,'2019-09-24','Stardrifter RPG Playtest Part 05',3120,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode is Part 5 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this part, the characters take on a contract to deal with some...hippies?\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, and Mark (who was playing Brinn)\r\n</p>',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2885,'2019-08-23','ONICS Part 2: Filtering and Extraction',994,'In this episode I discuss commands to filter and/or extract packets from a packet trace file.','<p>In this episode we\'ll talk about filtering and dissecting packet traces and streams and introduce diffing. Remember that most tools have very flexible options for a variety of use cases. So check their manpages. Each man page also has multiple examples of how to use each tool.</p>\r\n<h3 id=\"counting-packets\">Counting Packets</h3>\r\n<ul>\r\n<li>Lets start with grabbing a trace from the unit tests:</li>\r\n</ul>\r\n<pre><code>   $ mkdir /tmp/packets\r\n   $ cd /tmp/packets\r\n   $ cp /path/to/onics/tests/data/packets/sample.xpkt .\r\n</code></pre>\r\n<ul>\r\n<li>Lets see what we have inside. First, lets see how many packets there are. We\'ll use a new tool \'pcount\'.</li>\r\n</ul>\r\n<pre><code>   $ pcount sample.xpkt\r\n\r\n   90 total packets and 19082 total bytes.\r\n</code></pre>\r\n<ul>\r\n<li>Good thing we looked first. Don\'t want to walk through all the packets.</li>\r\n</ul>\r\n<h3 id=\"scanning-packet-flows\">Scanning Packet Flows</h3>\r\n<ul>\r\n<li><p>Well, lets look at the connections or &quot;flows&quot; in the trace. We\'ll do this by using the \'nftrk\' command for &quot;network flow tracker&quot;.</p></li>\r\n<li><p>Like \'pcount\' this utility (and many or most ONICS utilities), this program can run on a live stream or a trace file. We\'ll run:</p></li>\r\n</ul>\r\n<pre><code>   $ nftrk -dt sample.xpkt | grep END\r\n</code></pre>\r\n<p>and get:</p>\r\n<pre><code>   |FLOW END|IP:ca=192.168.0.43,sa=224.0.0.251,proto=2|Start=1565446184.543,\r\n   End=1565446184.544,Dur=0.001|SENT:1,60|\r\n   ...\r\n   |FLOW END|IP:ca=192.168.0.7,sa=192.168.0.255,proto=17,cpt=631,spt=631|\r\n   Start=1565446184.543,End=1565446184.544,Dur=0.001|SENT:3,660|\r\n</code></pre>\r\n<ul>\r\n<li><p>\'nftrk\' tracks flows giving events like the start and end of each flow or connection. We just want a summary of all the connections so we just grep for \'END\' (all caps).</p></li>\r\n<li><p>We could just as easily have grepped for START, but this way we get the final number of packets sent and received on each connection. If we just want a count of the connections we can do:</p></li>\r\n</ul>\r\n<pre><code>   $ nftrk -dt sample.xpkt | grep START | wc -l\r\n</code></pre>\r\n<p>and that tells us that there are 10 flows in the trace.</p>\r\n<h3 id=\"basic-filtering\">Basic Filtering</h3>\r\n<ul>\r\n<li>Ok, so 90 packets, in 10 flows totalling ~19000 bytes. Lets now see about filtering the connection so we just get the TCP packets.</li>\r\n</ul>\r\n<pre><code>   $ pflt tcp sample.xpkt tcponly.xpkt\r\n\r\n   $ pcount tcponly.xpkt\r\n   73 total packets and 17184 total bytes.\r\n\r\n   $ nftrk -dt tcponly.xpkt | grep END | wc -l\r\n   2\r\n</code></pre>\r\n<ul>\r\n<li>We could have been super fancy and done:</li>\r\n</ul>\r\n<pre><code>   $ pflt tcp sample.xpkt |\r\n     pcount -p |\r\n     nftrk -t 2&gt;/tmp/flows &gt; tcponly.xpkt &amp;&amp;\r\n     echo -n &quot;Number of flows &quot; &amp;&amp;\r\n     grep END /tmp/flows | wc -l &amp;&amp;\r\n     rm -f /tmp/flows\r\n</code></pre>\r\n<ul>\r\n<li>Ok, enough of that. Anyway, now we have a trace file with only the TCP connections. Running</li>\r\n</ul>\r\n<pre><code>   $ nftrk -dt /tmp/tcponly.xpkt | grep END\r\n   |FLOW END|IP:ca=192.168.0.4,sa=192.168.0.7,proto=6,cpt=38859,spt=22|\r\n   Start=1566073862.612,End=1566073862.613,Dur=0.000|C2S:25,4561|S2C:30,5124|\r\n   |FLOW END|IP:ca=192.168.0.4,sa=64.233.169.147,proto=6,cpt=35071,spt=80|\r\n   Start=1566073862.613,End=1566073862.613,Dur=0.000|C2S:9,704|S2C:9,6795|\r\n</code></pre>\r\n<p>Shows that the server ports are 22 and 80 for the two connections. That\'s SSH and HTTP.</p>\r\n<ul>\r\n<li><p>The patterns we can use to filter packets are pretty standard across most of the ONICS tools.</p></li>\r\n<li><p>We\'ll discuss this is more detail in a future podcast. But if you want to see the kinds of fields you can match on go to</p></li>\r\n</ul>\r\n<pre><code>   $ man onics_proto\r\n</code></pre>\r\n<h3 id=\"extracting-ranges-of-packets\">Extracting Ranges of Packets</h3>\r\n<ul>\r\n<li>What if we wanted to just grab specific packets out of the trace file? Say we wanted packets 3-6. For that we would run:</li>\r\n</ul>\r\n<pre><code>   $ pxtr 3,6 sample.xpkt pkts-3-to-6.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Alternately we could ask for all packets from the 7th packet to the first TCP packet. We match using the same types of matching conditions as with pflt, but we must enclose them in {}s.</li>\r\n</ul>\r\n<pre><code>   $ pxtr &quot;7,{tcp}&quot; sample.xpkt | xpktdump\r\n</code></pre>\r\n<ul>\r\n<li>Lets say we just wanted to drop packets 5-10 from the stream. There are several ways to do this in ONICS, but using pxtr, the way we would do it would be:</li>\r\n</ul>\r\n<pre><code>   $ pxtr 1,4 sample.xpkt &gt; not-5-to-10.xpkt\r\n   $ pxtr 11,NONE sample.xpkt &gt;&gt; not-5-to-10.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Maybe I should add another option to pxtr to invert the boundary conditions. It\'s a tradeoff between having the tools do one thing and one thing well and supporting a potentially common use case.</li>\r\n</ul>\r\n<h3 id=\"differences-between-traces\">Differences Between Traces</h3>\r\n<ul>\r\n<li>Finally, lets look at one tool that I really like. Let\'s see the difference between the original stream and the one that we just created:</li>\r\n</ul>\r\n<pre><code>   $ pdiff sample.xpkt not-5-to-10.xpkt | less\r\n</code></pre>\r\n<ul>\r\n<li>Sure enough that shows us that packets 5-10 were dropped from the stream. If we do the reverse</li>\r\n</ul>\r\n<pre><code>   $ pdiff -v not-5-to-10.xpkt sample.xpkt | less\r\n</code></pre>\r\n<p>it describes the sample.xpkt from the perspective of starting with not-5-to-10.xpkt and inserting a bunch of packets into the middle.</p>\r\n<h3 id=\"conclusion\">Conclusion</h3>\r\n<ul>\r\n<li>In this podcast we looked at a few tools to help analyze and dissect packet traces or packet streams.</li>\r\n<li>Next time we\'ll look at some of the more powerful pattern matching we can apply and</li>\r\n</ul>\r\n',259,61,0,'CC-BY-SA','networking, command-line, tools',0,0,1),
(2894,'2019-09-05','Repairing a Musical Instrument Case',1318,'I talked about repairing the case for a Vietnamese Dan Tranh','<p>In this episode I talk about repairing the case for a Vietnamese Đàn tranh, a zither-like instrument which was donated to the School of Music by a member of the community. I also demonstrate the instrument as best I can so that you can hear what it sounds like.</p>\r\n\r\n<p>See the Flickr photo album that accompanies this show by clicking the image below.</p>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157710403088542\" title=\"Dan Tranh Case Repair\"><img src=\"https://live.staticflickr.com/65535/48570414971_d678f8ff0c.jpg\" width=\"500\" height=\"375\" alt=\"Dan Tranh Case Repair\"></a></p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/%C4%90%C3%A0n_tranh\">Đàn tranh</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Adhesive#Contact\">Contact cement</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Pentatonic_scale\">Pentatonic scale</a></li>\r\n</ul>\r\n\r\n<h2>Credits</h2>\r\n\r\n<ul>\r\n	<li>Music bumpers are from Kimiko Ishizaka\'s <em>The Open Goldberg Variations</em>: <a href=\"https://www.opengoldbergvariations.org/\">https://www.opengoldbergvariations.org/</a>, used by permission of their <a href=\"https://creativecommons.org/publicdomain/zero/1.0/\">CC0 1.0 Universal (CC0 1.0) Public Domain Dedication license</a>.</li>\r\n</ul>',238,0,0,'CC-BY-SA','Music, Musical Instruments, Repairs, DIY, Vietnamese Stringed Instruments',0,0,1),
(2895,'2019-09-06','The work of fire fighters, part 2',2370,'The continued introduction into the work of fire fighters','<p>Continued general basic knowledge of fire fighting.<br />\r\nAlso an extended invitation to ask questions in the comments.<br />\r\nps: I started making podcasts one year ago! o/</p>',369,0,0,'CC-BY-SA','fire fighting, fire brigade',0,0,1),
(2899,'2019-09-12','Endeavour OS',99,'A quick show introducing Endeavour OS','<p>Hi to all you out there in HPR land, this is a quick show to help out with the current summer shortage of shows.</p>\r\n<p>So over the last few months I’ve been busy with my new Podcasting career, well it fills in the time now I’m retired. Anyway the Distro-hoppers show has been getting a regular audience and recently we decided to branch out a little and open up the review format to the audience, you can find details of how to do that on the Blog.</p>\r\n<p>The most recent show was a review of the new Endeavour OS which has risen from the ashes of Antergos Linux an Arch based OS. Well I decided to use this opportunity to delve into the world of Arch for the first time with Endeavour OS and I can report I was pleasantly surprised with this slick iteration of Arch. OK when you first install Endeavour all you will have is a new XFCE 4.14 DE and some basic software to get you started, you are then expected to do a little research to find out how to install other software you need to get your PC setup the way you like but all the basic information on package management is on the Endeavour OS Wiki and also on the Arch Linux Wiki.</p>\r\n<p>If you have thought of trying Arch Linux but would prefer to start with a running Desktop from install then Endeavour OS is definitely the place to start. I have been running it as my daily Driver for over a month and have fallen in love with it.<br />\r\nMy full review is on the Distrohoppers Blog as is a link to the Audio of the show.</p>\r\n<p>That’s it for this time, this is Tony Hughes saying goodbye until next time.</p>\r\n<p><a href=\"https://distrohoppersdigest.blogspot.com/\" class=\"uri\">https://distrohoppersdigest.blogspot.com/</a></p>\r\n<p><a href=\"https://endeavouros.com/\" class=\"uri\">https://endeavouros.com/</a></p>\r\n<p><a href=\"https://www.archlinux.org/\" class=\"uri\">https://www.archlinux.org/</a></p>\r\n',338,0,0,'CC-BY-SA','EndeavourOS, Linux, Arch Linux, Distrohopping',0,0,1),
(2912,'2019-10-01','Stardrifter RPG Playtest Part 06',2013,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 6 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes. The remaining episodes in this mini-series, including this one, were all from the second session.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>In this part, the characters fly out to the derelict (though hardly empty) spaceship, and find a way to sneak aboard.</p>\r\n<p>Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2917,'2019-10-08','Stardrifter RPG Playtest Part 07',1685,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 7 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>In this part, the characters make some new friends who show them their guns! Bonus Fun: I make tons of mistakes reading my own rules!</p>\r\n<p>Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2922,'2019-10-15','Stardrifter RPG Playtest Part 08',1967,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 8 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>In this part, the characters reevaluate their life choices, and decide that negotiation is the better part of valor!</p>\r\n<p>Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2927,'2019-10-22','Stardrifter RPG Playtest Part 09',1584,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 9 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>In this part, the characters agree to join someone else’s treasure hunt, with the success (or failure) of their own mission in the balance!</p>\r\n<p>Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2893,'2019-09-04','Whats in the box! Part 2',727,'NYbill finishes a guitar pedal kit Timttmy sent him. ','<p>In this short follow up episode NYbill troubleshoots the Tremlo guitar kit Timttmy sent him.</p>\r\n<p>Here is a hint, there were two problems, not just one.</p>\r\n<p>Pics for the episode:</p>\r\n<p><a href=\"https://media.gunmonkeynet.net/u/nybill/collection/whats-in-the-box-part-2/\" class=\"uri\">https://media.gunmonkeynet.net/u/nybill/collection/whats-in-the-box-part-2/</a></p>\r\n',235,103,0,'CC-BY-SA','guitar, pedal, tremlo, kit, DIY, soldering',0,0,1),
(2932,'2019-10-29','Stardrifter RPG Playtest Part 10',3255,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 10 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>It’s not unusual for a game master to have two sets of maps for an adventure: one is for the players, which only has the sort of information on it that their characters might reasonably have access to; the other is NOT for the players, as it shows all the special information they shouldn’t know about (at least, not all at once). This is where you’d make note of secret doors, hidden objects or enemies, and/or, as in the case of this playtest, the physical condition of the ship as it stands at the moment.</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2932/Player-Cargo-Ship-2000x2624.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2932/Player-Cargo-Ship-666x874.jpg\" alt=\"Player Map\" width=\"666\" height=\"874\" /></a><br />\r\nPlayer Map</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2932/GM-Cargo-Ship-2000x2786.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2932/GM-Cargo-Ship-627x874.jpg\" alt=\"Game Master Map\" width=\"627\" height=\"874\" /></a><br />\r\nGame Master Map</p>\r\n<p>Additionally, here’s a zip file containing the adventure, the maps, the floor plan descriptions, some miscellaneous non-player characters, and the Stardrifter RPG rules in EPUB format. Again, these are no longer the LATEST version of the rules, but they are what we used for these episodes.</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2932/Stardrifter-RPG-Playtest_Squatters-Rights.zip\">Stardrifter-RPG-Playtest_Squatters-Rights.zip</a></p>\r\n<p>In this final part of the mini-series, the players provide their hard-working game designer with some valuable feedback, observations, and general opinions!</p>\r\n<p>Special thanks to my playtesters in this episode: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2896,'2019-09-09','Orange PI Zero LTS version',737,'A general overview of the Orange PI Zero LTS','<ul>\r\n<li><p>A general overview of the Orange PI Zero LTS version<br />\r\n<a href=\"https://www.orangepi.org/orangepizerolts/\" class=\"uri\">https://www.orangepi.org/orangepizerolts/</a><br />\r\n<a href=\"https://www.geeky-gadgets.com/raspberry-pi-alternative-12-08-2019/\" class=\"uri\">https://www.geeky-gadgets.com/raspberry-pi-alternative-12-08-2019/</a></p></li>\r\n<li><p>This is the one I really liked<br />\r\n<a href=\"https://www.cnx-software.com/2019/07/31/buy-orange-pi-zero-lts-sbc/\" class=\"uri\">https://www.cnx-software.com/2019/07/31/buy-orange-pi-zero-lts-sbc/</a></p></li>\r\n<li><p>This is were the software is<br />\r\n<a href=\"https://www.armbian.org\" class=\"uri\">https://www.armbian.org</a></p></li>\r\n</ul>\r\n',129,0,0,'CC-BY-SA','Raspberry PI, OrangePI, Armbian, Hobby Computing, VNC',0,0,1),
(2901,'2019-09-16','Describing how I listen to podcasts PART 3',835,'In this episode I cover the 1st add-on board I purchased for one of my raspberry pi\'s','<p>In this series I cover how I listen to podcasts and how the process has changed over the years. In this episode I cover the 1st add-on board I purchased for one of my raspberry pi’s I then go on to explain what I do with it.</p>\r\n<ul>\r\n<li><p>Raspberry pi<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Raspberry_Pi\" class=\"uri\">https://en.wikipedia.org/wiki/Raspberry_Pi</a></p></li>\r\n<li><p>Piface Digital IO, pictures and links<br />\r\n<a href=\"https://www.piface.org.uk/products/piface_digital/\" class=\"uri\">https://www.piface.org.uk/products/piface_digital/</a><br />\r\n<a href=\"https://www.piface.org.uk/products/piface_digital_2/\" class=\"uri\">https://www.piface.org.uk/products/piface_digital_2/</a><br />\r\nSoftware Documentation <a href=\"https://piface.github.io/pifacedigitalio/\" class=\"uri\">https://piface.github.io/pifacedigitalio/</a></p></li>\r\n<li>Command used to install the software &amp; libraries to use the Piface Digital IO board, command from companies website:</li>\r\n</ul>\r\n<pre><code>    sudo apt-get install python{,3}-pifacedigitalio</code></pre>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2901/Picture-01.JPG\" alt=\"Picture 1\" /><br />\r\nPicture 1, shows the Piface Digital IO board installed on top of my raspberry pi</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2901/Picture-02.JPG\" alt=\"Picture 2\" /><br />\r\nPicture 2, shows the extension board I built. The extension board increases the number of available LED’s and switches. The board is attached via a ribbon cable with the ends of the wire inserted into the green and orange screw down chocolate blocks attached to the Piface Digital IO board.</p>\r\n<ul>\r\n<li><p>Command to toggle between play and pause in moc is<br />\r\n<code>mocp -G</code> or <code>mocp –toggle-pause</code><br />\r\nmoc man page <a href=\"https://www.mankier.com/1/mocp\" class=\"uri\">https://www.mankier.com/1/mocp</a><br />\r\nmoc homepage <a href=\"https://moc.daper.net/\" class=\"uri\">https://moc.daper.net/</a></p></li>\r\n<li><p>Uptime man page <a href=\"https://linux.die.net/man/1/uptime\" class=\"uri\">https://linux.die.net/man/1/uptime</a></p></li>\r\n</ul>\r\n<h3 id=\"explanation-of-how-to-read-a-binary-display\">Explanation of how to read a binary display</h3>\r\n<p>The board I built which attaches to the Piface Digital board has a total of 8 LED’s. I use the 8 LED’s to display a number in binary format. In binary each LED has only two values either on or off, with 1 LED you can count to 1 with two LED’s you can count to 3. This may seem confusing if you’ve never dealt with binary before. Starting from the right each subsequent LED represents double the value of the previous one so the 1st LED has a value of 1 the 2nd LED has a value of 2, the third LED has a value of 4 and so on. See below</p>\r\n<pre><code>LED Number   8   7   6   5  4  3  2  1\r\nLED VALUES 128, 64, 32, 16, 8, 4, 2, 1</code></pre>\r\n<p>LED on represents 1, LED off represents 0</p>\r\n<p><code>[Example 1]    0   0   0   0  0  0  0  1  [Represented value 1]</code><br />\r\n1st LED on value = 1</p>\r\n<p><code>[Example 2]    0   0   0   0  0  0  1  1  [Represented value 3]</code><br />\r\n1st and 2nd LED on, LED VALUE 1 + 2 = 3</p>\r\n<p><code>[Examples 3]   0   0   0   0  1  0  1  0  [Represented value 10]</code><br />\r\n2nd and 4th LED on, LED VALUE 2 + 8 = 10</p>\r\n<p>With practice it gets easy to convert from binary to decimal, at my work we still have a very old computer which contains a front panel with LED’s and binary switches. To load the computer instructions must be loaded in binary using flip switches and LED’s with practice it becomes second nature.</p>\r\n<h3 id=\"links\">Links</h3>\r\n<ul>\r\n<li><p>Further information on binary numbers <a href=\"https://en.wikipedia.org/wiki/Binary_number\" class=\"uri\">https://en.wikipedia.org/wiki/Binary_number</a></p></li>\r\n<li><p><code>df</code> man page (Disk Free) <a href=\"https://linux.die.net/man/1/df\" class=\"uri\">https://linux.die.net/man/1/df</a></p></li>\r\n<li><p><code>aplay</code> man page <a href=\"https://linux.die.net/man/1/aplay\" class=\"uri\">https://linux.die.net/man/1/aplay</a></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, hardware, electronics, Raspberry Pi',0,0,1),
(2918,'2019-10-09','Selecting random item from weighted list',1604,'How to selected random item from weighted list using Haskell','<h2 id=\"intro\">Intro</h2>\r\n<p>We’re going to have a look how to select random item from weighted list. There isn’t that much code this time, but it certainly took many tries to get it working and looking nice.</p>\r\n<h2 id=\"analogy\">Analogy</h2>\r\n<p>Imagine stack of building blocks of different heights stacked on top of each other. Height of the each block is chance of how often it will be selected. Selection is done by chopping a stick so that its length at maximum is height of the stack. Place stick next to the stack and select the block that stick reaches at.</p>\r\n<h2 id=\"explanation-of-algorithm\">Explanation of algorithm</h2>\r\n<p>We have list of items and associated weight, defined as <code>Frequency a = Frequency Int a</code>.</p>\r\n<p>Total is sum of all the weights and we select a random number <code>n</code> between 1 and total.</p>\r\n<p><code>pick</code> function has signature of <code>[Frequency a] -&gt; n -&gt; Maybe a</code>. Empty list will result <code>Nothing</code>. When picking item, if <code>n</code> is equal or less than weight of the first item, return that item. Otherwise, drop the first item, subtract weight of that first item from <code>n</code> and try again. Eventually we either arrive to item which weight is greater than <code>n</code> or to empty list.</p>\r\n<h2 id=\"quick-detour-on-random-number-generators\">Quick detour on random number generators</h2>\r\n<p>Haskell functions are pure, meaning that with same input, you are guaranteed to get the same output (safe for some specific cases). Which makes concept of random numbers at first glance to be impossible. This is solved by passing in a random number generator, which can supply you a random value a new random number generator. Using this new random number generator to generate a value yields you a yet another value and yet another random number generator.</p>\r\n<p>Passing these random number generators around in code gets tedious, but there’s different solution: <code>MonadRandom</code>. Using it will thread along generators automatically behind the scenes, ensuring that you always have access to a fresh generator. There’s several functions that can be used to generate random values, but we’re using this one: <code>getRandomR :: Random a =&gt; (a, a) -&gt; m a</code>. Given a lower and upper bound, it will return you a random value wrapped in context that carries that new random number generator.</p>\r\n<p>In the end, we need to take our computation (that can be complex and use multiple calls to random number generator) and turn that <code>m a</code> into <code>a</code>. This is done with <code>runRand :: RandomGen g =&gt; Rand g a -&gt; g -&gt; (a, g)</code>. We give it our computation and a <code>RandomGen g</code> that can generate random values and receive <code>(a, g)</code> where <code>a</code> is our result and <code>g</code> new random number generator. In cases where we aren’t going to use the new generator, we can use <code>evalRand :: RandomGen g =&gt; Rand g a -&gt; g -&gt; a</code>, which discards it and returns just <code>a</code>.</p>\r\n<h2 id=\"actual-implementation-with-explanation\">Actual implementation with explanation</h2>\r\n<p>First, <code>Frequency</code> for expressing weight of individual item. It’s parametrized, so can be used with any data.</p>\r\n<pre><code>data Frequency a = Frequency Int a\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>Next, determining which item to choose, based on stack and measuring stick. In case a value outside of valid range has been selected, we end up with <code>Nothing</code>, otherwise with <code>Just a</code>. First case is for empty list (either we called this originally with empty list or picked number that is greater than total sum of weights), second one either picks the first item of list or recursive calls itself removing first item.</p>\r\n<pre><code>pick :: [Frequency a] -&gt; Int -&gt; Maybe a\r\npick [] _ = Nothing\r\n\r\npick (Frequency x item:xs) i\r\n    | i &lt;= x = Just item\r\n    | otherwise = pick xs (i - x)</code></pre>\r\n<p>Finally, function for calculating total of weights and choosing random number. We’re using that <code>Rand g (Maybe a)</code> I explained earlier. First case is for empty list again and latter case for list with at least one item.</p>\r\n<pre><code>choose :: RandomGen g =&gt; [Frequency a] -&gt; Rand g (Maybe a)\r\nchoose [] =\r\n    return Nothing\r\n\r\nchoose items = do\r\n    let total = sum $ fmap (\\(Frequency x _) -&gt; x) items\r\n    n &lt;- getRandomR (1, total)\r\n    return $ pick items n</code></pre>\r\n<p>Notice how we can get random number by <code>n &lt;- getRandomR (1, total)</code>, without talking about generators. <code>MonadRandom</code> is handling generators and making sure that there’s always a fresh generator available and new generator is stored ready to be used.</p>\r\n<p>And that’s all the code this time (I told the amount of code is small this time).</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>This probably sounds a lot more complicated than it actually is. I arrived to the result after quite many detours, but the end result looks pretty nice.</p>\r\n<p>Next time we’re going to have a look where to use our <code>choose</code> function.</p>\r\n<p>In the meantime, questions, comments and feedback are welcomed. Best way to reach me is email or fediverse where I’m <code>Tuula@mastodon.social</code>. Or even better, record your own Hacker Public Radio episode.</p>\r\n',364,107,0,'CC-BY-SA','haskell, random, monad',0,0,1),
(2904,'2019-09-19','DIY URL shortening',738,'Quick tip on how to shorten an URL without a silly SaaS','<p>\r\nMake a directory to house your shortened URLs.\r\n</p>\r\n\r\n<pre><code>\r\n$ ssh example.com mkdir public_html/u\r\n</code></pre>\r\n\r\n<p>\r\nOn demand, create a subdirectory for the shortened URL you want to create.\r\n</p>\r\n\r\n<pre><code>\r\n$ ssh example.com mkdir public_html/u/hpr\r\n</code></pre>\r\n\r\n<p>\r\nCreate an HTTP redirect in an index.html file.\r\n</p>\r\n\r\n<pre><code>\r\n$ ssh example.com echo \"\"&lt;html>&lt;title>Shortened URL&lt;/title>&lt;head>&lt;meta http-equiv=\'refresh\' content=\'0; URL=http:&#47;&#47;hackerpublicradio.org&#47;correspondents/0078.html\' />&lt;/head>&lt;/html>\"\" &gt; www/u/hpr/index.html\r\n</code></pre>\r\n\r\n<p>\r\nYour shortened URL is example.com/u/hpr\r\n</p>\r\n',78,0,0,'CC-BY-SA','html, url shortner',0,0,1),
(2928,'2019-10-23','Building markov chains with Haskell',1798,'How to build markov chains with Haskell','<h2 id=\"intro\">Intro</h2>\r\n<p>Last time we built a weighted list, this time we’re using that to build markov chains. Wikipedia states that “A Markov chain is a stochastic model describing a sequence of possible events in which the probability of each event depends only on the state attained in the previous event.” and that they’re named after the Russian mathematician Andrey Markov.</p>\r\n<h2 id=\"configuration\">Configuration</h2>\r\n<p>We’re after generic system, hence parametrized data types.</p>\r\n<p>First part is <code>Configuration a</code> that lists possible starting elements of chain and elements that can follow a particular element.</p>\r\n<pre><code>data Config a = Config\r\n    { configStarts :: ![Item a]\r\n    , configContinuations :: !(Map a [Item a])\r\n    } deriving (Show, Read, Eq)</code></pre>\r\n<p>Second part is <code>Item a</code>, that just holds single item that could appear in chain and relatively frequency for its appearance.</p>\r\n<pre><code>data Item a =\r\n    Item (Frequency (Maybe a))\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>We’re using <code>Maybe a</code> as in some cases there’s chance of element being last element in chain. Thus, <code>Nothing</code> will represent end of chain.</p>\r\n<p>In previous episode, we implemented <code>choose</code>, but later on I decided to rename it to <code>chooseM</code>. So when you see <code>chooseM</code>, it’s just different name for what we implemented previously.</p>\r\n<h2 id=\"building-a-chain\">Building a chain</h2>\r\n<p>Since building a configuration depends on the case quite a bit, we’re just going to assume that we have one at hand.</p>\r\n<p>Our chains are built by <code>chainM :: (Ord a, RandomGen g) =&gt; Config a -&gt; Rand g [a]</code>. Given a config, it creates computation that when run will return list of <code>a</code>, which is our chain.</p>\r\n<p>Implementation is fairly straightforward:</p>\r\n<pre><code>chainM config = do\r\n    starter &lt;- chooseM (itemToFreq &lt;$&gt; configStarts config)\r\n    case join starter of\r\n        Nothing -&gt;\r\n            return []\r\n\r\n        Just h -&gt; do\r\n            t &lt;- tailOfChain config h\r\n            return $ h : t</code></pre>\r\n<p>First we select item from starting elements. In case there isn’t one, result will be a empty list. Otherwise we use <code>tailOfChain</code> to compute rest of the list and return a list of starter element followed by that tail.</p>\r\n<p>For tail we need to figure out first what possible elements there are that can follow a given element. This is done by <code>candidates</code> function. <code>lookup</code> finds a possible list of elements in <code>configContinuations</code>. We use <code>itemToFreq</code> to turn this list into frequencies. Since <code>items</code> might be <code>Nothing</code> (in case where there aren’t any suitable continuations present) and any continuation in the list might be <code>Nothing</code> (in case where this is possibly terminating element), we have to use <code>(fmap . fmap)</code> to apply <code>itemToFreq</code> to each possible element. Moreover, <code>concat</code> turns our <code>Maybe [Frequency (Maybe a)]</code> into <code>[Frequency (Maybe a)]</code>, if we have <code>Nothing</code> at this stage, result will be an empty list <code>[]</code>.</p>\r\n<pre><code>candidates :: (Ord a) =&gt; Config a -&gt; a -&gt; [Frequency (Maybe a)]\r\ncandidates config x =\r\n    concat $ (fmap . fmap) itemToFreq items\r\n    where\r\n        items = lookup x (configContinuations config)</code></pre>\r\n<p>That <code>concat</code> part could have been written as:</p>\r\n<pre><code>    case (fmap . fmap) itemToFreq items of\r\n        Nothing -&gt;\r\n            []\r\n\r\n        Just x -&gt;\r\n            x</code></pre>\r\n<p>and the end result would be identical.</p>\r\n<p>Now that we know how to figure our possible continuation elements, we can implement computing tail of chain:</p>\r\n<pre><code>tailOfChain :: (Ord a, RandomGen g) =&gt; Config a -&gt; a -&gt; Rand g [a]\r\ntailOfChain config c = do\r\n    item &lt;- chooseM (candidates config c)\r\n    case join item of\r\n        Nothing -&gt;\r\n            return []\r\n\r\n        Just x -&gt; do\r\n             xs &lt;- tailOfChain config x\r\n             return $ x : xs</code></pre>\r\n<p>Function first select <code>item</code> from candidates. If there isn’t suitable item or item is <code>Nothing</code>, result will be an empty list. Otherwise function recurses, computes tail starting from selected element and constructs chain starting by selected <code>item</code> and followed by tail.</p>\r\n<p><code>join item</code> at the start of case analysis collapses two nested <code>Maybe</code>s together:</p>\r\n<ul>\r\n<li><code>Nothing</code> will result <code>Nothing</code> (no suitable continuation)</li>\r\n<li><code>Just Nothing</code> will also result <code>Nothing</code> (end of chain reached)</li>\r\n<li><code>Just a</code> will result <code>Just a</code> (suitable element found)</li>\r\n</ul>\r\n<p>In the end we have list that is sort of like: <code>h : chooseM (candidates config h) : chooseM (candidates config h\') : chooseM (candidates config h\'\') : ... : []</code></p>\r\n<h2 id=\"extra\">Extra</h2>\r\n<p>For convenience we define two other functions. First one is for when we don’t want to use <code>Rand g a</code>. It’s done by applying <code>runRand</code> function with our <code>chainM</code> function, config and <code>RandomGen</code>.</p>\r\n<pre><code>chain :: (Ord a, RandomGen g) =&gt; Config a -&gt; g -&gt; ([a], g)\r\nchain config g =\r\n    runRand (chainM config) g</code></pre>\r\n<p>More interesting is <code>chains</code> which builds infinite list of chains:</p>\r\n<pre><code>chains :: (Ord a, RandomGen g) =&gt; Config a -&gt; g -&gt; [[a]]\r\nchains config g =\r\n        c : chains config g&#39;\r\n    where\r\n        (c, g&#39;) = chain config g</code></pre>\r\n<p>This uses <code>chain</code> function to create starting element (which is markov chain) and new generator <code>g\'</code>. Then it builds a list where that first chain is followed by list of chains that is created by calling <code>chains</code> with that new random generator. Since there’s no termination case in the function, it will compute infinitely long list of markov chains. This works because elements are computed only when needed. For all intents and purposes for program using this infinite list, items are there when needed.</p>\r\n<h2 id=\"closing\">Closing</h2>\r\n<p>Hardest part working with markov chains (at least in my opinion) is building suitable configuration. When you have that configuration at hand, building chains from it requires relatively small amount of code. In the next episode we’re going to use this chains for our space game.</p>\r\n<p>Questions, comments and feedback are always welcome. Best way to reach me is by email or in fediverse where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','markov chains, Haskell',0,0,1),
(2905,'2019-09-20','Two HPR hosts living in the same region finally meet up!',1145,'Dave Morriss and MrX meet up and record a conversation','<h2 id=\"introduction\">Introduction</h2>\r\n<p>Two HPR hosts who live in the Edinburgh locality in Scotland met on Saturday 24<sup>th</sup> August for a chat.</p>\r\n<p>The hosts are:</p>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" title=\"MrX\">MrX</a> - first HPR show <a href=\"https://hackerpublicradio.org/eps.php?id=911\">“Hobbies”</a> on 2012-01-27</li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" title=\"Dave Morriss\">Dave Morriss</a> - first HPR show <a href=\"https://hackerpublicradio.org/eps.php?id=1091\">“Useful Vim Plugins”</a> on 2012-10-05</li>\r\n</ul>\r\n<p>Some of the meeting was recorded and is presented here.</p>\r\n<h3 id=\"recording-information\">Recording information</h3>\r\n<p>We were both recording this chat. Dave was using his Zoom H2n (with the microphones in <em>XY</em> mode) and MrX had left his small <em>Dictaphone</em>-like recorder on the table.</p>\r\n<p>Most of the audio here was from the Zoom, but at one point it switches to MrX’s recorder for comparison. The sample is at about 18 minutes into the recording (hard to judge since an intro sequence will have been added on the HPR site). A “chirp” effect has been added at the start and end of this sample to help with identification.</p>\r\n<p>The Zoom track had noise reduction applied to it, using a noise sample from the start as a reference. The sample from MrX’s recorder also had noise reduction applied, and both tracks were amplified.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>MrX’s shows that we were talking about:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2879\">Describing how I listen to podcasts PART 1</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2889\">Describing how I listen to podcasts PART 2</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2901\">Describing how I listen to podcasts PART 3</a></li>\r\n</ul></li>\r\n<li>The radio device for the Pi mentioned by Dave:\r\n<ul>\r\n<li>ESP8266 IoT pHAT from Pimoroni (now discontinued)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/ESP8266\">Wikipedia page on the ESP8266</a></li>\r\n<li><a href=\"https://learn.pimoroni.com/tutorial/hal13/getting-started-with-iot-phat\">Pimoroni Tutorial on using the pHAT</a></li>\r\n</ul></li>\r\n</ul>\r\n',225,0,1,'CC-BY-SA','HPR,hosts,meeting,Dave Morriss,MrX',0,0,1),
(2906,'2019-09-23','Feature Engineering for Data-Driven Decision Making',1006,'In this episode, I explain feature engineering, and how it can be used to make decisions','<h2 id=\"example-of-the-input-data\">Example of the input data</h2>\r\n<table>\r\n<thead>\r\n<tr class=\"header\">\r\n<th>Client name</th>\r\n<th>Date ordered</th>\r\n</tr>\r\n</thead>\r\n<tbody>\r\n<tr class=\"odd\">\r\n<td>Client 1</td>\r\n<td>2019-01-01</td>\r\n</tr>\r\n<tr class=\"even\">\r\n<td>Client 1</td>\r\n<td>2019-01-01</td>\r\n</tr>\r\n<tr class=\"odd\">\r\n<td>Client 3</td>\r\n<td>2019-01-01</td>\r\n</tr>\r\n<tr class=\"even\">\r\n<td>Client 3</td>\r\n<td>2019-01-01</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<h2 id=\"example-of-the-engineered-features\">Example of the engineered features</h2>\r\n<table>\r\n<thead>\r\n<tr class=\"header\">\r\n<th>Client name</th>\r\n<th>volume</th>\r\n<th>last order date</th>\r\n<th>first order date</th>\r\n<th>days since last order</th>\r\n</tr>\r\n</thead>\r\n<tbody>\r\n<tr class=\"odd\">\r\n<td>Client 1</td>\r\n<td>292</td>\r\n<td>2019-09-03</td>\r\n<td>2015-03-04</td>\r\n<td>10</td>\r\n</tr>\r\n<tr class=\"even\">\r\n<td>Client 2</td>\r\n<td>18</td>\r\n<td>2019-09-09</td>\r\n<td>2019-09-04</td>\r\n<td>4</td>\r\n</tr>\r\n<tr class=\"odd\">\r\n<td>Client 3</td>\r\n<td>300</td>\r\n<td>2019-08-16</td>\r\n<td>2016-11-15</td>\r\n<td><strong>28</strong></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<h2 id=\"links\">Links</h2>\r\n<ol type=\"1\">\r\n<li><a href=\"https://en.wikipedia.org/wiki/Feature_engineering\">Feature Engineering</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Feature_(machine_learning)\">Feature</a></li>\r\n</ol>\r\n',300,0,0,'CC-BY-SA','data',0,0,1),
(2909,'2019-09-26','ONICS Basics Part 3:  Networking Fundamentals',3031,'This show discusses basic principles of networks and how to send data using ONICS','<h1 id=\"theory\">Theory</h1>\r\n<p>In this episode I decided to take a slight diversion into networking fundamentals. As before, if you want to learn more about installing the ONICS tool suite, go back and listen to HPR 2882.</p>\r\n<p>There are three key concepts to understand about modern networks. They are:</p>\r\n<ul>\r\n<li><p>digital - the networks carry bits and bytes (binary digits)</p></li>\r\n<li><p>packet switched - devices break data into blobs of data called &quot;packets&quot; and take turns sending and receiving those packets to/from other devices attached to the network</p></li>\r\n<li><p>internetworked -- machines communicate using a protocol that allows traffic to traverse across multiple, independently-managed networks in a uniform way</p></li>\r\n</ul>\r\n<h1 id=\"my-setup\">My Setup</h1>\r\n<ul>\r\n<li><p>2 laptops connected to a home wifi network that has Internet connectivity.</p></li>\r\n<li><p>Practicing sending data from a source machine to a destination machine. Both are running Linux.</p></li>\r\n<li><p>Source machine:</p>\r\n<ul>\r\n<li>Wifi interface: wlan0</li>\r\n<li>Ethernet address: 00:22:fa:a7:69:90</li>\r\n<li>IP address: 192.168.0.4</li>\r\n</ul></li>\r\n<li><p>Destination machine</p>\r\n<ul>\r\n<li>Wifi interface: wlo1</li>\r\n<li>Ethernet address: 6c:88:14:7c:2e:14</li>\r\n<li>IP address: 192.168.0.248</li>\r\n</ul></li>\r\n<li><p>Internet Router:</p>\r\n<ul>\r\n<li>Ethernet address: 00:0d:b9:23:f2:51</li>\r\n<li>IP address: 192.168.0.1</li>\r\n</ul></li>\r\n</ul>\r\n<h1 id=\"more-terminology\">More Terminology</h1>\r\n<ul>\r\n<li><p>Address - a number that identifies a machine\'s interface in a network</p></li>\r\n<li><p>Packet - a blob of binary data sent as a unit over a network</p></li>\r\n<li><p>Route - a rule that specifies how to forward traffic to a given address</p></li>\r\n<li><p>Router / Gateway - a machine that uses the IP protocol and forwards traffic between multiple networks that it connects to</p></li>\r\n<li><p>Network Protocol - a set of rules and data formats for exchanging information over a network</p></li>\r\n</ul>\r\n<h1 id=\"standard-unix-commands\">Standard UNIX Commands</h1>\r\n<ul>\r\n<li>ifconfig (no arguments or \'-a\')\r\n<ul>\r\n<li>list interfaces on a machine</li>\r\n</ul></li>\r\n<li>ifconfig IFNAME\r\n<ul>\r\n<li>list properites about a given interface</li>\r\n</ul></li>\r\n<li>ping -c 1 IPADDRESS\r\n<ul>\r\n<li>send an echo request to machine IPADDRESS</li>\r\n</ul></li>\r\n<li>arp -na\r\n<ul>\r\n<li>Dump the Ethernet addresses of known nearby machines</li>\r\n</ul></li>\r\n<li>netstat -nr\r\n<ul>\r\n<li>Dump the routes in a system</li>\r\n</ul></li>\r\n<li>netstat -nr | grep &quot;^0.0.0.0&quot;\r\n<ul>\r\n<li>Find the route (and thus IP address) of the default gateway</li>\r\n</ul></li>\r\n</ul>\r\n<h1 id=\"onics-commands-in-this-episode\">ONICS Commands in this Episode</h1>\r\n<ul>\r\n<li><p>rawpkt - take a blob of data and wrap it in an XPKT format (so other ONICS tools can understand what it is)</p></li>\r\n<li><p>ethwrap - take an XPKT and prepend an Ethernet header to it</p></li>\r\n<li><p>ipwrap - take an XPKT and prepend an IP header to it</p></li>\r\n<li><p>pktin - read a stream of packets from a network interface</p></li>\r\n<li><p>pflt - filter a stream of packets so that only those matching a pattern get through</p></li>\r\n<li><p>pktout - send a stream of packets to a network interface</p></li>\r\n<li><p>x2hpkt - convert XPKTs into a hex dump</p></li>\r\n<li><p>xpktdump - like x2hpkt, but send the output to a pager like \'less\' for easy reading</p></li>\r\n</ul>\r\n<h1 id=\"sending-an-ethernet-packet-to-the-destination\">Sending an Ethernet Packet to the Destination</h1>\r\n<ul>\r\n<li>On the receiver:</li>\r\n</ul>\r\n<pre><code>    $ sudo pktin wlo1 |\r\n      pflt &quot;not ip and eth.dst == 6c:88:14:7c:2e:14&quot; |\r\n      x2hpkt\r\n</code></pre>\r\n<ul>\r\n<li>On the sender:</li>\r\n</ul>\r\n<pre><code>    $ echo &quot;hello world&quot; |\r\n      rawpkt |\r\n      ethwrap &quot;eth.dst = 6c:88:14:7c:2e:14; &quot;\r\n              &quot;eth.src = 00:22:fa:a7:69:90; &quot;\r\n              &quot;eth.ethtype = 12;&quot; |\r\n      sudo pktout wlan0\r\n</code></pre>\r\n<p>Note that while I broke up the field setting commands into multiple lines in ethwrap, they can all be part of a single quoted string if desired. To store the packet to a file rather than send it instead do something</p>\r\n<pre><code>$ echo ... | rawpkt | ethwrap ... &gt; outfile.xpkt\r\n</code></pre>\r\n<p>One can then dump the packet by running:</p>\r\n<pre><code>$ xpktdump outfile.xpkt\r\n</code></pre>\r\n<p>or send the packet by running:</p>\r\n<pre><code>$ sudo pktout outfile.xpkt wlan0\r\n</code></pre>\r\n<h1 id=\"sending-an-ip-packet-to-the-destination-over-the-local-network\">Sending an IP Packet to the Destination over the Local Network</h1>\r\n<ul>\r\n<li>On the reciever:</li>\r\n</ul>\r\n<pre><code>    $ sudo pktin wlo1 |\r\n      pflt &quot;ip and ip.proto == 255&quot; |\r\n      x2hpkt\r\n</code></pre>\r\n<ul>\r\n<li>On the sender:</li>\r\n</ul>\r\n<pre><code>    $ echo &quot;hello world&quot; |\r\n      rawpkt |\r\n      ipwrap &quot;ip.saddr = 192.168.0.4;&quot;\r\n             &quot;ip.daddr = 192.168.0.248;&quot;\r\n             &quot;ip.len = 32;&quot;\r\n             &quot;ip.ttl = 64;&quot;\r\n             &quot;ip.proto = 255;&quot; |\r\n      ethwrap &quot;eth.dst = 6c:88:14:7c:2e:14; &quot;\r\n              &quot;eth.src = 00:22:fa:a7:69:90; &quot;\r\n              &quot;eth.ethtype = 0x800;&quot; |\r\n      sudo pktout wlan0\r\n</code></pre>\r\n<p>Note that while I broke up the field setting commands into multiple lines in ipwrap and ethwrap, they can all be part of a single quoted string if desired. Also note that it is not actually necessary to set the \'ip.len\' and \'eth.ethtype\' fields: the tools will do that automatically.</p>\r\n<h1 id=\"sending-an-ip-packet-to-the-destination-via-ip\">Sending an IP Packet to the Destination via IP</h1>\r\n<ul>\r\n<li>On the receiver:</li>\r\n</ul>\r\n<pre><code>    $ sudo pktin wlo1 |\r\n      pflt &quot;ip and ip.proto == 255&quot; |\r\n      x2hpkt\r\n</code></pre>\r\n<ul>\r\n<li>One the sender:</li>\r\n</ul>\r\n<pre><code>    $ echo &quot;hello world&quot; |\r\n      rawpkt |\r\n      ipwrap &quot;ip.saddr = 192.168.0.4;&quot;\r\n             &quot;ip.daddr = 192.168.0.248;&quot;\r\n             &quot;ip.ttl = 64;&quot;\r\n             &quot;ip.proto = 255;&quot; |\r\n      ethwrap &quot;eth.dst = 00:0d:b9:23:f2:51; &quot;\r\n              &quot;eth.src = 00:22:fa:a7:69:90; &quot; |\r\n      sudo pktout wlan0\r\n</code></pre>\r\n<h1 id=\"challenge\">Challenge</h1>\r\n<p>There are several differences between the packets that arrive at the destination machine when sending directly over the local network versus sending via an IP gateway (router). I\'ve mentioned how the Ethernet header is different. Can you find the other differences? What causes these differences?</p>\r\n<p>TIP: instead of sending the <code>pktin</code> command to x2hpkt, send it to a file. Do this for both local network send and for sending via the router saving each to different files. Then run <code>pdiff</code> on the two files to highlight the differences.</p>\r\n',259,61,0,'CC-BY-SA','command-line, networking, basics',0,0,1),
(2911,'2019-09-30','my internet connection',655,'a bloviated harang with a smattering of spewed expetives, while describing available ISPs','<p>Any notes for this episode should probably contain links to the ISPs mentioned in the show. Since I do not wish to harm any listeners, I have opted to not include links to evil ISPs.</p>',243,0,1,'CC-BY-SA','internet service, satellite',0,0,1),
(2938,'2019-11-06','Naming pets in space game',1236,'How to use markov chains to generate names','<h2 id=\"intro\">Intro</h2>\r\n<p>In the two previous episodes we built a weighted list and used that to build markov chains. This time we’re going to use them to generate some names based on examples. I’m skipping over a lot of uninteresting code in this episode, concentrating only the parts that deal with names.</p>\r\n<h2 id=\"idea\">Idea</h2>\r\n<p>Person in game might hear scurrying sounds inside walls of their quarters. Then they have option of getting a cat, taming a rat or letting someone else deal with the problem. Depending on their choice, they might end up with a cat or a rat, that of course needs a name. Game offers 3 different options of names that haven’t been used before and person can always opt for completely random one.</p>\r\n<h2 id=\"config\">Config</h2>\r\n<p>While we’re not going to dig very deep into making configurations for markov chains, we can have look at the overall process.</p>\r\n<p>We have list of names to serve as examples and three functions, which implementation I won’t delve into:</p>\r\n<ul>\r\n<li><code>start</code> for adding starting element</li>\r\n<li><code>links</code> for recording link between two elements</li>\r\n<li><code>end</code> adds ending element</li>\r\n</ul>\r\n<p><code>addName</code> function is used to add single name into config:</p>\r\n<pre><code>addName :: Int -&gt; Text -&gt; Config Text -&gt; Config Text\r\naddName n s config =\r\n    links pairs $\r\n            end elements $\r\n            start elements config\r\n    where\r\n        elements = chunksOf n s\r\n        pairs = zip elements (safeTail elements)</code></pre>\r\n<p>First <code>s</code> (name) is split into strings of length <code>n</code>. These <code>elements</code> are then combined into pairs, where consecutive elements form a pair. Final step is to add start and ending elements into config, followed by links between elements of pairs.</p>\r\n<p>We can then fold a list of examples into config:</p>\r\n<pre><code>nameConfig :: [Text] -&gt; Int -&gt; Config Text\r\nnameConfig xs n =\r\n    foldr (addName n) emptyConfig xs</code></pre>\r\n<p>This starts with <code>emptyConfig</code> and calls <code>addName</code> repeatedly until all elements of list containing examples have been processed.</p>\r\n<h2 id=\"implementation\">Implementation</h2>\r\n<p>Now that we have configuration, we can start generating names. As usual, I like to keep things specific and generate <code>PetName</code> instead of just <code>Text</code>. I happened to have list of ancient greek names at hand, so I used that. Later on we’ll have to add more cultures, like Romans, Parthians, Persians, Germans, Phoenicians and so on.</p>\r\n<p>General implementation of generating infinite list of strings of specific kind is shown below:</p>\r\n<pre><code>names :: (RandomGen g, Eq b) =&gt; (Text -&gt; b) -&gt; Config Text -&gt; g -&gt; [b]\r\nnames t config g =\r\n    nub $ (t . toTitle . concat) &lt;$&gt; chains config g</code></pre>\r\n<p>It’s easier to read if you start from right. <code>chains config g</code> generates infinite list of markov chains with given configuration. Next we create a new function <code>(t . toTitle . concat)</code>, which uses <code>concat</code> to combine list of <code>Text</code> into single <code>Text</code>, <code>toTitle</code> to capitalize is correctly and <code>t</code> to transform it to something (<code>PetName</code> in our case). <code>&lt;$&gt;</code> is then used to apply this function to each element of our infinite list. Finally <code>nub</code> is used to remove duplicate entries.</p>\r\n<p>With <code>names</code> we can then define <code>petNames</code>:</p>\r\n<pre><code>petNames :: (RandomGen g) =&gt; g -&gt; [PetName]\r\npetNames =\r\n    names MkPetName greekNameConfig</code></pre>\r\n<p><code>MkPetName</code> is value constructor that turns <code>Text</code> into <code>PetName</code> (this is <code>t</code> used by <code>names</code> function).</p>\r\n<h2 id=\"pets\">Pets</h2>\r\n<p>Pets are currently very much work in progress. They have few attributes and there can be two different kinds of pets:</p>\r\n<pre><code>Pet json\r\n    name PetName\r\n    type PetType\r\n    dateOfBirth StarDate\r\n    dateOfDeath StarDate Maybe\r\n    ownerId PersonId\r\n    deriving Show Read Eq</code></pre>\r\n<pre><code>data PetType\r\n    = Cat\r\n    | Rat\r\n    deriving (Show, Read, Eq, Ord, Enum, Bounded)</code></pre>\r\n<p>The actual beef is <code>namingPetEvent</code> function. When applied with <code>Entity Person</code>, <code>Entity Pet</code> and <code>StarDate</code>, it will create <code>News</code> that can be saved into database and later on showed to player. While the code is shown below, I’m not going to go over it line by line:</p>\r\n<pre><code>namingPetEvent :: (PersistQueryRead backend, MonadIO m,\r\n    BaseBackend backend ~ SqlBackend) =&gt;\r\n    Entity Person -&gt; Entity Pet -&gt; StarDate -&gt; ReaderT backend m News\r\nnamingPetEvent personE petE date = do\r\n    pets &lt;- selectList [ PetOwnerId ==. (entityKey personE)\r\n                       , PetDateOfDeath ==. Nothing\r\n                       ] []\r\n    let names = (petName . entityVal) &lt;$&gt; pets\r\n    g &lt;- liftIO getStdGen\r\n    let availableNames = take 3 $ filter (\\x -&gt; not (x `elem` names)) $ petNames g\r\n    let content = NamingPet (NamingPetEvent { namingPetEventPersonId = entityKey personE\r\n                                            , namingPetEventPetId = entityKey petE\r\n                                            , namingPetEventPetType = (petType . entityVal) petE\r\n                                            , namingPetEventDate = date\r\n                                            , namingPetNameOptions = availableNames\r\n                                            })\r\n                            [] Nothing\r\n    return $ mkPersonalSpecialNews date (entityKey personE) content</code></pre>\r\n<p>General idea is to use <code>selectList</code> to load living pets of given person and then extract their names. With random generator <code>g</code>, we create a infinite list of <code>PetName</code>s, remove already used names from it and take 3 first ones. These names are then used to create <code>NamingPetEvent</code>.</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>Names are probably one of the most common applications of markov chains in games. Same technique can be used to generate nonsense books and articles that look realistic on a glance.</p>\r\n<p>Questions, comments and feedback is welcomed, best way to reach is email or in fediverse where I’m <code>Tuula@mastodon.social</code>. Or even better, record your own episode for Hacker Public Radio.</p>\r\n<p>ad astra!</p>\r\n',364,107,0,'CC-BY-SA','haskell, markov chains',0,0,1),
(2913,'2019-10-02','Windows, SDN, and Firewalls',2483,'Being a Windows User for the past 3 years, Information on SDN, and a DIY approach to a home Firewall','<pre>\r\nIntro\r\n\r\nLast Upload was hpr1468 March 19, 2014 \r\n\r\npython\r\n\r\n>>> print (D.today() - D(2014, 3, 19)).days\r\n\r\n1999\r\n\r\n>>> 2000/365\r\n\r\n5\r\n</pre>\r\n\r\n<p><a href=\"https://unix.stackexchange.com/questions/24626/quickly-calculate-date-differences\" class=\"uri\">https://unix.stackexchange.com/questions/24626/quickly-calculate-date-differences</a></p>\r\n<p>In the last 5 years:</p>\r\n<ul>\r\n<li>Traveled the world.</li>\r\n<li>Deployed a lot of things for work.</li>\r\n<li>Taken on a new role which moves me from Datacenters to Networks.</li>\r\n<li>Learned a lot about Operations, Datacenter Infrastructure, People around the world, and why it is important to have your house in order.</li>\r\n<li>Read over 3 dozen books.</li>\r\n<li>Paid off debt and focused on long term financial goals.</li>\r\n<li>Humility, Humanity, and Harmony: Three things I have continued to strive for in my personal life, work, and hobbies.</li>\r\n</ul>\r\n<p>Let\'s Start The Show off in the wrong direction</p>\r\n<h2 id=\"windows\">Windows</h2>\r\n<ul>\r\n<li>Chocolatey\r\n<ul>\r\n<li>Great Tool for Downloading free software from the windows powershell command line</li>\r\n<li><a href=\"https://chocolatey.org/docs/installation\" class=\"uri\">https://chocolatey.org/docs/installation</a></li>\r\n</ul></li>\r\n</ul>\r\n<h3 id=\"sublime-text-3\">Sublime Text 3</h3>\r\n<ul>\r\n<li>Fantastic Text editor and very powerful. I use this to quickly parse data using regex searches and push this to spreadsheets or other tools that allow me to organize data quickly. Overall Great tool for anyone</li>\r\n</ul>\r\n<h3 id=\"summary\">Summary:</h3>\r\n<ul>\r\n<li>Overall: The importance of being an everyday Windows User has allowed me to focus on solving problems in different and unique ways. I\'ve found that the way I use Windows is not the same as most normal Windows Users. I live most of the time inside of Chrome so Windows is just another OS to get my Chrome Browser running.</li>\r\n<li>Observation: Windows has definitely matured over the past 10 years. I find myself enjoying the time I save using Windows 10.</li>\r\n<li>Contradictions: I still use Linux, but as a VM to work on things that I just can\'t do inside of Windows.</li>\r\n</ul>\r\n<h2 id=\"web-stuff\">Web Stuff</h2>\r\n<ul>\r\n<li>Regex\r\n<ul>\r\n<li>Test and debug your regex. It is a great tool that combines pastebin and regex debugging. This allows you to share your regex with other by simply using a link. There is a lot of useful information on the site about what each portion of your regex is doing.</li>\r\n<li><a href=\"https://regex101.com\" class=\"uri\">https://regex101.com</a></li>\r\n</ul></li>\r\n<li>Maps\r\n<ul>\r\n<li>USGS Maps\r\n<ul>\r\n<li>Very nice site that allows you to download PDFs of 1:24000 or 7.5 minute Maps. You can print these off and use a Map grid tool to navigate your journey. This is kind of an analog tool but you are downloading the maps to your computer or phone. Good to have maps saved offline while you hike, that way you don\'t get lost.</li>\r\n<li><a href=\"https://store.usgs.gov/map-locator\" class=\"uri\">https://store.usgs.gov/map-locator</a></li>\r\n</ul></li>\r\n</ul></li>\r\n<li>SDN Information\r\n<ul>\r\n<li>If you\'re just starting with Software Defined Networking or are already working with it in a production environment, there is much to learn but very few places to find aggregated information. The GitHub Page called awesome-sdn has tons of links on NOS,Controllers, Libraries, and more. I have A couple of Northbound network and Aruba switches at home to use with my SDN projects. I highly recommend you start getting familiar with network automation using ansible or other automation best practices at the least. For the more technical stuff definitely start looking at SDN.</li>\r\n<li>Awesome-SDN\r\n<ul>\r\n<li><a href=\"https://github.com/sdnds-tw/awesome-sdn/blob/master/README.md\" class=\"uri\">https://github.com/sdnds-tw/awesome-sdn/blob/master/README.md</a></li>\r\n</ul></li>\r\n<li>Northbound Networks SDN Devices\r\n<ul>\r\n<li><a href=\"https://northboundnetworks.com/\" class=\"uri\">https://northboundnetworks.com/</a></li>\r\n</ul></li>\r\n<li>ZeroTier is an example of SDN WAN or Edge Networking\r\n<ul>\r\n<li><a href=\"https://www.zerotier.com/download/\" class=\"uri\">https://www.zerotier.com/download/</a></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"home-hacks\">Home Hacks</h2>\r\n<ul>\r\n<li>Home Phone\r\n<ul>\r\n<li>Cheap way to have a home phone\r\n<ul>\r\n<li>Google Voice Number</li>\r\n<li>OBi200 VoIP Telephone Adapter 100Mb LAN\r\n<ul>\r\n<li>Has the Option to sign up for 911 but with just Google Voice Number it is a free way to have a house phone</li>\r\n<li><a href=\"https://www.obitalk.com/info/products/obi200\" class=\"uri\">https://www.obitalk.com/info/products/obi200</a></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"firewalls\">Firewalls</h2>\r\n<ul>\r\n<li>Off the shelf vs DIY options\r\n<ul>\r\n<li>Off The Shelf Ubiquiti Option\r\n<ul>\r\n<li>Ubiquiti \"SDN\" Like FW decent enough for homes with 100Mb/s Uplinks but not for homes with 1Gb/s uplinks.</li>\r\n<li>USG3 can\'t handle IPS throughput past 50Mb/s</li>\r\n<li>USG3 can\'t handle FW PPS past 400Mb/s at 100B packets, which is around 500,000 PPS</li>\r\n<li>The Ubiquiti alternative would be to spend money on an XG which is well over $1000 USD.</li>\r\n</ul></li>\r\n<li>DIY Option\r\n<ul>\r\n<li>The best alternative would be to purchase a used SFF PC with at least 1 Gb onboard NIC and 2 PCIe x16 or x 8 lanes. This would allow for 10Gb NIC options</li>\r\n<li>4x10Gb Intel Nics are a steal</li>\r\n<li>or 4 x 1Gb Nics which are an even better deal.</li>\r\n<li>Going SFP+ is a great option because you can use Copper or Fiber Modules in the same NIC card.</li>\r\n</ul></li>\r\n</ul></li>\r\n<li>Summary\r\n<ul>\r\n<li>The most important part about the SFF Option, you get to use a xeon processor, at least 32 GBs of RAM, and install up to 4 HDDs in the System. You can even install a PCIe NVME or M.2 Sata using a PCIe peripheral.</li>\r\n<li>For software, PFSense or Sophos XG will be great options. If you really want to get technical, load up a hypervisor and then install the Firewall as a VM. This would allow you to leverage the SFF system for more than just a FW and allow for easy testing of other types of FW solutions.</li>\r\n</ul></li>\r\n<li>Hardware Info\r\n<ul>\r\n<li>Intel X722DA4FH Ethernet Network Adapter X722-DA4\r\n<ul>\r\n<li><a href=\"https://g.co/kgs/j9aNJz\" class=\"uri\">https://g.co/kgs/j9aNJz</a></li>\r\n</ul></li>\r\n<li>HP Z240 SFF\r\n<ul>\r\n<li><a href=\"https://g.co/kgs/ax2hwq\" class=\"uri\">https://g.co/kgs/ax2hwq</a></li>\r\n</ul></li>\r\n</ul></li>\r\n<li>Firewall OSes\r\n<ul>\r\n<li>PFSense\r\n<ul>\r\n<li><a href=\"https://www.pfsense.org/\" class=\"uri\">https://www.pfsense.org/</a></li>\r\n</ul></li>\r\n<li>Sophos\r\n<ul>\r\n<li><a href=\"https://www.sophos.com/en-us/products/next-gen-firewall.aspx\" class=\"uri\">https://www.sophos.com/en-us/products/next-gen-firewall.aspx</a></li>\r\n</ul></li>\r\n<li>OPNSense\r\n<ul>\r\n<li><a href=\"https://opnsense.org/\" class=\"uri\">https://opnsense.org/</a></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n',231,61,1,'CC-BY-SA','Windows, Firewalls, SDN',0,0,1),
(2914,'2019-10-03','Describing how I listen to podcasts PART 4',526,'In this episode I cover my 2nd add on board for the raspberry pi','<ul>\r\n<li><p>PiFace Control and Display<br />\r\n<a href=\"https://www.piface.org.uk/products/piface_control_and_display/\" class=\"uri\">https://www.piface.org.uk/products/piface_control_and_display/</a></p></li>\r\n<li><p>How to fit, setup and install the required software for your Raspberry Pi running the Raspbian Operating system<br />\r\n<a href=\"https://www.piface.org.uk/guides/setting_up_pifacecad/fitting_PiFace_Control_and_Display/\" class=\"uri\">https://www.piface.org.uk/guides/setting_up_pifacecad/fitting_PiFace_Control_and_Display/</a></p></li>\r\n</ul>\r\n<p>Pictures 01, 02 and 03 show how the PiFace Control and Display board and raspberry pi fit into the case<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/Picture-01.JPG\" alt=\"Picture-01.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/Picture-02.JPG\" alt=\"Picture-02.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/Picture-03.JPG\" alt=\"Picture-03.JPG\" /></p>\r\n<p>Pictures 04 and 05 shows the piece of plastic used to transfer the light from the LED’s on the Pi board to the holes in the casing. This is supposed to allow you to monitor the PI LED’s. I held it in place using a piece of Blu Tack.<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/Picture-04.JPG\" alt=\"Picture-04.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/Picture-05.JPG\" alt=\"Picture-05.JPG\" /></p>\r\n<ul>\r\n<li>Wikipedia article about Blu Tack<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Blu_Tack\" class=\"uri\">https://en.wikipedia.org/wiki/Blu_Tack</a></li>\r\n</ul>\r\n<p>Picture 6 shows the completed box<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/Picture-06.JPG\" alt=\"Picture-06.JPG\" /></p>\r\n<p>Pictures 7 and 8 show the project in operation and mounted on a spare Anker tablet stand that I had lying about.<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/Picture-07.JPG\" alt=\"Picture-07.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/Picture-08.JPG\" alt=\"Picture-08.JPG\" /></p>\r\n<p>This is an example of the Anker stand I used. I use it to hold my project at a 45 degree angle so I can see it from around the room, it is intended to be used as a tablet stand.<br />\r\n<a href=\"https://www.ebay.co.uk/itm/Anker-Multi-Angle-Portable-Stand-for-Tablets-7-10-inch-E-readers-and-0-4lb-for-/282696421630?_trksid=p2385738.m4383.l4275.c10\">Anker stand for my Nexus 7, pictures, links</a></p>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Raspberry Pi, hardware, electronics, projects',0,0,1),
(2915,'2019-10-04','Intro - My Recording Setup',1248,'My first HPR episode. A bit of an intro and then a description of my recording setup.','<p>I discuss loading Fedora on various bits of older hardware and devise a plan to turn one of those bits of older hardware into a dedicated headless audio processor using its firewire port to keep yet another older piece of hardware alive: a Yamaha GO46 audio interface.</p>\r\n<p>Having done that and finding that it all performs admirably, I illogically decide to replace it with newer (but not new) hardware and buy yet another different model firewire audio interface: a Focusrite Saffire Pro 24.</p>\r\n<p>I record the end of the show on audio interface #3: a USB based Steinberg UR22mkII, which one could argue that I should have been using all along, leaving the firewire gear in the last decade where it belongs (?).</p>',380,0,0,'CC-BY-SA','Fedora, Firewire, Audio Interface',0,0,1),
(2919,'2019-10-10','hosting software in HPR show notes',626,'boats are awesome, but might lead to hosting software in the HPR show notes ','<pre><code>#!/usr/bin/env python\r\nimport urllib.request\r\nimport json\r\nimport re\r\nimport subprocess\r\n\r\n# see https://www.weather.gov/documentation/services-web-api\r\n\r\n#where are we? GPS coordinates\r\nlat = 39.275235\r\nlon = -120.9199507\r\n#what is the user agent string?\r\nagent = &quot;Jezra&#39;s fun lil script&quot;\r\n#minimum wind speed in mph?\r\nmin_speed = 9\r\n\r\ndef get_api_data(endpoint):\r\n  print(endpoint)\r\n  #prepare the connection with custom headers\r\n  request = urllib.request.Request(endpoint, headers={&quot;User-Agent&quot;:agent})\r\n  #create a handler for the request\r\n  handler = urllib.request.urlopen(request)\r\n  #get the text\r\n  text = handler.read()\r\n  #parse the json text to a python object\r\n  obj = json.loads(text)\r\n  return obj\r\n\r\ndef wind_is_good(s):\r\n  #use regex to find the matches\r\n  matches = re.findall(&quot;[0-9]+&quot;,s)\r\n  for match in matches:\r\n    #convert string to int\r\n    m = int(match)\r\n    #is the speed good?\r\n    if(m&gt;=min_speed):\r\n      return True\r\n  #if we get here, there is no match :(\r\n  return False\r\n\r\nstart_url = &quot;https://api.weather.gov/points/{0},{1}&quot;.format(lat,lon)\r\n#get the json response from the start_url as a python object\r\nobj = get_api_data(start_url)\r\n\r\n#get the forecast url from the returned data\r\nforecast_url = obj[&#39;properties&#39;][&#39;forecast&#39;]\r\n\r\n# process the forecast url\r\nforecast = get_api_data(forecast_url)\r\n\r\n#loop through the forcast periods\r\nfor period in forecast[&#39;properties&#39;][&#39;periods&#39;]:\r\n  #put name and windspeed into easier to handle variable names\r\n  name= period[&#39;name&#39;]\r\n  wind = period[&#39;windSpeed&#39;]\r\n  print (name, wind)\r\n  #check the wind speed\r\n  if wind_is_good(wind):\r\n    subprocess.call([&quot;textjezra&quot;,&quot;{0}: {1}&quot;.format(name,wind)])\r\n</code></pre>\r\n',243,25,0,'CC-BY-SA','canoe, ptython, api, weather',0,0,1),
(2921,'2019-10-14','Geocaching with the family',2916,'Dave and his family take a wander around a wood looking for Geocaches','<p>In this episode, Dave and his family wander the paths of <a href=\"https://www.doncaster.gov.uk/services/culture-leisure-tourism/sandall-beat-wood\">Sandall Beat Wood</a> in <a href=\"https://en.wikipedia.org/wiki/Doncaster\">Doncaster</a> to participate in the game of <a href=\"https://en.wikipedia.org/wiki/Geocaching\">Geocaching</a>. During this time, which demonstrates an unusual level of failure in us playing the game, we try and explain what the game is all about.</p>\r\n<p>No, not <a href=\"https://en.wikipedia.org/wiki/The_Game_(mind_game)\">The Game</a>...</p>\r\n<p>As I explain at the beginning of the episode, this is a fairly long episode which hasn\'t been edited down much, so there are a lot of ambient pauses and heavy breathing to be enjoyed.</p>\r\n<p><em>Recorded in the field on my <a href=\"https://www.amazon.co.uk/Olympus-DM-3-Digital-Voice-Recorder/dp/B003UP6ALA\">Olympus DM-3</a> voice recorder.</em></p>\r\n<h2 id=\"caches-explored\">Caches explored</h2>\r\n<ul>\r\n<li>Cache 1 - <a href=\"https://coord.info/GC7F8ND\">GC7F8ND</a> - not found</li>\r\n<li>Cache 2 - <a href=\"https://coord.info/GC50TVW\">GC50TVW</a> - not found</li>\r\n<li>Cache 3 - <a href=\"https://coord.info/GC7KRHH\">GC7KRHH </a> - found!</li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://next.moobug.net/index.php/apps/gallery/s/iGwmZMtyaD52ecg\">Link to photos and screenshot</a></li>\r\n<li><a href=\"https://geocaching.com\">geocaching.com</a></li>\r\n<li>Official Geocaching App: <a href=\"https://play.google.com/store/apps/details?id=com.groundspeak.geocaching.intro\">Google Play</a> | <a href=\"https://itunes.apple.com/app/apple-store/id329541503\">App Store</a></li>\r\n<li>c:geo Geocaching app: <a href=\"https://play.google.com/store/apps/details?id=cgeo.geocaching\">Google Play</a></li>\r\n</ul>\r\n',314,0,0,'CC-BY-SA','geocaching, outdoors, family',0,0,1),
(2948,'2019-11-20','Testing with Haskell',2560,'Introduction on HSpec and QuickCheck','<h2 id=\"intro\">Intro</h2>\r\n<p>I have liked writing automated tests for a long time, so it’s not a surprise that I end up writing them in Haskell too. This is very broad topic, so this episode only scratches the surface.</p>\r\n<h2 id=\"hspec\">HSpec</h2>\r\n<p>HSpec is testing framework that automatically detects tests, like most of the modern systems. It supports hierarchies, so one can organize tests by feature for example.</p>\r\n<pre><code>spec :: Spec\r\nspec = do\r\n    describe &quot;Very important feature&quot; $ do\r\n        it &quot;Execution should be error free&quot; $ do\r\n            ...\r\n\r\n        it &quot;Flux capacitors can be charged&quot; $ do\r\n            ...\r\n\r\n    describe &quot;Somewhat less important feature&quot; $ do\r\n        ...</code></pre>\r\n<h2 id=\"unit-test\">Unit test</h2>\r\n<p>Unit test tests a single case with fixed set of inputs. With pure functions these are a pleasure to write as they’re really just data in, data out, verify results. Below is two examples:</p>\r\n<pre><code>spec :: Spec\r\nspec = do\r\n    describe &quot;Markov chain configuration&quot; $ do\r\n        it &quot;Adding new starting element to empty configuration creates item with frequency of 1&quot; $ do\r\n            let config = addStart (&quot;AA&quot; :: DT.Text) emptyConfig\r\n            config ^? (configStartsL . _head . itemFreqL) `shouldBe` Just 1\r\n            config ^? (configStartsL . _head . itemItemL . _Just) `shouldBe` Just &quot;AA&quot;\r\n\r\n        it &quot;Adding same element twice to empty configuration creates item with frequency of 2&quot; $ do\r\n            let config = addStart &quot;AA&quot; $\r\n                         addStart (&quot;AA&quot; :: DT.Text) emptyConfig\r\n            config ^? (configStartsL . _head . itemFreqL) `shouldBe` Just 2\r\n            config ^? (configStartsL . _head . itemItemL . _Just) `shouldBe` Just &quot;AA&quot;</code></pre>\r\n<p>Both are for testing configuring markov chains. First one checks that adding a starting element in empty configuration results correct item with correct weight being added. Second checks that adding same starting element twice results weight of 2.</p>\r\n<p>Both tests use lenses for reading nested data structure. Episode doesn’t cover them much at all, as it’s enough to know that <code>(configStartsL . _head . itemFreqL)</code> focuses on starting elements of configuration, selects first item of the list and then selects frequency of that item. Lenses can also be used for modifying data and they don’t have to focus on only one element.</p>\r\n<p>Unit tests are easy enough to write, they verify single thing about the unit being tested and are usually super fast to run and not error prone.</p>\r\n<h2 id=\"property-based-test\">Property based test</h2>\r\n<p>Property based tests are used to check that a certain property holds with randomly generated input parameters. I’m using HSpec as testing framework and QuickCheck as tool for generating test data:</p>\r\n<pre><code>spec :: Spec\r\nspec = do\r\n    describe &quot;planets&quot; $ do\r\n        describe &quot;food&quot; $ do\r\n            it &quot;food requirement for positive amount of population is more than zero&quot; $ do\r\n                forAll positivePopulation $ \\x -&gt; foodRequirement x  &gt; RawResource 0\r\n\r\n            it &quot;food base production for farms is equal or greater than their amount&quot; $ do\r\n                forAll someFarms $ \\x -&gt; (sum (fmap foodBaseProduction x)) &gt; (RawResource $ length x)</code></pre>\r\n<p>Above we have two tests. First one checks that with any non-zero population, <code>foodRequirement</code> is greater than 0. Second one check that with any positive amount of farm, <code>foodBaseProduction</code> is greater than amount of the farms.</p>\r\n<p><code>positivePopulation</code> is Generator, that is used by QuickCheck to generate random data for testing. Its definition is shown below:</p>\r\n<pre><code>singlePopulation :: Gen PlanetPopulation\r\nsinglePopulation = do\r\n    let aPlanetId = toSqlKey 0\r\n    let aRaceId = toSqlKey 0\r\n    aPopulation &lt;- arbitrary `suchThat` \\x -&gt; x &gt; 0\r\n    return $ PlanetPopulation aPlanetId aRaceId aPopulation\r\n\r\npositivePopulation :: Gen [PlanetPopulation]\r\npositivePopulation = do\r\n    k &lt;- arbitrary `suchThat` \\x -&gt; x &gt; 0\r\n    vectorOf k singlePopulation</code></pre>\r\n<p>Generated data can be really simple or very complex. Generating complex data is often convenient to break into smaller steps and write generators for them.</p>\r\n<p>Property based tests are somewhat harder to write than unit tests, but they can potentially cover edge cases that might otherwise not been discovered.</p>\r\n<h2 id=\"working-with-database\">Working with database</h2>\r\n<p>All tests shown so far have been testing pure code, that is, code that is data in, data out. When database is introduced, things get more complicated. Suddenly there’s much more possibilities for errors. Below is an example of such a test:</p>\r\n<pre><code>spec :: Spec\r\nspec = withApp $ do\r\n\r\n    describe &quot;Status handling&quot;  $ do\r\n        describe &quot;Planet statuses&quot;  $ do\r\n            it &quot;Expired planet statuses are removed and news created&quot; $ do\r\n\r\n                sId &lt;- runDB $ insert $ StarSystem\r\n                        { starSystemName = &quot;Aldebaraan&quot;\r\n                        , starSystemCoordX = 10\r\n                        , starSystemCoordY = 20\r\n                        , starSystemRulerId = Nothing\r\n                        }\r\n\r\n                fId &lt;- runDB $ insert $ Faction\r\n                        { factionName = &quot;Star lords&quot;\r\n                        , factionHomeSystem = sId\r\n                        , factionBiologicals = 10\r\n                        , factionMechanicals = 10\r\n                        , factionChemicals = 10\r\n                        }\r\n\r\n                pId1 &lt;- runDB $ insert $ Planet\r\n                        { planetName = &quot;New Earth&quot;\r\n                        , planetPosition = 3\r\n                        , planetStarSystemId = sId\r\n                        , planetOwnerId = Just fId\r\n                        , planetGravity = 1.0\r\n                        , planetRulerId = Nothing\r\n                        }\r\n\r\n                _ &lt;- runDB $ insert $ PlanetStatus\r\n                        { planetStatusPlanetId = pId1\r\n                        , planetStatusStatus = GoodHarvest\r\n                        , planetStatusExpiration = Just 20201\r\n                        }\r\n\r\n                let status = Simulation 20201\r\n                _ &lt;- runDB $ insert status\r\n\r\n                news &lt;- runDB $ removeExpiredStatuses (simulationCurrentTime status)\r\n\r\n                statuses &lt;- runDB $ selectList [ PlanetStatusPlanetId ==. pId1 ] []\r\n                loadedNews &lt;- runDB $ selectList [] [ Asc NewsDate ]\r\n\r\n                liftIO $ statuses `shouldSatisfy` (\\x -&gt; length x == 0)\r\n                liftIO $ news `shouldSatisfy` (\\x -&gt; length x == 1)\r\n                liftIO $ loadedNews `shouldSatisfy` (\\x -&gt; length x == 1)</code></pre>\r\n<p>There’s a lot more code that had to be written for this test and majority of it is for setting up database state. The test if for ensuring that when good harvest boost expires, it is removed from database and respective news article is created.</p>\r\n<p>These kinds of tests have a lot more code and are much more slower to run because of the communication with a database. There’s also more cases where something can go wrong. But in the end, these kinds of tests are needed if one wants to verify that interaction with database is working as planned.</p>\r\n<h2 id=\"testing-api\">Testing API</h2>\r\n<p>Last example is about testing REST API. There are two tests, where the first one is checking that proper access control is in place and second one checks that pending messages are correctly retrieved.</p>\r\n<pre><code>spec :: Spec\r\nspec = withApp $ do\r\n    describe &quot;Message handling&quot; $ do\r\n        it &quot;unauthenticated user can&#39;t access messages&quot; $ do\r\n            _ &lt;- get ApiMessageR\r\n            statusIs 401\r\n\r\n        it &quot;pending messages are loaded&quot; $ do\r\n            (pId, fId) &lt;- setupPerson\r\n            _ &lt;- runDB $ insert $ researchCompleted 25250 fId HighSensitivitySensors\r\n            user &lt;- createUser &quot;Pete&quot; (Just pId)\r\n            authenticateAs user\r\n            _ &lt;- get ApiMessageR\r\n            resp &lt;- getResponse\r\n            let jsonM = join (decode &lt;$&gt; simpleBody &lt;$&gt; resp) :: Maybe Value\r\n\r\n            assertEq &quot;message tag&quot;\r\n                     (jsonM ^? (_Just . _Array . _head . key &quot;tag&quot; . _String))\r\n                     (Just &quot;ResearchCompleted&quot;)\r\n            assertEq &quot;star date&quot;\r\n                     (jsonM ^? (_Just . _Array . _head . key &quot;starDate&quot; . _Integer))\r\n                     (Just 25250)\r\n            assertEq &quot;technology&quot;\r\n                     (jsonM ^? (_Just . _Array . _head . key &quot;contents&quot; . key &quot;Technology&quot; . _String))\r\n                     (Just &quot;HighSensitivitySensors&quot;)\r\n\r\n            statusIs 200</code></pre>\r\n<p>Here extra complication is created by the fact that many features of the system are behind authentication and authorization. Luckily Yesod comes with helper function <code>authenticateAs</code>, that allows code to authenticate when system is running in development mode.</p>\r\n<p>These test are even slower than any of the previous ones, but on the other hand, they test whole chain from user interaction to database and back.</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>There’s lots of things that I couldn’t cover in such a short time, like various types of tests: UI testing, performance testing, security testing, long running testing…, the list goes on and on. But hopefully this episode gave you ideas what kinds of tests one can write and how to get started doing so using Haskell.</p>\r\n<p>Best way to reach me is email or at fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','haskell, testing, HSpec, QuickCheck',0,0,1),
(2924,'2019-10-17','Hacking an Alarm Clock to Make it Quieter',365,'I talk about installing a resistor in the speaker wire of an alarm clock so it won\'t be so loud','<p>The alarm clock on my bedside table had a very loud alarm&mdash;so loud that it scared me and made my heart race when it went off. I know you\'re thinking I should just use an alarm on my phone, but for whatever reason I wanted to use the alarm clock. In this episode I talk about installing a resistor in the speaker wires of the alarm clock so that it won\'t be so loud when it goes off. It\'s all good now. Loud enough to wake me up, but not so loud that it scares everyone.</p>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157710800691661\" title=\"Alarm Clock Hack\" target=\"_blank\"><img src=\"https://live.staticflickr.com/65535/48718052852_81d452d4c8.jpg\" width=\"500\" height=\"394\" alt=\"Alarm Clock Hack\"></a></p>\r\n',238,0,0,'CC-BY-SA','clocks, electronics, decibels, noise levels, alarm clocks, alarms',0,0,1),
(2937,'2019-11-05','Lord D\'s Film Reviews: His Girl Friday',2937,'Lostnbronx reviews an old screwball comedy.','<p>Ignore the address for the film that I give in the review. Here’s a MUCH better copy than the one I watched. It’s another upload on Archive.org:</p>\r\n<p><a href=\"https://archive.org/details/HisGirlFriday-1940\" class=\"uri\">https://archive.org/details/HisGirlFriday-1940</a></p>\r\n<p>Boy, I wish I’d found this one first!</p>\r\n',107,109,0,'CC-0','review, film, lord d',0,0,1),
(2933,'2019-10-30','A walk through my PifaceCAD Python code – Part 1',871,'In this series a do whirl wind tour of the Python code I developed for my PifaceCAD board','<p>In this series a do whirl wind tour of the Python code I developed to control my PifaceCAD raspberry pi add on board. I this use to control a music player running on a remote raspberry pi upstairs.</p>\r\n<p>In this episode I cover my use of global variables.</p>\r\n<p>List of global variables along with associated comments explaining what they are used for</p>\r\n<pre><code># GLOBAL VARIABLES\r\n\r\nRemoteDevice = &quot;pi@192.168.1.13&quot;\r\n# Username and ip address of the remote device to control\r\n\r\nSeekMin = -6\r\n# Sets the minimum value of the variable SeekPosition\r\n\r\nSeekMax = 6\r\n# Sets the maximum value of the variable SeekPosition\r\n\r\nSeekPosition = 0\r\n# stores seek menu position,\r\n\r\nSeekMenu = False\r\n# used to track seek menu state, ie are we in seek menu or not\r\n\r\nFirstPass = True\r\n# Used to track 1st time button 5 (backlight toggle) is pushed, turns off blinkstick\r\n\r\nLcdLightOn = False\r\n# used to track toggle sate of backlight button 5\r\n\r\nMenuMin = 0\r\n# Sets the minimum value of variable &quot;Menu&quot;\r\n\r\nMenuMax = 2\r\n# Sets the maximum value of variable &quot;Menu&quot;\r\n\r\nMenu = 0\r\n# global variable used to keep trak of selected menu\r\n\r\nIrActive = False\r\n# used to track toggle state of active infrared buttons, when false disables\r\n# all buttons on the remote control except the blue button.\r\n\r\nStoredTime = 0\r\n# Stores curent time in seconds when a button is pushed, used by double button tap feature\r\n\r\n#GET_IP_CMD = &quot;hostname –all-ip-addresses&quot;\r\n# Debian 7 wheezy, Command to get IP adress\r\n\r\nGET_IP_CMD = &quot;hostname --all-ip-addresses | cut -d&#39; &#39; -f1&quot;\r\n# Debian 8 jessie, Command to get IP adress\r\n\r\n#GET_ESSID_CMD = &quot;iwconfig wlan0 | grep &#39;ESSID:&#39; | cut -d&#39;:&#39; -f2&quot;\r\n# Debian 7 wheezy, Command to get wifi ESSID\r\n\r\nGET_ESSID_CMD = &quot;/sbin/iwconfig wlan0 | grep &#39;ESSID:&#39; | cut -d&#39;:&#39; -f2&quot;\r\n# Debian 8 wheezy, Command to get wifi ESSID\r\n\r\nGET_WIFI_STRENGTH_CMD = &quot;/sbin/iwconfig wlan0 | grep &#39;Link Quality=&#39; | awk &#39;{ print $2 }&#39;&quot;\r\n# Command to get wifi signal strength</code></pre>\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(2923,'2019-10-16','Describing how I listen to podcasts PART 5',1750,'In this episode I cover how I use my 2nd add on board the PiFace Control and Display','<p>Below are examples of messages shown on the screen during operation</p>\r\n<p><em>System Up</em> (Unfortunately I didn’t get a picture of this message)</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-01.JPG\" alt=\"Picture 01\" /><br />\r\nShows the unit waiting to get a wi-fi connection and get given an IP address.</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-02.JPG\" alt=\"Picture 02\" /><br />\r\nUnit goes to the HPR site and gets the number of days to free slot in the show queue. At the time when I took the picture the queue had a healthy 22 shows!</p>\r\n<p>Links to three previous shows I did that mention the Blinkstick</p>\r\n<ol type=\"1\">\r\n<li><p>Solving a problem I had with my Blinkstick<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2089\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2089</a></p></li>\r\n<li><p>Tracking the HPR queue using python and a Blinkstick<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2340\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2340</a></p></li>\r\n<li><p>Follow on to HPR2340 (Tracking the HPR queue in Python)<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2344\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2344</a></p></li>\r\n</ol>\r\n<ul>\r\n<li>Link to Moc, Music On Console<br />\r\n<a href=\"https://moc.daper.net/\" class=\"uri\">https://moc.daper.net/</a></li>\r\n</ul>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-03.JPG\" alt=\"Picture 03\" /> <img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-04.JPG\" alt=\"Picture 04\" /><br />\r\nMenu 0 Podcasts screens</p>\r\n<pre><code>0 [PODCASTS]\r\n0 1 &lt;|| PLAY/PAUSE (Toggles moc between play and Pause)\r\n0 2 &lt;&lt;  INFORMATION(Displays information about the current track)\r\n0 3 &lt;&lt;  (Move to previous track in playlist)\r\n0 4 &lt;&lt;  (Move to next track in playlist)\r\n0 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Seek forward or back in current track)</code></pre>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-05.JPG\" alt=\"Picture 05\" /> <img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-06.JPG\" alt=\"Picture 06\" /><br />\r\nMenu 1 Audiobooks screens</p>\r\n<pre><code>1 [AUDIOBOOKS]\r\n1 1 &lt;|| PLAY/PAUSE (Toggles moc between play and Pause)\r\n1 2 &lt;&lt;  INFORMATION(Displays information about the current track)\r\n1 3 &lt;&lt;  (Move to previous track in playlist)\r\n1 4 &lt;&lt;  (Move to next track in playlist)\r\n1 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Seek forward or back in current track)</code></pre>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-07.JPG\" alt=\"Picture 07\" /> <img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-08.JPG\" alt=\"Picture 08\" /><br />\r\nMenu 2 System screens</p>\r\n<pre><code>2 [SYSTEM]\r\n2 1 Sys Information (System information)\r\n2 2 WiFi (Displays WiFi inofrmation such SSID &amp; signal strength)\r\n2 3 HPR (Displays the number days to the next free slots on FPR que)\r\n2 4 Not shown, (Not in use)\r\n2 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Shut-down the Raspberry Pi)</code></pre>\r\n<p>Infra-red Sensor</p>\r\n<ul>\r\n<li><p>Example of my <a href=\"https://www.google.com/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=images&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwin95XTnLbeAhURzaQKHcNIADEQjRx6BAgBEAU&amp;url=http%3A%2F%2Fwww.remotes4you.eu%2Fen%2Fsamsung-original-samsung-remote-control-aa59-00465.html&amp;psig=AOvVaw04vHTRnb1mBQYLrBKpOAKf&amp;ust=1541265724536724\">Samsung TV remote control</a></p></li>\r\n<li><p>Lirc Article from Wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/LIRC\" class=\"uri\">https://en.wikipedia.org/wiki/LIRC</a></p></li>\r\n</ul>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-09.JPG\" alt=\"Picture 09\" /><br />\r\nInfra-red sensor turned on</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-10.JPG\" alt=\"Picture 10\" /><br />\r\nInfra-red sensor turned off</p>\r\n<ul>\r\n<li>Kodi article on Wikipedia, (Formerly XBMC)<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Kodi_(software)\" class=\"uri\">https://en.wikipedia.org/wiki/Kodi_(software)</a></li>\r\n</ul>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-11.JPG\" alt=\"Picture 11\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-12.JPG\" alt=\"Picture 12\" /><br />\r\nExample of a message being sent to the unit telling me that a backup is complete. The bright pink LED on the Blinkstick lets me know at a glance that a message has been sent to the display.</p>\r\n<ul>\r\n<li><p>EEE PC article on Wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Asus_Eee_PC\" class=\"uri\">https://en.wikipedia.org/wiki/Asus_Eee_PC</a></p></li>\r\n<li><p>Switch Bounce article on Wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Switch#Contact_bounce\" class=\"uri\">https://en.wikipedia.org/wiki/Switch#Contact_bounce</a></p></li>\r\n</ul>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-13.JPG\" alt=\"Picture 13\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-14.JPG\" alt=\"Picture 14\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-15.JPG\" alt=\"Picture 15\" /><br />\r\nA flavour of what information is shown when the information button 2 is pushed. The picture showing the title scrolling from right to left was blurred so I didn’t include this.</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-16.JPG\" alt=\"Picture 16\" /><br />\r\nThe menu displayed during seek, this in initiated by pushing and releasing the toggle button while either in the Podcasts main menu 0 or Audio book main menu 1.</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/Picture-17.JPG\" alt=\"Picture 17\" /><br />\r\nThe shut-down menu this in initiated by pushing and releasing the toggle button while in the System main menu 2.</p>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(2925,'2019-10-18','LinuxLugCast\'s Memorial for FiftyOneFifty ',7541,'We are here tonight to share memories of our friend Donald Grier aka FiftyOneFifty.','<p><a href=\"https://www.linuxlugcast.com/category/https-honkeymagoo-000webhostapp-com-home-podcast-2\">LinuxLugCast Memorial</a></p>\r\n\r\n<p>We are here tonight to share memories of our friend<strong> Donald Grier</strong> aka <strong>FiftyOneFifty</strong></p>\r\n<p>Fifty was involved with many podcast over the years</p>\r\n<ul class=\"bullet\">\r\n<li>Obviously LinuxLugCast <a href=\"https://www.linuxlugcast.com\">https://www.linuxlugcast.com</a></li>\r\n<li><a href=\"https://archive.org/search.php?query=linuxlugcast\">https://archive.org/search.php?query=linuxlugcast</a></li>\r\n<li>Hacker Public Radio <a href=\"https://hackerpublicradio.org/\">https://hackerpublicradio.org/</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0131.html\">https://hackerpublicradio.org/correspondents/0131.html</a></li>\r\n<li>/dev/random <a href=\"https://devrandomshow.org/\">https://devrandomshow.org/</a></li>\r\n<li><a href=\"https://devrandomshow.org/shows/?f=all.html\">https://devrandomshow.org/shows/?f=all.html</a></li>\r\n<li>Kernal Panic Oggcast <a href=\"https://archive.org/search.php?query=KernelPanic+Oggcast&page=2\">https://archive.org/search.php?query=KernelPanic+Oggcast&page=2</a></li>\r\n</ul>\r\n<p><u>Shared thoughts and memories</u>:<br>\r\n<strong>Ken Fallon</strong></p>\r\n<p>I was in the back room pottering away when espeak notified me that 5150<br>\r\nhad passed away. I went back to the computer and read the announcement<br>\r\nin the IRC Logs and confirmed the news. Some dude I had never met, never<br>\r\nseen in my life, and didn’t even know his real name, was gone and I was<br>\r\nin the back room crying my eyes out.</p>\r\n<p>Crying for the loss of a friend.</p>\r\n<p>When had he become a friend ?</p>\r\n<p>People have been socializing since the dawn of humans, be it at the camp<br>\r\nfire, the forge, pub, hairdresser, sports club, church, or wherever.</p>\r\n<p>For us it was via Linux podcasting. You are there because you share a<br>\r\ncommon interest. If you were into Linux podcasting then you could not<br>\r\nhelp but get to know fiftyonefifty. The guy turned up everywhere if not<br>\r\non the podcasts themselves he was commenting on them. I have 619<br>\r\nmessages from him about HPR alone.</p>\r\n<p>He submitted his first show back in 2010 and has been a regular since<br>\r\nthen. At some point after that I knew that he was on my “special list”<br>\r\nof people who I could rely upon to fill the queue if needed.</p>\r\n<p>And as I sat there crying I realized that he had also sneaked onto my<br>\r\nlist of friends.</p>\r\n<p>I’ve not always been a fan of the New Year Show, but now I am glad for<br>\r\nit. While I may never get to share a beer with him any more, or take him<br>\r\nup on his promise to let me fire off some rounds on his farm, I did at<br>\r\nleast get to shoot the breeze with him for many a happy hour.</p>\r\n<p>Goodbye old friend you will be missed</p>\r\n<p><strong>Anonymous</strong><br>\r\nA Ramble for FiftyOneFifty: King of Ramblers</p>\r\n<p>I am writing a Ramble for a man I knew only as FiftyOneFifty.  I never knew his real name,<br>\r\nnor do I know if he knew mine.  In many things, Names do not matter, People, Actions, and<br>\r\nfeeling do.   We podcasted together off and on, over several years.  I don’t recall exactly<br>\r\nhow many.   It doesn’t matter now, since they are all that there will ever be.  We grew to be<br>\r\ngood friends.  I never met him in person, online life is like that.  I only know my life would be<br>\r\nmuch poorer, if I had not known him.  Hearing he died, shattered me.  This Ramble is my try<br>\r\nat putting most the pieces back in place.  Of course, nothing can replace the largest piece,<br>\r\nthe Man Himself.  My heart and prayers go out to those friends and family dealing with his loss.</p>\r\n<p>His death is a harsh, unchangeable, fact.  I shall focus on his life, and things better remembered<br>\r\nthan the wall we all will hit one day.  Fifty was a man if Life, Joy, and passions.  That is how I shall<br>\r\nwrite of him.  I had a far too short time, to learn about him, and from him.  It will also  warm my heart,<br>\r\nwhere he live yet, and has for a long time.  I learned this fact, only after I could no longer talk with him.</p>\r\n<p>I found him easy to talk with, and listen to.  He was also “Vaccinated with a Victrola Needle ”  as<br>\r\nmy relatives might say.  He could ramble on for hours. enjoyably.  He virtually always made sense,<br>\r\neven when in his cups.  He shared himself, his hobbies, experience, and his travels with us, on our<br>\r\npodcasts.  While he went to Linux events, he never limited himself to just linux topics.  He reported the<br>\r\nnon Linux features of events.  This great for choosing family trips to them.   He included accommodations, restaurants, and pubs in the area.  I don’t travel, or drive, so these second hand visit were a delight.</p>\r\n<p>His research and Linux activities made up much of his contribution to our podcasts.  He life also<br>\r\nflowed in, to entertain and inform us.  He lived in the country, farming, cows, trouble getting Internet<br>\r\nservice were included.  My parents can off farms, so he even kept my ties to that life alive.  Firearms, cars, especially his beloved Hearse were shared interests.  tale from his tech support work, for businesses and schools enlightened me.  Farmers are natural pack rats, so gathering all sorts of discarded computer gear was natural.   Unfortunately he lost most of it in the fire which destroyed his house.   Losing his house, and even his dear father, never seemed to blight his spirit or life, in the long run.  It would be natural to keep such private matters from more distant friends, as I was.  Nor did his long illness color the side of him I saw.  it got in his way, sometimes,  as I recall, but never in his spirit.  I wish I had been closer, to offer myself more to the man I miss dearly.  I must just try to use his independent example, in my own life.  Anyone could do much, worse.   His quiet touch helped heal me in ways I am only now realizing.</p>\r\n<p>I started the day in tears, still aching from losing a rare, true friend.  Then I recalled a song from Toby Keith, called “Cryin’ for Me (Wayman’s Song ) written about he loss of his close friend, Wayman Tisdale.  Toby found about his friends passing on Friday.  On Sunday Toby was driven to write the memorial song.  In it he says his tears are not for his lost friend, who is now in Heaven, but for Toby himself, and all those family, and friends, Wayman left behind.  I believe Fifty is in Heaven, with his Dad, and those who have gone before.  He will see things from the Good Seats.  He can enjoy all the Holidays, and never feel the cold.  I was driven to write like Toby, to handle my own shock and grief.  We Cry and Mourn, those left behind in the Mortal world, for our loss and pain.  Our dear One is beyond pain, perhaps for the first time in years.  He has earned his time in Grace.  He as paid as we pay now, for life beyond grief, with those who have gone ahead.   I hope my words and memories may help  the ones he left behind.  Pain is a Mortal thing. It need not be deadly, or poisonous.  Fifty’s Life is a great example of this and many other things.  I hope we can go forward, with his example helping heal our loss of him.    God Bless You, Fifty, and those you touched in turn.</p>\r\n',269,0,1,'CC-BY-SA','LinuxLugCast, FiftyOneFifty, Memorial, Syndication',0,0,1),
(2929,'2019-10-24','Recovering Files from a Dead MacBook Air',482,'I talk about recovering the files from my wife\'s dead MacBook Air using an Ubuntu Live CD.','<p>I talk about becoming a household hero by recovering my wife\'s files from her dead MacBook Air. Her laptop would not boot, shutting down seconds into the process each time she tried to start it up. I used an Ubuntu Live CD (DVD), with the commands <code>fdisk</code> and <code>fsck</code> to repair the damaged filesystem on the Mac. It still wouldn\'t boot even with the repaired filesystem, but I was able to mount the drive and copy her files to a USB drive.</p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li>Blog post Howto: <a href=\"https://miteshshah.github.io/mac/repair-fix-mac-hfs-partition-using-ubuntu/\">Repair/Fix MAC HFS+ Partition Using Ubuntu</a></li>\r\n</ul>\r\n',238,0,0,'CC-BY-SA','Ubuntu,Mac OS X,File Recovery,Filesystem Repair',0,0,1),
(2931,'2019-10-28','Wallabag for on premises article aggregation',690,'In this episode, I describes my trials and eventual triumph in installing Wallabag','<h2 id=\"addendum\">Addendum</h2>\r\n<p>I forgot to mention that Wallabag is also offered as a service for a small fee. Check out the website for more information.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://wallabag.org/en\">Wallabag website</a></li>\r\n<li><a href=\"https://doc.wallabag.org/en/admin/installation/installation.html\">Wallabag documentation</a></li>\r\n<li><a href=\"https://hub.docker.com/r/wallabag/wallabag\">Wallabag on Docker Hub</a></li>\r\n<li><a href=\"https://cockpit-project.org/\">Cockpit website</a></li>\r\n</ul>\r\n',300,0,0,'CC-BY-SA','self-hosted, docker',0,0,1),
(2939,'2019-11-07','Submit a show to Hacker Public Radio in 10 easy steps',601,'This is a 10 step walkthrough of submitting a show to HPR','<h2 id=\"steps\">Steps</h2>\r\n<ol>\r\n<li>Record your episode</li>\r\n<li>Go to <a href=\"https://hackerpublicradio.org\" class=\"uri\">https://hackerpublicradio.org</a></li>\r\n<li>Click on &quot;Give Shows&quot;</li>\r\n<li>Click on &quot;Calendar&quot; (the link is not obvious, so use your browser\'s find functionality to search for the word &quot;Calendar&quot;).<br />\r\n<small><em>Edit: Please use the ⇧Upload⇧ link in the menu bar</em></small>\r\n</li>\r\n<li>Choose a slot</li>\r\n<li>Submit your email address</li>\r\n<li>Click the link in the confirmation email</li>\r\n<li>Create your profile (if new), then fill in the form with title, summary and show notes</li>\r\n<li>Attach your episode and submit (wait for long upload process)</li>\r\n<li>Receive your confirmation email, and enjoy your episode!</li>\r\n</ol>\r\n',300,45,0,'CC-BY-SA','podcast, hpr, how-to',0,0,1),
(2926,'2019-10-21','Full Circle Magazine',181,'Just a short show to request support for one of the Linux communities longest standing Magazines','<p>Hi Everyone in HPR land this is Tony Hughes coming to you from Studio B at Woodbrooke Quaker Study Centre in Birmingham in the UK, where I am currently staying for a week of voluntary work.</p>\r\n<p>The reason for this short episode is to talk about a community magazine that I have been reading since I started to use Ubuntu Linux back in 2007. Full Circle magazine actually produced a pilot issue in April of 2007 and issue one was issued in June 2007. All issues are published as a free pdf download and all the content is under a Creative Commons licence.</p>\r\n<p>Free Circle Magazine initially started as an Ubuntu (and official spins of Ubuntu) magazine but over the years while still being officially about Ubuntu or Linux Distributions based on Ubuntu, many of the articles are applicable to those across the Linux community.</p>\r\n<p>Over the years, as well as printing one off articles about individuals’ journey to using Linux, reviews and letters from readers, there have been regular series on topics such as Inkscape, Python programming, Open/LibreOffice, Virtualisation and much more.</p>\r\n<p>Sadly after over 12 years of producing a regular monthly magazine for the Linux community some of the regular article series are coming to an end and due to ill health at least one regular writer is not able to contribute at the moment, and this is leaving the magazine short of content and in danger of possibly coming to an end.</p>\r\n<p>As a podcast community that is used to the idea of crowd sourced content, many of whom are also Linux users, could I ask that some of you that have read Full Circle, but never contributed, consider sending in some content. It could be an article on how you started using Linux, about some Linux software that you think the readers may be interested in learning more about, or just a letter to Ronnie to say thanks for all his efforts putting out a magazine every month for the last 12+ years.</p>\r\n<p>Like many things we often don’t miss them until they are gone, and I would hate to think that Full Circle Magazine is one of those things that I will miss in the future. I have put my money where my mouth is and in coming issues you may see me in print, talking about podcasting. You could even use any writing you do as the base for a HPR show, and achieve two goals in one go.</p>\r\n<p>All the best for now.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.woodbrooke.org.uk/\" class=\"uri\">https://www.woodbrooke.org.uk/</a></li>\r\n<li><a href=\"https://fullcirclemagazine.org/\" class=\"uri\">https://fullcirclemagazine.org/</a></li>\r\n<li><a href=\"https://fullcirclemagazine.org/issue-149/\" class=\"uri\">https://fullcirclemagazine.org/issue-149/</a></li>\r\n</ul>\r\n',338,0,0,'CC-BY-SA','Full Circle Magazine, Ubuntu, Linux, Free Magazine, Creative Commons',0,0,1),
(2934,'2019-10-31','Server Basics 106: Namespaces and containers',2033,'Klaatu talks about the unshare and lxc commands','<p>\r\nNamespaces provide context and constraints for processes on a Linux system.\r\nThey are utilised by the infrastructure of \"the cloud\" to create distinct \"containers\", in which processes may run without awareness of the system they are actually running upon.\r\n</p>\r\n\r\n<pre><code>\r\n// prove you are not running some process\r\n\r\n$ pidof tcsh\r\n// nothing\r\n\r\n$ sudo pidof tcsh\r\n// nothing\r\n\r\n// launch tcsh in a new namespace with unshare:\r\n\r\n$ sudo unshare --fork --pid --mount-proc tcsh\r\n\r\n// from within that session:\r\n\r\n# pidof tcsh\r\n1\r\n\r\n// wait what??\r\n// yes tcsh is the first pid of its own namespace\r\n\r\n// from another term\r\n$ ps 1\r\ninit\r\n\r\n$ pidof tcsh\r\n26814\r\n\r\n// from inside the namespace, pid is seen as 1\r\n// from outside, pid is normal\r\n\r\n$ ps tree | less\r\n// search for tcsh\r\n\r\n// See evidence of namespaces:\r\n\r\n$ ls /proc/*/ns\r\n\r\n$ ls /proc/26814/ns\r\nipc net pid user uts [...]\r\n</code></pre>\r\n\r\n<p>\r\nTo see this in action for a slightly more pragmatic purpose, you can use the <code>lxc</code> command.\r\nThe <a href=\"https://linuxcontainers.org/lxc/getting-started/\" target=\"_blank\">LXC</a> system uses namespaces and cgroups to create functional containers that act, more or less, like a Virtual Machine, except that they are built in containers so that they do not have to emulate hardware.\r\n</p>\r\n<p>If your system doesn\'t have LXC installed, first install it:\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo dnf install lxc lxc-templates lxc-doc\r\n\r\n// on Ubuntu or Debian:\r\n\r\n$ apt install lxc\r\n</code>\r\n</pre>\r\n\r\n<p>\r\nYou also need to create a network bridge so that your container and your host system (that\'s the computer you\'re sitting in front of right now) can communicate.\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo ip link add br0 type bridge\r\n$ sudo ip addr show br0\r\n7: br0: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc\r\n   noop state DOWN group default qlen 1000\r\n   link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff\r\n</code></pre>\r\n<p>\r\nNow give your bridge device an IP address that doesn\'t conflict with any existing IP address on your network:\r\n</p>\r\n<pre><code>\r\n$ sudo ip addr add 192.168.168.168 dev br0\r\n$ sudo ip link set br0 up\r\n</code></pre>\r\n\r\n<p>\r\nCreate a configuration for your container.\r\nYou can base this on the samples provided by lxc (located in /usr/share/docs/lxc or similar).\r\nEverything but <strong>veth</strong>, <strong>br0</strong>, and <strong>up</strong> is arbitrary. You can make up all the values.\r\n</p>\r\n\r\n<pre><code>\r\nlxc.utsname = hackerpublicradio\r\nlxc.network.type = veth\r\nlxc.network.flags = up\r\nlxc.network.link = br0\r\nlxc.network.hwaddr = 4a:49:43:49:79:bd\r\nlxc.network.ipv4 = 192.168.168.1/24\r\nlxc.network.ipv6 = 2003:db8:1:0:214:c0ff:ee0b:3596\r\n</code></pre>\r\n\r\n<p>\r\nNow install an OS into your container.\r\nOS templates are provided by LXC in /usr/share/doc/lxc/templates or a similar location.\r\n</p>\r\n\r\n<pre><code>\r\n$ ls -m /usr/share/lxc/templates/\r\nlxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos [...]\r\n</code></pre>\r\n\r\n<p>\r\nChoose a template and install.\r\nI use Alpine in the recorded show, because it\'s supposed to be really small.\r\nI don\'t necessarily recommend Alpine. I recommend Slackware, of course.\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo lxc-create --name slackware --template slackware\r\n</code></pre>\r\n\r\n<p>\r\nOnce the install is done, start your container:\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo lxc-start --name slackware\r\n--rcfile ~/mycontainer.conf\r\n</code></pre>\r\n\r\n<p>\r\nNow attach to the container:\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo lxc-attach --name slackware\r\n#\r\n</code></pre>\r\n\r\n<p>\r\nRun a command.\r\n</p>\r\n\r\n<pre><code>\r\n# uname -av\r\nLinux hackerpublicradio 5.3.0.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\r\n</code></pre>\r\n\r\n<p>\r\nThis is the technology that Docker and <a href=\"https://www.opencontainers.org/\" target=\"_blank\">OCI</a> projects use to create containers.\r\nAnd when a bunch of containers start swarming around on a bunch of hosts, you eventually end up with a cloud.\r\nHow do you manage all of these things?\r\nThat will be the topic for the next entry in this series, I\'ll bet.\r\n</p>\r\n',78,0,0,'CC-BY-SA','server,container,docker,serverless,cloud,sys admin,kubernetes',0,0,1),
(2935,'2019-11-01','The work of fire fighters, part 3',1807,'The continued introduction into the work of fire fighters','<h2 id=\"continued-general-basic-knowledge-of-fire-fighting.\">Continued general basic knowledge of fire fighting.</h2>\r\n<p>Talking about large water system, breathing gear, “the walk”, flash-over and back-draft.</p>\r\n',369,0,0,'CC-BY-SA','fire fighting, fire brigade',0,0,1),
(2941,'2019-11-11','Server Basics 107: Minishift and container management',2331,'Klaatu introduces Minishift, a local test environment for a single-node cloud','<p>Learn \"the OS of the cloud\" with <a href=\"https://www.okd.io/minishift/\" target=\"_blank\">minishift</a> or <a href=\"https://github.com/kubernetes/minikube\" target=\"_blank\">minikube</a>\r\n</p>',78,0,0,'CC-BY-SA','server,container,docker,serverless,cloud,sys admin,kubernetes',0,0,1),
(2943,'2019-11-13','Music as Life',582,'quantum harmony','<ul>\r\n<li>Thomas Orr Anderson<br />\r\n<a href=\"https://www.phisonics.com/about-2/\" class=\"uri\">https://www.phisonics.com/about-2/</a></li>\r\n<li>Find the audio that I listened to here<br />\r\n<a href=\"https://www.phisonics.com/podcast-blog-research/\" class=\"uri\">https://www.phisonics.com/podcast-blog-research/</a></li>\r\n</ul>\r\n<p>Background sounds provided by some road noise, and a train.</p>\r\n',329,0,1,'CC-BY-SA','science',0,0,1),
(3196,'2020-11-02','HPR Community News for October 2020',5375,'Dave and Ken review the months happenings, and try various pronunciations of Cedric De Vroeys name.','<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=3174\" target=\"_blank\">3174</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3174\" target=\"_blank\">Linux Inlaws S01E14: The big programming language 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=3175\" target=\"_blank\">3175</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3175\" target=\"_blank\">International Keyboard</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=3176\" target=\"_blank\">3176</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-10-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3176\" target=\"_blank\">HPR Community News for September 2020</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=3177\" target=\"_blank\">3177</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-10-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3177\" target=\"_blank\">Zero cost VPN</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=3178\" target=\"_blank\">3178</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-10-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3178\" target=\"_blank\">Finishing the Recumbent Bicycle</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=3179\" target=\"_blank\">3179</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3179\" target=\"_blank\">MakeMKV to back up media, and a Question</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=3180\" target=\"_blank\">3180</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3180\" target=\"_blank\">GIMP: Miscellaneous Tools</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=3181\" target=\"_blank\">3181</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-10-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3181\" target=\"_blank\">RealVNC cloud offering</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=3182\" target=\"_blank\">3182</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-10-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3182\" target=\"_blank\">Yo-ho-ho, and a bottle of Cholecalciferol</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=3183\" target=\"_blank\">3183</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-10-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3183\" target=\"_blank\">Don\'t trust zipfiles</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3184\" target=\"_blank\">3184</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3184\" target=\"_blank\">Linux Inlaws S01E15: IT Security and stick insects</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=3185\" target=\"_blank\">3185</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3185\" target=\"_blank\">Pandemics In History</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=3186\" target=\"_blank\">3186</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-10-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3186\" target=\"_blank\">A light bulb moment, part 2</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=3187\" target=\"_blank\">3187</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-10-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3187\" target=\"_blank\">Ansible for Dynamic Host Configuration Protocol</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=3188\" target=\"_blank\">3188</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-10-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3188\" target=\"_blank\">Thrift store quick fix</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=3189\" target=\"_blank\">3189</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3189\" target=\"_blank\">How the Dutch dig Graves</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=3190\" target=\"_blank\">3190</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3190\" target=\"_blank\">GIMP Brushes</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=3191\" target=\"_blank\">3191</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-10-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3191\" target=\"_blank\">Swedish Corona Experience</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=3192\" target=\"_blank\">3192</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-10-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3192\" target=\"_blank\">A light bulb moment, part 3</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=3193\" target=\"_blank\">3193</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-10-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3193\" target=\"_blank\">Meet Antithesis</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3194\" target=\"_blank\">3194</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3194\" target=\"_blank\">Linux Inlaws S01E16: The count and the questions</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=3195\" target=\"_blank\">3195</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3195\" target=\"_blank\">For your Consideration - the ideal Ham Radio setup</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</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 14 comments in total.</p>\n<h3>Past shows</h3>\n<p>There is 1 comment on\n1 previous show:</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#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-10-21:\n\"Thank for this\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 13 comments on 9 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3175#comments\" target=\"_blank\">hpr3175</a></strong>\n(2020-10-02) \"<em>International Keyboard</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=3175#1\" target=\"_blank\">Comment 1</a>:\nGumnos on 2020-10-03:\n\"Using the X \"Compose\" key\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3176#comments\" target=\"_blank\">hpr3176</a></strong>\n(2020-10-05) \"<em>HPR Community News for September 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><li><a href=\"https://hackerpublicradio.org/eps.php?id=3176#1\" target=\"_blank\">Comment 1</a>:\nMike Ray on 2020-10-05:\n\"YAML, spacing and ansible-lint\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3179#comments\" target=\"_blank\">hpr3179</a></strong>\n(2020-10-08) \"<em>MakeMKV to back up media, and a Question</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=3179#1\" target=\"_blank\">Comment 1</a>:\njanedoc on 2020-10-09:\n\"using make mkv\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3180#comments\" target=\"_blank\">hpr3180</a></strong>\n(2020-10-09) \"<em>GIMP: Miscellaneous Tools</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=3180#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2020-10-10:\n\"contribution back\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3180#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2020-10-10:\n\"Donating to Fedora\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3184#comments\" target=\"_blank\">hpr3184</a></strong>\n(2020-10-15) \"<em>Linux Inlaws S01E15: IT Security and stick insects</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=3184#1\" target=\"_blank\">Comment 1</a>:\nClinton Roy on 2020-10-15:\n\"Mix not quite right?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3184#2\" target=\"_blank\">Comment 2</a>:\nCedric De Vroey on 2020-10-26:\n\"Great show keep them comming :-)\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3185#comments\" target=\"_blank\">hpr3185</a></strong>\n(2020-10-16) \"<em>Pandemics In History</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=3185#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-10-16:\n\"fear porn\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3185#2\" target=\"_blank\">Comment 2</a>:\nCedric De Vroey on 2020-10-26:\n\"Ahuka\"</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><li><a href=\"https://hackerpublicradio.org/eps.php?id=3187#1\" target=\"_blank\">Comment 1</a>:\nCedric De Vroey on 2020-10-26:\n\"Also getting into Ansible\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3189#comments\" target=\"_blank\">hpr3189</a></strong>\n(2020-10-22) \"<em>How the Dutch dig Graves</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=3189#1\" target=\"_blank\">Comment 1</a>:\nCedric De Vroey on 2020-10-26:\n\"Love graveyards\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3189#2\" target=\"_blank\">Comment 2</a>:\nClinton Roy on 2020-10-28:\n\"Interesting\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3191#comments\" target=\"_blank\">hpr3191</a></strong>\n(2020-10-26) \"<em>Swedish Corona Experience</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=3191#1\" target=\"_blank\">Comment 1</a>:\nmcnalu on 2020-10-26:\n\"Interesting info from Sweden\"</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/2020-October/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-October/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=\"call-for-shows\">Call for shows</h3>\n<ul>\n<li>There are just a few days until the next free slot on the calendar. More shows are urgently needed!</li>\n</ul>\n<h3 id=\"question\">Question</h3>\n<ul>\n<li>Which undead would you rather be from D&amp;D v 5 - Lich or Vampire ? And why ?</li>\n</ul>\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 6 shows which were without them.</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),
(3221,'2020-12-07','HPR Community News for November 2020',2948,'HPR Volunteers talk about shows released and comments posted in November 2020','<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/0388.html\" target=\"_blank\">Padraig Jeroen Fallon</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=3196\" target=\"_blank\">3196</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3196\" target=\"_blank\">HPR Community News for October 2020</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=3197\" target=\"_blank\">3197</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-11-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3197\" target=\"_blank\">Pens, pencils, paper and ink - 3</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=3198\" target=\"_blank\">3198</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-11-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3198\" target=\"_blank\">Income Life insurance and then Chopin</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3199\" target=\"_blank\">3199</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-11-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3199\" target=\"_blank\">Bad Audio Weed Eater Bugs Sprinkler and Bubbles !</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=3200\" target=\"_blank\">3200</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-11-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3200\" target=\"_blank\">Better Social Media 17 - OcapPub</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=3201\" target=\"_blank\">3201</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3201\" target=\"_blank\">A small intro to 3D printing</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3202\" target=\"_blank\">3202</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-11-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3202\" target=\"_blank\">A big Question</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0388.html\" target=\"_blank\">Padraig Jeroen Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3203\" target=\"_blank\">3203</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-11-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3203\" target=\"_blank\">The Paul Quirk show: Retro Computing</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3204\" target=\"_blank\">3204</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-11-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3204\" target=\"_blank\">Getting Started in 3D Printing</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=3205\" target=\"_blank\">3205</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-11-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3205\" target=\"_blank\">Backups of your Backups of Backups</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=3206\" target=\"_blank\">3206</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3206\" target=\"_blank\">Dungeons and Dragons for the blind</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=3207\" target=\"_blank\">3207</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-11-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3207\" target=\"_blank\">Fireside chat with E Nigma</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=3208\" target=\"_blank\">3208</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-11-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3208\" target=\"_blank\">The Paul Quirk show: Wacom with Pinebook, and thoughts on the DMCA takedown</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3209\" target=\"_blank\">3209</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-11-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3209\" target=\"_blank\">Linux Inlaws S01E17: Nextcloud</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=3210\" target=\"_blank\">3210</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-11-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3210\" target=\"_blank\">GIMP: Patterns and Gradients</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=3211\" target=\"_blank\">3211</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3211\" target=\"_blank\">Chainsaws</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=3212\" target=\"_blank\">3212</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-11-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3212\" target=\"_blank\">A Pi Model 3B as your daily driver? You must be joking.</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=3213\" target=\"_blank\">3213</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-11-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3213\" target=\"_blank\">Electrical Safety</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3214\" target=\"_blank\">3214</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-11-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3214\" target=\"_blank\">Rant about websites</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=3215\" target=\"_blank\">3215</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-11-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3215\" target=\"_blank\">Why I Gave Away a 3-D Printer</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=3216\" target=\"_blank\">3216</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3216\" target=\"_blank\">Buying a second home in France</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</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 13 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 7 comments on\n6 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=1771#comments\" target=\"_blank\">hpr1771</a></strong>\n(2015-05-18) \"<em>Audacity: Label Tracks</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0238.html\" target=\"_blank\">Jon Kulp</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=1771#4\" target=\"_blank\">Comment 4</a>:\nKen Fallon on 2020-11-19:\n\"Yes - found it\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=1796#comments\" target=\"_blank\">hpr1796</a></strong>\n(2015-06-22) \"<em>Audacity - Chains, Notches and Labels</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0307.html\" target=\"_blank\">cheeto4493</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=1796#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-11-19:\n\"And this one as well\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2881#comments\" target=\"_blank\">hpr2881</a></strong>\n(2019-08-19) \"<em>Automatically split album into tracks in Audacity</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=2881#3\" target=\"_blank\">Comment 3</a>:\nKen Fallon on 2020-11-19:\n\"And the final piece of the puzzle\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3126#comments\" target=\"_blank\">hpr3126</a></strong>\n(2020-07-27) \"<em>Metrics part II</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3126#3\" target=\"_blank\">Comment 3</a>:\nmcnalu on 2020-11-25:\n\"Thanks for the comments\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3179#comments\" target=\"_blank\">hpr3179</a></strong>\n(2020-10-08) \"<em>MakeMKV to back up media, and a Question</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=3179#2\" target=\"_blank\">Comment 2</a>:\nArcher72 on 2020-11-03:\n\"re: janedoc\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3193#comments\" target=\"_blank\">hpr3193</a></strong>\n(2020-10-28) \"<em>Meet Antithesis</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3193#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-11-03:\n\"dark-table\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3193#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-11-03:\n\"Agree with Brian\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 6 comments on 5 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3202#comments\" target=\"_blank\">hpr3202</a></strong>\n(2020-11-10) \"<em>A big Question</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0388.html\" target=\"_blank\">Padraig Jeroen Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3202#1\" target=\"_blank\">Comment 1</a>:\nEnigma on 2020-11-10:\n\"Great first show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3206#comments\" target=\"_blank\">hpr3206</a></strong>\n(2020-11-16) \"<em>Dungeons and Dragons for the blind</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3206#1\" target=\"_blank\">Comment 1</a>:\nMike Ray on 2020-11-16:\n\"Thanks for a great show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3208#comments\" target=\"_blank\">hpr3208</a></strong>\n(2020-11-18) \"<em>The Paul Quirk show: Wacom with Pinebook, and thoughts on the DMCA takedown</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3208#1\" target=\"_blank\">Comment 1</a>:\nCharliebrownau on 2020-11-23:\n\"Feedback - HPR 3208e\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3209#comments\" target=\"_blank\">hpr3209</a></strong>\n(2020-11-19) \"<em>Linux Inlaws S01E17: Nextcloud</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=3209#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2020-11-19:\n\"I loved the show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3213#comments\" target=\"_blank\">hpr3213</a></strong>\n(2020-11-25) \"<em>Electrical Safety</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3213#1\" target=\"_blank\">Comment 1</a>:\nnorrist on 2020-11-25:\n\"Great episode\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3213#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2020-11-27:\n\"I loved the show\"</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/2020-November/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-November/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>There were no tag or summary updates in the past month.</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),
(2942,'2019-11-12','Why I love lisps',509,'A very wooden and scripted episode about why I love the lisp programming language family','<h2 id=\"syntax-example\">Syntax example</h2>\r\n<pre><code>(define (fib-rec n)\r\n  (if (&lt; n 2)\r\n      n\r\n      (+ (fib-rec (- n 1))\r\n         (fib-rec (- n 2)))))\r\n</code></pre>\r\n<h2 id=\"structured-editing\">Structured Editing</h2>\r\n<p>Parinfer: <a href=\"https://shaunlebron.github.io/parinfer/\" class=\"uri\">https://shaunlebron.github.io/parinfer/</a></p>\r\n<p>Paredit: <a href=\"https://www.emacswiki.org/emacs/ParEdit\" class=\"uri\">https://www.emacswiki.org/emacs/ParEdit</a></p>\r\n<h2 id=\"clojure-libraries\">Clojure libraries</h2>\r\n<p>core.match (adds pattern matching): <a href=\"https://github.com/clojure/core.match\" class=\"uri\">https://github.com/clojure/core.match</a></p>\r\n<p>core.logic (prolog-like stuff): <a href=\"https://github.com/clojure/core.logic\" class=\"uri\">https://github.com/clojure/core.logic</a></p>\r\n<p>overtone: <a href=\"https://github.com/overtone/overtone\" class=\"uri\">https://github.com/overtone/overtone</a></p>\r\n<h2 id=\"other-stuff\">Other stuff</h2>\r\n<p>Clojure macro explanation: <a href=\"https://learnxinyminutes.com/docs/clojure-macros/\" class=\"uri\">https://learnxinyminutes.com/docs/clojure-macros/</a></p>\r\n<h2 id=\"books\">Books</h2>\r\n<p>The little schemer: <a href=\"https://mitpress.mit.edu/books/little-schemer-fourth-edition\" class=\"uri\">https://mitpress.mit.edu/books/little-schemer-fourth-edition</a></p>\r\n<p>Clojure for the brave and true: <a href=\"https://www.braveclojure.com/\" class=\"uri\">https://www.braveclojure.com/</a></p>\r\n',381,0,0,'CC-BY-SA','lisp, programming',0,0,1),
(2955,'2019-11-29','Machine Learning / Data Analysis Basics',1293,'We talk about different machine learning techniques','<p>In this episode, I talk about different techniques that we can use to predict the outcome of some question depending on input features.</p>\r\n<p>The different techniques I will go through are the ZeroR and OneR that will create a baseline for the rest of the methods.</p>\r\n<p>Next up, we have the Naive Bayes classifier that is simple but powerful for some applications.</p>\r\n<p>Nearest neighbor and Decision trees are next up that requires more training but is very efficient when you infer results.</p>\r\n<p>Multi-layer perceptron (MLP) is the first technique that is close to the ones we usually see in Machine Learning frameworks used today. But it is just a precursor to Convolutional Neural Network (CNN) because of the size requirements. MLPs have the same size for all the hidden layers, which makes it unfeasible for larger networks.</p>\r\n<p>CNNs, on the other hand, uses subsampling that will shrink the layer maps to reduce the size of the network without reducing the accuracy of the predictions.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Some references for further reading on Wikipedia.\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Naive_Bayes_classifier\" class=\"uri\">https://en.wikipedia.org/wiki/Naive_Bayes_classifier</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Nearest_neighbor_search\" class=\"uri\">https://en.wikipedia.org/wiki/Nearest_neighbor_search</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Decision_tree\" class=\"uri\">https://en.wikipedia.org/wiki/Decision_tree</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Support-vector_machine\" class=\"uri\">https://en.wikipedia.org/wiki/Support-vector_machine</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Multilayer_perceptron\" class=\"uri\">https://en.wikipedia.org/wiki/Multilayer_perceptron</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Convolutional_neural_network\" class=\"uri\">https://en.wikipedia.org/wiki/Convolutional_neural_network</a></li>\r\n</ul></li>\r\n<li>A video I made some years ago where you can see some visual aids for this subject.<br />\r\n<a href=\"https://youtu.be/Xys1N_7MbSs\" class=\"uri\">https://youtu.be/Xys1N_7MbSs</a></li>\r\n</ul>',382,0,0,'CC-BY-SA','machine learning, basics, theory',0,0,1),
(2944,'2019-11-14','ONICS Basics Part 4: Network Flows and Connections',989,'I try to add a bit more basic networking info while writing a quick script for Dave Morris','<h1 id=\"terminology\">Terminology</h1>\r\n<ul>\r\n<li>connection - a bi-directional communication channel between two programs over a network</li>\r\n<li>client - the initiator of a connection</li>\r\n<li>server - the receiver of the connection</li>\r\n<li>port - a common term for the address of a program or service on a given machine</li>\r\n<li>5-tuple - the combination of protocol, client machine network address, client port, server machine network address, server port that uniquely identifies a connection</li>\r\n<li>flow - a grouping of packets to be treated in a common way</li>\r\n<li>microflow - a flow with a fine level of granularity such as the packets from one direction of traffic in a connection</li>\r\n</ul>\r\n<h1 id=\"the-topflowsh-script\">The topflow.sh Script</h1>\r\n<pre><code>#!/bin/sh\r\n\r\n# Start a capture in the background that drops the packets\r\n# and just reports the flow events\r\npktin $1 | nftrk -d -f /tmp/flows.txt &amp;\r\nPID=$!\r\n\r\n# On CTRL-C clean kill the capture and clean up\r\ntrap &quot;kill $PID ; rm -f /tmp/flows.txt /tmp/topflows.txt /tmp/namecache.txt ; exit 0&quot; INT TERM\r\n\r\n# Once per second do\r\n#   look at the last 100 flows\r\n#   sort them by 5-tuple\r\n#   remove duplicates\r\n#   convert ports, protocols and addresses to names\r\n#   sort by data usage per flow in reverse order (highest first)\r\n#   a little more pretty printing\r\n#   only take the top 20 lines\r\n#   clear the screen and print the result\r\nwhile [ 1 ] ; do\r\n    tail -100 /tmp/flows.txt |\r\n            sort -s -t &#39;|&#39; -k 3,3 |\r\n            awk -f uniqflows.awk  |\r\n            awk -f prflow.awk  |\r\n            sort -s -t &#39;,&#39; -k 3 -r |\r\n            awk -f columns.awk |\r\n            head -20 &gt; /tmp/topflows.txt\r\n    clear\r\n    cat /tmp/topflows.txt\r\n    sleep 1\r\ndone\r\n</code></pre>\r\n<p>You can find the complete code at: <a href=\"https://gitlab.com/onics/onics-examples\" class=\"uri\">https://gitlab.com/onics/onics-examples</a></p>\r\n',259,61,0,'CC-BY-SA','command line networking',0,0,1),
(2945,'2019-11-15','Saturday at OggCamp Manchester 2019',2225,'Interviews and chat from the UK\'s largest FLOSS event.','<p>\r\n<a href=\"https://www.oggcamp.org/\">OggCamp</a> is an unconference celebrating Free Culture, Free and Open Source Software, hardware hacking, digital rights, and all manner of collaborative cultural activities and is committed to creating a conference that is as inclusive as possible.<br />\r\nThis year a team of HPR volunteers hit the show.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191018_122746Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191018_122746Z-small.jpg\"></a><br />\r\nKen\'s recording kit and some of the stickers.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_081508Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_081508Z-small.jpg\"></a><br />\r\n<a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave</a>, <a href=\"https://hackerpublicradio.org/correspondents/0268.html\">Andrew Conway/mcnalu</a> and Timttmy getting the booth ready.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_081704Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_081704Z-small.jpg\"></a><br />\r\nOnly <a http=\"https://hackerpublicradio.org/correspondents.php\">HPR hosts</a> can sign the booth.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_085140Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_085140Z-small.jpg\"></a><br />\r\n<a href=\"https://hackerpublicradio.org/correspondents/0370.html\">Yannick</a> signs the booth.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_091705Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_091705Z-small.jpg\"></a><br />\r\nTimttmy\'s script to turn an Android phone into a webcam. Two versions of the script to take a screenshot and post it to the web.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_091709Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_091709Z-small.jpg\"></a><br />\r\nSurveillance state ?\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_095727Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_095727Z-small.jpg\"></a><br />\r\nOur latest host <a href=\"https://hackerpublicradio.org/correspondents/0381.html\">Nihilazo</a> signs the booth.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_133636Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_133636Z-small.jpg\"></a><br />\r\nAn Interview with Ban Parsons from the <a href=\"https://matrix.org/\">Matrix</a> <em>An open network for secure, decentralized communication</em>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_135427Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_135427Z-small.jpg\"></a><br />\r\nAn Interview with <a href=\"https://www.mystorm.uk/\">mystorm.uk</a> makers of the open FPGA. An FPGA chip is a re-programmable piece of silicon hardware, it can be reconfigured or programmed to a logic circuit of your own design.\r\n\r\n<br/>\r\n<em>In 2016 we decided to setup up the myStorm project in order to build OpenSource FPGA hardware. Several years later we are building the 5th generation of <a href=\"https://github.com/folknology/BlackIceMx/wiki\">BlackIce</a> Development boards. <a href=\"https://www.tindie.com/products/Folknology/blackice-mx/\">BlackIce Mx</a> the latest generation of our hardware has been built using BlackEdge open hardware standard which enable the \'Core\' Board <a href=\"https://github.com/folknology/IceCore/wiki/IceCore-Getting-Started\">IceCore</a> to be separated from its carrier board which provides MixMod and Pmod hardware add-ons. Please take a look at the <a href=\"https://forum.mystorm.uk\">myStorm forum</a> to ask questions and participate in our community. </em>\r\n\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_135429Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_135429Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_141427Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_141427Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/IMG_20191019_143611Z.jpg\"><img src=\"../eps/hpr2945/IMG_20191019_143611Z-small.jpg\"></a><br />\r\nAn Interview with Erik Grun of the <a href=\"https://fsfe.org/\">Free Software Foundation Europe</a> about their campaign for <strong><a href=\"https://fsfe.org/campaigns/publiccode/index.en.html\">Public Money? Public Code!</a></strong>\r\n</p>\r\n',30,78,0,'CC-BY-SA','OGGCamp, FSFE, Matrix, BlackEdge, mystorm, blackice, fswebcam, android, sshpass',0,0,1),
(2946,'2019-11-18','Sunday at OggCamp Manchester 2019',3378,'Interviews and chat from the UK\'s largest FLOSS event.','<p>\r\n<a href=\"../eps/hpr2946/434340905_92324.jpg\"><img src=\"../eps/hpr2946/434340905_92324-small.jpg\"></a><br />\r\n<a href=\"https://hackerpublicradio.org/correspondents/0288.html\">beni</a>, <a href=\"https://hackerpublicradio.org/correspondents/0268.html\">Andrew Conway/mcnalu</a>, Timttmy, and <a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave</a> at the HPR booth.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_100452Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_100452Z-small.jpg\"></a><br />\r\nMichael from <a href=\"https://www.electricflapjack.com/\">Electric Flap Jack</a> Custom Built Guitars, and author of <a href=\"https://efguitars.s3.amazonaws.com/fretboard-generator.html\">Fretboard Template Generator</a> available on <a href=\"https://github.com/mdales/Fretboard-generator\">GitHub</a>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_132900Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_132900Z-small.jpg\"></a><br />\r\nPerspex template for carving the body and neck.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_132904Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_132904Z-small.jpg\"></a><br />\r\nA work in progress.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_132909Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_132909Z-small.jpg\"></a><br />\r\nTools for making guitar, including the tool to round the frets.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_132913Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_132913Z-small.jpg\"></a><br />\r\nAnd of course you need a guitar stand.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_132918Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_132918Z-small.jpg\"></a><br />\r\n<a href=\"https://efguitars.s3.amazonaws.com/fretboard-generator.html\">Fretboard Template Generator</a> available on <a href=\"https://github.com/mdales/Fretboard-generator\">GitHub</a>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_101726Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_101726Z-small.jpg\"></a><br />\r\nTai Kedzierski hanging out with \"Grumpy\" Mike Cook.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_101754Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_101754Z-small.jpg\"></a><br />\r\nMike produces electronic musical instruments for people with accessibility issues.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_103658Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_103658Z-small.jpg\"></a><br />\r\nHe also has a book called <a href=\"https://www.apress.com/gp/book/9781484217207\">Arduino Music and Audio Projects</a> to help you do this yourself.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_103704Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_103704Z-small.jpg\"></a><br />\r\n<em>\r\nAt <a href=\"https://www.drakemusic.org/\">Drake Music</a> we are leaders in music, disability and technology.<br />\r\nWe are innovators, educators, curators and advocates. We believe everyone has the right to express themselves creatively through music. We use new technologies and ideas to open up access to music for all. Our vision is a world where disabled and non-disabled musicians work together as equals.</em>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_103728Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_103728Z-small.jpg\"></a><br />\r\nThe <em>bat base</em>.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_103744Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_103744Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_103749Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_103749Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_103821Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_103821Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_103722Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_103722Z-small.jpg\"></a><br />\r\nThe <em>Cattle Caster</em>.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_103713Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_103713Z-small.jpg\"></a><br />\r\nThe <em>Arduino Caster</em>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_105735Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_105735Z-small.jpg\"></a><br />\r\nThe <a href=\"https://www.openrightsgroup.org/\">Open Rights Group</a>.<br />\r\n<em>\r\n<a href=\"https://www.openrightsgroup.org/ourwork/\">Open Rights Group</a> protects the digital rights of people in the UK including privacy and free speech online. We are funded by over <a href=\"https://www.openrightsgroup.org/join/\">3,000 people like you</a>.\r\n</em>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_115630Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_115630Z-small.jpg\"></a><br />\r\n<a href=\"https://manchestergreyhats.co.uk/\">Manchester Grey Hats</a><br />\r\n<p>Manchester Grey Hats is a place for all those interested in hacking and cyber security to learn and share. We run capture the flags, workshops and perform/present security research.</p>\r\n<p>We encourage all skill levels and those from all backgrounds. Are you an aspiring hacker or a developer thinking about security? Come along and learn. Presenting is open to all members, so if you have something you’d like to present but aren’t ready for the big conferences, get in touch.</p>\r\n\r\n<p>Said best by The Mentor – “This is our world now… the world of the electron and the switch, the beauty of the baud”</p>\r\n\r\n<p>Although we meet face to face once a month, MGH is mostly an online community. We encourage people to join us in person for workshops and events but if you can\'t, join us on Slack and our live stream.</p>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_115639Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_115639Z-small.jpg\"></a><br />\r\nAn example of the of the locks that needed to be picked for the FlawCon Capture the Flag event.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_115654Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_115654Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_115701Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_115701Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_115719Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_115719Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/IMG_20191020_115905Z.jpg\"><img src=\"../eps/hpr2946/IMG_20191020_115905Z-small.jpg\"></a><br />\r\nHow to hold the lock while you are picking it.\r\n</p>\r\n',30,78,0,'CC-BY-SA','OGGCamp, FSFE, Matrix, BlackEdge, mystorm, blackice, fswebcam, android, sshpass',0,0,1),
(2947,'2019-11-19','The Mimblewimble Protocol',1261,'mimblewimble is a new blockchain protocol for scalability, privacy and fungibility','<p>Financial privacy is critical for adoption of cryptocurrency as a means of exchange. Individuals worry about employers monitoring their spending details, insurers increasing rates based on purchases and landlords raising rents when they get a promotion. Businesses can only operate using cryptocurrency if they can prevent disclosure of vendor payments, rates paid to suppliers, payroll details, and so on. At the same time, they need to selectively disclose financial data to governments and might need to demonstrate compliance in some industries.</p>\r\n<p>Mimblewimble is a new protocol that uses cryptography to achieve striking reductions in blockchain size, so users can run a full node on low powered devices like phones. It offers the strongest privacy protection assurances around, through a variety of clever tricks. For one thing, transaction history is not recorded, which also results in a smaller blockchain. There are no addresses and no transaction amounts are recorded.</p>\r\n<p>We’re not going to focus on the cryptography, although it’s a fascinating example of just how much progress is being made in recent years. We’ll focus instead on what makes this mysterious network protocol unique among cryptocurrencies.</p>\r\n',379,110,0,'CC-BY-SA','blockchain, privacy',0,0,1),
(2954,'2019-11-28','Wrestling As You Like It episode 1',462,'A Wrestling podcast reporting on indie wrestling. Today we are talking about different TV styles.','<p>TV and pro wrestling go hand in hand. Both have fed off of each other, and with the internet we are now exposed to many different promotions with their own visual style in order to broadcast wrestling in the ring.</p>\r\n',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1),
(2949,'2019-11-21','Grin and Beam: The 2 major mimblewimble blockchains',1387,'Grin and Beam are two mimblewimble implementations that are very different & we take a look at both','<p>Last time we reviewed the mimblewimble protocol for blockchain networks. This is an innovative protocol focused on privacy and scalability.</p>\r\n<p>In this episode we take a closer look at the two major implementations of mimblewimble, called Grin and Beam. They are both interesting projects that take very different approaches, yet both have managed to launch working blockchains that preserve the core strengths of the protocol.</p>',379,110,1,'CC-BY-SA','blockchain, privacy',0,0,1),
(2960,'2019-12-06','Dehydrated Foods',835,'Dehydrating your own fruits and vegetables for healthy snacks','<p>I have begun to dehydrate fruits and vegetables at home with my own dehydrator, and it lets me have fresher products without all of the additives. In this episode I discuss both the why and the how.</p>\r\n<ul>\r\n<li><a href=\"https://www.mayoclinic.org/tests-procedures/a1c-test/about/pac-20384643\" class=\"uri\">https://www.mayoclinic.org/tests-procedures/a1c-test/about/pac-20384643</a></li>\r\n<li><a href=\"https://www.webmd.com/food-recipes/news/20090323/7-rules-for-eating#1\" class=\"uri\">https://www.webmd.com/food-recipes/news/20090323/7-rules-for-eating#1</a></li>\r\n<li><a href=\"https://www.amazon.com/NESCO-FD-37A-Dehydrator-Speckled-Marbled/dp/B00CS5ZI6G\" class=\"uri\">https://www.amazon.com/NESCO-FD-37A-Dehydrator-Speckled-Marbled/dp/B00CS5ZI6G</a></li>\r\n<li><a href=\"https://www.rei.com/blog/hike/how-to-dehydrate-food\" class=\"uri\">https://www.rei.com/blog/hike/how-to-dehydrate-food</a></li>\r\n<li><a href=\"https://smile.amazon.com/Beginners-Guide-Dehydrating-Food-2nd/dp/1635860245/ref=sr_1_1?keywords=The+Beginner%27s+Guide+to+Dehydrating+Food%2C+2nd+Edition%3A+How+to+Preserve+All+Your+Favorite+Vegetables%2C+Fruits%2C+Meats%2C+and+Herbs&amp;qid=1570990745&amp;s=books&amp;sr=1-1\">https://smile.amazon.com/Beginners-Guide-Dehydrating-Food-2nd/dp/1635860245/ref=sr_1_1?keywords=The+Beginner%27s+Guide+to+Dehydrating+Food%2C+2nd+Edition%3A+How+to+Preserve+All+Your+Favorite+Vegetables%2C+Fruits%2C+Meats%2C+and+Herbs&amp;qid=1570990745&amp;s=books&amp;sr=1-1</a></li>\r\n<li><a href=\"https://addapinch.com/homemade-ranch-seasoning-mix-recipe/\" class=\"uri\">https://addapinch.com/homemade-ranch-seasoning-mix-recipe/</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=674\" class=\"uri\">https://www.palain.com/?page_id=674</a></li>\r\n</ul>',198,100,0,'CC-BY-SA','Health, Diet',0,0,1),
(2958,'2019-12-04','Haskell modules',1387,'Tuula talks about haskell modules','<p>With small programs it’s easy enough to have all code in single file. But as the program grows, you eventually want to organize things into separate files. In this episode I’ll talk a bit how to define modules and how to use them.</p>\r\n<h2 id=\"defining\">Defining</h2>\r\n<p>Each module is defined in separate file. In our example, we have file called <code>multiplexer.hs</code>, which contains our module definition.</p>\r\n<p>At the beginning of the file, we have following:</p>\r\n<pre><code>module Multiplexer (mix, match, Plexer, Scooper(..))\r\n  where\r\n  ....</code></pre>\r\n<p>We’re omitting actual function and type definitions as they aren’t important to this episode. In any case, there’s two functions: <code>mix</code> and <code>match</code> and two types: <code>Plexer</code> and <code>Scooper</code> that module exports (that is, these are available outside of the module). <code>Plexer</code> is imported as a type only and <code>Scooper</code> with field accessors or value constructors depending if it’s a record or algebraic datatype.</p>\r\n<h2 id=\"using-modules\">Using modules</h2>\r\n<p>In order to be able to use identifiers defined in separate module, we have to import them into our current one. In our imaginary program, we have <code>main.hs</code> that defines entry point for our program and we would like to import the definitions from <code>Multiplexer</code> module.</p>\r\n<p>Easiest one is to just have <code>import Multiplexer</code> at the start of the <code>main</code>. This brings all exported identifiers from <code>Multiplexer</code> and we can then use them. Both qualified and unqualified names are imported. Qualified means name is prepended with module name: <code>Multiplexer.mix</code> instead of just <code>mix</code>.</p>\r\n<p>If we want, we can specify what exactly should be imported: <code>import Multiplexer (mix, match)</code>. This causes only functions <code>mix</code> and <code>match</code> be imported, while <code>Plexer</code> and <code>Scooper</code> are unavailable for us. Again, both qualified and unqualified names are imported.</p>\r\n<p>In case we want only qualified names, we’ll write <code>import qualified Multiplexer</code>. After this <code>mix</code> isn’t available, but <code>Multiplexer.mix</code> is (and all the other identifiers exported by <code>Multiplexer</code>).</p>\r\n<p>Sometimes module name is long and tedious to repeat when using qualified names. In these cases, renaming module while importing is a good option. This can be done by writing <code>import Multiplexer as M</code>. After this, instead of <code>Multiplexer.mix</code> you write <code>M.mix</code>.</p>\r\n<p>Final thing I’m going to mention is importing everything else except specified identifiers. This is done by writing <code>import Multiplexer hiding (mix)</code>. This imports everything exported by <code>Multiplexer</code>, except <code>mix</code>.</p>\r\n<h2 id=\"summary\">Summary</h2>\r\n<p>There are many ways of importing and they can be mixed. Here’s a list of them:</p>\r\n<ul>\r\n<li><code>import Multiplexer</code></li>\r\n<li><code>import Multiplexer ()</code></li>\r\n<li><code>import Multiplexer (mix, match, Plexer, Scooper(..))</code></li>\r\n<li><code>import qualified Multiplexer</code></li>\r\n<li><code>import qualified Multiplexer (mix, match, Plexer, Scooper(..))</code></li>\r\n<li><code>import Multiplexer hiding (mix, match)</code></li>\r\n<li><code>import qualified Multiplexer hiding (Plexer, Scooper)</code></li>\r\n<li><code>import Multiplexer as M</code></li>\r\n<li><code>import Multiplexer as M (mix, match)</code></li>\r\n<li><code>import qualified Multiplexer as M</code></li>\r\n<li><code>import qualified Multiplexer as M (Plexer, Scooper(..))</code></li>\r\n</ul>\r\n<p>In short:</p>\r\n<ul>\r\n<li>Some identifiers can be chosen to be imported, while leaving others unimported</li>\r\n<li>Modules can be imported qualified (forcing an obligatory namespace qualifier to imported identifiers).</li>\r\n<li>Some identifiers can be skipped via the hiding clause.</li>\r\n<li>The module namespace can be renamed, with an as clause.</li>\r\n</ul>\r\n<h2 id=\"prelude\">Prelude</h2>\r\n<p>Prelude is base module containing lots of helpful types and functions, which is automatically imported by every module. If this is not what you want, there’s two options. First one is to use pragma at start of the file: <code>{-# LANGUAGE NoImplicitPrelude #-}</code>, which causes <code>Prelude</code> not to be imported. Another one is to manually import <code>Prelude</code>, which turns of automatic import: <code>import qualified Prelude as P</code>.</p>\r\n<h2 id=\"closing\">Closing</h2>\r\n<p>When system grows, it’s helpful to break it into more manageable pieces. For this we use modules. <code>import</code> is used to bring identifiers from other modules into current one.</p>\r\n<p>Questions, comments and feedback is welcomed. Best way to reach me is either email or in fediverse where I’m <code>Tuula@mastodon.social</code></p>\r\n',364,107,0,'CC-BY-SA','haskell, modules',0,0,1),
(2951,'2019-11-25','A walk through my PifaceCAD Python code – Part 2',888,'In this episode I cover some generic functions at the top of the code.','<h2 id=\"code\">Code</h2>\r\n<p>The script being discussed in this show is available for download with this show: <a href=\"https://hackerpublicradio.org/eps/hpr2951/cad-menu.py\">cad-menu.py</a></p>\r\n<h2 id=\"generic-functions\">GENERIC FUNCTIONS</h2>\r\n<ul>\r\n<li><code>def get_hpr_que():</code><br />\r\nGoto hacker public stats page and extract the number of days to next free slot turns on blinkstick LED with colour dependent on the number of days to next free slot in HPR queue prints number of days to next free slot to the display</li>\r\n</ul>\r\n<h2 id=\"generic-blinkstick-functions\">GENERIC BLINKSTICK FUNCTIONS</h2>\r\n<ul>\r\n<li><p><code>def bstick_off():</code><br />\r\nSearch for all attached blinksticks and turn them all off</p></li>\r\n<li><p><code>def bstick_on(colour):</code><br />\r\nTurn blinkstick on and set led colour to string value stored in var colour. valid colours are, black, silver, gray, white, maroon, red, purple, fuchsia, green, lime, olive, yellow, navy, blue, teal, aqua</p></li>\r\n<li><p><code>def bstick_on_random():</code><br />\r\nTurn blinkstick on colour random</p></li>\r\n<li><p><code>def bstick_blink(colour):</code><br />\r\nTurn blinkstick on with supplied colour</p></li>\r\n</ul>\r\n<h2 id=\"end-blinkstick-functions\">END BLINKSTICK FUNCTIONS</h2>\r\n<ul>\r\n<li><p><code>def run_cmd(cmd):</code><br />\r\nUsed to run an external linux command</p></li>\r\n<li><p><code>def get_my_ip():</code><br />\r\nReturns ip address</p></li>\r\n<li><p><code>def get_my_essid():</code><br />\r\nReturns wifi ESSID</p></li>\r\n<li><p><code>def get_my_wifi_strength():</code><br />\r\nReturns wifi signal strength as a percentage</p></li>\r\n<li><p><code>def wait_for_ip():</code><br />\r\nTries 10 times to get IP address</p></li>\r\n<li><p><code>def show_wifi_info():</code><br />\r\nShow WiFi information on display, shows essid on first line and both the wifi signal strength as a percentage and ip address on the second line.</p></li>\r\n<li><p><code>def custom_bitmaps():</code><br />\r\nSelection of custom bitmaps to use on LCD display</p></li>\r\n<li><p>Article in pifacecad documentation giving details about creating custom bitmaps on the pifacecad<br />\r\n<a href=\"https://piface.github.io/pifacecad/creating_custom_bitmaps.html\" class=\"uri\">https://piface.github.io/pifacecad/creating_custom_bitmaps.html</a></p></li>\r\n<li><p>This tool referenced in the pifacecad documentation link above can help design custom bitmaps. Make sure you select 5x8<br />\r\n<a href=\"https://www.quinapalus.com/hd44780udg.html\" class=\"uri\">https://www.quinapalus.com/hd44780udg.html</a></p></li>\r\n<li><p><code>def writelongstring(longstring):</code><br />\r\nWrites a long string to the piface control and display LCD &amp; scrolls it to the left until the last character appears on the right hand side of the screen</p></li>\r\n</ul>\r\n<pre><code># Local Variables (for function writelongstring)\r\nDisplaySize = 15\r\n# Number of characters  that can be displayed on 1 line of display\r\n\r\nStepSize = 4\r\n# Step size when scrolling message on display\r\n\r\nScrollSpeed =   0.55\r\n# Adjusts scroll speed, delay in seconds between scrolls\r\n\r\nScroll = 0\r\n# Default value for scroll, used when string is smaller than display size</code></pre>\r\n<ul>\r\n<li><p><code>def init_display():</code><br/>\r\n# Setup LCD display for selected menu 0 (Podcasts), 1 (Audiobooks), 2 (System)</p></li>\r\n<li><p><code>def display_main_menu(event):</code><br/>\r\n# Clear LCD &amp; dsplays the appropriate main menu message</p></li>\r\n</ul>\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(2952,'2019-11-26','Publishing your book using open source tools',1562,'How I evolved from writing with a publisher to self-publishing using open source tools','<p>Printing on demand website: <a href=\"https://www.lulu.com\" class=\"uri\">https://www.lulu.com</a></p>',369,0,0,'CC-BY-SA','asciidoc,asciidoctor,lulu,writing,books',0,0,1),
(2953,'2019-11-27','How I got started in Linux',276,'How I start in Linux, computing, and Free Software','<p>Osdisc.com is the website that I mentioned while distro hopping. Unfortunately, as of August 2019, their site is no longer sending CD’s/DVD’s.</p>\r\n<p>How I recorded:<br />\r\nAndroid phone, lapel mic, and Audio Recorder app found here:</p>\r\n<p><a href=\"https://play.google.com/store/apps/details?id=com.github.axet.audiorecorder\" class=\"uri\">https://play.google.com/store/apps/details?id=com.github.axet.audiorecorder</a></p>\r\n<p>And here:</p>\r\n<p><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></p>\r\n',318,29,0,'CC-BY-SA','Linux, FreeBSD, Computers',0,0,1),
(2957,'2019-12-03','Lord D\'s Film Reviews: Ever',1025,'Lostnbronx reviews a recent drama/romance.','<p><b>Ever</b><br />\r\nWritten/Directed by Josh Beck<br />\r\nStarring Wendy McColm &amp; Christina Elizabeth Smith<br />\r\nCinematography by Micah Van Hove<br />\r\nRunning Time: 1:37:42</p>\r\n<p><a href=\"https://www.youtube.com/watch?v=5F-XfwIvmMg\" class=\"uri\">https://www.youtube.com/watch?v=5F-XfwIvmMg</a></p>\r\n<p>A young woman named Ever, while grieving over a devastating loss, meets Emily, who helps her to heal and find love again.</p>\r\n',107,109,0,'CC-0','review, film, lord d',0,0,1),
(2959,'2019-12-05','Interview with Josh Clements about gpodder.net ',2314,'What starts as an Interview and ends in a brain storm.','<p>\r\nIn today\'s show Ken interviews Josh Clements from the <a href=\"https://gpodder.net\">gpodder.net</a> project.\r\n</p>\r\n<p>\r\nJosh answered the <a href=\"https://github.com/gpodder/mygpo/blob/master/maintainer-needed.md\">call to arms</a> he heard on the <a href=\"https://ubuntupodcast.org/2019/08/08/s12e18-pilotwings/\">Ubuntu Podcast</a>. We discuss <em>the plan</em> and explain how you can also get involved.\r\n</p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://github.com/gpodder/mygpo/blob/master/maintainer-needed.md\">https://github.com/gpodder/mygpo/blob/master/maintainer-needed.md</a></li>\r\n<li><a href=\"https://ubuntupodcast.org/2019/08/08/s12e18-pilotwings/\">https://ubuntupodcast.org/2019/08/08/s12e18-pilotwings/</a></li>\r\n<li><a href=\"https://github.com/gpodder/\">https://github.com/gpodder/</a></li>\r\n<li><a href=\"https://gpodder.github.io/docs/mailing-list.html\">https://gpodder.github.io/docs/mailing-list.html</a></li>\r\n<li><a href=\"https://feeds.gpodder.net/\">https://feeds.gpodder.net/</a></li>\r\n<li><a href=\"https://prgmr.com/xen/\">https://prgmr.com/xen/</a></li>\r\n<li><a href=\"mailto:support@gpodder.net\">support@gpodder.net</a></li>\r\n</ul>\r\n',30,78,0,'CC-BY-SA','gpodder.net, Josh Clements',0,0,1),
(2961,'2019-12-09','Kubernetics / Cloud - Terminology',664,'We talk about terms often used when using Kubernetes','<p>We talk about terms often used when using Kubernetes.</p>\r\n<p>Terms we talk about</p>\r\n<ul>\r\n<li>Node - Machine to run jobs on.</li>\r\n<li>Cluster - Grouping of nodes to deploy work to.</li>\r\n<li>Container - Compute unit that we can run in the cloud</li>\r\n<li>Pod - One or more containers that are one unit in the cloud that could be started, stopped, or restarted.</li>\r\n<li>Service - Different network services that serve the pods\r\n<ul>\r\n<li>Load balancers - Balance network calls to different pods</li>\r\n<li>Certmanager - Handles certificates, for instance, let’s encrypt.</li>\r\n<li>Ingress - Handles traffic from the external network</li>\r\n</ul></li>\r\n<li>Volumes - External resources used by pods to keep state</li>\r\n<li>ConfigMap - Configuration parameters that could be changed without restarting the pods or deployment.</li>\r\n<li>Deployment - A configuration of all the terms mentioned that you use to deploy as a unit to the cluster.</li>\r\n</ul>\r\n',382,0,0,'CC-BY-SA','kubernetics, basic, terminology',0,0,1),
(2968,'2019-12-18','Life and Times of a Geek part 3',2441,'Part 3 of my personal story of experiences with computers','<h2 id=\"introduction\">Introduction</h2>\r\n<p>In the last part of my story (show <a href=\"https://hackerpublicradio.org/eps.php?id=1811\" title=\"Life and Times of a Geek part 2\">1811</a> in 2015) I told you about some of my experiences at the University of Manchester as a postgraduate student from around 1973.</p>\r\n<p>Today I want to talk a little more about my time in Manchester and mention some of the things I did that may be of interest to Hackers!</p>\r\n<h2 id=\"researching-for-the-episode\">Researching for the episode</h2>\r\n<p>As I have been researching for this HPR episode I realise how long ago some of these events were - in Internet years particularly. In many cases I could find no online records of places, equipment or people. This seems to be because any records there might be are on paper and have never made it online. I contacted a company that made some of the laboratory equipment I used that I thought might be of interest, and the person I contacted said that although he remembered what I was referring to the company had kept no records of it and had had to discontinue it due to modern safety concerns.</p>\r\n<p>I find this somewhat dispiriting and it makes me feel very very old!</p>\r\n<h2 id=\"long-notes\">Long notes</h2>\r\n<p>I have provided detailed notes as usual for this episode. The HTML version can be <a href=\"https://hackerpublicradio.org/eps/hpr2968/full_shownotes.html\">viewed here</a> and the ePub version downloaded from <a href=\"https://hackerpublicradio.org/eps/hpr2968/full_shownotes.epub\">here</a>.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Building experimental apparatus:\r\n<ul>\r\n<li>Wikipedia page for <a href=\"https://en.wikipedia.org/wiki/Dexion\">Dexion</a> - for building metal structures</li>\r\n<li>Wikipedia page on the “<em>Skinner Box</em>” or <a href=\"https://en.wikipedia.org/wiki/Operant_conditioning_chamber\">Operant Conditioning Chamber</a></li>\r\n<li>“<em><a href=\"https://handytube.co.uk/\">Handy Tube</a></em>” used for making Skinner Boxes</li>\r\n</ul></li>\r\n<li>Video tape recorders:\r\n<ul>\r\n<li>The Rewind Museum <a href=\"https://www.rewindmuseum.com/reeltoreelvideo.htm\">reel-to-reel video recorders</a></li>\r\n<li>Wikipedia page on <a href=\"https://en.wikipedia.org/wiki/Video_tape_recorder\">Video tape recorders</a></li>\r\n<li>Youtube video about a <a href=\"https://www.youtube.com/watch?v=xwbMXqp0XtA\">Sanyo Reel to Reel Video Tape Recorder</a></li>\r\n</ul></li>\r\n<li>Logic programming:\r\n<ul>\r\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/Logic_gate\">Logic Gate</a></li>\r\n<li>Wikipedia page on the (electronic) <a href=\"https://en.wikipedia.org/wiki/Flip-flop_(electronics)\">“<em>Flip-Flop</em>”</a></li>\r\n</ul></li>\r\n<li>D-MAC Digitiser:\r\n<ul>\r\n<li>StackExchange article discussing the <a href=\"https://history.stackexchange.com/questions/48789/what-is-this-d-mac-device\"><em>D-MAC</em></a> digitiser</li>\r\n</ul></li>\r\n<li>ICT (ICL) computers:\r\n<ul>\r\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/ICT_1900_series\">ICT (ICL) 1900 series</a></li>\r\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/GEORGE_%28operating_system%29\">ICL GEORGE operating system</a></li>\r\n</ul></li>\r\n<li>Teleprinter:\r\n<ul>\r\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/Teletype_Model_33\">Teletype Model 33</a></li>\r\n</ul></li>\r\n<li>CDC computers:\r\n<ul>\r\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/CDC_Cyber\">CDC Cyber range</a></li>\r\n</ul></li>\r\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/APL_%28programming_language%29\">APL language</a></li>\r\n<li>Sinclair calculators:\r\n<ul>\r\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/Sinclair_Scientific\">Sinclair Scientific</a></li>\r\n<li><a href=\"https://books.google.co.uk/books?id=FS6D5VL2qo4C&amp;pg=PA639#v=onepage&amp;q&amp;f=false\">New Scientist advertisement</a> December 1975</li>\r\n<li><a href=\"https://phils.bitboxes.co.uk/scan_and_ocr/manuals/sinclair_scientific/\">Sinclair Scientific operating instructions</a> [<em>This link might be dead; try the archive.org one below</em>]\r\n<ul>\r\n<li><a href=\"https://web.archive.org/web/20141021211903/https://phils.bitboxes.co.uk/scan_and_ocr/manuals/sinclair_scientific/\" class=\"uri\">https://web.archive.org/web/20141021211903/https://phils.bitboxes.co.uk/scan_and_ocr/manuals/sinclair_scientific/</a></li>\r\n</ul></li>\r\n<li><a href=\"https://files.righto.com/calculator/sinclair_scientific_simulator.html\">Sinclair Scientific simulator</a></li>\r\n<li><a href=\"https://www.vintagecalculators.com/html/sinclair1.html\">Vintage Calculators</a></li>\r\n<li><a href=\"https://www.calculator.org/rpn.aspx\">Reverse Polish Notation</a></li>\r\n</ul></li>\r\n<li>Previous episodes:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1664\"><em>Life and Times of a Geek</em> part 1</a> (2014-12-18)</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1811\"><em>Life and Times of a Geek</em> part 2</a> (2015-07-13)</li>\r\n</ul></li>\r\n<li>Resources:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr2968/full_shownotes.html\">Full show notes</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps/hpr2968/full_shownotes.epub\">ePub show notes</a></li>\r\n</ul></li>\r\n</ul>\r\n',225,29,1,'CC-BY-SA','video recorder,Skinner box,logic gate,digitiser,Dobbie McInnes,Data General,teletype,Cyber-72,APL,Si',0,0,1),
(2975,'2019-12-27','SimpleScreenRecorder and Vidcutter',311,'Two useful applications to record a screen, and to chop and trim a video ','<p>In today’s show Ken talks about two small applications to make recording and trimming video easy.</p>\r\n<h3>What is SimpleScreenRecorder?</h3>\r\n<blockquote>\r\n<p>SimpleScreenRecorder is a Linux program that I’ve created to record programs and games. There were already a few programs that could do this, but I wasn’t 100% happy with any of them, so I created my own.</p>\r\n<p>My original goal was to create a program that was just really simple to use, but as I was writing it I started adding more and more features, and the result is actually a pretty powerful program. It’s ‘simple’ in the sense that it’s easier to use than ffmpeg/avconv or VLC, because it has a straightforward user interface.</p>\r\n</blockquote>\r\n<h3>What is VidCutter</h3>\r\n<blockquote>\r\n<p>The simplest &amp; sexiest tool for cutting and joining your videos without the need for re-encoding or a diploma in multimedia. VidCutter focuses on getting the job done using tried and true tech in its arsenal via mpv and FFmpeg.</p>\r\n</blockquote>\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://www.maartenbaert.be/simplescreenrecorder/\">SimpleScreenRecorder</a> Homepage</li>\r\n<li><a href=\"https://github.com/ozmartian/vidcutter\">vidcutter</a> Homepage</li>\r\n<li><a href=\"https://www.linuxandubuntu.com/home/vidcutter-linux-video-cutting-or-trimming-app\">VidCutter – Linux Video Cutting Or Trimming App</a> review on <a href=\"https://www.linuxandubuntu.com/\">Linux And Ubuntu</a></li>\r\n</ul>\r\n',30,0,1,'CC-BY-SA','SimpleScreenRecorder, Vidcutter, ffmpeg, ffprobe, mediainfo',0,0,1),
(2980,'2020-01-03','FLOSS Weekly 553 - Hacker Public Radio',4037,'Randal Schwartz and Aaron Newcomb featured HPR on FLOSS Weekly ','<p>On the 30th Oct 2019 <a href=\"https://hackerpublicradio.org/correspondents/0198.html\">Kevin O’Brien (Ahuka)</a> and <a href=\"https://hackerpublicradio.org/correspondents/0030.html\">Ken Fallon</a> were interviewed about <a href=\"https://hackerpublicradio.org\">Hacker Public Radio</a> by <a href=\"https://twit.tv/people/randal-schwartz\">Randal Schwartz</a> and <a href=\"https://twit.tv/people/aaron-newcomb\">Aaron Newcomb</a> for <a href=\"https://twit.tv/shows/floss-weekly/episodes/553\">FLOSS Weekly 553</a>.</p>\r\n<p>This is that show and is released under a <a href=\"https://creativecommons.org/licenses/by-nc-nd/4.0/\">Creative Commons Attribution Non-Commercial No-Derivatives 4.0 International license</a>.</p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://twit.tv/people/randal-schwartz\">https://twit.tv/people/randal-schwartz</a></li>\r\n<li><a href=\"https://twit.tv/people/aaron-newcomb\">https://twit.tv/people/aaron-newcomb</a></li>\r\n<li><a href=\"https://twit.tv/shows/floss-weekly/episodes/553\">https://twit.tv/shows/floss-weekly/episodes/553</a></li>\r\n<li><a href=\"https://creativecommons.org/licenses/by-nc-nd/4.0/\">https://creativecommons.org/licenses/by-nc-nd/4.0/</a></li>\r\n<li><a href=\"https://hackerpublicradio.org\">https://hackerpublicradio.org</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0198.html\">https://hackerpublicradio.org/correspondents/0198.html</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0030.html\">https://hackerpublicradio.org/correspondents/0030.html</a></li>\r\n</ul>',30,78,0,'CC-BY-NC-ND','Randal Schwartz, Aaron Newcomb, FLOSS Weekly',0,0,1),
(2962,'2019-12-10','Bespoke bike building',1474,'Brian in Ohio continues his bike building project','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1282\">hpr 1282</a> john kulps efforts</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2869\">hpr 2869</a> part one of my build</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2875\">hpr 2875</a> part two</li>\r\n<li>recycled recumbent<br />\r\n<a href=\"https://sites.google.com/site/recycledrecumbents/home\" class=\"uri\">https://sites.google.com/site/recycledrecumbents/home</a></li>\r\n<li>fish mouth cutting on recumbents.com<br />\r\n<a href=\"https://www.wisil.recumbents.com/wisil/Plans/frametubes.htm\" class=\"uri\">https://www.wisil.recumbents.com/wisil/Plans/frametubes.htm</a></li>\r\n</ul>\r\n<h2 id=\"pictures\">Pictures</h2>\r\n<p>(The images below may be clicked to view the full-sized versions)</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture01-mocking-up-the-parts.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture01-mocking-up-the-parts-small.jpg\" alt=\"Mocking up parts\" /></a><br />\r\nmocking up parts to see spacing, especially the crankset</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture02-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture02-cutting-fishmouths-small.jpg\" alt=\"Laying out fishmouths\" /></a><br />\r\nlaying out ‘fishmouth’ cut, used to connect two tubes</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture03-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture03-cutting-fishmouths-small.jpg\" alt=\"Cutting fishmouths\" /></a><br />\r\nlay out fishmouth</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture04-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture04-cutting-fishmouths-small.jpg\" alt=\"Cutting fishmouths\" /></a><br />\r\nanother layout picture, note marks on tube</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture05-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture05-cutting-fishmouths-small.jpg\" alt=\"Cutting fishmouths\" /></a><br />\r\nfinished product</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture06-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture06-cutting-fishmouths-small.jpg\" alt=\"Cutting fishmouths\" /></a><br />\r\ntest fitting assembly one, the engine room</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture07-assembly-one-complete.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture07-assembly-one-complete-small.jpg\" alt=\"Brazing complete\" /></a><br />\r\nbrazing complete! assembly one done</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture08-readying-assembly-two.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture08-readying-assembly-two-small.jpg\" alt=\"Readying assembly\" /></a><br />\r\nsetting up assembly tube, gray tube slips inside the red tube</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture09-readying-assemby-two.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture09-readying-assemby-two-small.jpg\" alt=\"Removing tab\" /></a><br />\r\nneed to cut that small tab off, get to hear this in the recording</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture10-jigging-up-assembly2.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture10-jigging-up-assembly2-small.jpg\" alt=\"Jigging up\" /></a><br />\r\njigging up the frame, similar to john kulps set up, see hpr 1282</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture11-assemby2-done.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture11-assemby2-done-small.jpg\" alt=\"Still in the jig\" /></a><br />\r\nstill in the jig but all brazed up, top half of frame done!</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/picture12-next-next-brazing-here.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/picture12-next-next-brazing-here-small.jpg\" alt=\"More brazing to do\" /></a><br />\r\nthe next part will be modifiying the rear triangle and brazing it where i’m pointing to.</p>\r\n<h2 id=\"summary\">Summary</h2>\r\n<ul>\r\n<li>all in all, went better than expected, i’ll clean up those brazing joints after the bike is done and has been ridden for a while, before I paint it.</li>\r\n<li>brazing isn’t as difficult as i thought it might be. give it a try its a cool hacker skill!</li>\r\n</ul>\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent, recycle',0,0,1),
(2963,'2019-12-11','A walk through my PifaceCAD Python code – Part 3',880,'In this episode I cover functions activated when a button is pushed on the PiFaceCAD board','<h3 id=\"code\">Code</h3>\r\n<p>The script being discussed in this show is available for download with the previous show: <a href=\"https://hackerpublicradio.org/eps/hpr2951/cad-menu.py\">cad-menu.py</a></p>\r\n<h3 id=\"functions\">Functions</h3>\r\n<ul>\r\n<li><p><code>def button0(event):</code><br />\r\nPlay / Pause Button<br />\r\nPrint message to lcd and toggle between play and pause for podcasts, then runs <code>init_display</code> to display available options</p></li>\r\n<li><p><code>def button1(event):</code><br />\r\nTrack Information button<br />\r\nPrint message to lcd then display current moc track information such as moc state, current time, time left, current playlist number of total playlist number &amp; podcast title.<br />\r\n<br />\r\nExample output from command <code>mocp --info</code></p>\r\n<pre><code>State: PAUSE\r\nFile: /home/pi/files/mp3/hpr1597.mp3\r\nTitle: Steve Smethurst - HPR1597: Extravehicular Activity (Hacker Public Radio)\r\nArtist: Steve Smethurst\r\nSongTitle: HPR1597: Extravehicular Activity\r\nAlbum: Hacker Public Radio\r\nTotalTime: 14:11\r\nTimeLeft: 02:47\r\nTotalSec: 851\r\nCurrentTime: 11:24\r\nCurrentSec: 684\r\nBitrate: 64kbps\r\nAvgBitrate: 64kbps\r\nRate: 44kHz</code></pre></li>\r\n<li><p><code>def button2(event):</code><br />\r\nPrevious Track Button<br />\r\nButton is only active if button is pushed twice within 0.3 seconds. This was added to stop moving to a new track by accidental pushing of button. If menu = 0 or 1 and value of variable TimeDiff is less than 0.3 then Print message to lcd and move to previous track in playlist. If menu = 2 and button pressed twice within 0.3 then display number of HPR shows in the queue</p></li>\r\n<li><p><code>def button3(event):</code><br />\r\nNext track Button<br />\r\nButton is only active if button is pushed twice within 0.3 seconds. This was added to stop moving to a new track by accidental pushing of button. If menu = 0 or 1 and value of variable TimeDiff is less than 0.3 then Print message to lcd and move to next track in playlist Button currently has no function if menu = 2</p></li>\r\n<li><p><code>def button4(event):</code><br />\r\nToggle backlight Button<br />\r\nIf 1st time button is pushed then turn off blinkstick and display main menu else Toggle lcd backlight between on and off</p></li>\r\n<li><p><code>def moc_seek():</code><br />\r\nUsed to seek backward or forward in track being played in mocp SeekPosition is a global variable used to store the current seek position, its value changes up and down when using button6 and button7</p></li>\r\n<li><code>def button5(event):</code><br />\r\nJogg switch<br />\r\nThis button is selected by momentarily pushing in the left/right toggle button. Button located on the top of unit<br />\r\n\r\n<ul>\r\n<li>If menu equals 0 or 1, [PODCASTS or AUDIOBOOKS] menu then<br />\r\n\r\n<ul>\r\n<li>if not in seek menu then display seek menu</li>\r\n<li>if in seek menu then jump forward or back in track by the amount currently displayed on the seek menu, uses function <code>moc_seek()</code></li>\r\n</ul></li>\r\n<li>If menu equals 2, [SYSTEM] menu then\r\n<ul>\r\n<li>Get date and time information, Clear screen, turn on LCD backlight print the shutdown message with date and time info to lcd &amp; then issue the shutdown command</li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<!-- -->\r\n<ul>\r\n<li><code>def button6(event):</code><br />\r\nLeft Jogg switch decrement through menus also used during seek<br />\r\nThis button is selected by momentarily pushing the toggle switch to the left. Button located on the top of unit<br />\r\nButton only active if more than 0.3 seconds has passed since it was last pushed, this was added to get around switch bounce causing multiple jumps in menu, think left and right jogg switch is a bit noisy.\r\n<ul>\r\n<li>If in seek menu\r\n<ul>\r\n<li>SeekPosition decrements by one until SeekMin is reached, and then returns to 0</li>\r\n<li>each time the display is updated with the decremented value stored in dictionary SeekDisplay</li>\r\n</ul></li>\r\n<li>If not in seek menu\r\n<ul>\r\n<li>Menu decrements down by one until MenuMin is reached then rolls over to MenuMax</li>\r\n</ul></li>\r\n</ul></li>\r\n<li><p><code>def button7(event):</code><br />\r\nSame as button6 above but instead increments value, i.e. menu or seek value is incremented by 1</p></li>\r\n<li><p><code>def print_ir_code(event):</code><br />\r\nUsed during debugging to get remote control working, came from piface examples page, prints IR code <code>print(event.ir_code)</code></p></li>\r\n<li><p><code>def ir_play(event):</code><br />\r\nIf the play button is pushed on the remote control twice within 0.5 seconds and if IR is active then toggle backlight and toggle between play and pause</p></li>\r\n<li><p><code>def ir_info(event):</code><br />\r\nIf the info button (pause) is pushed on the remote control twice within 0.5 seconds and if IR is active then toggle backlight and display on the LCD information about the current track</p></li>\r\n<li><p><code>def ir_rewind(event):</code><br />\r\nIf the rewind button is pushed on the remote control and if IR is active then toggle backlight and go to previous track on playlist</p></li>\r\n<li><p><code>def ir_forward(event):</code><br />\r\nIf the forward button is pushed on the remote control and if IR is active then toggle backlight and go to next track on playlist</p></li>\r\n<li><p><code>def ir_stop(event):</code><br />\r\nIf the stop button is pushed on the remote control and if IR is active then toggle backlight</p></li>\r\n<li><p><code>def ir_blue(event):</code><br />\r\nActivate and deactivate IR buttons on the remote control, turns blinkstick on red when IR active. When blue button is pushed twice within 0.5 seconds on remote control, toggle backlight and display momentary message on LCD display giving IR status i.e. are the remote control buttons active or deactive.<br />\r\n<br />\r\nAll remote buttons bar this one are affected. This feature was added to remotely disable all the buttons while using the TV remote control media buttons these would sometimes falsely trigger things<br />\r\n<br />\r\nThe double push of the blue button within 0.5 seconds was added as sometimes a single push of it was required on my TV and this would falsely activate it<br />\r\n<br />\r\nFeature added to check if var FirstPass is set to true, i.e. backlight button4 has not pushed since boot<br />\r\n<br />\r\nbutton4 normally toggles backlight but turns off hpr queue LED first time it’s pushed after boot.</p></li>\r\n</ul>\r\n',201,38,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(2964,'2019-12-12','Bolos and Bowties: Neckwear for Nerds',980,'I talk about ties, at least the kind I like to wear when the occasion calls for it.','<p>It\'s probably because of a non-conformist streak in me, but I\'ve never liked traditional neckties. In fact I never wanted to wear any ties until I got my first bolo tie, which was sufficiently different from everyone else and easy enough to put on that I decided I could wear bolo ties. I\'ve built a collection of about a dozen of these and they always get positive comments, especially the ones made from recycled circuit boards. Recently I\'ve expanded my horizons to include bowties, which have a more formal appearance and the added nerd factor of being difficult to tie for most people. In this episode I talk about my ties.</p>\r\n\r\n<h3>Click image to view photo gallery</h3>\r\n\r\n<p><a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/137675441@N05/albums/72157711876166718\" title=\"Bolos and Bowties\"><img src=\"https://live.staticflickr.com/65535/49100398632_cf81d6b66b.jpg\" width=\"500\" height=\"281\" alt=\"Bolos and Bowties\"></a></p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://circuitbreakerlabs.myshopify.com/\" target=\"_blank\">Circuit Breaker Labs</a> upcycled Jewelry made from circuit boards.</li>\r\n	<li><a href=\"https://www.hightidebowties.com/blogs/news/15522315-10-reasons-why-you-should-wear-a-bow-tie\">10 Reasons to Wear a Bowtie</a></li>\r\n</ul>\r\n',238,0,0,'CC-BY-SA','Style, Fashion, Recycling, Upcycling, Circuit Boards, Ties, Bowties, Bolo Ties, Neck ties',0,0,1),
(2969,'2019-12-19','Crewing a spaceship in Haskell',1358,'How to calculate amount of crew needed for a spaceship','<h2 id=\"intro\">Intro</h2>\r\n<p>Every spaceship in game needs a crew to operate it. Smaller ships with fewer components require less crew than huge ones with lots of components.</p>\r\n<h2 id=\"types\">Types</h2>\r\n<p>Unit stats lists amount of crew required to operate a spaceship and if they need sleeping quarters.</p>\r\n<pre><code>data UnitStats = UnitStats\r\n    { unitStatsMinimumCrew :: ![CrewRequirement]\r\n    , unitStatsNominalCrew :: ![CrewRequirement]\r\n    , unitStatsCrewSpace :: !TotalCrewSpace\r\n    , unitStatsCrewSpaceRequired :: !CrewSpaceReq\r\n    } deriving (Show, Read, Eq)</code></pre>\r\n<p>Different positions a crew can have is an enumeration:</p>\r\n<pre><code>data CrewPosition =\r\n    Commander\r\n    | Navigator\r\n    | Signaler\r\n    | SensorOperator\r\n    | Gunner\r\n    | Doctor\r\n    | Nurse\r\n    | Driver\r\n    | Helmsman\r\n    | Artificer\r\n    | Crew\r\n    | Passenger\r\n    deriving (Show, Read, Eq, Enum, Bounded)\r\nderivePersistField &quot;CrewPosition&quot;</code></pre>\r\n<p>Rank of a crew member isn’t a military rank, but rather their position in ship’s internal hierarchy:</p>\r\n<pre><code>data CrewRank =\r\n    SecondClass\r\n    | FirstClass\r\n    | Senior\r\n    | Chief\r\n    deriving (Show, Read, Eq, Enum, Bounded)\r\nderivePersistField &quot;CrewRank&quot;</code></pre>\r\n<p>Amount of crew is newtype that helps me not to mix different types of numbers with each other.</p>\r\n<pre><code>newtype CrewAmount = CrewAmount { unCrewAmount :: Int }\r\n    deriving (Show, Read, Eq, Ord, Num)</code></pre>\r\n<p>Total crew space of a ship is divided to three different types: steerage, standard and luxury.</p>\r\n<pre><code>data TotalCrewSpace = TotalCrewSpace\r\n    { totalCrewSpaceSteerage :: !(CrewSpace SteerageQuarters)\r\n    , totalCrewSpaceStandard :: !(CrewSpace StandardQuarters)\r\n    , totalCrewSpaceLuxury :: !(CrewSpace LuxuryQuarters)\r\n    } deriving (Show, Read, Eq)</code></pre>\r\n<p>Again, crew space is newtype so I don’t mix different types of numbers with each other.</p>\r\n<pre><code>data CrewSpace a =\r\n    CrewSpace { unCrewSpace :: CrewAmount }\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>I could have modeled fact that vehicle might need crew space with <code>Bool</code>, but having a descriptive name and type is more to my liking.</p>\r\n<pre><code>data CrewSpaceReq =\r\n    CrewSpaceRequired\r\n    | CrewSpaceOptional\r\n    deriving (Show, Read, Eq)\r\nderivePersistField &quot;CrewSpaceReq&quot;</code></pre>\r\n<p>The fact that single person could manage multiple components is reflected by <code>ComponentCrewReq</code> having <code>Double</code> instead of <code>Integer</code></p>\r\n<pre><code>-- | Crew requirements for a component\r\ndata ComponentCrewReq =\r\n    ComponentCrewReq CrewPosition Double\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>If you have questions, comments or feedback, easiest way to catch me nowdays is by email or in fediverse where I’m <code>Tuula@mastodon.social</code></p>\r\n',364,107,0,'CC-BY-SA','haskell, problem solving',0,0,1),
(2965,'2019-12-13','instant feedback for students in maths',838,'How we use old CAS software to give students instant feedback in their maths homework','<p>I\'m trying to make sure that this show doesn\'t come across as as advertisment placement on HPR I won\'t provide a link to our application (which wouldn\'t help a lot anyway as we don\'t really have much of a web site anyway.).</p>\r\n<p>However I\'ll link to some of the technical components:</p>\r\n<p>The Computer Algebra System we use is called <a href=\"https://maxima.sourceforge.net/\">Maxima</a>, its history goes back to the early 80s. It\'s written in common lisp.</p>\r\n<p>We have considered switching to <a href=\"https://www.sympy.org/\">SymPy</a> as a more modern alternative. SymPy doesn\'t offer the feature completeness Maxima does, though. It has still a long way to go.</p>\r\n<p>Our servers run <a href=\"https://debian.org/\">Debian</a>. The current version is written in <a href=\"https://www.php.net/\">PHP</a> but we are working on a new version based on dockerized <a href=\"https://www.djangoproject.com/\">Django</a> with a JS frontend in <a href=\"https://emberjs.com/\">Ember</a> along with some micro services written in <a href=\"https://golang.org/\">Go</a>, <a href=\"https://python.org/\">Python</a> and <a href=\"https://www.php.net/\">PHP</a>.</p>\r\n<p>To render math we use <a href=\"https://www.mathjax.org/\">MathJax</a> in the current version and <a href=\"https://katex.org/\">KaTeX</a> in the new version. The PDF-export of worksheets is of course done in <a href=\"https://www.latex-project.org/\">LaTeX</a>.</p>',288,0,0,'CC-BY-SA','maths,education,learning',0,0,1),
(2966,'2019-12-16','World of Commodore 2019 Episode 1: The Interviews',1174,'In this first episode, I interview exhibitors and members at the World of Commodore in 2019.','<p>Hello, good people of Hacker Public Radio, my name is Paul Quirk and this is my very first ever podcast. I would like to give credit Klaatu of Gnu World Order for making me aware of Hacker Public Radio, which I’ve been a listener of for the past year. As we near the holiday season of the winter solstice, I decided to give back to the open source community with this gift of a mini series of podcasts about the World of Commodore from December 7, 2019.</p>\r\n<p>The World of Commodore is an annual computer expo dedicated to Commodore computers that is normally held on the first Saturday of December in the city of Mississauga, Ontario. It started off back in 1983 by Commodore Canada as a trade show where Commodore and related vendors could showcase their latest products for the holiday season. As a Commodore computer nerd kid of the 1980’s living within an hour’s drive of Mississauga, this was an event I always looked forward to with excitement. For me, this was bigger and better than Santa Claus. Commodore went bankrupt in 1994, but a decade later, the show was revived by the Toronto PET user’s group, or TPUG, one of the world’s oldest computer user groups of which I am a member. Today’s World of Commodore is very different from the expo’s of the 1980’s, and has transformed into an event where hackers from around the world gather together to share ideas and show off their own discoveries and products, both open source and commercial.</p>\r\n<p>Since many listeners and contributors of Hacker Public Radio got started with a Commodore computer at some time, and since this event has grown beyond Commodore products and into open source hardware and software, I thought this event would be of great interest to this community, and it is my hope that many of you listeners might join us at next year’s World of Commodore.</p>\r\n<p>I have decided to create a miniseries of podcasts of this event which I will release on a weekly schedule. In this first episode, I walk around the trade show floor and interview various exhibitors, vendors, and members of TPUG. As there is a visual element to this podcast, I have posted pictures of the exhibits in my personal non-commercial blog at pquirk.com, which I encourage you to visit in order to get the full experience. And so, with no further ado, let’s all go to the wonderful world of Commodore.</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://signalsfromspace.ca/\" class=\"uri\">https://signalsfromspace.ca/</a></li>\r\n<li><a href=\"https://doublesidedgames.com/\" class=\"uri\">https://doublesidedgames.com/</a></li>\r\n<li><a href=\"https://pquirk.com/2019/12/08/world-of-commodore-2019-episode-1/\" class=\"uri\">https://pquirk.com/2019/12/08/world-of-commodore-2019-episode-1/</a></li>\r\n</ul>\r\n',383,103,0,'CC-BY-SA','Commodore,PET,Amiga,Gecko,retro',0,0,1),
(2967,'2019-12-17','Wrestling As You Like It Episode 2',1599,'Wrestling As You Like It Episode 2','<p>Today’s episode is about the landscape of professional wrestling today, the hierarchy, and how it came to be that way, and a brief explanation of different styles of professional wrestling.</p>',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1),
(2970,'2019-12-20','The Fediverse',1142,'The Fediverse is the open network of social media platforms','<p>The Fediverse is the name given to the collection of social media platforms that are distributed and interconnected. Distributed means that the servers are not centrally controlled, but are available to users in a variety of forms and conditions. And interconnected means they use protocols that are designed to allow communication between different platforms as well as different servers. The most common of these protocols is ActivityPub.</p>\r\n<p><a href=\"https://www.zwilnik.com/?page_id=1050\" class=\"uri\">https://www.zwilnik.com/?page_id=1050</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\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://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/\" class=\"uri\">https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/</a></li>\r\n<li><a href=\"https://www.w3.org/TR/activitypub/\" class=\"uri\">https://www.w3.org/TR/activitypub/</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://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/\" class=\"uri\">https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/</a></li>\r\n<li><a href=\"https://github.com/pump-io/pump.io/blob/master/API.md\" class=\"uri\">https://github.com/pump-io/pump.io/blob/master/API.md</a></li>\r\n<li><a href=\"https://blog.diasporafoundation.org/4-islamic-state-fighters-on-diaspora\" class=\"uri\">https://blog.diasporafoundation.org/4-islamic-state-fighters-on-diaspora</a></li>\r\n<li><a href=\"https://emojos.in/\" class=\"uri\">https://emojos.in/</a></li>\r\n<li><a href=\"https://mwl.io/\" class=\"uri\">https://mwl.io/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/ActivityPub\" class=\"uri\">https://en.wikipedia.org/wiki/ActivityPub</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Diaspora_(social_network)\" class=\"uri\">https://en.wikipedia.org/wiki/Diaspora_(social_network)</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Open_standard\" class=\"uri\">https://en.wikipedia.org/wiki/Open_standard</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/OStatus\" class=\"uri\">https://en.wikipedia.org/wiki/OStatus</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/XMPP\" class=\"uri\">https://en.wikipedia.org/wiki/XMPP</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=1050\" class=\"uri\">https://www.zwilnik.com/?page_id=1050</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(2971,'2019-12-23','World of Commodore 2019 Episode 2: Hacking GeckOS',2960,'Glen Holmer explains how he got Linux running on a Commodore 64.','<ul>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n<li><a href=\"https://www.lyonlabs.org/\" class=\"uri\">https://www.lyonlabs.org/</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</ul>',383,103,0,'CC-BY-SA','Commodore,PET,Amiga,Geckos,retro,Linux,Open Source',0,0,1),
(2972,'2019-12-24','The foot of the ski slope',2681,'MrX and Dave Morriss chat about nerdy things near a ski slope','<h2 id=\"another-in-the-chat-series-from-edinburgh\">Another in the chat series from Edinburgh</h2>\r\n<h3 id=\"hosted-by-mrx1-and-dave-morriss2\">Hosted by <a href=\"https://hackerpublicradio.org/correspondents/0201.html\" title=\"MrX\">MrX</a> and <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" title=\"Dave Morriss\">Dave Morriss</a></h3>\r\n<p>This time we met up for breakfast on Sunday 24<sup>th</sup> November in a pub/restaurant in an area called <a href=\"https://en.wikipedia.org/wiki/Hillend,_Edinburgh\" title=\"Hillend, Midlothian\">Hillend</a>, just outside Edinburgh in <a href=\"https://en.wikipedia.org/wiki/Midlothian\" title=\"Midlothian municipal district\">Midlothian</a>. The hill close by is the location of the <a href=\"https://en.wikipedia.org/wiki/Midlothian_Snowsports_Centre\" title=\"Midlothian Snowsports Centre\">Midlothian Snowsports Centre</a>, an artificial Ski Slope which is very popular in the region for recreation and training.</p>\r\n<p>We chatted for a while inside then moved to <em>Studio C</em> in the car park and recorded this episode.</p>\r\n<h3 id=\"pdas-and-the-like\">PDAs and the like</h3>\r\n<p>We were talking about PDAs (Personal Data Assistants) from the 1980’s.</p>\r\n<ul>\r\n<li>MrX had recently been offered a <a href=\"https://en.wikipedia.org/wiki/Gemini_(PDA)\" title=\"Gemini PDA\">Gemini</a> device and had at one time owned a <a href=\"https://en.wikipedia.org/wiki/Psion_Series_3\" title=\"Psion Series 3\">Psion Series 3c</a>.</li>\r\n<li>Dave owns a broken <a href=\"https://en.wikipedia.org/wiki/Psion_Series_5\" title=\"Psion Series 5\">Psion Series 5</a> (and recently parted with a working one after much bargaining).</li>\r\n<li>Dave struggled to remember devices like the <a href=\"https://en.wikipedia.org/wiki/PalmPilot\" title=\"Palm Pilot\">Palm Pilot</a> which were quite popular in the 80’s and 90’s. These had no keyboard, but offered a touch-sensitive screen, used with a stylus, and had handwriting recognition<a href=\"#fn1\" class=\"footnote-ref\" id=\"fnref1\"><sup>1</sup></a>.</li>\r\n<li>MrX mentioned the Compaq <a href=\"https://en.wikipedia.org/wiki/IPAQ\" title=\"Compaq/HP iPAQ PDA\">iPAQ PDA</a> (Compaq was later acquired by Hewlett Packard) from the 2000’s, which was a much advanced PDA with similar features.</li>\r\n</ul>\r\n<h3 id=\"software-annoyances\">Software annoyances</h3>\r\n<ul>\r\n<li>Mr X has had some problems with the latest Audacity on Ubuntu. It sometimes does not launch from the menu link after an upgrade.</li>\r\n<li>Calibre on Dave’s <em>Debian Testing</em> system has stopped working recently, due to a Python error.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></li>\r\n<li>Dave uses Clementine, the music player, which turns off the UI when you close it down the wrong way and apparently doesn’t provide a way to enable it again without hacking the configuration file<a href=\"#fn3\" class=\"footnote-ref\" id=\"fnref3\"><sup>3</sup></a>.</li>\r\n<li>MrX had problems with audio device recognition and uses <code>hdajackretask</code> to correct this. This is part of the <code>alsa-tools-gui</code> package on Debian (and related)<a href=\"#fn4\" class=\"footnote-ref\" id=\"fnref4\"><sup>4</sup></a>, but has a non-intuitive UI.</li>\r\n</ul>\r\n<h3 id=\"os-choices\">OS choices</h3>\r\n<ul>\r\n<li>Dave uses Raspbian Lite on his headless Raspberry Pis (which he secures using advice from Ken Fallon’s HPR show on preparing the <a href=\"https://hackerpublicradio.org/eps.php?id=2356\" title=\"hpr2356 :: Safely enabling ssh in the default Raspbian Image\">Raspbian image</a>).</li>\r\n<li>MrX uses standard Raspian on RPis, Ubuntu as his main Linux version, as well as OSMC (Open Source Media Center) on a Raspberry Pi, for watching media.</li>\r\n<li>Dave originally started with Fedora (actually Red Hat version 4 for a brief time) then moved to Ubuntu (Kubuntu) before moving to Debian Testing on his desktop, and KDE Neon on his laptop.</li>\r\n<li>Both had used Crunchbang at one point, another Debian-based distribution.</li>\r\n</ul>\r\n<h3 id=\"a-few-other-topics\">A few other topics</h3>\r\n<ul>\r\n<li>MrX uses a Wiki service (<a href=\"https://www.wikidot.com/\" class=\"uri\">https://www.wikidot.com/</a>). Dave uses MediaWiki on a Raspberry Pi and has scripts that update some of the contents (mainly tables). There was discussion about using Pandoc (<a href=\"https://pandoc.org/\" class=\"uri\">https://pandoc.org/</a>) to generate MediaWiki markup from something like Markdown.</li>\r\n<li>Emulating a Bash session in a web browser. One example is: <a href=\"https://bellard.org/jslinux/\" class=\"uri\">https://bellard.org/jslinux/</a></li>\r\n<li>Online Python tools. For example: <a href=\"https://repl.it/languages/python3\" class=\"uri\">https://repl.it/languages/python3</a></li>\r\n<li>Midnight Commander (<a href=\"https://midnight-commander.org/\" class=\"uri\">https://midnight-commander.org/</a>) contains its own editor.</li>\r\n<li>Notepadqq (<a href=\"https://notepadqq.com/\" class=\"uri\">https://notepadqq.com/</a>) is a Notepad++-like editor for the Linux desktop.</li>\r\n<li>File managers:\r\n<ul>\r\n<li>MrX has problems with the Ubuntu file manager; he uses Nemo (<a href=\"https://en.wikipedia.org/wiki/Nemo_(file_manager)\" class=\"uri\">https://en.wikipedia.org/wiki/Nemo_(file_manager)</a>) for its more advanced features</li>\r\n<li>Dave uses KDE’s Dolphin (<a href=\"https://en.wikipedia.org/wiki/Dolphin_(file_manager)\" class=\"uri\">https://en.wikipedia.org/wiki/Dolphin_(file_manager)</a>)</li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Location:\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Hillend,_Edinburgh\">Hillend</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Midlothian\">Midlothian</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Midlothian_Snowsports_Centre\">Midlothian Snowsports Centre</a> (Wikipedia)</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>PDAs (Personal Data Assistants - <a href=\"https://en.wikipedia.org/wiki/Personal_digital_assistant\">Wikipedia page</a>)\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Psion_Organiser\">Psion Organiser II</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Psion_Series_3\">Psion Series 3</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Psion_Series_5\">Psion Series 5</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/PalmPilot\">Palm Pilot</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Gemini_(PDA)\">Gemini PDA</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/IPAQ\">Compaq/HP iPAQ PDA</a> (Wikipedia)</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Compaq computers\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/IPAQ_(desktop_computer)\">iPAQ</a></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Software niggles:\r\n<ul>\r\n<li><a href=\"https://www.audacityteam.org/\">Audacity software</a></li>\r\n<li><a href=\"https://calibre-ebook.com/\">Calibre e-book Manager</a></li>\r\n<li><a href=\"https://www.clementine-player.org/\">Clementine music player</a></li>\r\n<li><code>hdajackretask</code> from the <a href=\"https://alsa-project.org/wiki/Main_Page\">ALSA Project</a></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Operating system choices:\r\n<ul>\r\n<li><a href=\"https://www.raspberrypi.org/downloads/raspbian/\">Raspbian Lite</a>\r\n<ul>\r\n<li>Dave’s HPR show about his <a href=\"https://hackerpublicradio.org/eps.php?id=2496\"><code>what_pi</code></a> script</li>\r\n</ul></li>\r\n<li><a href=\"https://osmc.tv/\">Open Source Media Center (OSMC)</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/CrunchBang_Linux\">Crunchbang Linux</a> (Wikipedia)</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>MrX’s shows that we were talking about:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2879\">Describing how I listen to podcasts PART 1</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2889\">Describing how I listen to podcasts PART 2</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2901\">Describing how I listen to podcasts PART 3</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2914\">Describing how I listen to podcasts PART 4</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2923\">Describing how I listen to podcasts PART 5</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2933\">A walk through my PifaceCAD Python code – Part 1</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2951\">A walk through my PifaceCAD Python code – Part 2</a></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>The previous episode:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2905\">Two HPR hosts living in the same region finally meet up!</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><small>The person using a Palm Pilot to take meeting notes had an external keyboard, and wasn’t using handwriting recognition!</small><a href=\"#fnref1\" class=\"footnote-back\">↩</a></p></li>\r\n<li id=\"fn2\"><p><small><code>calibre</code> was failing with the error: <code>ImportError: No module named functools_lru_cache</code>. It later proved possible to fix this by reinstalling a Python module: <code>pip2 install --force backports.functools_lru_cache</code></small><a href=\"#fnref2\" class=\"footnote-back\">↩</a></p></li>\r\n<li id=\"fn3\"><p><small>There have been no releases of Clementine since 2016 sadly, though there are more recent changes on the GitHub page.</small><a href=\"#fnref3\" class=\"footnote-back\">↩</a></p></li>\r\n<li id=\"fn4\"><p><small>Information on the web about <em>alsa-tools-gui</em> seems a little sparse. The <em>hdajackretask</em> application has a README file in the distribution that gives some information.</small><a href=\"#fnref4\" class=\"footnote-back\">↩</a></p></li>\r\n</ol>\r\n</section>',225,0,1,'CC-BY-SA','HPR,hosts,meeting,technology',0,0,1),
(2976,'2019-12-30','A walk through my PifaceCAD Python code – Part 4',391,'This is the last show in the series and covers the main program section at the bottom of my script','<p>This is the last show in the series. The series was recorded in one go and split into multiple parts. This last section is pretty short; it covers the main program section at the bottom of my script that calls all the other functions and allows the user to quit the program. In this episode I also mention explanatory notes that I included in my script. These are mainly for my own benefit so I could remember how I set up lirc. I’ve included these notes at the end of these show notes.</p>\r\n<p><b>Main program</b><br />\r\nTurn LCD backlight on, print <em>System up</em> message to LCD, wait a few seconds then clear screen. Activate push buttons on control and display board. Activates various IR buttons waiting on input from the remote control. Print quit message to terminal, waiting for input, repeat message until q is entered by user. When q is entered deactivate buttons and turn LCD backlight off.</p>\r\n<p>Below are my Lirc explanatory comments at the end of my Python script.</p>\r\n<blockquote>\r\n<p><code>lirc</code><br />\r\nThis is the Linux IR control program<br />\r\nLIRC (Linux Infrared remote control) is an open source package that allows users to receive and send infrared signals with a Linux-based computer system.</p>\r\n<p><code>Irrecord</code><br />\r\nTool used to record valid IR codes from your remote control. It generates the file <code>/etc/lirc/lircd.conf</code>, possibly overwrites original file so use with caution. It attempts to recognise your remote control from a series of button pushes. If the remote is not recognised then it captures the codes in raw mode, I abandoned this tool and got a valid IR file for a very similar remote control on the internet, see info below</p>\r\n<p><code>/etc/lirc/lircd.conf</code><br />\r\nFile used to store IR codes for your remote control, either using the tool <code>irrecord</code> or from somewhere on the internet. This file is a direct copy of file <code>\"BN59-00861A-SAMSUNG-TV.conf\"</code> I added the Samsung TV string to the file name.</p>\r\n<p><code>irw</code><br />\r\nTool used to get the key names for your particular remote control, for this to work you must first have a valid <code>/etc/lirc/lircd.conf</code> file</p>\r\n<p><code>~/.lircrc</code><br />\r\nThis file is used to store the remote control key names that you want to activate, and what action is to be taken when the button is pushed. Adding the field <code>\"remote =\"</code> allows the use of multiple remote controls. The remote control key names can be found by using the command <code>\"irw\"</code>, I created a file called <code>~/scripts/remote-key-names-sorted.txt</code> to store the valid key names for my Samsung remote control</p>\r\n<p><code>~/scripts/remote-key-names-sorted.txt</code><br />\r\nList of valid remote control key names for my Samsung remote control, this was generated using the <code>irw</code> command. I used the <code>\"tee\"</code> command to pipe output to the screen and write output to this file at the same time, see file for further details of commands I used.</p>\r\n</blockquote>\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(3241,'2021-01-04','HPR Community News for December 2020',4055,'HPR Volunteers Dave, ToeJet, and Ken talk about shows released and comments posted in December 2020','<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/0011.html\" target=\"_blank\">Pat from TLLTS</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=3217\" target=\"_blank\">3217</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3217\" target=\"_blank\">Sump Minion</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=3218\" target=\"_blank\">3218</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3218\" target=\"_blank\">An introduction to Darktable</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3219\" target=\"_blank\">3219</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3219\" target=\"_blank\">Linux Inlaws S01E18: Voice Recognition and Text to Speech</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=3220\" target=\"_blank\">3220</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-12-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3220\" target=\"_blank\">PixelFed</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=3221\" target=\"_blank\">3221</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-12-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3221\" target=\"_blank\">HPR Community News for November 2020</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=3222\" target=\"_blank\">3222</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3222\" target=\"_blank\">Musings about writing a book about the Odoo software suite</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3223\" target=\"_blank\">3223</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3223\" target=\"_blank\">My COVID year summary</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">b-yeezi</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3224\" target=\"_blank\">3224</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3224\" target=\"_blank\">Adventures in Retrocomputing with the Mac Plus</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3225\" target=\"_blank\">3225</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-12-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3225\" target=\"_blank\">Grill repair</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=3226\" target=\"_blank\">3226</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-12-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3226\" target=\"_blank\">Using taskwarrior to structurize your work</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3227\" target=\"_blank\">3227</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3227\" target=\"_blank\">Fresh water Aquarium Basics</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=3228\" target=\"_blank\">3228</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3228\" target=\"_blank\">YAML basics</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=3229\" target=\"_blank\">3229</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3229\" target=\"_blank\">Linux Inlaws S01E19: Redis</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=3230\" target=\"_blank\">3230</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-12-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3230\" target=\"_blank\">Introduction to 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=3231\" target=\"_blank\">3231</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-12-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3231\" target=\"_blank\">USB Key</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=3232\" target=\"_blank\">3232</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3232\" target=\"_blank\">Nextcloud</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=3233\" target=\"_blank\">3233</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3233\" target=\"_blank\">HPR RPG Club reviews Shadowrun 5e</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=3234\" target=\"_blank\">3234</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3234\" target=\"_blank\">Apple products I have owned</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=3235\" target=\"_blank\">3235</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-12-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3235\" target=\"_blank\">Soldering Tips</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=3236\" target=\"_blank\">3236</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-12-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3236\" target=\"_blank\">The State of Linux Audio Apps in 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0011.html\" target=\"_blank\">Pat from TLLTS</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3237\" target=\"_blank\">3237</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3237\" target=\"_blank\">Cloning a Hard Drive with Clonezilla</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0238.html\" target=\"_blank\">Jon Kulp</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3238\" target=\"_blank\">3238</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3238\" target=\"_blank\">Linux Inlaws S01E20: The Xmas and New Year Special</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=3239\" target=\"_blank\">3239</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3239\" target=\"_blank\">New Community Project Proposal</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</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 18 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=3090#comments\" target=\"_blank\">hpr3090</a></strong>\n(2020-06-05) \"<em>Locating Computer on a Enterprise Network</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=3090#3\" target=\"_blank\">Comment 3</a>:\nnstr on 2020-12-01:\n\"wow\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3158#comments\" target=\"_blank\">hpr3158</a></strong>\n(2020-09-09) \"<em>Fingerprint access control? LOL... </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3158#3\" target=\"_blank\">Comment 3</a>:\ncrust punk on 2020-12-03:\n\"untitled\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3207#comments\" target=\"_blank\">hpr3207</a></strong>\n(2020-11-17) \"<em>Fireside chat with E Nigma</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=3207#1\" target=\"_blank\">Comment 1</a>:\noperat0r on 2020-12-04:\n\"old days\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 15 comments on 8 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3218#comments\" target=\"_blank\">hpr3218</a></strong>\n(2020-12-02) \"<em>An introduction to Darktable</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3218#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2020-12-03:\n\"Another great show\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3218#2\" target=\"_blank\">Comment 2</a>:\nRay Arachelian on 2020-12-06:\n\"would have been useful to have this podcast as a video instead\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3218#3\" target=\"_blank\">Comment 3</a>:\nKen Fallon on 2020-12-08:\n\"Supporting Video\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3220#comments\" target=\"_blank\">hpr3220</a></strong>\n(2020-12-04) \"<em>PixelFed</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=3220#1\" target=\"_blank\">Comment 1</a>:\nsesamemucho on 2020-12-05:\n\"A complete and conclusive report\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3220#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-12-05:\n\"You are most welcome\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3223#comments\" target=\"_blank\">hpr3223</a></strong>\n(2020-12-09) \"<em>My COVID year summary</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">b-yeezi</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3223#1\" target=\"_blank\">Comment 1</a>:\nBrian-in-ohio on 2020-12-12:\n\"compliment\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3223#2\" target=\"_blank\">Comment 2</a>:\nb-yeezi on 2020-12-21:\n\"re: compliment\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3226#comments\" target=\"_blank\">hpr3226</a></strong>\n(2020-12-14) \"<em>Using taskwarrior to structurize your work</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3226#1\" target=\"_blank\">Comment 1</a>:\nJon Kulp on 2020-12-16:\n\"I like it but probably won\'t switch completely\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3226#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-12-20:\n\"Write a manual!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3227#comments\" target=\"_blank\">hpr3227</a></strong>\n(2020-12-15) \"<em>Fresh water Aquarium Basics</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=3227#1\" target=\"_blank\">Comment 1</a>:\nJon Kulp on 2020-12-16:\n\"Pictures!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3231#comments\" target=\"_blank\">hpr3231</a></strong>\n(2020-12-21) \"<em>USB Key</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><li><a href=\"https://hackerpublicradio.org/eps.php?id=3231#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2020-12-29:\n\"Great technique\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3232#comments\" target=\"_blank\">hpr3232</a></strong>\n(2020-12-22) \"<em>Nextcloud</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3232#1\" target=\"_blank\">Comment 1</a>:\nthe pro on 2020-12-22:\n\"this is a nice group\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3232#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2020-12-22:\n\"Upgrade via the UI ?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3232#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2020-12-23:\n\"Good inspiration!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3236#comments\" target=\"_blank\">hpr3236</a></strong>\n(2020-12-28) \"<em>The State of Linux Audio Apps in 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0011.html\" target=\"_blank\">Pat from TLLTS</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3236#1\" target=\"_blank\">Comment 1</a>:\nClaudioM on 2020-12-28:\n\"Links for the Episode\"</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/2020-December/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-December/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/0215.html\">Windigo</a></b></p>\n<p>Over the period tags and/or summaries have been added to 3 shows which were without them.</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),
(3261,'2021-02-01','HPR Community News for January 2021',3606,'HPR Volunteers talk about shows released and comments posted in January 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/0389.html\" target=\"_blank\">TrumpetJohn</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=3240\" target=\"_blank\">3240</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3240\" target=\"_blank\">Linux Under Attack</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=3241\" target=\"_blank\">3241</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-01-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3241\" target=\"_blank\">HPR Community News for December 2020</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=3242\" target=\"_blank\">3242</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-01-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3242\" target=\"_blank\">The eternal battle over how to run your chromebook is about to begin</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=3243\" target=\"_blank\">3243</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-01-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3243\" target=\"_blank\">Pictor - free and open radio astronomy</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3244\" target=\"_blank\">3244</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-01-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3244\" target=\"_blank\">Interview with Anco Scholte ter Horst CEO of Freedom Internet</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=3245\" target=\"_blank\">3245</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3245\" target=\"_blank\">ELECTRICITY</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=3246\" target=\"_blank\">3246</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-01-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3246\" target=\"_blank\">LXCast: freeing the Fairphone 3 (and many other phones) </a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0285.html\" target=\"_blank\">2BFrank</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3247\" target=\"_blank\">3247</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-01-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3247\" target=\"_blank\">Saturday Morning Automotive Routine</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0389.html\" target=\"_blank\">TrumpetJohn</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3248\" target=\"_blank\">3248</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-01-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3248\" target=\"_blank\">SARS-CoV-2 detection by PCR explanation</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">b-yeezi</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3249\" target=\"_blank\">3249</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-01-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3249\" target=\"_blank\">Linux Inlaws S01E21: The Big Linux Inlaws Peep Show</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=3250\" target=\"_blank\">3250</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3250\" target=\"_blank\">GIMP: Getting Started With 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=3251\" target=\"_blank\">3251</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-01-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3251\" target=\"_blank\">Opposing Views on Alcohol</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0215.html\" target=\"_blank\">Windigo</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3252\" target=\"_blank\">3252</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-01-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3252\" target=\"_blank\">Simple JSON querying tool (also YAML, and to a lesser extent XML)</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0385.html\" target=\"_blank\">crvs</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3253\" target=\"_blank\">3253</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-01-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3253\" target=\"_blank\">Pandas Intro</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=3254\" target=\"_blank\">3254</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-01-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3254\" target=\"_blank\">The Markdown editor Retext</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=3255\" target=\"_blank\">3255</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3255\" target=\"_blank\">garage door part 2</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=3256\" target=\"_blank\">3256</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-01-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3256\" target=\"_blank\">Update, MS Teams, Covid 19, Raspberry PI 400 Raspberry PI 4 8GB Centos</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=3257\" target=\"_blank\">3257</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-01-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3257\" target=\"_blank\">Lack of diversity in Linux and other open source communities</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=3258\" target=\"_blank\">3258</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-01-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3258\" target=\"_blank\">Linux Inlaws S01E22: The Linux Professional Institute</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=3259\" target=\"_blank\">3259</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-01-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3259\" target=\"_blank\">Nextcloud - The easy way</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=3260\" target=\"_blank\">3260</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3260\" target=\"_blank\">Free, Public Domain and Creative Commons Assets</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 21 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 2 comments on\n2 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3236#comments\" target=\"_blank\">hpr3236</a></strong>\n(2020-12-28) \"<em>The State of Linux Audio Apps in 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0011.html\" target=\"_blank\">Pat from TLLTS</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3236#2\" target=\"_blank\">Comment 2</a>:\nMarc Lavallee on 2021-01-10:\n\"Jack and Pulseadio\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3237#comments\" target=\"_blank\">hpr3237</a></strong>\n(2020-12-29) \"<em>Cloning a Hard Drive with Clonezilla</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0238.html\" target=\"_blank\">Jon Kulp</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3237#1\" target=\"_blank\">Comment 1</a>:\njezra on 2021-01-04:\n\"blather\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 19 comments on 12 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3240#comments\" target=\"_blank\">hpr3240</a></strong>\n(2021-01-01) \"<em>Linux Under Attack</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=3240#1\" target=\"_blank\">Comment 1</a>:\nGreat episode on 2021-01-11:\n\"Important information, thank you\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3242#comments\" target=\"_blank\">hpr3242</a></strong>\n(2021-01-05) \"<em>The eternal battle over how to run your chromebook is about to begin</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=3242#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2021-01-06:\n\"Video\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3242#2\" target=\"_blank\">Comment 2</a>:\nKlaatu on 2021-01-07:\n\"Cool skills\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3242#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-01-08:\n\"I loved the show\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3242#4\" target=\"_blank\">Comment 4</a>:\nReto on 2021-01-17:\n\"I like the concept\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3244#comments\" target=\"_blank\">hpr3244</a></strong>\n(2021-01-07) \"<em>Interview with Anco Scholte ter Horst CEO of Freedom Internet</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=3244#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-01-12:\n\"I\'m jealous!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3244#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2021-01-24:\n\"Great show for lifting the spirits\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3245#comments\" target=\"_blank\">hpr3245</a></strong>\n(2021-01-08) \"<em>ELECTRICITY</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=3245#1\" target=\"_blank\">Comment 1</a>:\nPaul Quirk on 2020-11-07:\n\"Show warning\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3246#comments\" target=\"_blank\">hpr3246</a></strong>\n(2021-01-11) \"<em>LXCast: freeing the Fairphone 3 (and many other phones) </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0285.html\" target=\"_blank\">2BFrank</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3246#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-01-19:\n\"I loved the show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3247#comments\" target=\"_blank\">hpr3247</a></strong>\n(2021-01-12) \"<em>Saturday Morning Automotive Routine</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0389.html\" target=\"_blank\">TrumpetJohn</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3247#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-01-19:\n\"Excellent!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3248#comments\" target=\"_blank\">hpr3248</a></strong>\n(2021-01-13) \"<em>SARS-CoV-2 detection by PCR explanation</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">b-yeezi</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3248#1\" target=\"_blank\">Comment 1</a>:\nnorrist on 2021-01-13:\n\"Is b-yeezi  a genius?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3248#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2021-01-20:\n\"Another fantastic show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3249#comments\" target=\"_blank\">hpr3249</a></strong>\n(2021-01-14) \"<em>Linux Inlaws S01E21: The Big Linux Inlaws Peep Show</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=3249#1\" target=\"_blank\">Comment 1</a>:\nOperat0r on 2021-01-22:\n\"greets!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3252#comments\" target=\"_blank\">hpr3252</a></strong>\n(2021-01-19) \"<em>Simple JSON querying tool (also YAML, and to a lesser extent XML)</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0385.html\" target=\"_blank\">crvs</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3252#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2021-01-29:\n\"Using this today\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3253#comments\" target=\"_blank\">hpr3253</a></strong>\n(2021-01-20) \"<em>Pandas Intro</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=3253#1\" target=\"_blank\">Comment 1</a>:\nb-yeezi on 2021-01-20:\n\"New info, even for me\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3257#comments\" target=\"_blank\">hpr3257</a></strong>\n(2021-01-26) \"<em>Lack of diversity in Linux and other open source communities</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=3257#1\" target=\"_blank\">Comment 1</a>:\nb-yeezi on 2021-01-26:\n\"I can relate\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3257#2\" target=\"_blank\">Comment 2</a>:\nTony Hughes on 2021-01-26:\n\"The lack of diversity in Linux\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3257#3\" target=\"_blank\">Comment 3</a>:\nBeeza on 2021-01-27:\n\"Thoughts on diversity\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3258#comments\" target=\"_blank\">hpr3258</a></strong>\n(2021-01-27) \"<em>Linux Inlaws S01E22: The Linux Professional Institute</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=3258#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-01-28:\n\"I loved the show\"</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-January/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-January/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/0215.html\">Windigo</a></b></p>\n<p>Over the period tags and/or summaries have been added to 3 shows which were without them.</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),
