(2624,'2018-08-23','Cycling through Brussels',1327,'On a hot day Knightwise rides his bike through Brussels.','<h2 id=\"cycling-through-brussels\">Cycling Through Brussels</h2>\r\n<ul>\r\n<li><p>Apple Store at the Guldenvlieslaan: <a href=\"https://www.apple.com/benl/retail/brussels/\" class=\"uri\">https://www.apple.com/benl/retail/brussels/</a></p></li>\r\n<li><p>Matonge District: <a href=\"https://en.wikipedia.org/wiki/Ixelles#Matong%C3%A9\">https://en.wikipedia.org/wiki/Ixelles#Matong%C3%A9</a></p></li>\r\n<li><p>René Magritte: <a href=\"https://en.wikipedia.org/wiki/Ren%C3%A9_Magritte\">https://en.wikipedia.org/wiki/Ren%C3%A9_Magritte</a></p></li>\r\n<li><p>Musee des Instruments: <img src=\"https://brusselsmuseums.imgix.net/covers/MIM-Hofberg_pano_170522_110758.jpg?w=730&amp;h=496&amp;fit=crop&amp;q=40&amp;auto=format%2Cenhance%2Ccompress\" alt=\"https://brusselsmuseums.imgix.net/covers/MIM-Hofberg_pano_170522_110758.jpg?w=730&amp;h=496&amp;fit=crop&amp;q=40&amp;auto=format%2Cenhance%2Ccompress\" /></p></li>\r\n<!-- <li><p>Musee des Instruments: <img src=\"https://brusselsmuseums.imgix.net/covers/MIM-Hofberg_pano_170522_110758.jpg\" width=\"730\" height=\"496\" alt=\"https://brusselsmuseums.imgix.net/covers/MIM-Hofberg_pano_170522_110758.jpg?w=730&amp;h=496&amp;fit=crop&amp;q=40&amp;auto=format%2Cenhance%2Ccompress\" /></p></li> -->\r\n<li><p>Victor Horta: <a href=\"https://en.wikipedia.org/wiki/Victor_Horta\" class=\"uri\">https://en.wikipedia.org/wiki/Victor_Horta</a></p></li>\r\n<li><p>Belgian Waffles: 2 kinds: <a href=\"https://www.ottsworld.com/blogs/a-tale-of-two-waffles/\" class=\"uri\">https://www.ottsworld.com/blogs/a-tale-of-two-waffles/</a></p></li>\r\n<li><p>He who saves the world in Shindlers list: <a href=\"https://www.youtube.com/watch?v=49aQb7VZ6F8\" class=\"uri\">https://www.youtube.com/watch?v=49aQb7VZ6F8</a></p></li>\r\n<li><p>Central Station<br />\r\n<a href=\"https://www.google.be/maps?rlz=1C1GCEA_enBE808BE808&amp;q=brussels+central+station&amp;um=1&amp;ie=UTF-8&amp;sa=X&amp;ved=0ahUKEwiP7Z7WodDcAhXOyKQKHTgZC0QQ_AUICigB\" class=\"uri\">https://www.google.be/maps?rlz=1C1GCEA_enBE808BE808&amp;q=brussels+central+station&amp;um=1&amp;ie=UTF-8&amp;sa=X&amp;ved=0ahUKEwiP7Z7WodDcAhXOyKQKHTgZC0QQ_AUICigB</a></p></li>\r\n</ul>\r\n',111,0,1,'CC-BY-SA','cycling,Brussels',0,0,1),
(2638,'2018-09-12','Dirt cheap Magic',2410,'Magic the Gathering for cheapskates','<p>In this episode, Klaatu talks about playing <strong>Magic: The Gathering</strong> for cheap.\r\n</p>\r\n\r\n<p>\r\nSee <a href=\"https://rpggeek.com/thread/532036/how-build-deck-magic-gathering\" target=\"_blank\">rpggeek.com&#47;thread&#47;532036&#47;how-build-deck-magic-gathering</a> by Eric Jome for a good deck building formula.\r\n</p>',78,95,0,'CC-BY-SA','magic,mtg',0,0,1),
(2639,'2018-09-13','Some ancillary Bash tips - 9',1305,'Making decisions in Bash (part 1)','<h1 id=\"some-ancillary-bash-tips---9\">Some ancillary Bash tips - 9</h1>\n<h2 id=\"making-decisions-in-bash\">Making decisions in Bash</h2>\n<p>This is my ninth contribution to the <a href=\"https://hackerpublicradio.org/series/0042.html\" title=\"*Bash Scripting* series\"><em>Bash Scripting</em></a> series under the heading of <em>Bash Tips</em>. The previous episodes are listed below in the <a href=\"#links\">Links</a> section.</p>\n<p>It seems to me that it would be worthwhile looking at how Bash can be used to make decisions, such as how many times a loop should cycle (<em>looping constructs</em>) or to choose between multiple choices (<em>conditional constructs</em>). Of course we need to look at some of the expressions used in conjunction with the commands that do these tasks – the tests themselves – and we’ll do this in this episode.</p>\n<p>This is a complex area which I had some trouble with when I first started using Bash, and there is a lot to say about it all. I have prepared a group of HPR shows about this subject, in order to do it justice, and this is the first of the group.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2639_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions\">\"Bash Conditional Expressions\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins\">\"Bourne Shell Builtins\"</a></li>\n</ul></li>\n<li><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n</ol></li>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2639_bash9_ex1.sh\">bash9_ex1.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,test,true,false',0,0,1),
(2649,'2018-09-27','More ancillary Bash tips - 10',1372,'Making decisions in Bash (part 2)','<h1 id=\"more-ancillary-bash-tips---10\">More ancillary Bash tips - 10</h1>\n<h2 id=\"making-decisions-in-bash\">Making decisions in Bash</h2>\n<p>This is my tenth contribution to the <a href=\"https://hackerpublicradio.org/series/0042.html\" title=\"*Bash Scripting* series\"><em>Bash Scripting</em></a> series under the heading of <em>Bash Tips</em>. The previous episodes are listed below in the <a href=\"#links\">Links</a> section.</p>\n<p>We are currently looking at decision making in Bash, and in the last episode we examined the tests themselves. In this episode we’ll look at the constructs that use these tests: looping constructs, conditional constructs and lists of commands.</p>\n<p><strong>Note</strong>: this episode and the preceding one were originally recorded as a single episode, but because it was so long it was split into two. As a consequence the audio contains references to examples such as <code>bash9_ex2.sh</code> where the true name is <code>bash10_ex1.sh</code>. The notes have been updated as necessary but not the audio.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2649_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Looping-Constructs\">\"Bash Looping Constructs\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs\">\"Bash Conditional Constructs\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins\">\"Bourne Shell Builtins\"</a></li>\n</ul></li>\n<li><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n</ol></li>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2649_bash10_ex1.sh\">bash10_ex1.sh</a>, <a href=\"hpr2649_bash10_ex2.sh\">bash10_ex2.sh</a>, <a href=\"hpr2649_bash10_ex3.sh\">bash10_ex3.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,test,while,until,if,case',0,0,1),
(2659,'2018-10-11','Further ancillary Bash tips - 11',1702,'Making decisions in Bash (part 3)','<h1 id=\"further-ancillary-bash-tips---11\">Further ancillary Bash tips - 11</h1>\n<p>This is the eleventh episode in the <em>Bash Tips</em> sub-series. It is the third of a group of shows about making decisions in Bash.</p>\n<p>In the last two episodes we saw the types of test Bash provides, and we looked briefly at some of the commands that use these tests. Now we want to start examining the expressions that can be used in these tests, and how to combine them. We will also start looking at string comparisons in extended tests.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2659_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs\">\"Bash Conditional Constructs\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions\">\"Bash Conditional Expressions\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins\">\"Bourne Shell Builtins\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin\">\"The <code>set</code> Builtin\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching\">\"Bash Pattern Matching\"</a></li>\n</ul></li>\n<li><p><a href=\"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html\">\"<em>POSIX Shell Command Language</em>\"</a> - documentation of all of the POSIX features mentioned in this series.</p></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n</ol></li>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2659_bash11_ex1.sh\">bash11_ex1.sh</a>, <a href=\"hpr2659_bash11_ex2.sh\">bash11_ex2.sh</a>, <a href=\"hpr2659_bash11_ex3.sh\">bash11_ex3.sh</a>, <a href=\"hpr2659_bash11_ex4.sh\">bash11_ex4.sh</a>, <a href=\"hpr2659_bash11_ex5.sh\">bash11_ex5.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,test,conditional expression,string comparison,pattern',0,0,1),
(2645,'2018-09-21','Blinking LED',1390,'In this live show, Ken sees if he can follow simple instructions','<p>\r\nDuring the New Year Show Ken soldered a component tester. Unfortunately this did not work. \r\n</p>\r\n<p>\r\nNYBill offered to fix it and he succeeded in his show <a href=\"https://hackerpublicradio.org/eps.php?id=2591\">hpr2591 :: International Troubleshooting</a>. When he shipped it back he included two 555 timers with the message: <em>Now, figure out how to make LED\'s blink\r\nwith those 555\'s! </em> \r\n</p>\r\n<p>\r\n\r\nIn this show Ken uses the online guide <a href=\"https://www.instructables.com/id/Flashing-LED-using-555-Timer/\">FLASHING L.E.D. USING 555 TIMER</a> By <a href=\"https://www.instructables.com/member/Trilesto/\">Trilesto</a> to do this. \r\n</p>',30,103,1,'CC-BY-NC-SA','555, NYBill, pico, nano',0,0,1),
(2640,'2018-09-14','Another Rambling Drive Into Work',835,'An second attempt at making a show on the way into work','<p>It’s been a while since I posted my first attempt at recording a show in my car, this attempt was recorded not that long after that but I’d forgotten to post it, hopefully, it’s not too boring.</p>\r\n<p>This is the previously mentioned dictation device I used<br />\r\n<a href=\"https://www.amazon.co.uk/HccToo-Multifunctional-Rechargeable-Dictaphone-Conversation/dp/B015H9JP6S/ref=sr_1_1?ie=UTF8&amp;qid=1502381150&amp;sr=8-1&amp;keywords=dictation+machines\" class=\"uri\">https://www.amazon.co.uk/HccToo-Multifunctional-Rechargeable-Dictaphone-Conversation/dp/B015H9JP6S/ref=sr_1_1?ie=UTF8&amp;qid=1502381150&amp;sr=8-1&amp;keywords=dictation+machines</a></p>\r\n<p>An article that explains how to remove noise using Audacity, which was what dodddummy was talking about when he commented on my first show on <a href=\"https://hackerpublicradio.org/eps.php?id=2377\">HPR2377</a> <a href=\"https://www.podfeet.com/blog/recording/how-to-remove-noise-with-audacity/\" class=\"uri\">https://www.podfeet.com/blog/recording/how-to-remove-noise-with-audacity/</a></p>\r\n<p>Link to Dave’s (<code>thelovebug</code>) page and the original John Kulp’s $2 microphone show that kicked all this off. Looking forward to getting a chance to catch up with Dave’s drive into work show. Refer to Dave’s episode <a href=\"https://hackerpublicradio.org/eps.php?id=2400\">HPR2400</a> and John Kulp’s original $2 microphone show <a href=\"https://hackerpublicradio.org/eps.php?id=1812\">HPR1812</a></p>\r\n<p>Link to the microphone originally recommended By John Kulp<br />\r\n<a href=\"https://www.amazon.co.uk/Neewer-3-5mm-Hands-Computer-Microphone/dp/B005DOTSM4/\" class=\"uri\">https://www.amazon.co.uk/Neewer-3-5mm-Hands-Computer-Microphone/dp/B005DOTSM4/</a></p>\r\n<p>A link from StackExchange that details the wiring diagram for Kenwood style microphone used in many portable Amateur radios<br />\r\n<a href=\"https://ham.stackexchange.com/questions/1891/whats-the-pinout-for-kenwood-2-5mm-trs-3-5-mm-trs-connector\" class=\"uri\">https://ham.stackexchange.com/questions/1891/whats-the-pinout-for-kenwood-2-5mm-trs-3-5-mm-trs-connector</a></p>\r\n<p>This is a small article in Wikipedia that covers the Electret Microphone which is the type used in the microphone recommended by John Kulp, Dave (<code>thelovebug</code>) and now me.<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Electret_microphone\" class=\"uri\">https://en.wikipedia.org/wiki/Electret_microphone</a></p>\r\n',201,0,1,'CC-BY-SA','recording, podcasting, audio, microphone, car, Audacity',0,0,1),
(2642,'2018-09-18','My swedish and german Podcasts Part 2',318,'I talk about 6 more podcasts in swedish and german. This time no radio network involved.','<ul>\r\n<li><strong>Helt sant</strong> <a href=\"https://api.sr.se/api/rss/pod/20447\" class=\"uri\">https://api.sr.se/api/rss/pod/20447</a></li>\r\n<li><strong>Brysselbubblan</strong> <a href=\"https://brysselbubblan.libsyn.com/rss\" class=\"uri\">https://brysselbubblan.libsyn.com/rss</a></li>\r\n<li><strong>Fri tanke podcast</strong> <a href=\"https://fritanke.podbean.com/feed/\" class=\"uri\">https://fritanke.podbean.com/feed/</a></li>\r\n<li><strong>Chaosradio</strong> <a href=\"https://chaosradio.ccc.de/chaosradio-latest.rss\" class=\"uri\">https://chaosradio.ccc.de/chaosradio-latest.rss</a></li>\r\n<li><strong>Radio Tux</strong> <a href=\"https://radiotux.de/podcast/rss/radiotux-all_ogg.xml\" class=\"uri\">https://radiotux.de/podcast/rss/radiotux-all_ogg.xml</a></li>\r\n<li><strong>Heiseshow</strong> <a href=\"https://www.heise.de/heiseshow.rss\" class=\"uri\">https://www.heise.de/heiseshow.rss</a></li>\r\n</ul>\r\n',309,75,1,'CC-BY-SA','podcast,swedish,german,ccc',0,0,1),
(2916,'2019-10-07','HPR Community News for September 2019',4081,'HPR Volunteers talk about shows released and comments posted in September 2019','<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=2891\" target=\"_blank\">2891</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-09-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2891\" target=\"_blank\">HPR Community News for August 2019</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=2892\" target=\"_blank\">2892</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-09-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2892\" target=\"_blank\">Stardrifter RPG Playtest Part 02</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=2893\" target=\"_blank\">2893</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-09-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2893\" target=\"_blank\">Whats in the box! Part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0235.html\" target=\"_blank\">NYbill</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2894\" target=\"_blank\">2894</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-09-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2894\" target=\"_blank\">Repairing a Musical Instrument Case</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=2895\" target=\"_blank\">2895</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-09-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2895\" target=\"_blank\">The work of fire fighters, part 2</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=2896\" target=\"_blank\">2896</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-09-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2896\" target=\"_blank\">Orange PI Zero LTS version</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=2897\" target=\"_blank\">2897</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-09-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2897\" target=\"_blank\">Stardrifter RPG Playtest Part 03</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=2898\" target=\"_blank\">2898</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-09-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2898\" target=\"_blank\">Modeling people in space game</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2899\" target=\"_blank\">2899</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-09-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2899\" target=\"_blank\">Endeavour OS</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=2900\" target=\"_blank\">2900</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-09-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2900\" target=\"_blank\">Better Social Media 01 - Introduction</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=2901\" target=\"_blank\">2901</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-09-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2901\" target=\"_blank\">Describing how I listen to podcasts 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=2902\" target=\"_blank\">2902</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-09-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2902\" target=\"_blank\">Stardrifter RPG Playtest Part 04</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=2903\" target=\"_blank\">2903</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-09-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2903\" target=\"_blank\">What is PMEM</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=2904\" target=\"_blank\">2904</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-09-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2904\" target=\"_blank\">DIY URL shortening</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=2905\" target=\"_blank\">2905</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-09-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2905\" target=\"_blank\">Two HPR hosts living in the same region finally meet up!</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=2906\" target=\"_blank\">2906</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-09-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2906\" target=\"_blank\">Feature Engineering for Data-Driven Decision Making</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2907\" target=\"_blank\">2907</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-09-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2907\" target=\"_blank\">Stardrifter RPG Playtest Part 05</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=2908\" target=\"_blank\">2908</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-09-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2908\" target=\"_blank\">Modeling opinions in space game</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2909\" target=\"_blank\">2909</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-09-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2909\" target=\"_blank\">ONICS Basics Part 3:  Networking Fundamentals</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0259.html\" target=\"_blank\">Gabriel Evenfire</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2910\" target=\"_blank\">2910</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-09-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2910\" target=\"_blank\">Better Social Media 02 - Pluspora</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=2911\" target=\"_blank\">2911</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-09-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2911\" target=\"_blank\">my internet connection</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0243.html\" target=\"_blank\">Jezra</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 17 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=1328#comments\" target=\"_blank\">hpr1328</a></strong>\n(2013-09-04) \"<em>A Hacker\'s Perspective On Schizophrenia </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0115.html\" target=\"_blank\">sigflup</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=1328#6\" target=\"_blank\">Comment 6</a>:\nVegewurst on 2019-09-06:\n\"Insightful\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2844#comments\" target=\"_blank\">hpr2844</a></strong>\n(2019-06-27) \"<em>The Sony TC-222-A Portable Reel-To-Reel Tape Recorder</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=2844#1\" target=\"_blank\">Comment 1</a>:\nMichael on 2019-09-29:\n\"Muffled sound because of low path filtering.\"</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#2\" target=\"_blank\">Comment 2</a>:\nHipstre on 2019-09-01:\n\"2881 - Audacity: Split Album into Tracks\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 14 comments on 9 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2891#comments\" target=\"_blank\">hpr2891</a></strong>\n(2019-09-02) \"<em>HPR Community News for August 2019</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=2891#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2019-09-02:\n\"Where was Ken ?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2891#2\" target=\"_blank\">Comment 2</a>:\nJon Kulp on 2019-09-03:\n\"Heroic effort!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2891#3\" target=\"_blank\">Comment 3</a>:\nDave Morriss on 2019-09-04:\n\"Thanks Jon\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2893#comments\" target=\"_blank\">hpr2893</a></strong>\n(2019-09-04) \"<em>Whats in the box! Part 2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0235.html\" target=\"_blank\">NYbill</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2893#1\" target=\"_blank\">Comment 1</a>:\ntimttmy on 2019-09-05:\n\"Trem pedal\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2893#2\" target=\"_blank\">Comment 2</a>:\nJon Kulp on 2019-09-06:\n\"No delay\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2893#3\" target=\"_blank\">Comment 3</a>:\nNYbill on 2019-09-07:\n\"Hit and Miss\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2895#comments\" target=\"_blank\">hpr2895</a></strong>\n(2019-09-06) \"<em>The work of fire fighters, part 2</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=2895#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2019-09-06:\n\"Very dissapointed\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2895#2\" target=\"_blank\">Comment 2</a>:\nSteve on 2019-09-10:\n\"Volunteer Firefighters\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2903#comments\" target=\"_blank\">hpr2903</a></strong>\n(2019-09-18) \"<em>What is PMEM</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0129.html\" target=\"_blank\">JWP</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2903#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2019-09-27:\n\"Awesome\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2904#comments\" target=\"_blank\">hpr2904</a></strong>\n(2019-09-19) \"<em>DIY URL shortening</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=2904#1\" target=\"_blank\">Comment 1</a>:\nTuula on 2019-09-23:\n\"clever\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2906#comments\" target=\"_blank\">hpr2906</a></strong>\n(2019-09-23) \"<em>Feature Engineering for Data-Driven Decision Making</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2906#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2019-09-27:\n\"Nice show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2907#comments\" target=\"_blank\">hpr2907</a></strong>\n(2019-09-24) \"<em>Stardrifter RPG Playtest Part 05</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0107.html\" target=\"_blank\">lostnbronx</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2907#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2019-09-27:\n\"Nice series\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2909#comments\" target=\"_blank\">hpr2909</a></strong>\n(2019-09-26) \"<em>ONICS Basics Part 3:  Networking Fundamentals</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0259.html\" target=\"_blank\">Gabriel Evenfire</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2909#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2019-09-27:\n\"Interesting\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2910#comments\" target=\"_blank\">hpr2910</a></strong>\n(2019-09-27) \"<em>Better Social Media 02 - Pluspora</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=2910#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2019-09-27:\n\"Nice 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/2019-September/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-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: <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 1 show which was 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<h3 id=\"change-to-the-missing-tags-document\">Change to the Missing Tags document</h3>\n<p>The section of this document which lists all of the tags currently in the system has been made more accessible. If you know of a tag in the system and you want to find out how many instances there are and which shows use them you can construct a query of the form:</p>\n<pre><code>https://hackerpublicradio.org/report_missing_tags.php#vim</code></pre>\n<p>This would look for the tag <code>\'vim\'</code> and position the page at the relevant place.</p>\n<p>If the tag you are looking for contains spaces, you need to replace them with underscores. So to look for the tag <code>\'vietnamese stringed instruments\'</code> your query would have to be:</p>\n<pre><code>https://hackerpublicradio.org/report_missing_tags.php#vietnamese_stringed_instruments</code></pre>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(2936,'2019-11-04','HPR Community News for October 2019',2514,'Ken discusses last months shows and talks about OggCamp, FLOSS Weekly, FOSDEM, and Star Wars.','<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/0380.html\" target=\"_blank\">Carl</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=2912\" target=\"_blank\">2912</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-10-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2912\" target=\"_blank\">Stardrifter RPG Playtest Part 06</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=2913\" target=\"_blank\">2913</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-10-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2913\" target=\"_blank\">Windows, SDN, and Firewalls</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0231.html\" target=\"_blank\">Beto</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2914\" target=\"_blank\">2914</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-10-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2914\" target=\"_blank\">Describing how I listen to podcasts PART 4</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=2915\" target=\"_blank\">2915</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-10-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2915\" target=\"_blank\">Intro - My Recording Setup</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0380.html\" target=\"_blank\">Carl</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2916\" target=\"_blank\">2916</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-10-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2916\" target=\"_blank\">HPR Community News for September 2019</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=2917\" target=\"_blank\">2917</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-10-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2917\" target=\"_blank\">Stardrifter RPG Playtest Part 07</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=2918\" target=\"_blank\">2918</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-10-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2918\" target=\"_blank\">Selecting random item from weighted list</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2919\" target=\"_blank\">2919</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-10-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2919\" target=\"_blank\">hosting software in HPR show notes</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0243.html\" target=\"_blank\">Jezra</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2920\" target=\"_blank\">2920</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-10-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2920\" target=\"_blank\">Better Social Media 03 - MeWe</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=2921\" target=\"_blank\">2921</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-10-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2921\" target=\"_blank\">Geocaching with the family</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0314.html\" target=\"_blank\">thelovebug</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2922\" target=\"_blank\">2922</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-10-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2922\" target=\"_blank\">Stardrifter RPG Playtest Part 08</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=2923\" target=\"_blank\">2923</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-10-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2923\" target=\"_blank\">Describing how I listen to podcasts PART 5</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=2924\" target=\"_blank\">2924</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-10-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2924\" target=\"_blank\">Hacking an Alarm Clock to Make it Quieter</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=2925\" target=\"_blank\">2925</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-10-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2925\" target=\"_blank\">LinuxLugCast\'s Memorial for FiftyOneFifty </a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0269.html\" target=\"_blank\">Honkeymagoo</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2926\" target=\"_blank\">2926</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-10-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2926\" target=\"_blank\">Full Circle Magazine</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=2927\" target=\"_blank\">2927</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-10-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2927\" target=\"_blank\">Stardrifter RPG Playtest Part 09</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=2928\" target=\"_blank\">2928</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-10-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2928\" target=\"_blank\">Building markov chains with Haskell</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2929\" target=\"_blank\">2929</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-10-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2929\" target=\"_blank\">Recovering Files from a Dead MacBook Air</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=2930\" target=\"_blank\">2930</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-10-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2930\" target=\"_blank\">Better Social Media 04 - Diaspora</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=2931\" target=\"_blank\">2931</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-10-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2931\" target=\"_blank\">Wallabag for on premises article aggregation</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2932\" target=\"_blank\">2932</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-10-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2932\" target=\"_blank\">Stardrifter RPG Playtest Part 10</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=2933\" target=\"_blank\">2933</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-10-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2933\" target=\"_blank\">A walk through my PifaceCAD Python code – 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=2934\" target=\"_blank\">2934</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-10-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2934\" target=\"_blank\">Server Basics 106: Namespaces and containers</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 14 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 7 comments on\n5 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2895#comments\" target=\"_blank\">hpr2895</a></strong>\n(2019-09-06) \"<em>The work of fire fighters, part 2</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>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2895#3\" target=\"_blank\">Comment 3</a>:\nDon on 2019-10-20:\n\"great podcast\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2900#comments\" target=\"_blank\">hpr2900</a></strong>\n(2019-09-13) \"<em>Better Social Media 01 - Introduction</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2900#1\" target=\"_blank\">Comment 1</a>:\nJeroen baten on 2019-10-05:\n\"Hope you will find time to discuss Okuna\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2900#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2019-10-05:\n\"No plans for now\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2906#comments\" target=\"_blank\">hpr2906</a></strong>\n(2019-09-23) \"<em>Feature Engineering for Data-Driven Decision Making</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2906#2\" target=\"_blank\">Comment 2</a>:\nGabriel Evenfire on 2019-10-08:\n\"Love the idea here...\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2909#comments\" target=\"_blank\">hpr2909</a></strong>\n(2019-09-26) \"<em>ONICS Basics Part 3:  Networking Fundamentals</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0259.html\" target=\"_blank\">Gabriel Evenfire</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2909#2\" target=\"_blank\">Comment 2</a>:\nGabriel Evenfire on 2019-10-08:\n\"Thanks for the feedback\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2909#3\" target=\"_blank\">Comment 3</a>:\ngerryk on 2019-10-17:\n\"Yet another top episode\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2911#comments\" target=\"_blank\">hpr2911</a></strong>\n(2019-09-30) \"<em>my internet connection</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0243.html\" target=\"_blank\">Jezra</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2911#1\" target=\"_blank\">Comment 1</a>:\nBeeza on 2019-10-05:\n\"HPR 2911\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 7 comments on 5 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2913#comments\" target=\"_blank\">hpr2913</a></strong>\n(2019-10-02) \"<em>Windows, SDN, and Firewalls</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0231.html\" target=\"_blank\">Beto</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2913#1\" target=\"_blank\">Comment 1</a>:\nClaudioM on 2019-10-02:\n\"+1 on Chocolatey Recommendation\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2915#comments\" target=\"_blank\">hpr2915</a></strong>\n(2019-10-04) \"<em>Intro - My Recording Setup</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0380.html\" target=\"_blank\">Carl</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2915#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2019-10-04:\n\"More shows on ....\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2921#comments\" target=\"_blank\">hpr2921</a></strong>\n(2019-10-14) \"<em>Geocaching with the family</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0314.html\" target=\"_blank\">thelovebug</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2921#1\" target=\"_blank\">Comment 1</a>:\njezra on 2019-10-17:\n\"what a fun adventure\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2921#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2019-10-17:\n\"I loved the show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2925#comments\" target=\"_blank\">hpr2925</a></strong>\n(2019-10-18) \"<em>LinuxLugCast\'s Memorial for FiftyOneFifty </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0269.html\" target=\"_blank\">Honkeymagoo</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2925#1\" target=\"_blank\">Comment 1</a>:\nlostnbronx on 2019-10-19:\n\"I Never Met Fifty, But I Knew Him\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2928#comments\" target=\"_blank\">hpr2928</a></strong>\n(2019-10-23) \"<em>Building markov chains with Haskell</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2928#1\" target=\"_blank\">Comment 1</a>:\nMr. Young on 2019-10-29:\n\"Thanks for this episode\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2928#2\" target=\"_blank\">Comment 2</a>:\nTuula on 2019-10-31:\n\"thanks for the feedback!\"</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/2019-October/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-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=\"floss-weekly\">FLOSS Weekly</h3>\n<p><a href=\"https://hackerpublicradio.org/correspondents/0030.html\">Ken Fallon</a> and <a href=\"https://hackerpublicradio.org/correspondents/0198.html\">Ahuka</a> appeared on FLOSS Weekly <a href=\"https://twit.tv/shows/floss-weekly/episodes/553?autostart=false\">Episode 553</a> on October 30<sup>th</sup> 2019 to talk about Hacker Public Radio.</p>\n<h3 id=\"oggcamp-2019\">OggCamp 2019</h3>\n<p>There was an HPR presence at OggCamp 2019. This was held at The Manchester Conference Centre during the weekend of October 19<sup>th</sup> and 20<sup>th</sup> 2019. We had an HPR table, which was manned by many HPR hosts and received many visitors. Ken recorded interviews which will be released later in November.</p>\n<h3 id=\"fosdem-2020\">FOSDEM 2020</h3>\n<p>A request has been made to get a Podcasters table at FOSDEM 2020.</p>\n<h3 id=\"hpr-on-podcast-networks\">HPR on podcast networks</h3>\n<p>We need some help getting HPR on Google Podcasts, Stitcher, Soundcloud, etc.</p>\n<h3 id=\"ken-versus-espeak\">Ken versus <em>espeak</em></h3>\n<p>Which is preferable, the <em>espeak</em> show summary or Ken’s new reading of the information?</p>\n<h3 id=\"watching-star-wars-for-the-first-time\">Watching Star Wars for the first time</h3>\n<p>A question: should it be watched in Episode or Production Order?</p>\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),
(2643,'2018-09-19','The Payoff In Storytelling',677,'A brief look at the emotional structure of story endings.','<p>Lostnbronx takes a quick look at how story endings need to be structured in order to be satisfying. Lots of endings are possible, but they don’t all require the same treatment. Some can be abrupt, some can be sad, but all of them need to meet certain emotional expectations.</p>\r\n',107,105,0,'CC-0','stories,storytelling,endings,lostnbronx',0,0,1),
(2644,'2018-09-20','Error on show 2642',59,'Error error','<p>The right podcast is:</p>\r\n<ul>\r\n<li><strong>Kvalificerat Hemligt</strong> <a href=\"https://feeds.soundcloud.com/users/soundcloud:users:167287536/sounds.rss\" class=\"uri\">https://feeds.soundcloud.com/users/soundcloud:users:167287536/sounds.rss</a></li>\r\n</ul>',309,75,0,'CC-BY-SA','podcast, swedish, correction',0,0,1),
(2648,'2018-09-26','Explaining the controls on my Amateur HF Radio Part 1',1646,'I attempt to explain the controls on my Kenwood TS940S HF Amateur Radio.','<p>In this episode, I cover the transmit section controls.</p>\r\n<h2 id=\"related-links-for-the-ts940s-amateur-hf-radio\">Related links for the TS940S Amateur HF Radio</h2>\r\n<ul>\r\n<li><p>TS940 Overview<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>TS940 Review<br />\r\n<a href=\"https://www.eham.net/reviews/detail/239\" class=\"uri\">https://www.eham.net/reviews/detail/239</a></p></li>\r\n<li><p>TS940 User Manual<br />\r\n<a href=\"https://www.radiomanual.info/schemi/TS940_user.pdf\" class=\"uri\">https://www.radiomanual.info/schemi/TS940_user.pdf</a></p></li>\r\n</ul>\r\n<h3 id=\"further-info-and-clarification\">Further info and clarification</h3>\r\n<p>Below I’ll cover some of the items I missed or didn’t understand when I recorded my off the cuff episode. If I miss something you may find it in the user manual link above.</p>\r\n<p>Full and Semi break-in mode is used when operating in CW mode (Morse Code). In full break-in mode the radio jumps back into receive the moment the mores key is released this way you can hear if the station is trying to contact in-between each press of the key. This is very demanding on the radio as it must switch very quickly back into receive mode it can also be distracting for the operator hearing hissing noise between each dot and dash. Semi break-in mode is a bit like using VOX mode in speech the radio goes silent between each dot and dash but will return to receive after the mores key is released for a predetermined time interval.</p>\r\n<p>The digital display used on the main display of the TS940S is apparently a Vacuum Fluorescent Display not the more usual LED of the time.</p>\r\n<p>The TS 940S was manufactured around 1986, so unbelievably that means my wonderful radio that to me looks fairly modern is around 30 years Old! I believe this HF radio was top of the line for Kenwood back then.</p>\r\n<p>The Auto and thru button is used to connect the auto tuner in line with the antenna. When AUTO is selected the radio is connected to the Auto internal tuner and then to the antenna. In THRU the radio bypasses the auto tuner and connects the radio directly to the antenna.</p>\r\n<h3 id=\"the-speech-compressor\">The Speech Compressor</h3>\r\n<p>During SSB operation it is desirable to increase the relative “talk power” of the transceiver by using speech processor circuitry. The speech processor control is set by using the in and out rotary control. The in control level is set by putting the meter into Comp and adjusting the in control to no more than 10 dB of compression. The out control level is set by putting the meter into ALC and adjusting the out control to ensure the meter stays within the ALC section of the meter.</p>\r\n<p>IC meter position indicates the power transistor collector current</p>\r\n<p>VC meter position indicates the power transistor collector voltage</p>\r\n<p>Noise Blanker 1 (NB1)<br />\r\nFor pulse type noise, such as generated by automatic ignition systems.</p>\r\n<p>Noise Blanker 2 (NB2)<br />\r\nFor long duration pulse noise, like the Russian woodpecker.</p>',201,43,1,'CC-BY-SA','Amateur, Radio, Ham',0,0,1),
(2650,'2018-09-28','My Pocket Knife',505,'Shane talks about his pocket knife for a few minutes.','<p>\r\nThe pocket knife Shane talks about is the Number 6 knife made by the French company Opinel, It costs about $20 (Canadian). This version has a walnut handle.\r\n</p>\r\n<p>\r\n<a href=\"https://hackerpublicradio.org/eps/hpr2650/hpr2650/hpr2650.jpg\">\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2650/hpr2650/hpr2650-small.jpg\" alt=\"Opinel pocket knife with ham and cheese sandwich\"/>\r\n</a>\r\n</p>\r\n',250,23,0,'CC-BY-SA','lock knife,Opinel knife',0,0,1),
(2653,'2018-10-03','Using the EXACT Function in Excel',199,'Shane explains that he just learned a simple and useful Excel function.','<p>The function looks like <code>=EXACT(A1,D1)</code> and its purpose is to tell you if <code>A1</code> contains the exact same value as <code>D1</code> or not.</p>\r\n',250,0,0,'CC-BY-SA','Excel',0,0,1),
(2654,'2018-10-04','Making Crepes',767,'Shane makes crepes from a simple recipe. ','<h2 id=\"crepe-recipe\">Crepe Recipe:</h2>\r\n<ul>\r\n<li>1 cup of flour</li>\r\n<li>1 cup of milk</li>\r\n<li>1 egg</li>\r\n<li>1 pinch of salt</li>\r\n</ul>\r\n<h3 id=\"cinnamon-sugar-mixture-recipe\">Cinnamon Sugar Mixture Recipe:</h3>\r\n<ul>\r\n<li>1 part cinnamon (or less)</li>\r\n<li>8 parts sugar</li>\r\n</ul>\r\n',250,93,0,'CC-BY-SA','crepes, cooking, parenting',0,0,1),
(2655,'2018-10-05','Sleep Apnea and Afib',705,'How Sleep Apnea and Atrial Fibrillation entered my life','<p>The last of my personal health issue shows covers two related issues, Sleep Apnea and Atrial Fibrillation. They are related because Sleep Apnea is a cause of Atrial Fibrillation. Fortunately both can be controlled if you follow medical directions.</p>\r\n<ul>\r\n<li><a href=\"https://www.mayoclinic.org/diseases-conditions/sleep-apnea/symptoms-causes/syc-20377631\" class=\"uri\">https://www.mayoclinic.org/diseases-conditions/sleep-apnea/symptoms-causes/syc-20377631</a></li>\r\n<li><a href=\"https://www.heart.org/en/health-topics/atrial-fibrillation/what-is-atrial-fibrillation-afib-or-af\" class=\"uri\">https://www.heart.org/en/health-topics/atrial-fibrillation/what-is-atrial-fibrillation-afib-or-af</a></li>\r\n<li><a href=\"https://www.mayoclinic.org/diseases-conditions/sleep-apnea/symptoms-causes/syc-20377631\" class=\"uri\">https://www.mayoclinic.org/diseases-conditions/sleep-apnea/symptoms-causes/syc-20377631</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=352\" class=\"uri\">https://www.palain.com/?page_id=352</a></li>\r\n</ul>\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Apnea, Heart, Afib, Atrial Fibrillation',0,0,1),
(2656,'2018-10-08','Explaining the controls on my Amateur HF Radio Part 2',844,'In this episode I cover the mode and frequency selection controls of my Kenwood TS 940S','<h2 id=\"radio-mode-and-frequency-controls-on-amateur-hf-radio-ts940s\">Radio Mode and frequency controls on Amateur HF Radio TS940S</h2>\r\n<ul>\r\n<li><p>UK HF band plan information<br />\r\n<a href=\"https://rsgb.org/main/operating/band-plans/hf/\" class=\"uri\">https://rsgb.org/main/operating/band-plans/hf/</a></p></li>\r\n<li><p>Morse code (CW), Carrier Wave<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Morse_code\" class=\"uri\">https://en.wikipedia.org/wiki/Morse_code</a></p></li>\r\n<li><p>Article about Sideband, including Lower Side Band (LSB) and Upper Side Band (USB)<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Sideband\" class=\"uri\">https://en.wikipedia.org/wiki/Sideband</a></p></li>\r\n<li><p>Amplitude Modulation (AM)<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Amplitude_modulation\" class=\"uri\">https://en.wikipedia.org/wiki/Amplitude_modulation</a></p></li>\r\n<li><p>Frequency Modulation (FM)<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Frequency_modulation\" class=\"uri\">https://en.wikipedia.org/wiki/Frequency_modulation</a></p></li>\r\n<li><p>Frequency Shift Keying (FSK)<br />\r\nNote the CW ident di da dit or dot dash dot is not as I thought the letter “K” in Morse code, silly me, it’s actually the letter “R”. Told you I wasn’t great at Morse.<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Frequency-shift_keying\" class=\"uri\">https://en.wikipedia.org/wiki/Frequency-shift_keying</a></p></li>\r\n</ul>\r\n<p>The “T-F Set” button is used to set the Transmit frequency when working in split mode. In split mode, you can set the radio to transmits on one frequency and receives on a different frequency.</p>',201,43,1,'CC-BY-SA','Amateur, Radio, Ham',0,0,1),
(2665,'2018-10-19','Exercise and Diet',1041,'Exercise and Diet are primary to health','<p>The best things you can do to maximize your health are to watch what you eat and make sure you get exercise. These are some of the primary tools in my kit for staying healthy and living a long life.</p>\r\n<ul>\r\n<li><a href=\"https://www.amazon.com/Dr-Bernsteins-Diabetes-Solution-Achieving-ebook/dp/B004QZ9PC4/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1483459301&amp;sr=1-1&amp;keywords=dr+bernstein+diabetes+solution\" class=\"uri\">https://www.amazon.com/Dr-Bernsteins-Diabetes-Solution-Achieving-ebook/dp/B004QZ9PC4/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1483459301&amp;sr=1-1&amp;keywords=dr+bernstein+diabetes+solution</a></li>\r\n<li><a href=\"https://www.diabetes-book.com/\" class=\"uri\">https://www.diabetes-book.com/</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=354\" class=\"uri\">https://www.palain.com/?page_id=354</a></li>\r\n</ul>\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Exercise, Diet',0,0,1),
(2675,'2018-11-02','YouTube Playlists',767,'How to solve a problem with following YouTube channels','<p>I am subscribed to a number of YouTube channels, and I found a need to be able to watch all of the videos in order for certain channels. This describes how to do it.</p>\r\n<ul>\r\n<li><a href=\"https://chrome.google.com/webstore/detail/iridium-for-youtube/gbjmgndncjkjfcnpfhgidhbgokofegbl?hl=en\" class=\"uri\">https://chrome.google.com/webstore/detail/iridium-for-youtube/gbjmgndncjkjfcnpfhgidhbgokofegbl?hl=en</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=372\" class=\"uri\">https://www.palain.com/?page_id=372</a></li>\r\n</ul>\r\n',198,0,0,'CC-BY-SA','YouTube, Channels, Playlists',0,0,1),
(2685,'2018-11-16','Scientific and Medical Reports',854,'We need to be careful about evaluating news reports about medical studies','<p>We get bombarded with breathless news stories about medical breakthroughs that may not be as reliable as they are presented. This begins our look at what is reliable and what you need to watch out for.</p>\r\n<ul>\r\n<li><a href=\"https://journalistsresource.org/studies/society/news-media/health-research-misinformation-tips\" class=\"uri\">https://journalistsresource.org/studies/society/news-media/health-research-misinformation-tips</a></li>\r\n<li><a href=\"https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0196346\" class=\"uri\">https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0196346</a></li>\r\n<li><a href=\"https://journals.plos.org/\" class=\"uri\">https://journals.plos.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/ArXiv\" class=\"uri\">https://en.wikipedia.org/wiki/ArXiv</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=356\" class=\"uri\">https://www.palain.com/?page_id=356</a></li>\r\n</ul>',198,100,0,'CC-BY-SA','Health, Medicine, Medical Studies, News Reports',0,0,1),
(2695,'2018-11-30','Problems with Studies',798,'Some principles for evaluating medical studies','<p>All medical studies are not alike. Some are of higher quality than others, and the conclusions they reach need to be evaluated based on some principles of good research. Here we take a look at some warning signs of bad or unreliable studies.</p>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Replication_crisis\" class=\"uri\">https://en.wikipedia.org/wiki/Replication_crisis</a></li>\r\n<li><a href=\"https://www.wired.com/story/social-science-reproducibility\" class=\"uri\">https://www.wired.com/story/social-science-reproducibility</a></li>\r\n<li><a href=\"https://www.sciencemag.org/news/2017/01/rigorous-replication-effort-succeeds-just-two-five-cancer-papers\" class=\"uri\">https://www.sciencemag.org/news/2017/01/rigorous-replication-effort-succeeds-just-two-five-cancer-papers</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Andrew_Wakefield\" class=\"uri\">https://en.wikipedia.org/wiki/Andrew_Wakefield</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Hwang_Woo-suk#Controversies\" class=\"uri\">https://en.wikipedia.org/wiki/Hwang_Woo-suk#Controversies</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Yoshiki_Sasai\" class=\"uri\">https://en.wikipedia.org/wiki/Yoshiki_Sasai</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Data_dredging\" class=\"uri\">https://en.wikipedia.org/wiki/Data_dredging</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=Gx0fAjNHb1M\" class=\"uri\">https://www.youtube.com/watch?v=Gx0fAjNHb1M</a></li>\r\n<li><a href=\"https://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.1002106\" class=\"uri\">https://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.1002106</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=358\" class=\"uri\">https://www.palain.com/?page_id=358</a></li>\r\n</ul>',198,100,0,'CC-BY-SA','Health, Medicine, Medical Studies, Evaluating Studies',0,0,1),
(2705,'2018-12-14','Evidence-based Medicine',1013,'Medicine should be based on objective scientific evidence','<p>Basing medical care and treatment on the scientific evidence should be the norm, but frequently it is not. Doctors may treat based on how they have always done it, or how other doctors do it (i.e. best practices), but there is a movement now to reorient medicine to follow the best scientific guidelines.</p>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Evidence-based_medicine\" class=\"uri\">https://en.wikipedia.org/wiki/Evidence-based_medicine</a></li>\r\n<li><a href=\"https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3789163/\" class=\"uri\">https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3789163/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/N_ray\" class=\"uri\">https://en.wikipedia.org/wiki/N_ray</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=360\" class=\"uri\">https://www.palain.com/?page_id=360</a></li>\r\n</ul>\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Evidence, Science',0,0,1),
(2669,'2018-10-25','Additional ancillary Bash tips - 12',1702,'Making decisions in Bash (part 4)','<h1 id=\"additional-ancillary-bash-tips---12\">Additional ancillary Bash tips - 12</h1>\n<h2 id=\"making-decisions-in-bash\">Making decisions in Bash</h2>\n<p>This is the twelfth episode in the <em>Bash Tips</em> sub-series. It is the fourth of a group of shows about making decisions in Bash.</p>\n<p>In the last three episodes we saw the types of test Bash provides, and we looked briefly at some of the commands that use these tests. We looked at conditional expressions and all of the operators Bash provides to do this. We concentrated particularly on string comparisons which use <em>glob</em> and <em>extended glob</em> patterns.</p>\n<p>Now we want to look at the other form of string comparison, using <em>regular expressions</em>.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2669_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs\">\"Bash Conditional Constructs\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions\">\"Bash Conditional Expressions\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins\">\"Bourne Shell Builtins\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching\">\"Bash Pattern Matching\"</a></li>\n</ul></li>\n<li><p><a href=\"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html\">\"<em>POSIX Shell Command Language</em>\"</a> - documentation of all of the POSIX features mentioned in this series.</p></li>\n<li><a href=\"https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04\">\"Extended Regular Expressions\"</a></li>\n<li><p><a href=\"https://tldp.org/LDP/abs/html/x17129.html\">\"A Brief Introduction to Regular Expressions\"</a></p></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n</ol></li>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2669_bash12_ex1.sh\">bash12_ex1.sh</a>, <a href=\"hpr2669_bash12_ex2.sh\">bash12_ex2.sh</a>, <a href=\"hpr2669_bash12_ex3.sh\">bash12_ex3.sh</a>, <a href=\"hpr2669_bash12_ex4.sh\">bash12_ex4.sh</a>, <a href=\"hpr2669_bash12_ex5.sh\">bash12_ex5.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,test,regular expression',0,0,1),
(2657,'2018-10-09','Why we are all going to shit in 30 years due to computers',1555,'Some thoughts about the increasing impact of automation','<p>Now, this is not a doom and gloom lecture.</p>\r\n<p>Actually it is a talk about what is going to happen in the next 30 years.</p>\r\n<p>It is a talk about what is called “postcapitalism”.</p>\r\n<p>It is a talk about how almost all jobs are going to disappear due to automation. But also how we are going to think about this this and come up with solutions.</p>\r\n<p>It talks about the three big challenges we need to face.</p>\r\n<p>And yes, this involves you as well!</p>\r\n',369,0,1,'CC-BY-SA','prediction,post-capitalism',0,0,1),
(2658,'2018-10-10','Questions on podcast production',2784,'Al asks Dave questions about podcast production','<h1>HPR Chat with Al</h1>\r\n<p>Al asks Dave a number of questions about podcast audio recording and post-production.</p>\r\n<h2>Al is thinking of doing National Podcast Post Month in November</h2>\r\n<p>National Podcast Post Month (or <a href=\"https://napodpomo.org/\">NaPodPoMo</a>) is a challenge in a similar vein to National Novel Writing Month (or <a href=\"https://nanowrimo.org/\">NaNoWriMo</a>) in which participants are challenged to produce and publish a piece of audio as a podcast, every day for the month of November.</p>\r\n<h2>Bad podcast audio</h2>\r\n<p>Audio quality is as important as the content that\'s being presented. Bad audio is going to be what causes new podcasters the most damage in subscriber numbers. An example of good audio is the true crime podcast, <a href=\"https://oneeyeopen.podbean.com/\">One Eye Open</a>, which Dave started listening to a couple of weeks ago. He also picked up a couple of other true crime podcasts as a result of listening to One Eye Open where the audio quality is so bad, that they can\'t be heard!</p>\r\n<p><a href=\"https://en.wikipedia.org/wiki/Loudness\">Loudness</a> is a measurement of how loud something is perceived to be. Levelling is a process of ensuring that individual tracks in a podcasts are an an equivalent level, but also the podcast overall is at an equivalent level to other podcasts that have been levelled the same way.</p>\r\n<h2>Our setups</h2>\r\n<p>Al and Dave have a very similar microphone setup.</p>\r\n<ul>\r\n<li><a href=\"https://www.amazon.co.uk/Samson-SAQ2U-Microphone-Recording-Pack/dp/B001R747SG/\">Samson Q2U</a> - XLR and USB capable microphone</li>\r\n<li>Pop filters and wind screens</li>\r\n<li>Boom arm</li>\r\n<li>Shock mount</li>\r\n</ul>\r\n<h2>What is a compressor</h2>\r\n<p>The non-technical definition is that it brings up the quiet bits and brings down the louder bits so that your voice has less of a variance if you shout or whisper.</p>\r\n<h2>Different microphone types</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Microphone#Cardioid\">Cardioid</a> - focuses on sounds coming from in front of the mic</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Microphone#Omnidirectional\">Omnidirectional</a> - can theoretically pick up sound from all directions</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Microphone#Dynamic_microphone\">Dynamic</a> - well suited for vocal use</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Microphone#Condenser_microphone\">Condenser</a> - overall better quality sound than dynamic, but more susceptible to background noise, so requires a really quiet studio environment</li>\r\n</ul>\r\n<h2>Your level</h2>\r\n<p>You can measure your own level in <a href=\"https://www.audacityteam.org/\">Audacity</a> - make sure you stay in the green! If you stray into yellow or even red, either lower your level or move slightly away from the mic.</p>\r\n<h2>Other people\'s levels</h2>\r\n<p>Concentrate on your own, get others to manage theirs. If you\'re recording multiple tracks, it <em>can</em> be managed in post-production, but once it\'s been merged into a single track it\'s virtually impossible.</p>\r\n<h2>File formats</h2>\r\n<ul>\r\n<li>FLAC/ALAC - <a href=\"https://en.wikipedia.org/wiki/Lossless_compression#Audio\">lossless</a> formats</li>\r\n<li>MP3/OGG/M4A - <a href=\"https://en.wikipedia.org/wiki/Data_compression#Audio\">lossy</a> formats</li>\r\n</ul>\r\n<p>Record in a lossless format, and do your edits and post-production in a lossless format. Only <a href=\"https://en.wikipedia.org/wiki/Transcoding\">transcode</a> to a lossy format once you\'re ready to publish your final file.</p>\r\n<h2>Monitoring</h2>\r\n<p>If you\'re recording yourself, and you don\'t want to hear yourself through headphones, take the headphones off.</p>\r\n<p>If you\'re recording with someone else who is not in the same room, you are better off hearing yourself through your headphones at the same level as the person you\'re talking to.</p>\r\n<h2>Post-production</h2>\r\n<ul>\r\n<li>Use <a href=\"https://www.audacityteam.org/\">Audacity</a> to:\r\n<ul>\r\n<li>align the tracks so that everyone is in the right place</li>\r\n<li>convert coughs, sneezes, burps, keyboard sounds, mouse clicks, etc to silence</li>\r\n</ul></li>\r\n<li>Use <a href=\"https://auphonic.com\">Auphonic</a> to:\r\n<ul>\r\n<li>level the individual tracks so that everyone sounds as &quot;<a href=\"https://en.wikipedia.org/wiki/Loudness\">loud</a>&quot; as anyone else</li>\r\n<li>merge the individual tracks into a single output file (a Multitrack production)</li>\r\n</ul></li>\r\n<li>Dave also gives a specific use case for adding music into the final mix.</li>\r\n</ul>\r\n<h2>NaPodPoMo revisited</h2>\r\n<p>This will be Al\'s first attempt at NaPodPoMo, but not for Dave. Dave wants to make sure that he plans for this year, so he doesn\'t run out of material on day 7!!</p>\r\n<p>Dave will interview another NaPodPoMo participant at least once a week during November. Looks like Al will be one of them!</p>\r\n<ul>\r\n<li>Al\'s NaPodPoMo <a href=\"https://al.christman.co.uk/\">website</a> and <a href=\"https://al.christman.co.uk/feed/mp3/\">RSS feed</a></li>\r\n<li>Dave\'s NaPodPoMo <a href=\"https://thelovebug.org/napodpomo-2018/\">website</a> and <a href=\"https://thelovebug.org/feed/podcast/napodpomo-2018\">RSS feed</a></li>\r\n</ul>\r\n<h2>Dave\'s final thought</h2>\r\n<p>Podcasting isn\'t rocket science. You don\'t need lots of expensive equipment to produce a podcast. You just need something to record into (e.g. a mobile phone or portable recorder) and somewhere to host it. You can host on your own website or on one of a number of free services, like <a href=\"https://anchor.fm\">Anchor</a>, <a href=\"https://audioboom.com/\">AudioBoom</a>, or indeed <a href=\"https://hackerpublicradio.org\">Hacker Public Radio</a>!</p>\r\n<h2>The obligatory podcast plug</h2>\r\n<ul>\r\n<li><a href=\"https://www.adminadminpodcast.co.uk\">Admin Admin Podcast</a></li>\r\n<li><a href=\"https://thebugcast.org\">The Bugcast</a></li>\r\n</ul>\r\n<h2>Errata</h2>\r\n<ul>\r\n<li>Dave originally said that the pickup pattern that picks up 360 degrees was &quot;unidirectional&quot; - it should have been &quot;omnidirectional&quot; and has been fixed in the edit, but it sounds like it was added in afterwards... which, of course, it was!!</li>\r\n</ul>\r\n',290,0,0,'CC-BY-SA','Admin Admin Podcast',0,0,1),
(2661,'2018-10-15','My Music Production Setup',679,'ClaudioM shares his music production setup.','<h2 id=\"previous-music-production-setup\">Previous Music Production Setup</h2>\r\n<ul>\r\n<li>Master Tracks Pro: <a href=\"https://en.wikipedia.org/wiki/Master_Tracks_Pro\" class=\"uri\">https://en.wikipedia.org/wiki/Master_Tracks_Pro</a></li>\r\n<li>Kawai K4 synthesizer: <a href=\"https://www.polynominal.com/site/studio/gear/synth/kawai-k4/kawai-k4.html\" class=\"uri\">https://www.polynominal.com/site/studio/gear/synth/kawai-k4/kawai-k4.html</a></li>\r\n<li>Apple GarageBand: <a href=\"https://en.wikipedia.org/wiki/GarageBand\" class=\"uri\">https://en.wikipedia.org/wiki/GarageBand</a></li>\r\n</ul>\r\n<h2 id=\"current-music-production-setup\">Current Music Production Setup</h2>\r\n<ul>\r\n<li>Qtractor: <a href=\"https://en.wikipedia.org/wiki/Qtractor\" class=\"uri\">https://en.wikipedia.org/wiki/Qtractor</a></li>\r\n<li>JACK: <a href=\"https://en.wikipedia.org/wiki/JACK_Audio_Connection_Kit\" class=\"uri\">https://en.wikipedia.org/wiki/JACK_Audio_Connection_Kit</a></li>\r\n<li>QJackCtl: <a href=\"https://en.wikipedia.org/wiki/Qjackctl\" class=\"uri\">https://en.wikipedia.org/wiki/Qjackctl</a></li>\r\n<li>Hydrogen Drum Machine: <a href=\"https://en.wikipedia.org/wiki/Hydrogen_(software)\" class=\"uri\">https://en.wikipedia.org/wiki/Hydrogen_(software)</a></li>\r\n<li>Yoshimi: <a href=\"https://en.wikipedia.org/wiki/Yoshimi_(synthesizer)\" class=\"uri\">https://en.wikipedia.org/wiki/Yoshimi_(synthesizer)</a></li>\r\n<li>Amsynth: <a href=\"https://en.wikipedia.org/wiki/Amsynth\" class=\"uri\">https://en.wikipedia.org/wiki/Amsynth</a></li>\r\n<li>Fluidsynth: <a href=\"https://en.wikipedia.org/wiki/FluidSynth\" class=\"uri\">https://en.wikipedia.org/wiki/FluidSynth</a></li>\r\n<li>WhySynth: <a href=\"https://linuxsynths.com/WhySynthBanksDemos/whysynth.html\" class=\"uri\">https://linuxsynths.com/WhySynthBanksDemos/whysynth.html</a></li>\r\n<li>QMidiArp: <a href=\"https://qmidiarp.sourceforge.net/\" class=\"uri\">https://qmidiarp.sourceforge.net/</a></li>\r\n<li>Hexter: <a href=\"https://linuxsynths.com/HexterPatchesDemos/hexter.html\" class=\"uri\">https://linuxsynths.com/HexterPatchesDemos/hexter.html</a></li>\r\n<li>Calf Plugins: <a href=\"https://en.wikipedia.org/wiki/Calf_Studio_Gear\" class=\"uri\">https://en.wikipedia.org/wiki/Calf_Studio_Gear</a></li>\r\n<li>Audacity: <a href=\"https://en.wikipedia.org/wiki/Audacity_(audio_editor)\" class=\"uri\">https://en.wikipedia.org/wiki/Audacity_(audio_editor)</a></li>\r\n</ul>\r\n<h2 id=\"notable-mentions\">Notable Mentions</h2>\r\n<ul>\r\n<li>LMMS: <a href=\"https://en.wikipedia.org/wiki/LMMS\" class=\"uri\">https://en.wikipedia.org/wiki/LMMS</a></li>\r\n</ul>\r\n<h2 id=\"linux-oriented-links\">Linux-oriented Links</h2>\r\n<ul>\r\n<li>Debian Ports page: <a href=\"https://www.ports.debian.org\" class=\"uri\">https://www.ports.debian.org</a></li>\r\n<li>Debian Ports PowerPC64: <a href=\"https://wiki.debian.org/PPC64\" class=\"uri\">https://wiki.debian.org/PPC64</a></li>\r\n<li>Fedora: <a href=\"https://getfedora.org\" class=\"uri\">https://getfedora.org</a></li>\r\n</ul>\r\n',152,0,0,'CC-BY-SA','music, multimedia, audio, linux, musicproduction, foss, floss',0,0,1),
(2679,'2018-11-08','Extra ancillary Bash tips - 13',2202,'Making decisions in Bash (part 5)','<h1 id=\"extra-ancillary-bash-tips---13\">Extra ancillary Bash tips - 13</h1>\n<h2 id=\"making-decisions-in-bash\">Making decisions in Bash</h2>\n<p>This is the thirteenth episode in the <em>Bash Tips</em> sub-series. It is the fifth and final of a group of shows about making decisions in Bash.</p>\n<p>In the last four episodes we saw the types of test Bash provides, and we looked briefly at some of the commands that use these tests. We looked at conditional expressions and all of the operators Bash provides to do this. We concentrated particularly on string comparisons which use <em>glob</em> and <em>extended glob</em> patterns then we devoted an episode to Bash <em>regular expressions</em>.</p>\n<p>Now we want to look at the final topic within regular expressions, the use of <em>capture groups</em>.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2679_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs\">\"Bash Conditional Constructs\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions\">\"Bash Conditional Expressions\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins\">\"Bourne Shell Builtins\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin\">\"The <code>set</code> Builtin\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching\">\"Bash Pattern Matching\"</a></li>\n</ul></li>\n<li><p><a href=\"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html\">\"<em>POSIX Shell Command Language</em>\"</a> - documentation of all of the POSIX features mentioned in this series.</p></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 \"<em>Additional ancillary Bash tips - 12</em>\"</a></li>\n</ol></li>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2679_bash13_ex1.sh\">bash13_ex1.sh</a>, <a href=\"hpr2679_bash13_ex2.sh\">bash13_ex2.sh</a>, <a href=\"hpr2679_bash13_ex3.sh\">bash13_ex3.sh</a>, <a href=\"hpr2679_bash13_ex4.sh\">bash13_ex4.sh</a>, <a href=\"hpr2679_bash13_ex4.txt\">bash13_ex4.txt</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,extended test,regular expression,capture group,BASH_REMATCH,back reference',0,0,1),
(2690,'2018-11-23','A chat about the HiveMQ Broker',425,'Ken talks with Florian Raschbichler and Anja Helmbrecht-Schaar about HiveMQ','<p>\r\nI had the opportunity to chat with Florian Raschbichler and Anja Helmbrecht-Schaar from the company <a href=\"https://www.dc-square.de/en/\">dc-square GmbH</a>, who are developers of the <a href=\"https://www.hivemq.com/\">HiveMQ</a> Broker.\r\n</p>\r\n<p>\r\nIf you are new to <a href=\"https://en.wikipedia.org/wiki/MQTT\">MQTT</a> they have <a href=\"https://www.hivemq.com/blog/mqtt-essentials/page/2/\">the ultimate kickstart for MQTT beginners</a>. They also maintain an <a href=\"https://www.hivemq.com/mqtt-client-library-encyclopedia\">MQTT Client Library Encyclopedia</a>\r\n</p>\r\n\r\n\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://www.hivemq.com/\">https://www.hivemq.com/</a></li>\r\n<li><a href=\"https://www.dc-square.de/en/\">https://www.dc-square.de/en/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Comparison_of_MQTT_Implementations\">https://en.wikipedia.org/wiki/Comparison_of_MQTT_Implementations</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/MQTT\">https://en.wikipedia.org/wiki/MQTT</a></li>\r\n<li><a href=\"https://www.hivemq.com/blog/mqtt-essentials/page/2/\">https://www.hivemq.com/blog/mqtt-essentials/page/2/</a></li>\r\n<li><a href=\"https://github.com/hivemq\">https://github.com/hivemq</a></li>\r\n<li><a href=\"https://www.hivemq.com/mqtt-client-library-encyclopedia\">https://www.hivemq.com/mqtt-client-library-encyclopedia</a></li>\r\n</ul>',30,78,0,'CC-BY-SA','MQTT, HiveMQ, dc-square GmbH',0,0,1),
(2662,'2018-10-16','Repairing a motherboard',196,'I repair a motherboard and get a old tower working again.','<h2 id=\"continued-from-hpr2549-dvd-ripping-using-old-hardware\">Continued from hpr2549 :: DVD ripping using old hardware</h2>\r\n<p>Acquired new user tower, replaced old tower with blown caps<br />\r\nDell Pentium 4 CPU 3.20GHz, 2Gb RAM</p>\r\n<pre><code>sudo shred -n 5 -vz /dev/sdX\r\n\r\n  -n, --iterations=N \r\n  -v, --verbose\r\n    show progress \r\n  -z, --zero\r\n    add a final overwrite with zeros to hide shredding</code></pre>\r\n<p>Used same Slackware USB from old tower</p>\r\n<p>Used soldering iron from Amazon - Weller WLC100 40-Watt Soldering Station<br />\r\n<a href=\"https://www.amazon.com/gp/product/B000AS28UC/ref=oh_aui_detailpage_o02_s00?ie=UTF8&amp;psc=1\" class=\"uri\">https://www.amazon.com/gp/product/B000AS28UC/ref=oh_aui_detailpage_o02_s00?ie=UTF8&amp;psc=1</a></p>\r\n<p><a href=\"https://photos.app.goo.gl/VpRxvZLBy49PCo5DA\" class=\"uri\">https://photos.app.goo.gl/VpRxvZLBy49PCo5DA</a></p>\r\n',318,0,1,'CC-BY-SA','hardware, circuit board, repair',0,0,1),
(2663,'2018-10-17','Short review on a 2.5 inch SSD/HDD caddy',202,'Tony reviews a Short review on a 2.5 inch SSD/HDD caddy from ebay','<p>Well Ken made another call for shows and as my recent interview series has come to an end by the time you listen to this here is a short review of a USB3 2.5inch HDD/SSD caddy I got from E-bay a few weeks ago.</p>\r\n<p>As many of you who have listened to my previous ramblings know I frequent a local Computer auction and recently they have had some cheap 128Gig SSD’s for sale and I managed to pick several up at a good price. After using some to upgrade some desktop PC’s to SSD I had a couple of these spare and as I have USB3 on my main laptop thought it would be good to be able to use one or two of these as portable storage or even for boot drives to test out odd Linux distro or 2.</p>\r\n<p>So I purchased a caddy off that font of all things techie E-bay for £5.50, link here:<br />\r\n<a href=\"https://www.ebay.co.uk/itm/USB-3-0-to-SATA-Hard-Drive-Enclosure-Caddy-Case-For-2-5-Inch-HDD-SSD-External/282930148654?ssPageName=STRK%3AMEBIDX%3AIT&amp;_trksid=p2057872.m2749.l2648\">https://www.ebay.co.uk/itm/USB-3-0-to-SATA-Hard-Drive-Enclosure-Caddy-Case-For-2-5-Inch-HDD-SSD-External/282930148654?ssPageName=STRK%3AMEBIDX%3AIT&amp;_trksid=p2057872.m2749.l2648</a></p>\r\n<p>So after it arrived I plugged in one of the drives and tested it out. The first thing to notice is that SSD’s being 7mm in depth flop about a bit in the case but this is easily resolved by a bit of card under the drive to help it fit snug in the case and it does mean that the case will support the larger 9mm 2.5inch spinners if needed. I’ve not tested a larger older spinner but I suspect they will not fit as 9mm ones are very snug in the case.</p>\r\n<p>Anyway the drive was detected by the PC/Laptop and works flawlessly and as it is so quick to swap drives in the caddy means I can carry large data files and my music and video library when on the move with the advantage that it is less likely to be damaged if accidentally dropped or knocked off a surface, which is quite likely with a portable spinner HDD.</p>\r\n<p>I am very happy with this purchase and it has already become a regular part of my travelling tool kit/laptop bag.</p>\r\n',338,23,0,'CC-BY-SA','Computers, Tool Bag',0,0,1),
(2668,'2018-10-24','Explaining the controls on my Amateur HF Radio Part 3',1090,'In this episode I cover the Main / sub displays meter memory and band keys of the TS940S.','<ul>\r\n<li><p>Main display is a fluorescent display<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Vacuum_fluorescent_display\" class=\"uri\">https://en.wikipedia.org/wiki/Vacuum_fluorescent_display</a></p></li>\r\n<li><p>Hertz and Kilohertz<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Hertz\" class=\"uri\">https://en.wikipedia.org/wiki/Hertz</a></p></li>\r\n<li><p>Example of an old type tuning dial with moving needle display.<br />\r\n<img src=\"https://i.ytimg.com/vi/YBCuNkdP4M0/maxresdefault.jpg\" alt=\"https://i.ytimg.com/vi/YBCuNkdP4M0/maxresdefault.jpg\" /></p></li>\r\n<li><p>Example of AVO meter<br />\r\n<img src=\"https://www.richardsradios.co.uk/AVO/AVO8mk2.jpg\" alt=\"https://www.richardsradios.co.uk/AVO/AVO8mk2.jpg\" /></p></li>\r\n<li><p>Standing Wave Ration Scale<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Standing_wave_ratio\" class=\"uri\">https://en.wikipedia.org/wiki/Standing_wave_ratio</a></p></li>\r\n<li><p>Explanation of Auto Limiter Control (ALC)<br />\r\n<a href=\"https://www.robkalmeijer.nl/techniek/electronica/radiotechniek/hambladen/radcom/1995/07/page61/index.html\" class=\"uri\">https://www.robkalmeijer.nl/techniek/electronica/radiotechniek/hambladen/radcom/1995/07/page61/index.html</a></p></li>\r\n</ul>\r\n<h3 id=\"sub-display\">Sub Display</h3>\r\n<p>Used either to display the time or in graph mode gives a representation of the receiver bandwidth setting when using CW or SSB.</p>\r\n<h3 id=\"memories-and-band-keys\">Memories and band keys</h3>\r\n<p>Ten memory and band keys to switch either between ten stored memories or to switch between the ten pre-set amateur HF bands when in VFO mode. Up / Down step keys jumps in 1Mhz step.</p>\r\n<h3 id=\"antenna-tuner\">Antenna Tuner</h3>\r\n<p>I tried and failed to find a simple explanation of an antenna tuner it’s a complicated topic, I can at least have a go at explaining how to use a simple manual antenna tuner, hope this makes some sense.</p>\r\n<p>A typical manual Antenna Tuner has two rotatable knobs both interact with each other. The Tuner is used to match a badly tuned antenna to your transmitter. The Tuner is placed in-between the transmitter and antenna. To use it you typically hold down the transmit key while looking at the VSWR meter and rotating one knob at a time in turn repeating this operation until the minimum VSWR is achieved.</p>\r\n<p>If you really want to dive into more detail feel free to follow this link in wikipedia. <a href=\"https://en.wikipedia.org/wiki/Antenna_tuner\" class=\"uri\">https://en.wikipedia.org/wiki/Antenna_tuner</a></p>\r\n',201,43,1,'CC-BY-SA','HF, Ham, Amateur Radio',0,0,1),
(2674,'2018-11-01','Raspberry pi3 open media server',616,'JWP emails in this episode','<ul>\r\n<li>Use Gparted for the SD card</li>\r\n<li>Use <a href=\"https://etcher.io/\">Etcher</a> from Resin.Io</li>\r\n<li>Use the normal external hard drive file os.</li>\r\n</ul>\r\n',129,0,1,'CC-BY-SA','Raspberry Pi,open media,Etcher',0,0,1),
(2664,'2018-10-18','My git workflow',495,'In this episode I talk about the workflow I use to contribute to opensource project using git','<h2 id=\"my-git-workflow\">My git workflow</h2>\r\n<p>In this episode of HPR I present the workflow I use to contribute to opensource projects using git. I have no idea if this workflow is something that is commonly used, but it is working for me, so I thought I’d share it with the HPR community.</p>\r\n<p>The first thing I do is fork the project I want to contribute to. This is done on github most of the time, although this workflow can work on gitlab, bitbucket, or even some self hosted git platform.</p>\r\n<p>Once the project is forked, I clone it on my machine :</p>\r\n<pre><code>$ git clone git://server/path/to/myproject.git</code></pre>\r\n<p>Git automatically names my remote project <code>origin</code>.</p>\r\n<p>Then I add a reference to the original project :</p>\r\n<pre><code>$ git remote add upstream https://server/path/to/originalproject.git</code></pre>\r\n<p>Now my local repository references my fork under the name <code>origin</code> and the original project under the name <code>upstream</code>.</p>\r\n<p>In this workflow, I never work on the master branch. So, when I need to fix a bug for example, I create a new branch :</p>\r\n<pre><code>$ git checkout -b bugfix</code></pre>\r\n<p>I can then make changes, test my code, make sure everything is ok, stage and commit my changes :</p>\r\n<pre><code>$ git add .\r\n$ git commit -m &quot;commit message&quot;</code></pre>\r\n<p>Now I need to push this local branch to my repository on github :</p>\r\n<pre><code>$ git push -u origin bugfix</code></pre>\r\n<p>Since I forked the original project, github knows that <code>origin</code> and <code>upstream</code> are linked. If there are no conflicts, github will show me a big green button to create a pull request. Once the pull request is created, I just have to wait for the maintainer to merge it in <code>upstream</code>’s master branch. Then, I need to sync both my local copy and my fork on github with the original project. In order to do that, on my local copy, I checkout my master branch, fetch <code>upstream</code>’s changes, and merge them :</p>\r\n<pre><code>$ git checkout master\r\n$ git fetch upstream\r\n$ git merge upstream/master</code></pre>\r\n<p>Now my local master branch is ahead of <code>origin</code>’s master branch, so I push those changes to github :</p>\r\n<pre><code>$ git push</code></pre>\r\n<p>I don’t need the <code>bugfix</code> branches (the local one and the github one), so I can delete those :</p>\r\n<pre><code>$ git branch -d bugfix\r\n$ git push origin -d bugfix</code></pre>\r\n<p>And now, my local repository is even with both <code>origin</code> and <code>upstream</code>, and I can start again.</p>\r\n<p>To summarize, here’s the complete workflow :</p>\r\n<pre><code>$ git checkout -b myawesomefeature\r\n$ git add .\r\n$ git commit -m &quot;Awesome commit message&quot;\r\n$ git push -u origin myawesomefeature</code></pre>\r\n<p>Create a pull request, wait for the maintainer to merge it.</p>\r\n<pre><code>$ git checkout master\r\n$ git fetch upstream\r\n$ git merge upstream/master\r\n$ git push\r\n$ git branch -d myawesomefeature\r\n$ git push origin -d myawesomefeature</code></pre>\r\n',370,104,0,'CC-0','git,github,workflow',0,0,1),
(2689,'2018-11-22','Bash Tips - 14',1688,'More about loops - the \'for\' loop, \'break\' and \'continue\'','<h1 id=\"bash-tips---14\">Bash Tips - 14 <small><small>(Some auxiliary Bash tips)</small></small></h1>\n<h2 id=\"more-about-loops\">More about loops</h2>\n<p>This is the fourteenth episode covering useful tips about using Bash. Episodes 9-13 covered <em>Making Decisions in Bash</em> and in these episodes we looked at <code>while</code> and <code>until</code> loops, but not <code>for</code> loops. This episode is making good this deficiency, and is also looking at <code>break</code> and <code>continue</code> which are very useful when using loops.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2689_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Looping-Constructs\">\"Bash Looping Constructs\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Shell-Arithmetic\">\"Bash Shell Arithmetic\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins\">\"Bourne Shell Builtins\"</a></li>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Brace-Expansion\">\"Bash Brace Expansion\"</a></li>\n</ul></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 \"<em>Additional ancillary Bash tips - 12</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2679\">HPR episode 2679 \"<em>Extra ancillary Bash tips - 13</em>\"</a></li>\n</ol></li>\n</ul>\n<ul>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2689_bash14_ex1.sh\">bash14_ex1.sh</a>, <a href=\"hpr2689_bash14_ex2.sh\">bash14_ex2.sh</a>, <a href=\"hpr2689_bash14_ex3.sh\">bash14_ex3.sh</a>, <a href=\"hpr2689_bash14_ex4.sh\">bash14_ex4.sh</a>, <a href=\"hpr2689_bash14_ex5.sh\">bash14_ex5.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,loop,for,break,continue',0,0,1),
(2666,'2018-10-22','Slackware Post-Install',1826,'A quick and dirty guide to getting Slack up and running after it\'s installed.','<p>This episode started out as just some thoughts on why I decided to move back to Slackware after having been away from it for a few years, and wound up being a short set of notes on the post install configuration of Slackware 14.2</p>\r\n<p>This is by no means a definitive or exhaustive in its scope. It’s just a few thoughts and tips on the post-install process that might not be completely clear to a new user.</p>\r\n<ul>\r\n<li>Website - <a href=\"https://www.slackware.com/\" class=\"uri\">https://www.slackware.com/</a></li>\r\n<li>Slackware Install Guide - <a href=\"https://docs.slackware.com/slackware:install\" class=\"uri\">https://docs.slackware.com/slackware:install</a></li>\r\n<li>Slackware Post Install Beginner’s Guide - <a href=\"https://docs.slackware.com/slackware:beginners_guide\" class=\"uri\">https://docs.slackware.com/slackware:beginners_guide</a></li>\r\n<li>Wikipedia Slackware Page - <a href=\"https://en.wikipedia.org/wiki/Slackware\" class=\"uri\">https://en.wikipedia.org/wiki/Slackware</a></li>\r\n</ul>\r\n',325,0,1,'CC-BY-SA','Slackware, Slackware post-install',0,0,1),
(2671,'2018-10-29','Algae farming with Desearcher',2379,'Desearcher edumacates us all on the benefits of algae farming.','<p>Apologies for the sound quality. We recorded in a small apartment with only one mic. :-</p>\r\n<ul>\r\n<li><p>Wikipedia Articles - <a href=\"https://en.m.wikipedia.org/wiki/Nannochloropsis\" class=\"uri\">https://en.m.wikipedia.org/wiki/Nannochloropsis</a><br />\r\n<a href=\"https://en.m.wikipedia.org/wiki/Phytoplankton\" class=\"uri\">https://en.m.wikipedia.org/wiki/Phytoplankton</a></p></li>\r\n<li><p>Amazon - <a href=\"https://www.amazon.com/nannochloropsis/s?page=1&amp;rh=i%3Aaps%2Ck%3Anannochloropsis\">https://www.amazon.com/nannochloropsis/s?page=1&amp;rh=i%3Aaps%2Ck%3Anannochloropsis</a></p></li>\r\n<li><p>Algae Research Supply - <a href=\"https://algaeresearchsupply.com/pages/f-2-media\" class=\"uri\">https://algaeresearchsupply.com/pages/f-2-media</a></p></li>\r\n<li><p>Blogs - <a href=\"https://www.nannochloropsis.org/blog/\" class=\"uri\">https://www.nannochloropsis.org/blog/</a></p></li>\r\n<li><p>Album of Desearcher’s setup - <a href=\"https://imgur.com/a/Cwqd7m9\" class=\"uri\">https://imgur.com/a/Cwqd7m9</a></p></li>\r\n</ul>\r\n',325,0,1,'CC-BY-SA','Phytoplankton,algae,Nannochloropsis',0,0,1),
(2678,'2018-11-07','Explaining the controls on my Amateur HF Radio Part 4',984,'In this episode I cover the first four Receiver section controls of the TS940S','<h2 id=\"the-three-dual-function-controls-covered-are\">The three dual function controls covered are</h2>\r\n<h3 id=\"squelchnotch\">Squelch/Notch</h3>\r\n<ul>\r\n<li>(1A) Squelch <a href=\"https://en.wikipedia.org/wiki/Squelch\" class=\"uri\">https://en.wikipedia.org/wiki/Squelch</a></li>\r\n<li>(1B) Notch filter <a href=\"https://en.wikipedia.org/wiki/Band-stop_filter\" class=\"uri\">https://en.wikipedia.org/wiki/Band-stop_filter</a></li>\r\n</ul>\r\n<h3 id=\"pitchaf-tune\">Pitch/AF Tune</h3>\r\n<ul>\r\n<li><p>(2A) Pitch (From the Kenwood manual)<br />\r\nThe CW PITCH control is provided so that you may adjust the pitch or tone of the incoming CW signal so that the tone is pleasing to you. The TS-940S accomplishes this without shifting the actual transmitter or receiver frequency, by shifting the 100kHz IF frequency, just prior to Product detection.</p></li>\r\n<li><p>(2B) AF Tune (From the Kenwood manual)<br />\r\nThe AF TUNE circuit is just the opposite of the NOTCH circuit. With this control, it is possible to accentuate the desired signal by providing additional rejection of noise and interfering signals whose pitch (tone) falls outside the audio passband. Turn the AF TUNE switch ON and adjust the AF TUNE control to peak the desired signal.</p></li>\r\n</ul>\r\n<h3 id=\"ritxit\">RIT/XIT</h3>\r\n<ul>\r\n<li><p>(3A) RIT – Receiver incremental Tune<br />\r\nThe RIT control allows shifting the receive frequency without effecting the transmit frequency</p></li>\r\n<li><p>(3B) XIT – Transmitter incremental Tune<br />\r\nThe XIT control allows shifting the transmit frequency without effecting the receive frequency</p></li>\r\n</ul>',201,43,1,'CC-BY-SA','HF, Ham, Amateur Radio',0,0,1),
(2667,'2018-10-23','Create PDF bookmarks with Pdftk',1313,'Basic intro to a few pdftk functions','<p>\r\nPdftk is a command that lets you manipulate PDFs outside of a GUI PDF creation tool.\r\nThere are several GUI tools you can use to create PDFs with valid bookmarks and other fancy features, but pdftk is often more convenient.\r\n</p>\r\n\r\n<p>\r\nExtract pages 1 through 2, and pages 5-21, and page 261 from a big PDF into a new PDF:\r\n</p>\r\n<pre><code>\r\n$ pdftk big.pdf cat 1-2 5-21 261 output small.pdf\r\n</code></pre>\r\n\r\n<p>\r\nExtract bookmarks from original PDF:\r\n</p>\r\n\r\n<pre><code>\r\n$ pdftk big.pdf dump_data output book.mark\r\n</code></pre>\r\n\r\n<p>\r\nHere is what a bookmark file looks like:\r\n</p>\r\n\r\n<pre><code>\r\nInfoBegin\r\nInfoKey: ModDate\r\nInfoValue: D:20181010181951-05\'00\'\r\nInfoBegin\r\nInfoKey: CreationDate\r\nInfoValue: D:20181010181934-05\'00\'\r\nInfoBegin\r\nInfoKey: Creator\r\nInfoValue: pdftk (Linux)\r\nInfoBegin\r\nInfoKey: Producer\r\nInfoValue: pdftk 2.02-x86_64\r\nPdfID0: d8deadbeeff34211ba60d80fda7611da\r\nPdfID1: 39186170c6134566884b79c0ffee7d59\r\nNumberOfPages: 261\r\nBookmarkBegin\r\nBookmarkTitle: Cover\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: 1\r\nBookmarkBegin\r\nBookmarkTitle: Credits\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: 2\r\nBookmarkBegin\r\nBookmarkTitle: Chapter One\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: 3\r\nBookmarkBegin\r\nBookmarkTitle: Foo Section\r\nBookmarkLevel: 2\r\nBookmarkPageNumber: 5\r\nBookmarkBegin\r\nBookmarkTitle: Bar Baz\r\nBookmarkLevel: 3\r\nBookmarkPageNumber: 7\r\nBookmarkBegin\r\nBookmarkTitle: Back cover\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: 19\r\n</code></pre>\r\n\r\n<p>\r\nApply the bookmark data back to the PDF:\r\n</p>\r\n\r\n<pre><code>\r\n$ pdftk small.pdf update_info book.mark output final.pdf\r\n</code></pre>\r\n\r\n',78,0,0,'CC-BY-SA','pdf',0,0,1),
(2670,'2018-10-26','Character Arcs In Storytelling',893,'Lostnbronx looks character arcs, and their role in storytelling.','<p>Characters are intrinsic to stories of all types, and they often have journeys, referred to as arcs. What, exactly is the character arc? Does everybody in a tale have one? Do they even need one? How do arcs affect the plot, and vice-versa? Lostnbronx shares some off-the-cuff thoughts about this often misunderstood aspect of storytelling.</p>\r\n',107,105,0,'CC-BY-SA','stories,storytelling,character arcs,lostnbronx',0,0,1),
(2672,'2018-10-30','Porteus',3477,'Installing Porteus and the cool things you can do with thumbdrive installation','<p><a href=\"https://porteus.org\" target=\"_blank\">Porteus</a> is a portable Live Linux distro, based on Slackware, intended for use on thumbdrives or optical media.  It is, more or less, the new <a href=\"https://hackerpublicradio.org/eps.php?id=0055\" target=\"_blank\">Slax</a>, now that Slax has switched to Debian.</p>\r\n\r\n<h2>Install</h2>\r\n\r\n<p>The official means of installation is to burn Porteus to disc, and then (optionally) install Porteus onto a thumbdrive from within Porteus. To install Porteus to a thumbdrive, you need a thumbdrive with an EXT4 partition. You can try other filesystems and partition schemes, but EXT4 definitely works well.</p>\r\n<p>\r\nFrom either Porteus or Slackware (you can try other distros, but results <em>will</em> vary), you can do a manual install, and here are the correct commands (as of this writing, the docs on porteus.org are not accurate). Assuming you have discovered, using <code>lsblk</code>, that your target device (the thumbdrive) is <code>/dev/sdx</code>:\r\n</p>\r\n\r\n<pre><code>$ sudo bash\r\n# mkdir -p /mnt/loop /mnt/drive\r\n# mount --options loop /path/to/Porteus*iso /mnt/loop\r\n# mount /dev/sdx1 /mnt/drive\r\n# rsync -av /mnt/loop/ /mnt/drive/\r\n# cd /mnt/drive/boot\r\n# chmod +x Porteus-installer-for-Linux.com\r\n# ./Porteus*com\r\n</code></pre>\r\n\r\n<p>\r\nAlternately, you can use Porteus from a virtual machine and install to a thumbdrive, as long as your virtualisation software redirects USB. I have used <a href=\"https://virt-manager.org/\" target=\"_blank\">virt-manager</a> running on Fedora successfully for this.\r\n</p>\r\n\r\n<p>The other alternative, of course, is to run Porteus off of an optical disc. That means your system is unwritable, so nothing you do is persistent across reboots, but you can save your work to a thumbdrive. I\'ve worked with Slax this way before, and it\'s quite manageable.</p>\r\n\r\n<h2>Boot</h2>\r\n\r\n<p>\r\nBooting to Porteus depends a lot on the firmware of the computer you\'re booting. Almost every Linux distro in existence has accurate docs on the changes you may or may not need to make to your BIOS or [U]EFI in order to boot to Linux, so you can find more detail on this if you need. Here\'s some text I borrowed from Linux Mint:\r\n</p>\r\n\r\n<p> Insert your USB stick (or DVD) into the computer.</p>\r\n<p>Restart the computer.</p>\r\n<p>Before your computer boots your current operating system (Windows, Mac, Linux) you should see your BIOS or UEFI loading screen. Check the screen or your computer’s documentation to know which key to press and instruct your computer to boot on USB (or DVD). Most BIOS or UEFI have a special key you can press to select the boot device and all of them have a special key to enter a configuration screen (from which you can define the boot order). Depending on the firmware, these special keys can be Escape, F1, F2, F8, F10, F11, F12, or Delete. That information is usually briefly displayed on screen during the boot sequence.\r\n</p>\r\n<p>\r\nOn Macs, keep your finger pressed on the Alt or Option key after hearing the boot sound.\r\n</p>\r\n\r\n<h2>Boot modes</h2>\r\n\r\n<p>Porteus can boot to its default persistent modes: graphical or text. Both of these modes auto load any Porteus modules you\'ve installed and also read any changes you made since the previous boot.\r\n</p>\r\n<p>It can also boot to ephemeral modes: Copy to RAM and Always Fresh. These modes act as if you\'ve never booted into Porteus before, loading a completely fresh version of the file system. They also do not load Porteus modules automatically.</p>\r\n\r\n<h2>Installing software</h2>\r\n\r\n<p>Porteus modules are Slackware packages converted to .xzm files, a highly-compressed SquashFS filesystem. When a Porteus module is activated, the application and other files contained in the module appear in your environment. You can think of it as a layered filesystem.</p>\r\n\r\n<p>\r\nTo install software, you must sync up your package manager with upstream repositories:</p>\r\n\r\n<pre><code>$ sudo usm -u all\r\n</code></pre>\r\n\r\n<p>\r\nOnce everything is updated, you can search for packages using the <code>-k</code> (for keyword) option&#58;</p>\r\n\r\n<pre><code>$ sudo usm -k foo\r\n</code></pre>\r\n\r\n<p>\r\nAnd then install it&#58;</p>\r\n\r\n<pre><code>$ sudo usm -g foo\r\n</code></pre>\r\n\r\n<p>\r\nYou are prompted to either install or download the module. If you install it, then it becomes part of the filesystem. However, since changes to the filesystem are NOT read by the Copy to RAM or Always Fresh modes, this is probably not what you want. Instead, download the module so that you can have Porteus load it dynamically regardless of what mode you\'re running.</p>\r\n\r\n<p>\r\nModules are downloaded, by default, to /tmp/usm/ and then converted from their native format of .t?z to .xzm files. You can copy the .xzm files to an external device if you\'re running off of optical media, or into a persistent area on the thumbdrive running Porteus. Modules can be made permanently available in the /mnt/sdx1/porteus/modules or /mnt/sdx1/porteus/optianal directories.\r\n</p>\r\n\r\n<p>Modules in the ../modules path are loaded at boot in the Graphical and Text modes, and are available to load manually in the Copy to RAM and Always Fresh modes.</p><p>Modules in the ../optional path are never auto loaded.</p>\r\n\r\n<p>Modules can be activated or deactivated with this command&#58;</p>\r\n\r\n<pre><code>$ sudo activate foo\r\n</code></pre>\r\n\r\n<h2>Miscellany</h2>\r\n\r\n<p><a href=\"https://flatpak.org/\" target=\"_blank\">Flatpak</a> works on Porteus, too. I have found this to be convenient for applications like GIMP and Inkscape and Kdenlive and many others that are complex enough to warrant special attention.\r\n</p>\r\n\r\n<p>\r\nFlatpak does require the <code>glib-networking</code> package. You will not be warned about this, because all upstream Slackware repositories assume a full install of Slackware (and glib-networking is included on Slackware, but not on Porteus). Once you install glib-networking, you can use flatpak as described, for instance, on the GIMP downloads page.\r\n</p>\r\n\r\n<p>\r\nOver-customizing the \"hard-coded\" parts of Porteus is unwise. For instance, keep the default user (guest), don\'t try to change the UID (I tried and failed), and so on. Treat the system, more or less, as if though you were a guest on someone else\'s multi-user system. Install and customise stuff locally and through modules when possible. That\'s what Porteus expects, and things can break if you try to treat it too much like a traditional Linux system.\r\n</p>\r\n',78,0,0,'CC-BY-SA','porteus,slax,installation,howto,tutorial,usbdrive,thumbdrive',0,0,1),
(2673,'2018-10-31','Urandom - Ohio Linux Fest 2-18 Podcaster Roundtable',2043,'The Urandom crew gathers the podcasters at Ohio Linux Fest for a chat.','<p>Hosts: Lyle, Thaj, Kevin O’Brian (Ahuka), Tony Beamus, FiftyOneFifty</p>\r\n<ul>\r\n<li><a href=\"https://asciinema.org/\" class=\"uri\">https://asciinema.org/</a></li>\r\n<li>HPR saves lives</li>\r\n<li>Green scooters, but not on fire</li>\r\n<li>North Market <a href=\"https://www.northmarket.com/\" class=\"uri\">https://www.northmarket.com/</a></li>\r\n<li>LIKE SHARE SUBSCRIBE!</li>\r\n<li>Urandom <a href=\"https://urandom-podcast.info\" class=\"uri\">https://urandom-podcast.info</a></li>\r\n<li>SMLR <a href=\"https://smlr.us/\" class=\"uri\">https://smlr.us/</a></li>\r\n<li>LinuxLugcast <a href=\"https://www.linuxlugcast.com/\" class=\"uri\">https://www.linuxlugcast.com/</a></li>\r\n<li>HPR <a href=\"https://hackerpublicradio.org/\" class=\"uri\">https://hackerpublicradio.org/</a></li>\r\n</ul>\r\n<p>** Record Scratch audio sample <a href=\"https://freesound.org/people/luffy/sounds/3536/\" class=\"uri\">https://freesound.org/people/luffy/sounds/3536/</a></p>\r\n',270,0,1,'CC-BY-SA','Ohio Linux Fest,Urandom,Sunday Morning Linux Review,Linux Lug Cast',0,0,1),
(2677,'2018-11-06','Thoughts on language learning part 4 - RPG.',1090,'I ponder the idea of an RPG with players not speaking the same language.','<p>I thought I was done with this topic, but got to thinking about bringing a game to life it occurred to me it was a lot of work. So I thought about it some more and hit upon the idea of an RPG probably mostly played online where a key point of the game is that the players needn’t know the same language.</p>\r\n<p>At first this seems like an odd thing for an RPG because the talking to each other is sort of a requirement. By now you’ve guessed that what I mean is that the game could be designed so that it assumes the players will have limited ability to communicate. And that drives how the game progresses.</p>\r\n<p>I see two kinds of approaches. One is that players sort of team up by the their native languages so you might have people knowing different native languages working in smaller teams while the whole game has the goal of everyone learning the new language.</p>\r\n<p>The other is that everyone could know a different native language and many or may nor cooperate with others but the goal of the game is everyone learning the same new language.</p>\r\n<p>Submitting this show mostly because I’m curious what the community thinks of the idea.</p>\r\n',151,0,1,'CC-0','spoken language learning',0,0,1),
(2681,'2018-11-12','DerbyCon Interview - Hackers for Charity',273,'Xoke interviews the amazing Hackers for Charity people','<p><a href=\"https://www.hackersforcharity.org/\" class=\"uri\">https://www.hackersforcharity.org/</a></p>',79,78,0,'CC-0','DerbyCon, Charity, Interview',0,0,1),
(2684,'2018-11-15','Making a remote control visible',77,'Yet another amazing life hack !!!','<h2>The problem</h2>\r\n<p>\r\nA black remote control on a black couch.\r\n</p>\r\n<h2>The solution</h2>\r\n<p>\r\nCover it in Earth <a href=\"https://en.wikipedia.org/wiki/Electrical_tape\">Insulating Tape</a>.\r\n</p>\r\n<p>\r\n<a href=\"https://hackerpublicradio.org/eps/hpr2684/hpr2684/hpr2684_front.jpg\">\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2684/hpr2684/hpr2684_front_small.jpg\" alt=\"Remote control front\"/>\r\n</a>\r\n</p>\r\n<p>\r\n<a href=\"https://hackerpublicradio.org/eps/hpr2684/hpr2684/hpr2684_back.jpg\">\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2684/hpr2684/hpr2684_back_small.jpg\" alt=\"Remote control rear\"/>\r\n</a>\r\n</p>\r\n\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Electrical_tape\">https://en.wikipedia.org/wiki/Electrical_tape</a></li>\r\n</ul>\r\n',30,0,1,'CC-BY-SA','Life hacks',0,0,1),
(2680,'2018-11-09','Some Additional Talk About Characters -- 01',746,'Lostnbronx takes a look at what sorts of characters work best for certain types of tales. Part 01.','<p>Some characters are simple, some are complex, and some are entirely unknowable. What sorts of characters work best for grand, sweeping good vs. evil tales? Which types work best for simple character dramas? And how do characters interact with the setting and story? Lostnbronx offers some off-the-cuff observations.</p>\r\n',107,105,0,'CC-0','stories,storytelling,characters,lostnbronx',0,0,1),
(2682,'2018-11-13','(NOT) All About Blender',2753,'A meandering conversation to sooth the nerves, and warm the soul.','<p>The first part of what began a serious attempt to sit down and discuss Blender, a free and open-source piece of awesome, that slowly (rapidly) devolved into a meandering discussion. Mostly about video games.</p>\r\n<ul>\r\n<li><a href=\"https://openmw.org/en/\" class=\"uri\">https://openmw.org/en/</a></li>\r\n<li><a href=\"https://www.blender.org/\" class=\"uri\">https://www.blender.org/</a></li>\r\n<li><a href=\"https://www.blender.org/support/tutorials/\" class=\"uri\">https://www.blender.org/support/tutorials/</a></li>\r\n<li><a href=\"https://danielpocock.com/quick-start-blender-video-editing\" class=\"uri\">https://danielpocock.com/quick-start-blender-video-editing</a></li>\r\n<li><a href=\"https://m.youtube.com/user/BlenderFoundation\" class=\"uri\">https://m.youtube.com/user/BlenderFoundation</a></li>\r\n<li><a href=\"https://m.youtube.com/watch?v=_lGfeS050Xw\" class=\"uri\">https://m.youtube.com/watch?v=_lGfeS050Xw</a></li>\r\n<li><a href=\"https://zombiemud.org/\" class=\"uri\">https://zombiemud.org/</a></li>\r\n</ul>\r\n<h3 id=\"bloodpong\">BloodPong</h3>\r\n<ul>\r\n<li><a href=\"https://www.youtube.com/watch?v=GHrg48sa4ZA\" class=\"uri\">https://www.youtube.com/watch?v=GHrg48sa4ZA</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=vqZQFbKxkxg\" class=\"uri\">https://www.youtube.com/watch?v=vqZQFbKxkxg</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=VCYrErmTIjA\" class=\"uri\">https://www.youtube.com/watch?v=VCYrErmTIjA</a></li>\r\n</ul>\r\n',325,0,1,'CC-BY-SA','Blender',0,0,1),
(2686,'2018-11-19','(NOT) All About Blender - Part the Second',2413,'A meandering conversation to sooth the nerves, and warm the soul - part 2!!','<p>The second part of what began as a serious attempt to sit down and discuss Blender, a free and open-source piece of awesome, that slowly (rapidly) devolved into a meandering discussion. Mostly about video games.</p>\r\n<ul>\r\n<li><a href=\"https://openmw.org/en/\" class=\"uri\">https://openmw.org/en/</a></li>\r\n<li><a href=\"https://www.blender.org/\" class=\"uri\">https://www.blender.org/</a></li>\r\n<li><a href=\"https://www.blender.org/support/tutorials/\" class=\"uri\">https://www.blender.org/support/tutorials/</a></li>\r\n<li><a href=\"https://danielpocock.com/quick-start-blender-video-editing\" class=\"uri\">https://danielpocock.com/quick-start-blender-video-editing</a></li>\r\n<li><a href=\"https://m.youtube.com/user/BlenderFoundation\" class=\"uri\">https://m.youtube.com/user/BlenderFoundation</a></li>\r\n<li><a href=\"https://m.youtube.com/watch?v=_lGfeS050Xw\" class=\"uri\">https://m.youtube.com/watch?v=_lGfeS050Xw</a></li>\r\n<li><a href=\"https://zombiemud.org/\" class=\"uri\">https://zombiemud.org/</a></li>\r\n</ul>\r\n<h3 id=\"bloodpong\">BloodPong</h3>\r\n<ul>\r\n<li><a href=\"https://www.youtube.com/watch?v=GHrg48sa4ZA\" class=\"uri\">https://www.youtube.com/watch?v=GHrg48sa4ZA</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=vqZQFbKxkxg\" class=\"uri\">https://www.youtube.com/watch?v=vqZQFbKxkxg</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=VCYrErmTIjA\" class=\"uri\">https://www.youtube.com/watch?v=VCYrErmTIjA</a></li>\r\n</ul>',325,0,1,'CC-BY-SA','Blender',0,0,1),
(2688,'2018-11-21','Explaining the controls on my Amateur HF Radio Part 5',1039,'In this episode I cover the remaining Receiver section controls of the TS940S.','<ul>\r\n<li><p>The controls covered are</p>\r\n<ul>\r\n<li>AF / RF gain\r\n<ul>\r\n<li>(1A) AF, Audio frequency gain control (Volume)<br />\r\nTurns the volume up and down</li>\r\n<li>(1B) RF, Radiofrequency gain control (From the Kenwood manual)<br />\r\nRF GAIN is controlled by changing the AGC (Auto Gain Control) threshold voltage. Adjusting the RF GAIN so that the S-meter reading increases to a point just lower than speech peaks. This also reduces noise during reception. For normal operation, this control should be turned fully clockwise for maximum sensitivity.</li>\r\n</ul></li>\r\n<li>CW VBT (From the Kenwood manual)\r\n<ul>\r\n<li>Carrier Wave Variable Bandwidth Tuning Control<br />\r\nThis control is very similar to the SSB Slope tuning controls. However, with the CW VBT control, both sides of the IF passband are narrowed at the same time.</li>\r\n</ul></li>\r\n<li>SSB Slope Tune (High pass low pass audio filter)\r\n<ul>\r\n<li>High pass filter<br />\r\n<a href=\"https://en.wikipedia.org/wiki/High-pass_filter\" class=\"uri\">https://en.wikipedia.org/wiki/High-pass_filter</a></li>\r\n<li>Low-pass filter<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Low-pass_filter\" class=\"uri\">https://en.wikipedia.org/wiki/Low-pass_filter</a></li>\r\n</ul></li>\r\n</ul></li>\r\n<li><p>I mention that the radio uses phase locked loop technologies.<br />\r\nBelow is an article in Wikipedia about PLL (Phase locked loop)<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Phase-locked_loop\" class=\"uri\">https://en.wikipedia.org/wiki/Phase-locked_loop</a></p></li>\r\n<li><p>I mention that the radio doesn’t use valves.<br />\r\nBelow is an article in Wikipedia about valves (Vacuum tubes)<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Vacuum_tube\" class=\"uri\">https://en.wikipedia.org/wiki/Vacuum_tube</a></p></li>\r\n<li><p>Dry joint<br />\r\nI mention that the radio developed a dry joint<br />\r\nBelow is an article in Wikipedia about soldering that covers dry joints<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Soldering#Dry_joint\" class=\"uri\">https://en.wikipedia.org/wiki/Soldering#Dry_joint</a></p></li>\r\n</ul>\r\n',201,43,1,'CC-BY-SA','HF, Ham, Amateur Radio',0,0,1),
(2683,'2018-11-14','Using Open source tools to visualize the heartrate and blood oxygen saturation level of my stepchild',1911,'Using Open source tools to visualize the heartrate and blood oxygen saturation level of my stepchild','<h2 id=\"using-python-php-jquery-and-linux-to-visualize-the-heartrate-and-blood-oxygen-saturation-level-of-my-stepdaughter.\">Using Python, PHP, JQuery and Linux to visualize the heartrate and blood oxygen saturation level of my stepdaughter.</h2>\r\n<p>Jeroen Baten talks about how he used his knowledge of a couple of open source tools to visualize the heartrate and oxygen saturation in the blood of one of his children and how this aided a pediatrician at the Wilhelmina childrens hospital to come to the right conclusion and treatment. This talk is a mix of tech and 43 surgery sessions on one single human being.</p>\r\n<h2>Links</h2>\r\n<ul><li>Details, including source code, graphs and all can be found\r\nhere:<br/>\r\n<a href=\"https://www.jeroenbaten.nl/cardio-oxygen-saturation-monitoring-home/\">https://www.jeroenbaten.nl/cardio-oxygen-saturation-monitoring-home/</a></li></ul>\r\n\r\n<p>\r\n<small><small><b>Editor\'s Note</b><br/>\r\nJeroen\'s link above was added after the show had been aired.</small></small>\r\n</p>\r\n',369,0,0,'CC-BY-SA','python, php, jquery, linux',0,0,1),
(2687,'2018-11-20','Some Additional Talk About Characters -- 02',750,'Lostnbronx takes a look at what sorts of characters work best for certain types of tales. Part 02.','<p>What are some typical ways to create characters in your stories? Should you create the plot first, or the characters first? Should we think of characters in terms of heroes and villains, or protagonists and antagonists? What is the value of character depth, and is it the same as the character arc? Lostnbronx offers up even more off-the-cuff thoughts about this complicated subject.</p>\r\n',107,105,0,'CC-0','stories,storytelling,characters,lostnbronx',0,0,1),
(2956,'2019-12-02','HPR Community News for November 2019',5211,'Dave, Jeroen and Ken talk about shows released and comments posted in November 2019','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new hosts: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0381.html\" target=\"_blank\">Nihilazo</a>, \n    <a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</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=2935\" target=\"_blank\">2935</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-11-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2935\" target=\"_blank\">The work of fire fighters, part 3</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=2936\" target=\"_blank\">2936</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-11-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2936\" target=\"_blank\">HPR Community News for October 2019</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=2937\" target=\"_blank\">2937</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-11-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2937\" target=\"_blank\">Lord D\'s Film Reviews: His Girl Friday</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=2938\" target=\"_blank\">2938</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-11-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2938\" target=\"_blank\">Naming pets in space game</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2939\" target=\"_blank\">2939</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-11-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2939\" target=\"_blank\">Submit a show to Hacker Public Radio in 10 easy steps</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2940\" target=\"_blank\">2940</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-11-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2940\" target=\"_blank\">Better Social Media 05 - Mastodon</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=2941\" target=\"_blank\">2941</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-11-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2941\" target=\"_blank\">Server Basics 107: Minishift and container management</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=2942\" target=\"_blank\">2942</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-11-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2942\" target=\"_blank\">Why I love lisps</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0381.html\" target=\"_blank\">Nihilazo</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2943\" target=\"_blank\">2943</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-11-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2943\" target=\"_blank\">Music as Life</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0329.html\" target=\"_blank\">brian</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2944\" target=\"_blank\">2944</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-11-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2944\" target=\"_blank\">ONICS Basics Part 4: Network Flows and Connections</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0259.html\" target=\"_blank\">Gabriel Evenfire</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2945\" target=\"_blank\">2945</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-11-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2945\" target=\"_blank\">Saturday at OggCamp Manchester 2019</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=2946\" target=\"_blank\">2946</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-11-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2946\" target=\"_blank\">Sunday at OggCamp Manchester 2019</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=2947\" target=\"_blank\">2947</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-11-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2947\" target=\"_blank\">The Mimblewimble Protocol</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0379.html\" target=\"_blank\">mightbemike</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2948\" target=\"_blank\">2948</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-11-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2948\" target=\"_blank\">Testing with Haskell</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2949\" target=\"_blank\">2949</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-11-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2949\" target=\"_blank\">Grin and Beam: The 2 major mimblewimble blockchains</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0379.html\" target=\"_blank\">mightbemike</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2950\" target=\"_blank\">2950</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-11-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2950\" target=\"_blank\">NotPetya and Maersk: An Object Lesson</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=2951\" target=\"_blank\">2951</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-11-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2951\" target=\"_blank\">A walk through my PifaceCAD Python code – 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=2952\" target=\"_blank\">2952</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-11-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2952\" target=\"_blank\">Publishing your book using open source tools</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=2953\" target=\"_blank\">2953</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-11-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2953\" target=\"_blank\">How I got started in Linux</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=2954\" target=\"_blank\">2954</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-11-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2954\" target=\"_blank\">Wrestling As You Like It episode 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0354.html\" target=\"_blank\">TheDUDE</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2955\" target=\"_blank\">2955</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-11-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2955\" target=\"_blank\">Machine Learning / Data Analysis Basics</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 16 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 2 comments on\n1 previous show:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=1585#comments\" target=\"_blank\">hpr1585</a></strong>\n(2014-08-29) \"<em>36 - LibreOffice Calc - Financial Functions - Loan Payments</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=1585#1\" target=\"_blank\">Comment 1</a>:\ntimttmy on 2019-11-30:\n\"Thanks\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=1585#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2019-11-30:\n\"I\'m glad it helped\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 14 comments on 8 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2935#comments\" target=\"_blank\">hpr2935</a></strong>\n(2019-11-01) \"<em>The work of fire fighters, part 3</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=2935#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2019-11-05:\n\"That sucks\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2935#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2019-11-05:\n\"That blows\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2935#3\" target=\"_blank\">Comment 3</a>:\nKen Fallon on 2019-11-05:\n\"You\'re Fired\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2936#comments\" target=\"_blank\">hpr2936</a></strong>\n(2019-11-04) \"<em>HPR Community News for October 2019</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=2936#1\" target=\"_blank\">Comment 1</a>:\nlostnbronx on 2019-11-04:\n\"Ken\'s Voice Is Better Than espeak\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2936#2\" target=\"_blank\">Comment 2</a>:\nJon Kulp on 2019-11-05:\n\"Pots\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2936#3\" target=\"_blank\">Comment 3</a>:\nclacke on 2019-11-19:\n\"Release order or episode order?\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2939#comments\" target=\"_blank\">hpr2939</a></strong>\n(2019-11-07) \"<em>Submit a show to Hacker Public Radio in 10 easy steps</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2939#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2019-11-07:\n\"Clarification\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2940#comments\" target=\"_blank\">hpr2940</a></strong>\n(2019-11-08) \"<em>Better Social Media 05 - Mastodon</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=2940#1\" target=\"_blank\">Comment 1</a>:\nClaudioM on 2019-11-08:\n\"Simple Mastodon Timeline View Option\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2942#comments\" target=\"_blank\">hpr2942</a></strong>\n(2019-11-12) \"<em>Why I love lisps</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0381.html\" target=\"_blank\">Nihilazo</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2942#1\" target=\"_blank\">Comment 1</a>:\nTuula on 2019-11-12:\n\"welcome\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2942#2\" target=\"_blank\">Comment 2</a>:\nCarl on 2019-11-21:\n\"Well Done\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2942#3\" target=\"_blank\">Comment 3</a>:\ngerryk on 2019-11-22:\n\"loved it\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2943#comments\" target=\"_blank\">hpr2943</a></strong>\n(2019-11-13) \"<em>Music as Life</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0329.html\" target=\"_blank\">brian</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2943#1\" target=\"_blank\">Comment 1</a>:\nCarl on 2019-11-21:\n\"Interesting Episode\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2944#comments\" target=\"_blank\">hpr2944</a></strong>\n(2019-11-14) \"<em>ONICS Basics Part 4: Network Flows and Connections</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0259.html\" target=\"_blank\">Gabriel Evenfire</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2944#1\" target=\"_blank\">Comment 1</a>:\nDave Morriss on 2019-11-27:\n\"This is wonderful\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2955#comments\" target=\"_blank\">hpr2955</a></strong>\n(2019-11-29) \"<em>Machine Learning / Data Analysis Basics</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=2955#1\" target=\"_blank\">Comment 1</a>:\nMr. Young on 2019-11-29:\n\"Great first 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/2019-November/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-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=\"stand-at-fosdem\">Stand at FOSDEM</h3>\n<p>Our proposal for a “Free Culture Podcasts” stand at FOSDEM was accepted for the Sunday 2nd February. This is fantastic news as this is the largest FLOSS event in Europe and is absolutely thronged the whole day.</p>\n<p><a href=\"https://fosdem.org/2020/news/2019-11-19-accepted-stands/\" class=\"uri\">https://fosdem.org/2020/news/2019-11-19-accepted-stands/</a></p>\n<p>Anyone going to FOSDEM, and who would like to help staff the booth on Sunday please get in touch.</p>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month: <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 5 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),
(2981,'2020-01-06','HPR Community News for December 2019',4671,'HPR Volunteers talk about shows released and comments posted in December 2019','<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/0383.html\" target=\"_blank\">Paul Quirk</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=2956\" target=\"_blank\">2956</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-12-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2956\" target=\"_blank\">HPR Community News for November 2019</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=2957\" target=\"_blank\">2957</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-12-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2957\" target=\"_blank\">Lord D\'s Film Reviews: Ever</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=2958\" target=\"_blank\">2958</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-12-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2958\" target=\"_blank\">Haskell modules</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2959\" target=\"_blank\">2959</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-12-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2959\" target=\"_blank\">Interview with Josh Clements about gpodder.net </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=2960\" target=\"_blank\">2960</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-12-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2960\" target=\"_blank\">Dehydrated Foods</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=2961\" target=\"_blank\">2961</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-12-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2961\" target=\"_blank\">Kubernetics / Cloud - Terminology</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=2962\" target=\"_blank\">2962</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-12-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2962\" target=\"_blank\">Bespoke bike building</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=2963\" target=\"_blank\">2963</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-12-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2963\" target=\"_blank\">A walk through my PifaceCAD Python code – 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=2964\" target=\"_blank\">2964</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-12-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2964\" target=\"_blank\">Bolos and Bowties: Neckwear for Nerds</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=2965\" target=\"_blank\">2965</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-12-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2965\" target=\"_blank\">instant feedback for students in maths</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0288.html\" target=\"_blank\">beni</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2966\" target=\"_blank\">2966</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-12-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2966\" target=\"_blank\">World of Commodore 2019 Episode 1: The Interviews</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=2967\" target=\"_blank\">2967</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-12-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2967\" target=\"_blank\">Wrestling As You Like It Episode 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0354.html\" target=\"_blank\">TheDUDE</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2968\" target=\"_blank\">2968</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-12-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2968\" target=\"_blank\">Life and Times of a Geek part 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=2969\" target=\"_blank\">2969</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-12-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2969\" target=\"_blank\">Crewing a spaceship in Haskell</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2970\" target=\"_blank\">2970</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-12-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2970\" target=\"_blank\">The Fediverse</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=2971\" target=\"_blank\">2971</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-12-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2971\" target=\"_blank\">World of Commodore 2019 Episode 2: Hacking GeckOS</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=2972\" target=\"_blank\">2972</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-12-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2972\" target=\"_blank\">The foot of the ski slope</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=2973\" target=\"_blank\">2973</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2019-12-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2973\" target=\"_blank\">Introduction to Advent of Code</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=2974\" target=\"_blank\">2974</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2019-12-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2974\" target=\"_blank\">Guitar Setup pt. 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0235.html\" target=\"_blank\">NYbill</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2975\" target=\"_blank\">2975</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2019-12-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2975\" target=\"_blank\">SimpleScreenRecorder and Vidcutter</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=2976\" target=\"_blank\">2976</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2019-12-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2976\" target=\"_blank\">A walk through my PifaceCAD Python code – Part 4</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=2977\" target=\"_blank\">2977</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2019-12-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2977\" target=\"_blank\">World of Commodore 2019 Episode 3: Life after Commodore</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</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 22 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 6 comments on\n6 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2924#comments\" target=\"_blank\">hpr2924</a></strong>\n(2019-10-17) \"<em>Hacking an Alarm Clock to Make it Quieter</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=2924#1\" target=\"_blank\">Comment 1</a>:\nGabriel Evenfire on 2019-12-24:\n\"Fun to listen to as always\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2932#comments\" target=\"_blank\">hpr2932</a></strong>\n(2019-10-29) \"<em>Stardrifter RPG Playtest Part 10</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0107.html\" target=\"_blank\">lostnbronx</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2932#1\" target=\"_blank\">Comment 1</a>:\nGabriel Evenfire on 2019-12-24:\n\"Loved the series\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2942#comments\" target=\"_blank\">hpr2942</a></strong>\n(2019-11-12) \"<em>Why I love lisps</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0381.html\" target=\"_blank\">Nihilazo</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2942#4\" target=\"_blank\">Comment 4</a>:\nGabriel Evenfire on 2019-12-24:\n\"Great first episode\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2944#comments\" target=\"_blank\">hpr2944</a></strong>\n(2019-11-14) \"<em>ONICS Basics Part 4: Network Flows and Connections</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0259.html\" target=\"_blank\">Gabriel Evenfire</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2944#2\" target=\"_blank\">Comment 2</a>:\nGabriel Evenfire on 2019-12-23:\n\"Glad you liked it!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2947#comments\" target=\"_blank\">hpr2947</a></strong>\n(2019-11-19) \"<em>The Mimblewimble Protocol</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0379.html\" target=\"_blank\">mightbemike</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2947#1\" target=\"_blank\">Comment 1</a>:\nGabriel Evenfire on 2019-12-24:\n\"Enjoying this series\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2955#comments\" target=\"_blank\">hpr2955</a></strong>\n(2019-11-29) \"<em>Machine Learning / Data Analysis Basics</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>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2955#2\" target=\"_blank\">Comment 2</a>:\ngerryk on 2019-12-06:\n\"great! clear and informational\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 16 comments on 10 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2956#comments\" target=\"_blank\">hpr2956</a></strong>\n(2019-12-02) \"<em>HPR Community News for November 2019</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=2956#1\" target=\"_blank\">Comment 1</a>:\njezra on 2019-12-10:\n\"No more postcards?\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2957#comments\" target=\"_blank\">hpr2957</a></strong>\n(2019-12-03) \"<em>Lord D\'s Film Reviews: Ever</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0107.html\" target=\"_blank\">lostnbronx</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2957#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2019-12-03:\n\"Great series but ...\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2957#2\" target=\"_blank\">Comment 2</a>:\nlostnbronx on 2019-12-04:\n\"Links\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2957#3\" target=\"_blank\">Comment 3</a>:\nKen Fallon on 2019-12-04:\n\"Good point\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2959#comments\" target=\"_blank\">hpr2959</a></strong>\n(2019-12-05) \"<em>Interview with Josh Clements about gpodder.net </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=2959#1\" target=\"_blank\">Comment 1</a>:\nMr. Young on 2019-12-05:\n\"No problem. I\'ll do it\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2962#comments\" target=\"_blank\">hpr2962</a></strong>\n(2019-12-10) \"<em>Bespoke bike building</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0326.html\" target=\"_blank\">Brian in Ohio</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2962#1\" target=\"_blank\">Comment 1</a>:\npetard on 2019-12-11:\n\"I really enjoyed this\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2962#2\" target=\"_blank\">Comment 2</a>:\nJon Kulp on 2019-12-12:\n\"Excellent progress\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2963#comments\" target=\"_blank\">hpr2963</a></strong>\n(2019-12-11) \"<em>A walk through my PifaceCAD Python code – Part 3</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2963#1\" target=\"_blank\">Comment 1</a>:\nGabriel Evenfire on 2019-12-24:\n\"Great series\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2963#2\" target=\"_blank\">Comment 2</a>:\nMrX on 2019-12-27:\n\"Re: Great series\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2964#comments\" target=\"_blank\">hpr2964</a></strong>\n(2019-12-12) \"<em>Bolos and Bowties: Neckwear for Nerds</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><li><a href=\"https://hackerpublicradio.org/eps.php?id=2964#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2019-12-12:\n\"Yes it is of interest to Hackers\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2964#2\" target=\"_blank\">Comment 2</a>:\nJon Kulp on 2019-12-12:\n\"the model\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2965#comments\" target=\"_blank\">hpr2965</a></strong>\n(2019-12-13) \"<em>instant feedback for students in maths</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0288.html\" target=\"_blank\">beni</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2965#1\" target=\"_blank\">Comment 1</a>:\nDave Morriss on 2019-12-19:\n\"Cool project!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2966#comments\" target=\"_blank\">hpr2966</a></strong>\n(2019-12-16) \"<em>World of Commodore 2019 Episode 1: The Interviews</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=2966#1\" target=\"_blank\">Comment 1</a>:\nJon Kulp on 2019-12-19:\n\"Legacy Tech\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2966#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2019-12-19:\n\"Great show!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2967#comments\" target=\"_blank\">hpr2967</a></strong>\n(2019-12-17) \"<em>Wrestling As You Like It Episode 2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0354.html\" target=\"_blank\">TheDUDE</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2967#1\" target=\"_blank\">Comment 1</a>:\nBRonaldo on 2019-12-17:\n\"WWE\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2974#comments\" target=\"_blank\">hpr2974</a></strong>\n(2019-12-26) \"<em>Guitar Setup pt. 2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0235.html\" target=\"_blank\">NYbill</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2974#1\" target=\"_blank\">Comment 1</a>:\nNYbill on 2019-12-26:\n\"Heh, editing...\"</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/2019-December/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-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>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),
(2691,'2018-11-26','DerbyCon Interview - John Strand',160,'John Strand talks about behavoural analytics and blockchain','<p>John Strand (<a href=\"https://twitter.com/strandjs\" class=\"uri\">https://twitter.com/strandjs</a>) from Black Hills Information Security (<a href=\"https://www.blackhillsinfosec.com/\" class=\"uri\">https://www.blackhillsinfosec.com/</a>)</p>\r\n<p>Download RITA (it’s free!) - Real Intelligence Threat Analytics - <a href=\"https://www.blackhillsinfosec.com/projects/rita/\" class=\"uri\">https://www.blackhillsinfosec.com/projects/rita/</a></p>',79,78,0,'CC-BY-SA','DerbyCon, Interview, Blockchain',0,0,1),
(2699,'2018-12-06','Bash Tips - 15',1794,'Some of the pitfalls when using loops in Bash','<h1 id=\"bash-tips---15\">Bash Tips - 15 <small><small>(More auxiliary Bash tips)</small></small></h1>\n<h2 id=\"pitfalls-for-the-unwary-bash-loop-user\">Pitfalls for the unwary Bash loop user</h2>\n<p>This is the fifteenth episode covering useful tips for Bash users. In the last episode we looked at the <code>\'for\'</code> loop, and prior to that we looked at <code>\'while\'</code> and <code>\'until\'</code> loops. In this one I want to look at some of the loop-related issues that can trip up the unwary user.</p>\n<p>Loops in Bash are extremely useful, and they are not at all difficult to use in their basic forms. However, there are some perhaps less than obvious issues that can result in unexpected behaviour.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2699_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html#Process-Substitution\">\"Bash Process Substitution\"</a></li>\n</ul></li>\n<li><p><a href=\"https://www.gnu.org/software/findutils/manual/html_mono/find.html\">\"<em>GNU Findutils</em>\"</a></p></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 \"<em>Additional ancillary Bash tips - 12</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2679\">HPR episode 2679 \"<em>Extra ancillary Bash tips - 13</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2689\">HPR episode 2689 \"<em>Bash Tips - 14 (Some auxiliary Bash tips)</em>\"</a></li>\n</ol></li>\n</ul>\n<ul>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2699_bash15_ex1.sh\">bash15_ex1.sh</a>, <a href=\"hpr2699_bash15_ex2.sh\">bash15_ex2.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,loop,ls,pipe,pipeline,find,extglob',0,0,1),
(2710,'2018-12-21','Youtube downloader for channels',844,'A followup to hpr2675 how you can download an entire youtube channel for local playout','<p>\r\nI had a very similar problem to Ahuka aka Kevin, in <a href=\"https://hackerpublicradio.org/eps.php?id=2675\">hpr2675 :: YouTube Playlists</a>. I wanted to be able to download an entire youtube channel and store them so that I could play them in the order that they were posted.\r\n</p>\r\n<p>\r\nAdd the url\'s to a file called <em>subscriptions.txt</em>.\r\n</p>\r\n<pre>\r\n#LASTRUN: 20181030\r\n# /home/ken/sourcecode/personal/bestofyoutube/youtube-channel-watcher.bash\r\n#\r\n# Big Clive \r\nhttps://www.youtube.com/channel/UCtM5z2gkrGRuWd0JQMx76qA	20181030\r\n# Essential Craftsman\r\nhttps://www.youtube.com/channel/UCzr30osBdTmuFUS8IfXtXmg\r\n</pre>\r\n<p>\r\nThen run the script\r\n</p>\r\n<pre>\r\n#!/bin/bash\r\n# Downloads videos from youtube based on selection from https://thebestofyoutube.com\r\n# (c) Ken Fallon https://kenfallon.com\r\n# Released under the CC-0\r\n\r\nsavepath=\"/mnt/media/Videos/channels\"\r\nsubscriptions=\"${savepath}/subscriptions.txt\"\r\nYOUNGERTHAN=\"20010101\"\r\nRUNDATE=$(date +%Y%m%d)\r\nyoutubedl=\"/home/ken/sourcecode/youtube-dl/youtube-dl\"\r\n#DRYRUN=\"echo DEBUG: \"\r\n\r\nif [ ! -e \"${subscriptions}\" ]\r\nthen\r\n	echo \"Cannot find subscription file \"${subscriptions}\"\"\r\n	exit 1\r\nfi\r\n\r\nif [ \"$(grep \"#LASTRUN: \" \"${subscriptions}\" | wc -l )\" -eq 0 ]\r\nthen\r\n	sed --follow-symlinks \'1s/^/#LASTRUN: n/\' -i \"${subscriptions}\"\r\nfi\r\n\r\n# Read the subscriptions\r\ncat \"${subscriptions}\" | grep -v \'#\' | while read channel_info\r\ndo\r\n	if [ \"$(echo \"${channel_info}\" | grep -P \'t\' | wc -l )\" -eq 0 ]\r\n	then\r\n		DATEAFTER=\"--dateafter ${YOUNGERTHAN}\"\r\n	else\r\n		DATEAFTER=\"--dateafter $(echo \"${channel_info}\" | awk \'{print $NF}\' )\"\r\n	fi\r\n	channel=\"$(echo \"${channel_info}\" | awk \'{print $1}\' )\"\r\n	echo \"Processing Channel \"${channel}\" since ${DATEAFTER}\"\r\n	${DRYRUN} ${youtubedl} ${DATEAFTER} --ignore-errors --no-mtime --restrict-filenames --format mp4 -o ${savepath}\'/%(uploader)s/%(upload_date)s-%(title)s⋄%(id)s.%(ext)s\' ${channel}\r\n	${DRYRUN} sed --follow-symlinks \"s,${channel}.*$,${channel}t${RUNDATE},g\" -i \"${subscriptions}\"\r\ndone\r\n\r\n${DRYRUN} sed --follow-symlinks \"s/#LASTRUN: .*$/#LASTRUN: ${RUNDATE}/\" -i \"${subscriptions}\"\r\n</pre>\r\n',30,0,1,'CC-BY-SA','youtube, youtube-dl',0,0,1),
(2720,'2019-01-04','Download youtube channels using the rss feeds',1447,'Ken shares a script that will allow you to quickly keep up to date on your youtube subscriptions','<p>\nI had a very similar problem to Ahuka aka Kevin, in <a href=\"https://hackerpublicradio.org/eps.php?id=2675\">hpr2675 :: YouTube Playlists</a>. I wanted to be able to download an entire youtube channel and store them so that I could play them in the order that they were posted.<br />\nSee previous episode <a href=\"https://hackerpublicradio.org/eps.php?id=2710\">hpr2710 :: Youtube downloader for channels</a>.\n</p>\n<p>\nThe problem with the original script is that it needs to download and check each video in each channel and it can crawl to a halt on large channels like <a href=\"https://www.eevblog.com/\">EEEVblog</a>.\n</p>\n<p>\nThe solution was given in <a href=\"https://hackerpublicradio.org/eps.php?id=2544\">hpr2544 :: How I prepared episode 2493: YouTube Subscriptions - update</a> with more details in the <a href=\"https://hackerpublicradio.org/eps/hpr2544/hpr2544/full_shownotes.html\">full-length</a> notes.\n</p>\n\n<ol>\n<li>Subscribe:<br />Subscriptions are the currency of YouTube creators so don\'t be afraid to create an account to subscribe to the creators. Here is my current <a href=\"hpr2720_subscription_manager.opml\">subscription_manager.opml</a> to give you some ideas.</li>\n<li>Export:<br />Login to <a href=\"https://www.youtube.com/subscription_manager\">https://www.youtube.com/subscription_manager</a> and at the bottom you will see the option to <strong>Export subscriptions</strong>. Save the file and alter the script to point to it.</li>\n<li>Download: Run the script <a href=\"hpr2720_youtube-rss.bash\">youtube-rss.bash</a></li>\n</ol>\n\n<h3>How it works</h3>\n<p>\nThe first part allows you to define where you want to save your files. It also allows you to set what videos to skip based on length and strings in their titles.\n</p>\n<pre>\nsavepath=\"/mnt/media/Videos/channels\"\nsubscriptions=\"${savepath}/subscription_manager.opml\"\nlogfile=\"${savepath}/log/downloaded.log\"\nyoutubedl=\"/mnt/media/Videos/youtube-dl/youtube-dl\"\nDRYRUN=\"echo DEBUG: \"\nmaxlength=7200 # two hours\nskipcrap=\"fail |react |live |Best Pets|BLOOPERS|Kids Try\"\n</pre>\n\n<p>\nAfter some checks and cleanup, we can then parse the <a href=\"https://en.wikipedia.org/wiki/OPML\">opml</a> file. This is an example of the top of mine.\n</p>\n<pre>\n&lt;?xml version=\"1.0\"?&gt;\n&lt;opml version=\"1.1\"&gt;\n  &lt;body&gt;\n    &lt;outline text=\"YouTube Subscriptions\" title=\"YouTube Subscriptions\"&gt;\n      &lt;outline text=\"Wintergatan\" title=\"Wintergatan\" type=\"rss\" xmlUrl=\"https://www.youtube.com/feeds/videos.xml?channel_id=UCcXhhVwCT6_WqjkEniejRJQ\"/&gt;\n      &lt;outline text=\"Primitive Technology\" title=\"Primitive Technology\" type=\"rss\" xmlUrl=\"https://www.youtube.com/feeds/videos.xml?channel_id=UCAL3JXZSzSm8AlZyD3nQdBA\"/&gt;\n      &lt;outline text=\"John Ward\" title=\"John Ward\" type=\"rss\" xmlUrl=\"https://www.youtube.com/feeds/videos.xml?channel_id=UC2uFFhnMKyF82UY2TbXRaNg\"/&gt;\n</pre>\n\n<p>\nNow we use the xmlstarlet tool to extract each of the urls and also the title. The title is just used to give some feedback, while the url needs to be stored for later. Now we have a complete list of all the current urls, in all the feeds. \n</p>\n<pre>\nxmlstarlet sel -T -t -m \'/opml/body/outline/outline\' -v \'concat( @xmlUrl, \" \", @title)\' -n \"${subscriptions}\" | while read subscription title\ndo\n  echo \"Getting \"${title}\"\"\n  wget -q \"${subscription}\" -O - | xmlstarlet sel -T -t -m \'/_:feed/_:entry/media:group/media:content\' -v \'@url\' -n - | awk -F \'?\' \'{print $1}\'  >> \"${logfile}_getlist\"\ndone\n</pre>\n\n<p>\nThe main part of the script then counts the total so we can have some feedback while we are running it. It then pumps the list from the previous step into a loop which first checks to make sure we have not already downloaded it.\n</p>\n<pre>\ncount=1\ntotal=$( sort \"${logfile}_getlist\" | uniq | wc -l )\n\nsort \"${logfile}_getlist\" | uniq | while read thisvideo\ndo \n  if [ \"$( grep \"${thisvideo}\" \"${logfile}\" | wc -l )\" -eq 0 ];\n  then\n</pre>\n<p>\nThe next part takes advantage of the <strong>youtube-dl --dump-json</strong> command which downloads all sorts of information about the video which we store to query later.\n</p>\n<pre>\n    metadata=\"$( ${youtubedl} --dump-json ${thisvideo} )\"\n    uploader=\"$( echo $metadata | jq \'.uploader\' | awk -F \'\"\' \'{print $2}\' )\"\n    title=\"$( echo $metadata | jq \'.title\' | awk -F \'\"\' \'{print $2}\' )\"\n    upload_date=\"$( echo $metadata | jq \'.upload_date\' | awk -F \'\"\' \'{print $2}\' )\"\n    id=\"$( echo $metadata | jq \'.id\' | awk -F \'\"\' \'{print $2}\' )\"\n    duration=\"$( echo $metadata | jq \'.duration\' )\"\n</pre>\n<p>\nHaving the duration, we can skip long episodes.\n</p>\n<pre>\n\n    if [[ -z ${duration} || ${duration} -le 0 ]]\n    then\n      echo -e \"nError: The duration \"${length}\" is strange. \"${thisvideo}\".\"\n      continue\n    elif [[ ${duration} -ge ${maxlength} ]]\n    then\n      echo -e \"nFilter: You told me not to download titles over ${maxlength} seconds long \"${title}\", \"${thisvideo}\"\"\n      continue\n    fi\n</pre>\n<p>\nOr videos that don\'t interest us.\n</p>\n<pre>\n\n    if [[ ! -z \"${skipcrap}\" &amp;&amp; $( echo ${title} | egrep -i \"${skipcrap}\" | wc -l ) -ne 0 ]]\n    then\n      echo -e \"nSkipping: You told me not to download this stuff. ${uploader}: \"${title}\", \"${thisvideo}\"\"\n      continue\n    else\n      echo -e \"n${uploader}: \"${title}\", \"${thisvideo}\"\"\n    fi\n</pre>\n<p>\nNow we have a filtered list of urls we do want to keep. These we also save the description in a text file with the video id if we want to refer to it later. \n</p>\n<pre>\n    echo ${thisvideo} &gt;&gt; \"${logfile}_todo\"\n    echo -e $( echo $metadata | jq \'.description\' ) &gt; \"${savepath}/description/${id}.txt\"\n  else\n    echo -ne \"rProcessing ${count} of ${total}\"\n  fi\n  count=$((count+1))\ndone\necho \"\"\n</pre>\n<p>\nAnd finally we download the actual videos saving each channel in its own directory. The file names is first an <a href=\"https://en.wikipedia.org/wiki/ISO_8601\">ISO8601</a> date, then the title stored as ASCII with no space or ampersands. I then use a \"⋄\" as a delimiter before the video id.\n</p>\n<pre>\n\n# Download the list\nif [ -e \"${logfile}_todo\" ];\nthen\n  cat \"${logfile}_todo\" | ${youtubedl} --batch-file - --ignore-errors --no-mtime --restrict-filenames --format mp4 -o \"${savepath}\"\'/%(uploader)s/%(upload_date)s-%(title)s⋄%(id)s.%(ext)s\'\n  cat \"${logfile}_todo\" &gt;&gt; ${logfile}\nfi\n</pre>\n<p>\nNow you have a fast script that keeps you up to date with your feeds.\n</p>\n',30,0,1,'CC-BY-SA','youtube, youtube-dl, channels, playlists, xmlstarlet',0,0,1),
(2693,'2018-11-28','Getting started with web based game in Haskell and Elm',1146,'First steps in writing 4x space exploration game','<p>Haskell Stack: <a href=\"https://docs.haskellstack.org/en/stable/README/\">https://docs.haskellstack.org/en/stable/README/</a></p>\r\n<p>Stack is a build tool for Haskell with focus on reproducible build plans, multi-package projects, and a consistent, easy-to-learn interface. With stack, one can create new project: <kbd>stack new my-project yesod-sqlite</kbd> (more in the quick start guide: <a href=\"https://www.yesodweb.com/page/quickstart\">https://www.yesodweb.com/page/quickstart</a>)</p>\r\n\r\n<p><a href=\"https://github.com/Tuula/deep-sky/blob/baa0807dd36b61fd02174b17c10013862af4ec18/config/models\">models</a> is used to define shape of the data and Yesod uses it to generate datatypes and database for you. For example, to define a Star that has name, spectral type, luminosity class and link to StarSystem, one can write:</p>\r\n\r\n<pre><code>\r\nStar json\r\n    name Text\r\n    starSystemId StarSystemId\r\n    spectralType SpectralType\r\n    luminosityClass LuminosityClass\r\n</code></pre>\r\n\r\n<p>Custom types, like LuminosityClass, need mapping between datatype and database. In simple cases like this, Yesod can do that:\r\n\r\n<pre><code>\r\ndata LuminosityClass = Iap | Ia | Iab | Ib | II | III | IV | V | VI | VII\r\n    deriving (Show, Read, Eq)\r\nderivePersistField \"LuminosityClass\"\r\n</code></pre>\r\n\r\n<p>The \"derivePersistField\" part is template haskell call that will generate mapping needed.</p>\r\n\r\n<p>For those interested seeing some code, source is available at <a href=\"https://github.com/Tuula/deep-sky/\">https://github.com/Tuula/deep-sky/</a> (<a href=\"https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18\">https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18</a> is situation before lots of Elm related changes that I mentioned in passing in the episode)</p>\r\n\r\n',364,107,0,'CC-BY-SA','haskell, yesod',0,0,1),
(2703,'2018-12-12','Fog of war in Yesod based game',1515,'How to implement fog of war system in turn based web game','<p>Duality of the universe: there\'s true state of the universe used in simulation and there\'s state the the players perceive. These most likely will always be in conflict. One possible solution is to separate these completely. Perform simulation in one system and record what players see in other.</p>\r\n\r\n<p>For every type of entity in the game, there\'s two sets of data: real and reported. Reports are tied to time and faction. Examples are given for planets. Thus, we have <em>Planet</em>, <em>PlanetReport</em> and <em>CollatedPlanetReport</em>. First is the real entity, second is report of that entity tied in time and faction. Third one is aggregated information a faction has of given entity. In database two first ones are:</p>\r\n\r\n<pre><code>\r\nPlanet json\r\n    name Text\r\n    position Int\r\n    starSystemId StarSystemId\r\n    ownerId FactionId Maybe\r\n    gravity Double\r\n    SystemPosition starSystemId position\r\n    deriving Show\r\n\r\nPlanetReport json\r\n    planetId PlanetId\r\n    ownerId  FactionId Maybe\r\n    starSystemId StarSystemId\r\n    name Text Maybe\r\n    position Int Maybe\r\n    gravity Double Maybe\r\n    factionId FactionId\r\n    date Int\r\n    deriving Show\r\n</code></pre>\r\n<p>Third one is defined as a datatype:</p>\r\n\r\n<pre><code>\r\ndata CollatedPlanetReport = CollatedPlanetReport\r\n    { cprPlanetId :: Key Planet\r\n    , cprSystemId :: Key StarSystem\r\n    , cprOwnerId  :: Maybe (Key Faction)\r\n    , cprName     :: Maybe Text\r\n    , cprPosition :: Maybe Int\r\n    , cprGravity  :: Maybe Double\r\n    , cprDate     :: Int\r\n    } deriving Show\r\n</code></pre>\r\n\r\n<p>Data from database need to be transformed before working on it. Usually it\'s 1:1 mapping, but sometimes it makes sense to enrich it (turning IDs into names for example). For this we use <em>ReportTransform</em> type class:</p>\r\n\r\n<pre><code>\r\n-- | Class to transform a report stored in db to respective collated report\r\nclass ReportTransform a b where\r\n    fromReport :: a -&gt; b\r\n\r\ninstance ReportTransform PlanetReport CollatedPlanetReport where\r\n    fromReport report =\r\n	CollatedPlanetReport (planetReportPlanetId report)\r\n			     (planetReportStarSystemId report)\r\n			     (planetReportOwnerId report)\r\n			     (planetReportName report)\r\n			     (planetReportPosition report)\r\n			     (planetReportGravity report)\r\n			     (planetReportDate report)\r\n</code></pre>\r\n\r\n<p>To easily combine bunch of collated reports together, we define instances\r\n    of <em>semigroup</em> and <em>monoid</em> for collated report data.\r\n    Semigroup defines an associative binary operation (&lt;&gt;) and monoid defines a zero or empty item (mempty). My explanation about Monoid and Semigroup were a bit rambling, so maybe have a look at <a href=\"https://wiki.haskell.org/Monoid\">https://wiki.haskell.org/Monoid</a> which explains it in detail.</p>\r\n\r\n<pre><code>\r\ninstance Semigroup CollatedPlanetReport where\r\n    (&lt;&gt;) a b = CollatedPlanetReport (cprPlanetId a)\r\n				    (cprSystemId a)\r\n				    (cprOwnerId a &lt;|&gt; cprOwnerId b)\r\n				    (cprName a &lt;|&gt; cprName b)\r\n				    (cprPosition a &lt;|&gt; cprPosition b)\r\n				    (cprGravity a &lt;|&gt; cprGravity b)\r\n				    (max (cprDate a) (cprDate b))\r\n\r\ninstance Monoid CollatedPlanetReport where\r\n    mempty = CollatedPlanetReport (toSqlKey 0) (toSqlKey 0) Nothing Nothing Nothing Nothing 0\r\n</code></pre>\r\n\r\n<p>In some cases there might be a list of collated reports that are about different entities of same type (several reports for every planet in solar system). For those cases, we need a way to tell what reports belong together:</p>\r\n\r\n<pre><code>\r\n-- | Class to indicate if two reports are about same entity\r\nclass Grouped a where\r\n    sameGroup :: a -&gt; a -&gt; Bool\r\n\r\ninstance Grouped PlanetReport where\r\n    sameGroup a b =\r\n	planetReportPlanetId a == planetReportPlanetId b\r\n</code></pre>\r\n\r\n<p>After this, processing a list of reports for same entity is short amount of very general code:</p>\r\n\r\n<pre><code>\r\n-- | Combine list of reports and form a single collated report\r\n--   Resulting report will have facts from the possibly partially empty reports\r\n--   If a fact is not present for a given field, Nothing is left there\r\ncollateReport :: (Monoid a, ReportTransform b a) =&gt; [b] -&gt; a\r\ncollateReport reports = mconcat (map fromReport reports)\r\n</code></pre>\r\n\r\n<p>For reports of multiple entities is bit more complex, as they need to be sorted first, but the code is similarly general:</p>\r\n\r\n<pre><code>\r\n-- | Combine list of reports and form a list of collated reports\r\n--   Each reported entity is given their own report\r\ncollateReports :: (Grouped b, Monoid a, ReportTransform b a) =&gt; [b] -&gt; [a]\r\ncollateReports [] = []\r\ncollateReports s@(x:_) = collateReport itemsOfKind : collateReports restOfItems\r\n    where split = span (sameGroup x) s\r\n	  itemsOfKind = fst split\r\n	  restOfItems = snd split\r\n</code></pre>\r\n\r\n<p>Final step is to either render reports as HTML or send them as JSON back to client. For JSON case we need one more type class instance (ToJSON) that can be automatically generated. After that handler function can be defined. After authenticating the user and checking that they are member of a faction, reports of specific planet (defined by its primary key) are retrieved from database, collated, turned into JSON and sent back to client:</p>\r\n\r\n<pre><code>\r\n$(deriveJSON defaultOptions {fieldLabelModifier = drop 3} \'\'CollatedPlanetReport)\r\n\r\ngetApiPlanetR :: Key Planet -&gt; Handler Value\r\ngetApiPlanetR planetId = do\r\n    (_, _, fId) &lt;- apiRequireFaction\r\n    loadedPlanetReports &lt;- runDB $ selectList [ PlanetReportPlanetId ==. planetId\r\n					      , PlanetReportFactionId ==. fId ] [ Asc PlanetReportDate ]\r\n    let planetReport = collateReport $ map entityVal loadedPlanetReports :: CollatedPlanetReport\r\n    return $ toJSON planetReport\r\n</code></pre>\r\n\r\n<p>For those interested seeing some code, source is available at <a href=\"https://github.com/Tuula/deep-sky/\">https://github.com/Tuula/deep-sky/</a> (<a href=\"https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18\">https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18</a> is situation before lots of Elm related changes that I mentioned in passing in the previous episode)</p>\r\n\r\n',364,107,0,'CC-BY-SA','haskell, yesod',0,0,1),
(2692,'2018-11-27','YouTube URL tricks',436,'URL tricks for YouTube to enhance viewing experience and an overview of my viewing methodology','<h2>YouTube URL Tricks by Desearcher</h2>\r\n<br/><table><tr><th>Recommended Episode</th></tr><tr><td><a href=\"https://hackerpublicradio.org/eps.php?id=2675\">YouTube Playlists</a> by <a href=\"https://hackerpublicradio.org/correspondents/0198.html\">Ahuka</a></td></tr></table>\r\n<br/><table><tr><th colspan=\"2\">User Upload playlist</th></tr><tr><td>BEFORE</td><td><code>https://www.youtube.com/channel/UCAL3JXZSzSm8AlZyD3nQdBA</code></td></tr><tr><td>AFTER</td><td><code>https://www.youtube.com/playlist?list=UUAL3JXZSzSm8AlZyD3nQdBA</code></td></tr></table>\r\n<br/><table><tr><th colspan=\"2\">Embeded Player</th></tr><tr><td>BEFORE</td><td><code>https://www.youtube.com/playlist?list=UUAL3JXZSzSm8AlZyD3nQdBA</code></td></tr><tr><td>AFTER</td><td><code>https://www.youtube.com/embed?list=UUAL3JXZSzSm8AlZyD3nQdBA</code></td></tr></table>\r\n<br/><table><tr><th colspan=\"2\">Watch Later</th></tr><tr><td>NORMAL</td><td><code>https://www.youtube.com/playlist?list=WL</code></td></tr><tr><td>EMBED</td><td><code>https://www.youtube.com/embed?list=WL</code></td></tr></table>\r\n<br/><table><tr><th>Show \"Remove Watched\" Button in Watch Later queue</th></tr><tr><td><code>https://www.youtube.com/playlist?list=WL&amp;disable_polymer=true</code></td></tr></table>\r\n<br/><table><tr><th colspan=\"2\">Chrome App trick to maximize viewing area</th></tr><tr><td>Watch Later</td><td><code>chrome -app=\"https://www.youtube.com/embed?list=WL\"</code></td></tr><tr><td>Playlist</td><td><code>chrome -app=\"https://www.youtube.com/embed?list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr\"</code></td></tr></table>\r\n<br/><table><tr><th>Play On TV</th></tr><tr><td><code>https://www.youtube.com/pair</code></td></tr></table>\r\n<br/><table><tr><th>TCL Roku TV</th></tr><tr><td><a href=\"https://www.roku.com/products/finder/roku-tv\">Roku Product List</a></td></tr></table>\r\n',371,0,0,'CC-BY-SA','YouTube,URL,Chrome,Roku,Smart TV',0,0,1),
(2709,'2018-12-20','Bash Tips - 16',1440,'Arrays in Bash (part 1)','<h1 id=\"bash-tips---16\">Bash Tips - 16 <small><small>(Further auxiliary Bash tips)</small></small></h1>\n<h2 id=\"arrays-in-bash\">Arrays in Bash</h2>\n<p>This is the first of a small group of shows on the subject of arrays in Bash. It is also the sixteenth show in the <em>Bash Tips</em> sub-series.</p>\n<p>We have encountered Bash arrays at various points throughout this sub-series, and have even seen a number of examples, but the subject has never been examined in detail. This group of shows intends to make good this deficiency.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2709_full_shownotes.html\">viewed here</a>.</p>\n<h2>Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li>Section on <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Arrays\">\"Bash Arrays\"</a></li>\n</ul></li>\n</ul>\n<ul>\n<li>Linux Documentation Project: <a href=\"https://www.tldp.org/LDP/abs/html/index.html\">Advanced Bash-Scripting Guide</a>\n<ul>\n<li><a href=\"https://www.tldp.org/LDP/abs/html/arrays.html\">Chapter 27: Arrays</a></li>\n</ul></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 \"<em>Additional ancillary Bash tips - 12</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2679\">HPR episode 2679 \"<em>Extra ancillary Bash tips - 13</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2689\">HPR episode 2689 \"<em>Bash Tips - 14 (Some auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2699\">HPR episode 2699 \"<em>Bash Tips - 15 (More auxiliary Bash tips)</em>\"</a></li>\n</ol></li>\n</ul>\n<ul>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2709_bash16_ex1.sh\">bash16_ex1.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,array,indexed array,associative array',0,0,1),
(2713,'2018-12-26','Resources in 4x game',1252,'One way to implement data types for raw resources in Haskell','<p>Raw resources are integral part for most 4x games. Here’s one way of modeling them in Haskell. I wanted a system that is easy to use, doesn’t require too much typing and is type safe.</p>\r\n<p>RawResource is basic building block:</p>\r\n<pre><code>newtype RawResource a = RawResource { unRawResource :: Int }\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>It can be parametrised with anything, but I’m using three different types:</p>\r\n<pre><code>data Biological = Biological\r\ndata Mechanical = Mechanical\r\ndata Chemical = Chemical</code></pre>\r\n<p>Example of defining harvest being 100 units of biological raw resources:</p>\r\n<pre><code>  harvest :: RawResource Biological\r\n  harvest = RawResource 100</code></pre>\r\n<p>Raw resources are often manipulated (added and subtracted mostly). Defining Num instance allows us to use them as numbers:</p>\r\n<pre><code>instance Num (RawResource t) where\r\n    (+) (RawResource a) (RawResource b) = RawResource $ a + b\r\n    (-) (RawResource a) (RawResource b) = RawResource $ a - b\r\n    (*) (RawResource a) (RawResource b) = RawResource $ a * b\r\n    abs (RawResource a) = RawResource $ abs a\r\n    signum (RawResource a) = RawResource $ signum a\r\n    fromInteger a = RawResource $ fromInteger a</code></pre>\r\n<p>For example, adding harvest to stock pile:</p>\r\n<pre><code>  stock :: RawResource Biological\r\n  stock = RawResource 1000\r\n\r\n  harvest :: RawResource Biological\r\n  harvest = RawResource 100\r\n\r\n  newStock = stock + harvest</code></pre>\r\n<p>Comparing size of two resource piles is common operation. Ord instance has methods we need for comparing:</p>\r\n<pre><code>instance Ord (RawResource t) where\r\n    (&lt;=) (RawResource a) (RawResource b) = a &lt;= b</code></pre>\r\n<p>One function is enough, as rest is defined in terms of it. Sometimes (usually for reasons of optimization), one might want to define other functions too.</p>\r\n<p>Another way to add bunch of resources of same type together is defining Monoid instance:</p>\r\n<pre><code>instance Semigroup (RawResource t) where\r\n    (&lt;&gt;) a b = a + b\r\n\r\ninstance Monoid (RawResource t) where\r\n    mempty = RawResource 0</code></pre>\r\n<p>For example, combining harvests of many fields can be achieved as:</p>\r\n<pre><code>  harvests :: [RawResource Biological]\r\n  harvests = [RawResource 20, RawResource 50, RawResource 25]\r\n\r\n  total :: RawResource Biological\r\n  total = mappend harvests</code></pre>\r\n<p>All these functions keep track of type of resources being manipulated. Compiler will emit an error if two different types of resources are being mixed together.</p>\r\n<p>Raw resources are often grouped together for specific purpose. This again uses phantom types to keep track the intended usage:</p>\r\n<pre><code>data RawResources a = RawResources\r\n    { ccdMechanicalCost :: RawResource Mechanical\r\n    , ccdBiologicalCost :: RawResource Biological\r\n    , ccdChemicalCost :: RawResource Chemical\r\n    } deriving (Show, Read, Eq)\r\n\r\ndata ResourceCost = ResourceCost\r\ndata ConstructionSpeed = ConstructionSpeed\r\ndata ConstructionLeft = ConstructionLeft\r\ndata ConstructionDone = ConstructionDone\r\ndata ResourcesAvailable = ResourcesAvailable</code></pre>\r\n<p>And in order to be able to combine piles of RawResources, we’ll define Semigroup and Monoid instances. Notice how both instances make use of Semigroup and Monoid instances of RawResource:</p>\r\n<pre><code>instance Semigroup (RawResources t) where\r\n    (&lt;&gt;) a b = RawResources\r\n        { ccdMechanicalCost = ccdMechanicalCost a &lt;&gt; ccdMechanicalCost b\r\n        , ccdBiologicalCost = ccdBiologicalCost a &lt;&gt; ccdBiologicalCost b\r\n        , ccdChemicalCost = ccdChemicalCost a &lt;&gt; ccdChemicalCost b\r\n        }\r\n\r\ninstance Monoid (RawResources t) where\r\n    mempty = RawResources\r\n        { ccdMechanicalCost = mempty\r\n        , ccdBiologicalCost = mempty\r\n        , ccdChemicalCost = mempty\r\n        }</code></pre>\r\n<p>For those interested seeing some code, source is available at <a href=\"https://github.com/Tuula/deep-sky/\" class=\"uri\">https://github.com/Tuula/deep-sky/</a> (<a href=\"https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18\" class=\"uri\">https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18</a> is situation before lots of Elm related changes that I mentioned in passing in the previous episode)</p>\r\n',364,107,0,'CC-BY-SA','haskell',0,0,1),
(2719,'2019-01-03','Bash Tips - 17',2056,'Arrays in Bash (part 2)','<h1 id=\"bash-tips---17\">Bash Tips - 17 <small><small>(Additional auxiliary Bash tips)</small></small></h1>\n<h2 id=\"arrays-in-bash\">Arrays in Bash</h2>\n<p>This is the second of a small group of shows on the subject of arrays in Bash. It is also the seventeenth show in the <em>Bash Tips</em> sub-series.</p>\n<p>In the last show we saw the two types of arrays, and learned about the multiple ways of creating them and populating them. We also looked at how array elements and entire arrays are accessed.</p>\n<p>Now we want to continue looking at array access and some of the various parameter expansion operations available.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2719_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li>Section on <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Arrays\">\"Bash Arrays\"</a></li>\n</ul></li>\n</ul>\n<ul>\n<li>Linux Documentation Project: <a href=\"https://www.tldp.org/LDP/abs/html/index.html\">Advanced Bash-Scripting Guide</a>\n<ul>\n<li><a href=\"https://www.tldp.org/LDP/abs/html/arrays.html\">Chapter 27: Arrays</a></li>\n</ul></li>\n<li><p>Wikipedia article entitled <a href=\"https://en.wikipedia.org/wiki/Fibonacci_number\">\"<em>Fibonacci Number</em>\"</a></p></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 \"<em>Additional ancillary Bash tips - 12</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2679\">HPR episode 2679 \"<em>Extra ancillary Bash tips - 13</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2689\">HPR episode 2689 \"<em>Bash Tips - 14 (Some auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2699\">HPR episode 2699 \"<em>Bash Tips - 15 (More auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2709\">HPR episode 2709 \"<em>Bash Tips - 16 (Further auxiliary Bash tips)</em>\"</a></li>\n</ol></li>\n</ul>\n<ul>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2719_bash17_ex1.sh\">bash17_ex1.sh</a>, <a href=\"hpr2719_bash17_ex2.sh\">bash17_ex2.sh</a>, <a href=\"hpr2719_bash17_ex3.sh\">bash17_ex3.sh</a>, <a href=\"hpr2719_bash17_ex4.sh\">bash17_ex4.sh</a>, <a href=\"hpr2719_bash17_ex5.sh\">bash17_ex5.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,array,indexed array,associative array',0,0,1),
(2694,'2018-11-29','Bandit Update',699,'NYbill does a quick episode to mention there are new Over the Wire, Bandit levels out.','<p>(No Spoilers)</p>\r\n<p>NYbill does a quick episode to mention there are new Over the Wire, Bandit levels out.</p>\r\n<p><a href=\"https://overthewire.org/wargames/bandit/bandit0.html\" class=\"uri\">https://overthewire.org/wargames/bandit/bandit0.html</a></p>\r\n<p>Original Episode:</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps.php?id=2138\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2138</a></p>\r\n',235,0,0,'CC-BY-SA','Hacking, War games, Linux',0,0,1),
(2697,'2018-12-04','The Linux Shutdown Command Explained',402,'A short pod cast about the linux shutdown command','<p>\r\nA short podcast about the shutdown command \r\n</p>\r\n<p>\r\n<a href=\"https://linuxhandbook.com/linux-shutdown-command/\">https://linuxhandbook.com/linux-shutdown-command/</a>\r\n</p>',129,0,0,'CC-BY-SA','Linux,shutdown',0,0,1),
(2698,'2018-12-05','XSV for fast CSV manipulations - Part 1',1837,'Written in Rust, xsv is my new favorite tool for manipulating csv files','<h1 id=\"xsv-for-fast-csv-manipulations---part-1-basic-usage\">XSV for fast CSV manipulations - Part 1: Basic Usage</h1>\r\n<blockquote>\r\n<p><a href=\"https://github.com/BurntSushi/xsv\" class=\"uri\">https://github.com/BurntSushi/xsv</a></p>\r\n</blockquote>\r\n<h2 id=\"introduction\">Introduction</h2>\r\n<p>xsv is a command line program for indexing, slicing, analyzing, splitting and joining CSV files. Commands should be simple, fast and composable:</p>\r\n<ol>\r\n<li>Simple tasks should be easy.</li>\r\n<li>Performance trade offs should be exposed in the CLI interface.</li>\r\n<li>Composition should not come at the expense of performance.</li>\r\n</ol>\r\n<p>We will be using the CSV file provided in the <a href=\"https://burntsushi.net/stuff/worldcitiespop.csv\">documentation</a>.</p>\r\n<h2 id=\"commands-covered-in-this-episode\">Commands covered in this episode</h2>\r\n<ul>\r\n<li>count - Count the rows of CSV data</li>\r\n<li>headers - Show the headers of CSV data, or show the intersection of all headers between many CSV files</li>\r\n<li>index - Create an index for a CSV file. This is very quick and provides constant time indexing into the CSV file.</li>\r\n<li>frequency - Build frequency tables of each column in CSV data.</li>\r\n<li>stats - Show basic types and statistics of each column in the CSV file. (i.e., mean, standard deviation, median, range, etc.)</li>\r\n<li>sort - Sort CSV data</li>\r\n<li>select - Select or re-order columns from CSV data.</li>\r\n<li>slice - Slice rows from any part of a CSV file. When an index is present, this only has to parse the rows in the slice (instead of all rows leading up to the start of the slice).</li>\r\n<li>search - Run a regex over CSV data. Applies the regex to each field individually and shows only matching rows.</li>\r\n<li>table - Show aligned output of any CSV data using elastic tabstops.</li>\r\n<li>flatten - A flattened view of CSV records. Useful for viewing one record at a time.</li>\r\n</ul>\r\n',300,0,0,'CC-BY-SA','CSV,XSV',0,0,1),
(2700,'2018-12-07','Episode 3000',26830,'We commemorate the 300 Today with a Techie and 2700 Hacker Public Radio shows','<p>\r\nOn the 19th of September 2005 a group of individuals got together to release their first show on the podcast network \"Today with a Techie\".\r\n</p>\r\n<p>\r\nThe idea was to share knowledge through podcasting. Now 13 years, 2 months, 19 days later the project is still going strong, and you dear listener are a part of it.\r\n</p>\r\n<p>\r\nToday marks the 2700th episode of \"Hacker Public Radio\" and coupled with the 300 shows from \"Today with a Techie\", marks the 3000th episode of this project.\r\n</p>\r\n<p>\r\nA big thanks goes out to all 354 individual hosts who together contributed 1452 hours of shows to the archive. \r\n</p>\r\n<p>\r\nThere is about 50 giga bytes of mp3 files alone. \r\n</p>\r\n<p>\r\nWhich played back to back gives 60 days 11 hours 40 minutes 21 seconds of continuous play. \r\n</p>\r\n<p>\r\nIf you started listening today and played the shows 24 x 7 you wouldn\'t be finished listening until Monday, February 5th, 2019.\r\n</p>\r\n<p>\r\nOf course by then there would be 39 additional shows released, so you still wouldn\'t be finished.\r\n</p>\r\n<p>\r\nDespite all this we still don\'t have a wikipedia page. If you can, please take the time to create one for us. There is plenty of supporting information in the \"In the Press\" section of our about page.\r\n</p>\r\n<p>\r\nSo to mark the 3000th episode we are going to do nothing more than list the shows, host and summary where available.\r\n</p>\r\n<p>\r\nJust doing that alone creates a whopping 7 and a half hour episode. \r\n</p>\r\n<p>\r\nAre you l33t enough to listen to it all ?\r\n</p>\r\n<p>\r\nLet\'s go.\r\n</p>',30,0,0,'CC-BY-SA','TWaT, HPR, 3000',0,0,1),
(2701,'2018-12-10','First impressions of the Odroid-go',1926,'I ramble on about my first impressions of the odroid-go','<p>I ramble on about my impressions of the Odroid-go, a 32 USD handheld system similar to a gameboy built to run game system emulators and various other free software. It’s also built to be harcked.</p>\r\n<p><a href=\"https://wiki.odroid.com/odroid_go/odroid_go\" class=\"uri\">https://wiki.odroid.com/odroid_go/odroid_go</a></p>\r\n<p>The summary is this is an easy to put together kit requiring no soldering, and runs classic console emulators pretty well. Well worth the 32 USD plus shipping in my opinion. Claims 10 hours of game play and that seems about right so far for me.</p>\r\n<p>The systems emulated out of the box are:</p>\r\n<p>NES, Game Gear, Gameboy, Gameboy Color, Sega Master System, ColecoVision. Other systems of similar or earlier vintages have emulators that you have to install separately and boot into to run. I don’t think it will emulate newer systems. No Gameboy Advance emulator and I don’t see a Mame emulator. However, I do think this ‘might’ support Mame for some of the early arcade games like Asteroids and Space Invaders.</p>',151,103,0,'CC-0','Odroid-go',0,0,1),
(2702,'2018-12-11','Audacity set up and response to episode 2658',107,'Just a quick response to Ep2658','<p>Hi Guys and Girls in HPR land.</p>\r\n<p>This is Tony Hughes in Blackpool in the UK back for another show. I normally talk about my own stuff but while it is related to what I have been doing lately this is a response to Al’s interview with Dave in Episode 2658 and how to setup Audacity to record and edit audio for best sound quality when podcasting.</p>\r\n<p>I’ve recently joined the mintCast podcast team and have been editing and doing the post production of the audio recording for the last couple of episodes. The information that Dave provided during the show was invaluable in helping me in this task, I also have to give a shout out to Rob the previous host who also spent an hour and a half giving a tutorial on his post production work flow, but the additional information given by Dave in this show was also a big help.</p>\r\n<p>I’ve now purchased a boom arm and pop filter for my mic to reduce any artefacts in the recording although as it is still attached to my desk I think I may need to invest in a shock mount although I’m not sure how it will attach to my current Boom arm. Ah well that’s a problem for another day.</p>\r\n<p>As I said this was just a shout out to Al and Dave to say thanks for the show and I will save it for another day to do a show on my new post production work flow on the mintCast audio.</p>\r\n<p>This is Tony Hughes saying goodbye for now.</p>\r\n<p><a href=\"https://mintcast.org/about-the-authors/tonyh/\" class=\"uri\">https://mintcast.org/about-the-authors/tonyh/</a><br />\r\n<a href=\"mailto:th@mintcast.org\">th@mintcast.org</a></p>\r\n<p><a href=\"https://hackerpublicradio.org/eps.php?id=2658\">https://hackerpublicradio.org/eps.php?id=2658</a></p>',338,0,0,'CC-BY-SA','audio,Audacity',0,0,1),
(2715,'2018-12-28','About ONAP',618,'The Linux foundations ONAP project all about it','<p>So I went to the open networking trade show sponsored by the Linux Foundation with Ken Fallon’s help.</p>\r\n<p>The first thing they talked about was ONAP.</p>\r\n<p><a href=\"https://www.onap.org/\" class=\"uri\">https://www.onap.org/</a><br />\r\n<a href=\"https://en.wikipedia.org/wiki/ONAP\" class=\"uri\">https://en.wikipedia.org/wiki/ONAP</a></p>\r\n',129,61,1,'CC-BY-SA','Networking,ONAP,Open Networking Automation Platform',0,0,1),
(2722,'2019-01-08','RAID 6 a short description',150,'How Raid 6 works','<p>Raid 6 is a take of raid 5 but with support for 2 drive protection.</p>',129,0,1,'CC-BY-SA','Raid6',0,0,1),
(2742,'2019-02-05','SAP Hana Certification Directory',1085,'How the SAP Hana certification works','<p>SAP Hana certification is a long and hard process covered at<br />\r\n<a href=\"https://www.sap.com/dmc/exp/2014-09-02-hana-hardware/enEN/index.html\" class=\"uri\">https://www.sap.com/dmc/exp/2014-09-02-hana-hardware/enEN/index.html</a></p>',129,0,0,'CC-BY-SA','SAP HANA,certification',0,0,1),
(3001,'2020-02-03','HPR Community News for January 2020',2649,'HPR Volunteers Dave and Ken talk about shows released and comments posted in January 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=2978\" target=\"_blank\">2978</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-01-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2978\" target=\"_blank\">GARAGE DOOR</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=2979\" target=\"_blank\">2979</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-01-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2979\" target=\"_blank\">Bicycle Freewheel Maintenance</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=2980\" target=\"_blank\">2980</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-01-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2980\" target=\"_blank\">FLOSS Weekly 553 - Hacker Public Radio</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=2981\" target=\"_blank\">2981</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-01-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2981\" target=\"_blank\">HPR Community News for December 2019</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=2982\" target=\"_blank\">2982</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-01-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2982\" target=\"_blank\">World of Commodore 2019 Episode 4: Bare metal c64 Emulation on Raspberry Pi</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=2983\" target=\"_blank\">2983</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-01-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2983\" target=\"_blank\">my phone</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0243.html\" target=\"_blank\">Jezra</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2984\" target=\"_blank\">2984</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-01-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2984\" target=\"_blank\">RHEL 8 Workstation first looks </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=2985\" target=\"_blank\">2985</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-01-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2985\" target=\"_blank\">Firefox 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=2986\" target=\"_blank\">2986</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-01-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2986\" target=\"_blank\">Onlykey Updated</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=2987\" target=\"_blank\">2987</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-01-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2987\" target=\"_blank\">World of Commodore 2019 Episode 5: New games from Double Sided Games</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=2988\" target=\"_blank\">2988</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-01-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2988\" target=\"_blank\">A tale of two hackers in the same system</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0115.html\" target=\"_blank\">sigflup</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2989\" target=\"_blank\">2989</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-01-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2989\" target=\"_blank\">Hacker Public Radio 2019-20 New Year Show Episode 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0265.html\" target=\"_blank\">Kevin Wisher</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2990\" target=\"_blank\">2990</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-01-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2990\" target=\"_blank\">JDK14 - Wrap up edition</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=2991\" target=\"_blank\">2991</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-01-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2991\" target=\"_blank\">Fix yer fog machine</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=2992\" target=\"_blank\">2992</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-01-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2992\" target=\"_blank\">World of Commodore 2019 Episode 6: Introduction to C64 OS</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=2993\" target=\"_blank\">2993</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-01-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2993\" target=\"_blank\">Hacker Public Radio 2019-20 New Year Show Episode 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0265.html\" target=\"_blank\">Kevin Wisher</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2994\" target=\"_blank\">2994</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-01-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2994\" target=\"_blank\">Wrestling As You Like It Episode 3</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0354.html\" target=\"_blank\">TheDUDE</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2995\" target=\"_blank\">2995</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-01-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2995\" target=\"_blank\">ActivityPub Conference 2019 - ActivityPub: past, present, future</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=2996\" target=\"_blank\">2996</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-01-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2996\" target=\"_blank\">Spideroak Update</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=2997\" target=\"_blank\">2997</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-01-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2997\" target=\"_blank\">World of Commodore 2019 Episode 7: Video Playback with 1541 Ultimate</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=2998\" target=\"_blank\">2998</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-01-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2998\" target=\"_blank\">Hacker Public Radio 2019-20 New Year Show Episode 3</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0265.html\" target=\"_blank\">Kevin Wisher</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2999\" target=\"_blank\">2999</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-01-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=2999\" target=\"_blank\">SQRL - Secure Quick Reliable Login</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=3000\" target=\"_blank\">3000</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-01-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3000\" target=\"_blank\">Chopin Free project</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</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 9 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=95#comments\" target=\"_blank\">hpr95</a></strong>\n(2008-05-12) \"<em>Security Wow!</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0086.html\" target=\"_blank\">rowinggolfer</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=95#1\" target=\"_blank\">Comment 1</a>:\npokey on 2020-01-01:\n\"A long overdue thank you.\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 8 comments on 6 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2979#comments\" target=\"_blank\">hpr2979</a></strong>\n(2020-01-02) \"<em>Bicycle Freewheel Maintenance</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><li><a href=\"https://hackerpublicradio.org/eps.php?id=2979#1\" target=\"_blank\">Comment 1</a>:\nDave on 2020-01-02:\n\"Like the show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2988#comments\" target=\"_blank\">hpr2988</a></strong>\n(2020-01-15) \"<em>A tale of two hackers in the same system</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0115.html\" target=\"_blank\">sigflup</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2988#1\" target=\"_blank\">Comment 1</a>:\nClaudioM on 2020-01-15:\n\"Welcome Back!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2988#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2020-01-20:\n\"Condolences on behalf of HPR\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2989#comments\" target=\"_blank\">hpr2989</a></strong>\n(2020-01-16) \"<em>Hacker Public Radio 2019-20 New Year Show Episode 1</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0265.html\" target=\"_blank\">Kevin Wisher</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=2989#1\" target=\"_blank\">Comment 1</a>:\nbeian on 2020-01-18:\n\"silence?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=2989#2\" target=\"_blank\">Comment 2</a>:\nbrian on 2020-01-18:\n\"oops\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2991#comments\" target=\"_blank\">hpr2991</a></strong>\n(2020-01-20) \"<em>Fix yer fog machine</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=2991#1\" target=\"_blank\">Comment 1</a>:\nKen on 2020-01-20:\n\"Bigclive\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2992#comments\" target=\"_blank\">hpr2992</a></strong>\n(2020-01-21) \"<em>World of Commodore 2019 Episode 6: Introduction to C64 OS</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=2992#1\" target=\"_blank\">Comment 1</a>:\nGreg Nacu on 2020-01-29:\n\"Thanks for the episode!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3000#comments\" target=\"_blank\">hpr3000</a></strong>\n(2020-01-31) \"<em>Chopin Free project</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=3000#1\" target=\"_blank\">Comment 1</a>:\nClaudioM on 2020-01-31:\n\"Wow...just, WOW!\"</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-January/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-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 contributors for sending in updates in the past month: <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 9 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),
(3021,'2020-03-02','HPR Community News for February 2020',3272,'Call for shows is open. Ken and eventually Dave discuss the shows, media and development plans.','<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/0384.html\" target=\"_blank\">monochromec</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=3001\" target=\"_blank\">3001</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-02-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3001\" target=\"_blank\">HPR Community News for January 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=3002\" target=\"_blank\">3002</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-02-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3002\" target=\"_blank\">World of Commodore 2019 Episode 8: Vote of thanks</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=3003\" target=\"_blank\">3003</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-02-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3003\" target=\"_blank\">Hacker Public Radio 2019 2020 New Year Show Episode 4</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0265.html\" target=\"_blank\">Kevin Wisher</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3004\" target=\"_blank\">3004</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-02-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3004\" target=\"_blank\">Fixing simple audio problems with Audacity</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=3005\" target=\"_blank\">3005</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-02-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3005\" target=\"_blank\">Is ActivityPub Paving The Way to Web 3.0?</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=3006\" target=\"_blank\">3006</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-02-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3006\" target=\"_blank\">Hijack Auxiliary Input of your car!</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=3007\" target=\"_blank\">3007</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-02-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3007\" target=\"_blank\">Photography 101</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=3008\" target=\"_blank\">3008</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-02-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3008\" target=\"_blank\">Hacker Public Radio 2019-20 New Year Show Episode 5</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0265.html\" target=\"_blank\">Kevin Wisher</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3009\" target=\"_blank\">3009</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-02-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3009\" target=\"_blank\">Linux Inlaws S01 E01</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=3010\" target=\"_blank\">3010</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-02-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3010\" target=\"_blank\">FOSDEM first impressions</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=3011\" target=\"_blank\">3011</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-02-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3011\" target=\"_blank\">Linux is HARD rant with Intel graphics</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=3012\" target=\"_blank\">3012</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-02-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3012\" target=\"_blank\">Sample episode from Wikipediapodden</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=3013\" target=\"_blank\">3013</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-02-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3013\" target=\"_blank\">Bash Tips - 21</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=3014\" target=\"_blank\">3014</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-02-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3014\" target=\"_blank\">A Headless Raspberry Pi Streaming Radio</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=3015\" target=\"_blank\">3015</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-02-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3015\" target=\"_blank\">ActivityPub Conference 2019 - The Semantic Social Network</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=3016\" target=\"_blank\">3016</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-02-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3016\" target=\"_blank\">Nixie tube clock and friends!</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=3017\" target=\"_blank\">3017</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-02-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3017\" target=\"_blank\">Developing Black and White Film</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=3018\" target=\"_blank\">3018</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-02-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3018\" target=\"_blank\">Encrypted edit</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=3019\" target=\"_blank\">3019</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-02-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3019\" target=\"_blank\">Linux Inlaws S01E02 FOSDEM shenanigans</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=3020\" target=\"_blank\">3020</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-02-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3020\" target=\"_blank\">Validating data in Haskell</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 16 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 3 comments on\n2 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2999#comments\" target=\"_blank\">hpr2999</a></strong>\n(2020-01-30) \"<em>SQRL - Secure Quick Reliable Login</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>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2999#1\" target=\"_blank\">Comment 1</a>:\nAhuka on 2020-02-06:\n\"Great show!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3000#comments\" target=\"_blank\">hpr3000</a></strong>\n(2020-01-31) \"<em>Chopin Free project</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=3000#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-02-02:\n\"Great show!\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3000#3\" target=\"_blank\">Comment 3</a>:\nmcnalu on 2020-02-02:\n\"Great!\"</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=3002#comments\" target=\"_blank\">hpr3002</a></strong>\n(2020-02-04) \"<em>World of Commodore 2019 Episode 8: Vote of thanks</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=3002#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2020-02-18:\n\"Thanks for the series\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3003#comments\" target=\"_blank\">hpr3003</a></strong>\n(2020-02-05) \"<em>Hacker Public Radio 2019 2020 New Year Show Episode 4</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0265.html\" target=\"_blank\">Kevin Wisher</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3003#1\" target=\"_blank\">Comment 1</a>:\nfolky on 2020-02-20:\n\"Dark reader\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3008#comments\" target=\"_blank\">hpr3008</a></strong>\n(2020-02-12) \"<em>Hacker Public Radio 2019-20 New Year Show Episode 5</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0265.html\" target=\"_blank\">Kevin Wisher</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3008#1\" target=\"_blank\">Comment 1</a>:\nnorrist on 2020-02-26:\n\"These 2 guys should get together more often\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3009#comments\" target=\"_blank\">hpr3009</a></strong>\n(2020-02-13) \"<em>Linux Inlaws S01 E01</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=3009#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-02-15:\n\"Mailing list Discussion\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3009#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2020-02-15:\n\"Murmer/Mumble\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3009#3\" target=\"_blank\">Comment 3</a>:\nPeter Mortensen on 2020-02-19:\n\"The predecessor?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3009#4\" target=\"_blank\">Comment 4</a>:\nChris on 2020-02-19:\n\"LinuxInlaws\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3013#comments\" target=\"_blank\">hpr3013</a></strong>\n(2020-02-19) \"<em>Bash Tips - 21</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=3013#1\" target=\"_blank\">Comment 1</a>:\ncrvs on 2020-02-24:\n\"So that\'s how you use shebangs!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3013#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-02-24:\n\"Writing awk scripts\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3014#comments\" target=\"_blank\">hpr3014</a></strong>\n(2020-02-20) \"<em>A Headless Raspberry Pi Streaming Radio</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><li><a href=\"https://hackerpublicradio.org/eps.php?id=3014#1\" target=\"_blank\">Comment 1</a>:\nMr. Young on 2020-02-20:\n\"Trying this tonight\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3014#2\" target=\"_blank\">Comment 2</a>:\nJon Kulp on 2020-02-20:\n\"Still Streaming with URL Update\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3014#3\" target=\"_blank\">Comment 3</a>:\nMr. Young on 2020-02-20:\n\"Issue with mpg123\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3014#4\" target=\"_blank\">Comment 4</a>:\nJon Kulp on 2020-02-21:\n\"HTTP not HTTPS\"</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-February/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-February/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributors for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0152.html\">Claudio Miranda</a>, <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 16 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),
(2707,'2018-12-18','Steganalysis 101',864,'Steganalysis is the process of identifying the presence of, and decrypting, steganography.','<h3 id=\"introduction\">1. Introduction</h3>\r\n<p>Hello and welcome to Hacker Public Radio, I’m Edward Miro and I’ve been a fan of HPR for a while now and really love its collaborative and random nature. It’s always been important for me to support the hacking community. I always take any opportunity to give back to this community who have given me so much throughout the years. I’ve also always subscribed to the idea that the best way to learn something is by teaching and I hope to do a good job for all you listeners. This talk is on mystical art of steganalysis which is the process of identifying the presence of and decrypting (hopefully) steganography.</p>\r\n<h3 id=\"what-is-steganography\">2. What is steganography?</h3>\r\n<p>I’m into hacking, but I’m not a professional hacker. Usually I call myself a hobbyist. I like CTFs, crypto challenges, lots of stuff from Vulnhub or OverTheWire, things like that. I’ll provide some links in the end if anyone is interested, but for those who aren’t familiar a CTF, or Capture The Flag, it’s a kind of game that helps you get better at hacking. These days there are tons of VMs that are setup to be intentionally vulnerable to different techniques or attacks. You load the VM and pretend it’s a server you want to attack and follow your standard hacking protocols. Some are setup to be boot to root challenges where you ‘win’ when you get root and some are setup with flags that you can find hidden in the target worth points. There are in person and online CTFs and they’ve gotten pretty popular with the National Cyber League being a major competition. Some are easy, some are really hard and most have really good write-ups that can teach you so much about INFOSEC, penetration testing and actually let you practice the techniques in a relatively easy and legal way.</p>\r\n<p>Where steganography comes in to this discussion is that it’s an element you sometimes see used in the kinds of challenges I mentioned previously and also in alternate reality games, online recruitment challenges by national agencies/big tech companies and militarys. They are even used in real world espionage and intelligence work or super spooky secret challenges like Cicada 3301.</p>\r\n<p>Simply put steganography (and I’m pasting this straight out of Wikipedia): “is the practice of concealing a file, message, image, or video within another file, message, image, or video”. Steganography is used to hide secrets in plain sight. It’s a way to send a message, without anyone detecting that a message is even being sent.</p>\r\n<p>I’ll give you more examples in the next section, but imagine a letter that has a secret written in invisible ink. Only the sender and receiver should know about the invisible ink and any eavesdroppers should be none the wiser. This simple example has been used by countless prisoners whose mail is routinely read and examined. Terrorists and spies the world over also use steganography and are known to embed messages in an image and post it online. With how many image hosting sites there are, with millions of people posting to them billions of images day in and day out, you can see why steganography can be such a challenge to combat. Before I move on to some more specific examples I want to stress again that I’m not an expert on cryptography or steganography. While researching for this podcast it’s overwhelmingly clear that you could spend your whole career focused on only steganography. This talk is just a primer on the subject and only the tip of the iceberg.</p>\r\n<h3 id=\"examples-also-from-wikipedia-the-great-repository-of-all-knowledge\">3. Examples (also from Wikipedia, the great repository of all knowledge)</h3>\r\n<ul>\r\n<li>Analog:\r\n<ul>\r\n<li>Head shaving</li>\r\n<li>Invisible ink</li>\r\n<li>Knots tied into ropes</li>\r\n<li>Messages hidden under stamps on envelopes</li>\r\n<li>Mixed typeface</li>\r\n<li>Using a grille cipher</li>\r\n<li>Sending messages via newspaper classifieds</li>\r\n</ul></li>\r\n<li>Digital:\r\n<ul>\r\n<li>Noise in images or sound files</li>\r\n<li>Text commented out in source html or other code</li>\r\n<li>Using different color text</li>\r\n<li>Fractionalized comments</li>\r\n<li>Audio signals/spectro</li>\r\n<li>Hidden control characters and non printing Unicode</li>\r\n</ul></li>\r\n</ul>\r\n<p>The possibilities are almost endless for how this technique can be applied.</p>\r\n<h3 id=\"why-should-we-care\">4. Why should we care?</h3>\r\n<p>When we are doing a CTF or crypto challenge and are presented with an image or media file we are pretty well assured there’s something in there, though not every image you find while doing a challenge or CTF will utilize steganography so don’t overanalyze. I’ve known people who are really into alternate reality games spending 100s of hours doing spectrographic analysis and for our purpose(and the scope of this podcast), there should be some clue that steganography is being used. The challenge then becomes how we direct our work flow as to not waste any time and be the most efficient in cracking that particular part the puzzle. There are MANY stego tools out there, some of them homebrewed, and unless the designer of the challenge puts in a clue, you might spend hours trying different algorithms or tools. And even if you do, there’s no guarantee you’ll get anything at all. A lot of the tools that will be mentioned in the next section rely on fingerprinting how known algorithms process data. This is not only a big problem for hackers like us with our CTFs and games, but even more so for governments who are charged with keeping us safe. So if you’re looking at possible steganography, you need to build a good workflow and I noticed a post on Reddit a few weeks ago with a user asking about image forensics. There was a comment posted that was so good I forwarded it to my hacking friends and it inspired me to do this podcast. I’m using the comment as a potential framework for my own personal work with images and steganography. It helped me to develop my own protocol and I wanted to share it with you all and if anyone wants to expand on it or improve it please do so. Thank you /u/Alexeyan!</p>\r\n<h3 id=\"proposed-work-flow\">5. Proposed work flow</h3>\r\n<p>This is coming straight out of the post on Reddit. I thought about rewriting it, but it didn’t seem necessary and I will be giving the author full credit. I add a couple more tools on at the bottom and a few closing thoughts:</p>\r\n<ul>\r\n<li><p>First: Look at the image. Maybe it tells you something important.</p></li>\r\n<li><p>Use binwalk to check for other file type signatures in the image file.</p></li>\r\n<li><p>Use Exiftool to check for any interesting exif-metadata.</p></li>\r\n<li><p>Use stegsolve and switch through the layers and look for abnormalities.</p></li>\r\n<li><p>Maybe the Flag is painted in the LSB image, or some QR-Code.</p></li>\r\n<li><p>Maybe there are random pixels that look strange in a certain layer, that’s a hint for Bit-Stego.</p></li>\r\n<li><p>Use zsteg to automatically test the most common bitstegos and sort by %ascii-in-results. (This one auto-solves about 50% of all image stego challenges)</p></li>\r\n<li><p>If the file is a png, you can check if the IDAT chunks are all correct and correctly ordered.</p></li>\r\n<li><p>Check with the strings tool for parts of the flag. If you found for example “CTF{W” in a chunk, check what is on that position in other IDAT chunks.</p></li>\r\n<li><p>The harder ones can be a lot more tricky though.. JPG coefficiency manipulation, Frequency analysis, …</p></li>\r\n<li><p>But usually those are frowned upon, because they require a lot of guessing (if no hiding tool is provided)</p></li>\r\n</ul>\r\n<p>Some other go to tools not mentioned above:</p>\r\n<ul>\r\n<li>Stegdetect</li>\r\n<li>DIIT(Digital Invisible Ink Toolkit )</li>\r\n<li>StegSecret</li>\r\n<li>ILook Investigator (for law enforcement)</li>\r\n</ul>\r\n<p>Detecting steganography is hard work. There are computer scientists who do only this. While we aren’t at that level for the information being presented here, it will require a lot of digging and trying different tools. Hopefully following these steps will help identify the more common techniques in an easier way than trial and error.</p>\r\n<p>One last thing I want to mention is that part of how I see detecting steganography in CTFs or cyptochallenges is having a certain mindset and always looking at things in various layers. I try to look at everything within the challenge as if there could be something right in front of my eyes. I mentally flip through different layers and see the codes within the codes. And remember if you’re playing an alternate reality game, a CTF or a crypto challenge, generally speaking, the designers want you to play through the game. They will leave clues if you need them. They want the players to get to the end. Don’t overthink things.</p>\r\n<p>Well that’s all I’ve got for today. I hope you enjoyed this podcast and got something useful out of it. Like I said in the introduction, I’m Edward Miro. Have fun, and good luck!</p>\r\n<h3 id=\"sources\">6. Sources</h3>\r\n<ul>\r\n<li>Steganography basics:\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Steganography\" class=\"uri\">https://en.wikipedia.org/wiki/Steganography</a></li>\r\n<li><a href=\"https://www.wired.com/story/steganography-hacker-lexicon/\" class=\"uri\">https://www.wired.com/story/steganography-hacker-lexicon/</a></li>\r\n<li><a href=\"https://null-byte.wonderhowto.com/how-to/steganography-hide-secret-data-inside-image-audio-file-seconds-0180936/\" class=\"uri\">https://null-byte.wonderhowto.com/how-to/steganography-hide-secret-data-inside-image-audio-file-seconds-0180936/</a></li>\r\n</ul></li>\r\n<li>CTFs\r\n<ul>\r\n<li><a href=\"https://www.nationalcyberleague.org/\" class=\"uri\">https://www.nationalcyberleague.org/</a></li>\r\n<li><a href=\"https://www.vulnhub.com/\" class=\"uri\">https://www.vulnhub.com/</a></li>\r\n<li><a href=\"https://ctf365.com/\" class=\"uri\">https://ctf365.com/</a></li>\r\n</ul></li>\r\n<li>Tools\r\n<ul>\r\n<li><a href=\"https://github.com/ReFirmLabs/binwalk\" class=\"uri\">https://github.com/ReFirmLabs/binwalk</a></li>\r\n<li><a href=\"https://www.sno.phy.queensu.ca/~phil/exiftool/\" class=\"uri\">https://www.sno.phy.queensu.ca/~phil/exiftool/</a></li>\r\n<li><a href=\"https://github.com/zardus/ctf-tools/tree/master/stegsolve\" class=\"uri\">https://github.com/zardus/ctf-tools/tree/master/stegsolve</a></li>\r\n<li><a href=\"https://github.com/zed-0xff/zsteg\" class=\"uri\">https://github.com/zed-0xff/zsteg</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Strings_(Unix)\" class=\"uri\">https://en.wikipedia.org/wiki/Strings_(Unix)</a></li>\r\n<li><a href=\"https://github.com/abeluck/stegdetect\" class=\"uri\">https://github.com/abeluck/stegdetect</a></li>\r\n<li><a href=\"https://diit.sourceforge.net/\" class=\"uri\">https://diit.sourceforge.net/</a></li>\r\n<li><a href=\"https://stegsecret.sourceforge.net/\" class=\"uri\">https://stegsecret.sourceforge.net/</a></li>\r\n<li><a href=\"https://www.ilook-forensics.org/\" class=\"uri\">https://www.ilook-forensics.org/</a></li>\r\n</ul></li>\r\n<li>Detection\r\n<ul>\r\n<li><a href=\"https://web.cs.ucdavis.edu/~davidson/Publications/IAAI103.pdf\" class=\"uri\">https://web.cs.ucdavis.edu/~davidson/Publications/IAAI103.pdf</a></li>\r\n<li><a href=\"https://www.sans.org/reading-room/whitepapers/stenganography/steganalysis-detecting-hidden-information-computer-forensic-analysis-1014\" class=\"uri\">https://www.sans.org/reading-room/whitepapers/stenganography/steganalysis-detecting-hidden-information-computer-forensic-analysis-1014</a></li>\r\n</ul></li>\r\n</ul>\r\n',372,0,0,'CC-BY-SA','Steganalysis, steganography',0,0,1),
(2704,'2018-12-13','Intro to Scribus',2380,'Klaatu provides an overview of Scribus in part 1 of a mini-series about steganography','<p>Scribus is a page layout application. If you are familiar with common publishing industry tools, then Scribus will be very familiar to you, but if you\'re used to word processors or graphic applications, then Scribus will probably confuse you. In this episode, Klaatu talks about the workflow of page layout, and how to do some basic tasks in Scribus.\r\n</p>\r\n\r\n<p>The example files Klaatu produces in Scribus are available at <a href=\"https://slackermedia.info/tank/scribus-by-example.tar.gz\" target=\"_blank\">https://slackermedia.info/tank/scribus-by-example.tar.gz</a></p>\r\n\r\n<p>Fair warning: this episode is actually \"about\" steganography. The key you need is <strong>OGG</strong>.</p>',78,74,0,'CC-BY-SA','design, steganography, scribus, layout',0,0,1),
(2706,'2018-12-17','Why I love the IBM AS/400 computer systems',1714,'A short talk about how I came to love the IBM As/400 systems and why.','<p>This is a talk about my love for the IBM family of AS/400 computer systems.</p>\r\n<p>Although it’s a very hacker unfriendly system there is still much to admire and love.</p>\r\n<p>It’s completely different from anything else which makes it nice but also very likely to disappear in few years from now. To prevent that piece of computing history to vanish I started a small initiative called <a href=\"https://www.as400museum.org/\" class=\"uri\">https://www.as400museum.org/</a>. It’s just me, but it does show my intention with the system.</p>\r\n',369,0,1,'CC-BY-SA','as400, ibm, computing, midrange',0,0,1),
(2708,'2018-12-19','Ghostscript',1351,'Klaatu talks about manipulating PDFs with gs and pdf-stapler','<p>\r\nGhostscript is the open source implementation of Postscript. You can read its <a href=\"https://www.ghostscript.com/doc/current/Use.htm\" target=\"_blank\">docs</a> online.\r\n</p>\r\n\r\n<p>\r\nTo compress a big PDF into something possibly smaller:\r\n</p>\r\n\r\n<pre><code>\r\n$ gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dBATCH -sOutputFile=output.pdf example.pdf\r\n</code></pre>\r\n\r\n<p>\r\nThat renders basically the same PDF with all images down-res\'d to 72 DPI. Other valid setting profiles are <strong>ebook</strong>, <strong>printer</strong>, and <strong>prepress</strong>.\r\n</p>\r\n\r\n<p>\r\nTo render a version of a PDF without any raster images in it, making it cheaper and faster to print:\r\n</p>\r\n\r\n<pre><code>\r\ngs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dBATCH -dFILTERIMAGE -sOutputFile=output.pdf example.pdf\r\n</code></pre>\r\n\r\n<p>\r\nThe FILTERIMAGE option drops raster images from the file. The <strong>FILTERVECTOR</strong> option filters vector images, and <strong>FILTERTEXT</strong> filters text.\r\n</p>\r\n\r\n<p>\r\nIf <a href=\"https://hackerpublicradio.org/eps.php?id=2667\" target=\"_blank\">pdftk</a> is not available for your OS, you can use <a href=\"https://github.com/hellerbarde/stapler\" target=\"_blank\">pdf-stapler</a> instead for cutting and concatenating PDF files. It doesn\'t deal with metadata as well as pdftk does, however.</p><p>It\'s worth noting that pdftk is available as a snap package <a href=\"https://snapcraft.io/pdftk\" target=\"_blank\">https://snapcraft.io/pdftk</a>.\r\n</p>\r\n\r\n<p>\r\nIt\'s also worth noting that this is actually episode 2 in a series about steganography.</p>\r\n\r\n',78,74,0,'CC-BY-SA','pdf, ebook, bloat, print',0,0,1),
(2711,'2018-12-24','Raspberry Pi 3A+ Review',336,'In this episode of HPR, I will do a quick review of the Raspberry Pi 3A+.','<h1 id=\"raspberry-pi-3a-review\">Raspberry Pi 3A+ review</h1>\r\n<p>In this episode of HPR, I will do a quick review of the Raspberry Pi 3A+, the latest release of the Raspberry Pi foundation.</p>\r\n<p><img src=\"https://frenchguy.ch/assets/img_1710_800.jpg\" title=\"Raspberry Pi 3A+\" alt=\"Raspberry Pi 3A+\" /> <img src=\"https://frenchguy.ch/assets/img_1711_800.jpg\" title=\"Raspberry Pi 3A+\" alt=\"Raspberry Pi 3A+\" /></p>\r\n<p><strong>Specs</strong><br />\r\nThe Raspberry Pi 3A+ has almost the same hardware as its big brother/sister the 3B+ :</p>\r\n<ul>\r\n<li>BCM2837 BO SOC (system on chip), a quad core 64-bit ARM v8 processor, running at 1.4 GHz</li>\r\n<li>On board wireless :\r\n<ul>\r\n<li>WiFi : 2.4 and 5 GHz 802.11 c/y/n/ac</li>\r\n<li>Bluetooth : 4.2 and BLE</li>\r\n</ul></li>\r\n<li>MicroSD card for storing the operating system and the data</li>\r\n<li>Full size HDMI connector</li>\r\n<li>3.5 mm jack connector for audio and composite video output</li>\r\n<li>MicroUSB connector for the power supply</li>\r\n<li>40-pin header with the same pinout as every other Raspberry Pi</li>\r\n</ul>\r\n<p>The differences are :</p>\r\n<ul>\r\n<li>Only one full size USB connector, instead of four on the 3B+</li>\r\n<li>No ethernet connector</li>\r\n<li>Only 512 MB or SDRAM instead of 1 GB on the 3B+</li>\r\n</ul>\r\n<p><strong>Size</strong><br />\r\nThe Raspberry Pi 3A+ is 6.7 x 5.6 cm (2.6 x 2.2 in) and 11 mm high (.45 in). But if you plug a ribbon in the header, then it takes a lot of space.</p>\r\n<p><img src=\"https://frenchguy.ch/assets/img_1713_800.jpg\" title=\"Raspberry Pi 3A+\" alt=\"Raspberry Pi 3A+\" /></p>\r\n<p>In this case, it’s probably better to unsolder the header, and solder a right angle header in place, so the pins are pointing to the side of the board and not upwards</p>\r\n<p><img src=\"https://frenchguy.ch/assets/img_1716_800.jpg\" title=\"Raspberry Pi 3A+\" alt=\"Raspberry Pi 3A+\" /> <img src=\"https://frenchguy.ch/assets/img_1717_800.jpg\" title=\"Raspberry Pi 3A+\" alt=\"Raspberry Pi 3A+\" /></p>\r\n<p>With a bit of caution and the help of some desoldering wick, it’s not a complex operation, because there is no component near the GPIO header.</p>\r\n<p>Of course if you plan on using a HAT, then you’re better off using the straight header. The Raspberry Pi 3A+ is actually the same size than a standard HAT.</p>\r\n<p><img src=\"https://frenchguy.ch/assets/img_1718_800.jpg\" title=\"Raspberry Pi 3A+\" alt=\"Raspberry Pi 3A+\" /> <img src=\"https://frenchguy.ch/assets/img_1719_800.jpg\" title=\"Raspberry Pi 3A+\" alt=\"Raspberry Pi 3A+\" /></p>\r\n<p><strong>Use case</strong><br />\r\n</p>\r\n<p>Since the Raspberry Pi 3A+ doesn’t have an ethernet port, I think I will not use it for server stuff like <a href=\"https://mosquitto.org/\">Mosquitto</a> or <a href=\"https://pi-hole.net/\">Pi-Hole</a>, for which a good network connection is required. Also, those servers sometimes need a keyboard and a mouse, and with only one USB port, that’s not too practical.</p>\r\n<p>For me, the A+ will be used to upgrade projects currently using a Raspberry Pi ZeroW, and for which I need a little more power. The on board WiFi and the small form factor, combined with the extra power, makes the 3A+ an ideal replacement for the ZeroW.</p>\r\n<p><strong>Credits</strong><br />\r\n</p>\r\n<p>The sound used for the opening and closing sequence is <a href=\"https://www.jamendo.com/track/1405949/speaker-x-clash-jingle\">Speaker X-Clash</a> by Daniel H, and is released under a CC-BY-NC license.</p>\r\n',370,0,0,'CC-BY-SA','raspberry pi, review',0,0,1),
(2712,'2018-12-25','Steganography',1290,'Klaatu wraps up his miniseries about steganography.','<p>Did you find the hidden message contained in Klaatu\'s previous two episodes?</p>\r\n<p>If not, Klaatu reveals how to find it in this one, how to duplicate it, and what makes good steganography.</p>',78,0,0,'CC-BY-SA','steganography,message,secret decoder ring',0,0,1),
(2714,'2018-12-27','Airplane stalls and Angle of Attack',995,'A primer on why airplanes quit flying','<h1 id=\"stalls-a-primer-on-why-aircraft-fly-and-dont-fly\">stalls, a primer on why aircraft fly, and don’t fly</h1>\r\n<h2 id=\"youtube-video-of-stall-with-narration-35-seconds\">YouTube video of stall with narration (35 seconds)</h2>\r\n<p><a href=\"https://www.youtube.com/watch?v=SiOiVHUEYao\" class=\"uri\">https://www.youtube.com/watch?v=SiOiVHUEYao</a></p>\r\n<h2 id=\"aoa-gauge-from-t-38-manual\">AoA gauge from T-38 manual</h2>\r\n<p><a href=\"https://goo.gl/images/ZH5UYx\" class=\"uri\">https://goo.gl/images/ZH5UYx</a></p>\r\n<h2 id=\"some-definitions\">Some definitions</h2>\r\n<ul>\r\n<li><p>chord - an imaginary line from the front of the wing to the back</p></li>\r\n<li><p>relative wind - movement of air relative to the chord</p></li>\r\n<li><p>angle of attack - the angle of the chord of the wing to the relative wind</p></li>\r\n<li><p>stall - a condition where the air on the top of the wing is not flowing smoothly over the wing</p></li>\r\n<li><p>critical angle of attack - the angle that the wing becomes stalled</p></li>\r\n<li><p>fun - stalling and spinning and aircraft when its safe to do so</p></li>\r\n<li><p>scary - stalling and spinning and aircraft when you don’t want to</p></li>\r\n</ul>\r\n<h2 id=\"things-not-mentioned\">Things not mentioned</h2>\r\n<p>This discussion pertained to subsonic speeds, super sonic flight introduces a whole other realm of issues.</p>\r\n<p>The wings of aircraft do not stall all at once. They are designed (usually) to stall from the wing root (where the wing is attached to the fuselage) towards the tips. This ensures good roll control at slow speed and into the stall. This stalling characteristic is achieved by designing twist in the wing (washout) allowing different parts of the wing to hit the critical angle of attack at different times.</p>\r\n<p>The most dangerous situation that you can find yourself in is a low altitude situation where one wing is stalled more than the other. The airplane then enters a spin. The dangerous part is the low altitude. Spins are fun, and the plane is still controllable, but you need altitude to recover. A wise man told me when turning low to the ground keep your nose down and speed up.</p>\r\n<p>Most light aircraft will shudder or buffet as you approach the critical angle of attack this happens because of the disturbed airflow hitting the aircraft’s fuselage or tail. In larger aircraft no (i.e. airliners) no feel is given naturally as the plane approaches a stalled condition so systems like stick shakers vibrate the control artificially as you approach the critical angle of attack as measured by the AoA sensors. <a href=\"https://goo.gl/images/7xv5A5\">DC-9 stick shaker, a big cell phone vibrator</a> artificial stall warning is mandatory in fly-by-wire aircraft (i.e. Airbus, f-16) as well as pure hydraulic controls (i.e. Boeing 757)</p>\r\n<p>Author: Brian<br />\r\nCreated: 2018-12-01 Sat 07:34<br />\r\nEmacs 25.3.1 (Org mode 8.2.10)</p>\r\n',326,0,0,'CC-BY-SA','aircraft,flight,stall',0,0,1),
(2760,'2019-03-01','What is VNF',445,'A topic from the Open Networking conference in Amsterdam','<p>A short basic info about VNF</p>\r\n<p><a href=\"https://searchsdn.techtarget.com/definition/virtual-network-functions\" class=\"uri\">https://searchsdn.techtarget.com/definition/virtual-network-functions</a></p>',129,61,0,'CC-BY-SA','Virtual network function,VNF,network functions virtualization,NFV',0,0,1),
(2785,'2019-04-05','What is uCPE',399,'A short talk on telco networking standards','<ul>\r\n<li><a href=\"https://blog.advaoptical.com/en/what-is-universal-cpe\" class=\"uri\">https://blog.advaoptical.com/en/what-is-universal-cpe</a></li>\r\n<li><a href=\"https://www.audiocodes.com/solutions-products/solutions/network-function-virtualization-nfv/universal-cpe-ucpe\" class=\"uri\">https://www.audiocodes.com/solutions-products/solutions/network-function-virtualization-nfv/universal-cpe-ucpe</a></li>\r\n<li><a href=\"https://netmanias.com/en/post/blog/12703/sdn-nfv-ucpe/what-is-universal-cpe-updated-at-may-2018\" class=\"uri\">https://netmanias.com/en/post/blog/12703/sdn-nfv-ucpe/what-is-universal-cpe-updated-at-may-2018</a></li>\r\n<li><a href=\"https://www.walkerfirst.com/uploads/files/literature/Skinny_Wire_17S.pdf?as_url_id=AAAAAAWx6lVCrvi0cYObNZzKbTqds3zxZOTme09iW_1bgRwXnxj5xBhDUZFsrEovlR-8QzYp5bjEFX-8gUDCSfEtxk2YBSqlqDxvUktl5hrlcCW3RFsY5EZqzULvKHnRBTv51vleaWM2y0uBOkqJjueTHAIu\" class=\"uri\">https://www.walkerfirst.com/uploads/files/literature/Skinny_Wire_17S.pdf?as_url_id=AAAAAAWx6lVCrvi0cYObNZzKbTqds3zxZOTme09iW_1bgRwXnxj5xBhDUZFsrEovlR-8QzYp5bjEFX-8gUDCSfEtxk2YBSqlqDxvUktl5hrlcCW3RFsY5EZqzULvKHnRBTv51vleaWM2y0uBOkqJjueTHAIu</a></li>\r\n</ul>',129,0,1,'CC-BY-SA','Network Function Virtualization,NFV,Universal customer premises equipment,uCPE',0,0,1),
(2729,'2019-01-17','Bash Tips - 18',1898,'Arrays in Bash (part 3)','<h1 id=\"bash-tips---18\">Bash Tips - 18 <small><small>(Extra auxiliary Bash tips)</small></small></h1>\n<h2 id=\"arrays-in-bash\">Arrays in Bash</h2>\n<p>This is the third of a small group of shows on the subject of arrays in Bash. It is also the eighteenth show in the <em>Bash Tips</em> sub-series.</p>\n<p>In the last show we looked at ways of accessing elements with negative indices and how to concatenate arrays. We then launched into parameter expansion in the context of arrays.</p>\n<p>There are a few more parameter expansion operations to look at in this episode, then in the next episode we will look in more depth at the <code>declare</code> built in command and at some of the commands that assist with loading data into arrays.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p><a href=\"hpr2729_full_shownotes.html\">I have provided detailed notes as usual for this episode, and these can be viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li>Section on <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Arrays\">\"Bash Arrays\"</a></li>\n<li>Section on <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion\">\"Shell Parameter Expansion\"</a></li>\n</ul></li>\n</ul>\n<ul>\n<li>Linux Documentation Project: <a href=\"https://www.tldp.org/LDP/abs/html/index.html\">Advanced Bash-Scripting Guide</a>\n<ul>\n<li><a href=\"https://www.tldp.org/LDP/abs/html/arrays.html\">Chapter 27: Arrays</a></li>\n</ul></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 \"<em>Additional ancillary Bash tips - 12</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2679\">HPR episode 2679 \"<em>Extra ancillary Bash tips - 13</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2689\">HPR episode 2689 \"<em>Bash Tips - 14 (Some auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2699\">HPR episode 2699 \"<em>Bash Tips - 15 (More auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2709\">HPR episode 2709 \"<em>Bash Tips - 16 (Further auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2719\">HPR episode 2719 \"<em>Bash Tips - 17 (Additional auxiliary Bash tips)</em>\"</a></li>\n</ol></li>\n</ul>\n<ul>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2729_bash18_ex1.sh\">bash18_ex1.sh</a>, <a href=\"hpr2729_bash18_ex2.sh\">bash18_ex2.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,array,indexed array,associative array,parameter expansion',0,0,1),
(2724,'2019-01-10','Using a DIN Rail to mount a Raspberry Pi',549,'I created DIN rail fittings for attaching my RPi 3B+ and an SSD disk','<h2 id=\"overview\">Overview</h2>\n<p>A <em>DIN Rail</em> is a metal rail for mounting pieces of electrical equipment inside an equipment rack, for performing tasks in a building, in a machine, and so forth. It’s common to see DIN rails holding circuit breakers for example.</p>\n<p>See the <a href=\"https://en.wikipedia.org/wiki/DIN_rail\" title=\"Wikipedia article on the DIN Rail\">Wikipedia article</a> on the subject for full details.</p>\n<p>A number of people in the Maker Community have made use of these rails, and there are a number of freely available designs for stands that can be 3D printed on which you can mount these rails. There are also designs for mounts onto which devices like Raspberry Pis and disks can be fitted and attached to a rail.</p>\n<p>This show will recount my experiences with creating a compact mounting system for one of my Raspberry Pi systems. I had the help of my son and his girlfriend in 3D printing the parts for this project.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes and pictures for this episode, and these can be <a href=\"hpr2724_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><p>Wikipedia article <a href=\"https://en.wikipedia.org/wiki/DIN_rail\"><em>DIN Rail</em></a></p></li>\n<li>Thingiverse designs used:\n<ul>\n<li><a href=\"https://www.thingiverse.com/thing:2610621\">DIN Mounts: Pi, Arduino and disks</a> by <a href=\"https://www.thingiverse.com/imstrng\">imstrng</a></li>\n<li><a href=\"https://www.thingiverse.com/thing:2068383\">DIN Rail Stand</a> by <a href=\"https://www.thingiverse.com/RedWraith\">RedWraith</a></li>\n</ul></li>\n</ul>\n<ul>\n<li>Other Thingiverse DIN Rail-related items:\n<ul>\n<li><a href=\"https://www.thingiverse.com/thing:2144527\">DIN Rail Stand v2</a> by <a href=\"https://www.thingiverse.com/philklaus\">philklaus</a></li>\n<li><a href=\"https://www.thingiverse.com/thing:2415721\">Raspberry Pi Zero Vertical Edge-Mounted DIN Mount</a> by <a href=\"https://www.thingiverse.com/coffeenut\">coffeenut</a></li>\n</ul></li>\n</ul>\n',225,0,1,'CC-BY-SA','3D printing,DIN rail,Raspberry Pi',0,0,1),
(2723,'2019-01-09','Using Elm in context of 4X game client',2671,'Tuula talks their decisions on structuring Elm application','<p>Original idea I had with my toy game project was to have Yesod render most of the user interface as static HTML and have as little client side scripting as possible. Later I realized that there would be parts with significant amount of client side code and it might be better if whole site was written in Elm.</p>\r\n<p>Couple goals I had in my mind when I started this:</p>\r\n<ul>\r\n<li>easy to work with</li>\r\n<li>type safe</li>\r\n<li>extensible</li>\r\n<li>user authorization\r\n<ul>\r\n<li>regular player</li>\r\n<li>administrator</li>\r\n</ul></li>\r\n</ul>\r\n<p>Backend is written in Haskell and front end in Elm. Communication between them is via REST interface and most of the data is in JSON. All JSON encoding / decoding is centralized (more or less), same with initiating requests to server.</p>\r\n<h2 id=\"api-endpoints\">API Endpoints</h2>\r\n<p>End points used for REST calls are defined in single data type that captures their name and parameters. These are used when initiating requests, meaning there’s smaller chance of typo slipping through.</p>\r\n<pre><code>type Endpoint\r\n    = ApiStarDate\r\n    | ApiResources\r\n    | ApiStarSystem\r\n    | ApiStar\r\n    | ApiPlanet\r\n    | ApiPopulation PlanetId\r\n    | ApiBuilding PlanetId\r\n    | ApiConstructionQueue PlanetId\r\n    | ApiConstruction Construction\r\n    | ApiBuildingConstruction\r\n    | ApiAvailableBuildings</code></pre>\r\n<p>For example, sending a GET request to retrieve all construction projects on a planet is done as:</p>\r\n<pre><code>Http.send (ApiMsgCompleted &lt;&lt; ConstructionsReceived) (get (ApiConstructionQueue planetId) (list constructionDecoder))</code></pre>\r\n<p>GET Request is sent to ApiConstructionQueue endpoint and it has planetId as parameter. When server sends response, our program will parse content of it will be a list that is parsed with constructionDecoder and create “ApiMsgCompleted ConstructionsReceived” message with result of the parsing. Update function will process this and store list of constructions somewhere safe for further use.</p>\r\n<h2 id=\"update-function\">Update function</h2>\r\n<p>Update function is in charge of reacting to messages (mouse clicks, page changes, responses from server). In a large program update function will quickly get big and unwieldy. Breaking it into smaller pieces (per page for example), will make maintenance easier. This way each page has their own message type and own update function to handle it. In addition there’s few extra ones (cleaning error display, processing API messages and reacting to page changes).</p>\r\n<p>Same way as API end points are encoded in a type, pages are too:</p>\r\n<pre><code>type Route\r\n    = HomeR\r\n    | ProfileR\r\n    | StarSystemsR\r\n    | StarSystemR StarSystemId\r\n    | PlanetR StarSystemId PlanetId\r\n    | BasesR\r\n    | FleetR\r\n    | DesignerR\r\n    | ConstructionR\r\n    | MessagesR\r\n    | AdminR\r\n    | LogoutR\r\n    | ResearchR</code></pre>\r\n<p>routeToString function is used to map Route into String, that can be placed in hyperlink. Below is an excerp:</p>\r\n<pre><code>routeToString : Route -&gt; String\r\nrouteToString route =\r\n    case route of\r\n        HomeR -&gt;\r\n            &quot;/home&quot;\r\n\r\n        StarSystemR (StarSystemId sId) -&gt;\r\n            &quot;/starsystem/&quot; ++ String.fromInt sId\r\n\r\n        PlanetR (StarSystemId sId) (PlanetId pId) -&gt;\r\n            &quot;/starsystem/&quot; ++ String.fromInt sId ++ &quot;/&quot; ++ String.fromInt pId</code></pre>\r\n<p>Because mapping needs to be bi-directional (Route used to define content of a href and string from a href used to define Route), there’s mapping to other direction too:</p>\r\n<pre><code>routes : Parser (Route -&gt; a) a\r\nroutes =\r\n    oneOf\r\n        [ map HomeR top\r\n        , map ProfileR (s &quot;profile&quot;)\r\n        , map ResearchR (s &quot;research&quot;)\r\n        , map StarSystemsR (s &quot;starsystem&quot;)\r\n        , map StarSystemR (s &quot;starsystem&quot; &lt;/&gt; starSystemId)\r\n        , map PlanetR (s &quot;starsystem&quot; &lt;/&gt; starSystemId &lt;/&gt; planetId)\r\n        , map BasesR (s &quot;base&quot;)\r\n        , map FleetR (s &quot;fleet&quot;)\r\n        , map DesignerR (s &quot;designer&quot;)\r\n        , map ConstructionR (s &quot;construction&quot;)\r\n        , map MessagesR (s &quot;message&quot;)\r\n        , map AdminR (s &quot;admin&quot;)\r\n        , map LogoutR (s &quot;logout&quot;)\r\n]</code></pre>\r\n<p>Result of parsing is Maybe Route, meaning that failure will return Nothing. Detecting and handling this is responsibility of the calling code, usually I just default to HomeR.</p>\r\n<h2 id=\"breadcrumbs\">Breadcrumbs</h2>\r\n<p>Borrowing from Yesod, client uses recursive function to define breadcrumb path. This is hierarchical view of current location in the application, allowing user to quickly navigate backwards where they came.</p>\r\n<p>Breadcrumb path consists of segments that are tuple of (String, Maybe Route). String tells text to display and Route is possible parent route of the segment. This allows hierarchical definition: “Home / Star systems / Sol / Earth”. Because route has only (for example) PlanetId, we need to pass Model too, so that the data retrieved from server can be used to figure out what name such a planet has.</p>\r\n<pre><code>{-| Build complete breadcrumb path and wrap it in enclosing HTML\r\n-}\r\nbreadcrumbPath : Model -&gt; Html Msg\r\n\r\n{-| Recursively build list of breadcrumbs from segments\r\nLast one is plain text, while parents of it are links\r\n-}\r\nbreadcrumb : Model -&gt; Bool -&gt; Route -&gt; List (Html Msg)\r\n\r\n{-| Get segment of given route in form of ( String, Maybe Route )\r\nString denotes text describing the segment, Maybe Route is possible parent\r\n-}\r\nsegment : Model -&gt; Route -&gt; ( String, Maybe Route )</code></pre>\r\n',364,0,0,'CC-BY-SA','elm',0,0,1),
(2803,'2019-05-01','Update on my Raspi 3 B OpenMedia Vault and Next Cloud instances',449,'A short podcast on how my little home servers are working or not','<ul>\r\n<li><p><a href=\"https://nextcloud.com/box/\" class=\"uri\">https://nextcloud.com/box/</a><br />\r\nThis link was the first product and it is not available any more.</p></li>\r\n<li><p><a href=\"https://ownyourbits.com/nextcloudpi/\" class=\"uri\">https://ownyourbits.com/nextcloudpi/</a><br />\r\nThis link tells you about all the different ways to do next cloud.</p></li>\r\n<li><p><a href=\"https://github.com/nextcloud/nextcloudpi/wiki/How-to-install-NextCloudPi\" class=\"uri\">https://github.com/nextcloud/nextcloudpi/wiki/How-to-install-NextCloudPi</a><br />\r\nThe link above is what worked exactly for me.</p></li>\r\n<li><p><a href=\"https://www.openmediavault.org/about.html\" class=\"uri\">https://www.openmediavault.org/about.html</a><br />\r\nThe link above is about what OMV is.</p></li>\r\n<li><p><a href=\"https://sourceforge.net/projects/openmediavault/files/Raspberry%20Pi%20images/\">https://sourceforge.net/projects/openmediavault/files/Raspberry%20Pi%20images/</a><br />\r\nIs were I got my image.</p></li>\r\n</ul>\r\n<p>I use a Toshiba 4TB non-powered drive external usb 3 drive.</p>\r\n',129,0,1,'CC-BY-SA','Raspberry Pi,NextCloud,openmediavault',0,0,1),
(2716,'2018-12-31','Really Simple YouTube',441,'Thaj explains how he makes YouTube come to him using RSS feeds','<p>Here are the two links I mentioned that let you pull RSS feeds out of YouTube</p>\r\n<ul>\r\n<li><a href=\"https://danielmiessler.com/blog/rss-feed-youtube-channel/\" class=\"uri\">https://danielmiessler.com/blog/rss-feed-youtube-channel/</a></li>\r\n<li><a href=\"https://support.google.com/youtube/answer/6224202?hl=en\" class=\"uri\">https://support.google.com/youtube/answer/6224202?hl=en</a></li>\r\n</ul>\r\n',270,0,0,'CC-BY-SA','RSS, YouTube, PeerTube, TInyTinyRSS, Internet Video',0,0,1),
(2739,'2019-01-31','Bash Tips - 19',1553,'Arrays in Bash (part 4)','<h2 id=\"arrays-in-bash\">Arrays in Bash <small><small>(Supplemental auxiliary Bash tips)</small></small></h2>\n<p>This is the fourth and last of a small group of shows on the subject of arrays in Bash. It is also the nineteenth show in the <em>Bash Tips</em> sub-series.</p>\n<p>In the last show we continued with the subject of parameter expansion in the context of arrays. There are other aspects of this that could be looked at, but we’ll leave it for the moment and may revisit it in the future.</p>\n<p>In this episode we will look in more depth at the <code>declare</code> (<code>typeset</code>) built in command and at some commands that are related (<code>readonly</code> and <code>local</code>), We will also look at the commands that assist with loading data into arrays: <code>mapfile</code> (<code>readarray</code>) and <code>read</code>.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>As usual I have provided detailed notes and examples for this episode, and these can be <a href=\"hpr2739_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li>Section on <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Arrays\">\"Bash Arrays\"</a></li>\n<li>Section on <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Shell-Builtin-Commands\">\"4 Shell Builtin Commands\"</a>\n<ul>\n<li>Section on <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins\">\"4.1 Bourne Shell Builtins\"</a></li>\n<li>Section on <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins\">\"4.2 Bash Builtin Commands\"</a></li>\n</ul></li>\n</ul></li>\n</ul>\n<ul>\n<li>Linux Documentation Project: <a href=\"https://www.tldp.org/LDP/abs/html/index.html\">Advanced Bash-Scripting Guide</a>\n<ul>\n<li><a href=\"https://www.tldp.org/LDP/abs/html/arrays.html\">Chapter 27: Arrays</a></li>\n</ul></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 \"<em>Additional ancillary Bash tips - 12</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2679\">HPR episode 2679 \"<em>Extra ancillary Bash tips - 13</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2689\">HPR episode 2689 \"<em>Bash Tips - 14 (Some auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2699\">HPR episode 2699 \"<em>Bash Tips - 15 (More auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2709\">HPR episode 2709 \"<em>Bash Tips - 16 (Further auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2719\">HPR episode 2719 \"<em>Bash Tips - 17 (Additional auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2729\">HPR episode 2729 \"<em>Bash Tips - 18 (Extra auxiliary Bash tips)</em>\"</a></li>\n</ol></li>\n</ul>\n<ul>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2739_bash19_ex1.sh\">bash19_ex1.sh</a>, <a href=\"hpr2739_bash19_ex2.sh\">bash19_ex2.sh</a>, <a href=\"hpr2739_bash19_ex3.sh\">bash19_ex3.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,array,declare,typeset,local,readonly,read,mapfile,readarray',0,0,1),
(2717,'2019-01-01','Mobile Device Security',621,'Cell phone cyber security 101','<h2 id=\"introduction\">Introduction</h2>\r\n<p>Hello and welcome to Hacker Public Radio, I’m Edward Miro and for this episode I decided to address mobile device security. As with most of the research and articles I’ve written in the past, these are geared toward standard users in a business setting and are meant to be a jumping off point for further research and to be a foundation for cyber security 101 level training classes. If you like what I do, and want to have me come speak to your team, feel free to email me.</p>\r\n<p>As an information security researcher, I have noticed a trend in what potential clients lately have been interested in: cell phones. Almost everyone I have consulted for in the area of private investigations make this area their main priority. This makes sense as users have started to transition to using mobile devices more and more. Not only do cell phones represent the main conduit to the internet for a huge chunk of people, but many use them for work also. Many companies have smartly presented policies against this, but there are still many organizations that allow bring-your-own-device style implementations. In the following podcast I will try to define the threats, defense and considerations in very broad strokes.</p>\r\n<p>Cell phones differ from a standard hacking target in a few ways. For the most part, many of the same vectors are still valid. Remote code execution however is more rare, but not out of the question. I’m going to attempt to present these different vectors in an ascending list of what is most likely to be used as an attack, in my humble (and possibly ignorant) opinion.</p>\r\n<h3 id=\"passive-surveillance\">1. Passive Surveillance</h3>\r\n<p>This vector is one many in the hacking world will already be familiar with and it is a major concern for mobile devices as well. Attackers can monitor an access point where the mobile device is connected and collect packets in all the usual ways. Open public WiFi is a treasure trove and tons of data that’s being sent in the clear can be collected, analyzed and leveraged by attackers.</p>\r\n<p>Defense here is a bit more complicated for the general user, but shouldn’t be too intrusive for most:</p>\r\n<ol type=\"1\">\r\n<li>Use a VPN on your mobile devices.</li>\r\n<li>Switch to a DNS provider that provides secure DNSSEC.</li>\r\n<li>Implement proper encryption on access points.</li>\r\n</ol>\r\n<h3 id=\"spyware\">2. Spyware</h3>\r\n<p>Many commercial spyware applications are readily available on both of the main app stores. The challenges for attackers lie in either gaining physical access to the unlocked device to install the spyware, or tricking the user into installing it themselves. Most often the target’s spouse or close contact does this. Some of these apps can be disguised to look like innocuous applications as a feature, but with devices that are rooted/jailbroken, they can be completely hidden from the user. I found a few surveys that state the average smart phone user has about 30 apps installed. I don’t think it’s unreasonable to suspect the average person wouldn’t notice a second calculator or calendar app. These apps feature the full gamut of what you’d expect from a spyware app.</p>\r\n<p>Defense against spyware is pretty simple:</p>\r\n<ol type=\"1\">\r\n<li>Don’t allow unsupervised access to your device.</li>\r\n<li>Use a strong passcode or biometric lock.</li>\r\n<li>Remove unused applications and be aware of new apps that may pop up.</li>\r\n<li>Don’t root or jailbreak your device.</li>\r\n</ol>\r\n<h3 id=\"social-engineering\">3. Social Engineering</h3>\r\n<p>The tried and true vector that has always worked and will continue to work is social engineering. It doesn’t matter what kind of device a target is using if you can get them to click a malicious link, open a malicious attachment, or disclose their password to the attackers. With a user’s password you can conduct a vast amount of surveillance through their Google or Apple account. Not to mention leverage their password into all their other accounts as most users still use the same password for everything. We can also callback to the previous section on spyware by mentioning that many users are already familiar with enabling the installation of 3rd party applications and can be tricked into installing a cleverly disguised spyware application.</p>\r\n<p>Basic OPSEC recommendations are applicable here:</p>\r\n<ol type=\"1\">\r\n<li>Don’t click strange or unsolicited links or attachments on your devices.</li>\r\n<li>Never disclose your password to anyone through a text message or voice call.</li>\r\n<li>Don’t install 3rd party applications. I’ll extend this to say not to install any shady or questionable apps, even ones hosted by the app stores. There have been instances of vetted apps being malicious.</li>\r\n</ol>\r\n<h3 id=\"imsi-catchersfemtocells\">4. IMSI catchers/Femtocells</h3>\r\n<p>I refer to these as DIY Stingrays. Stingrays are devices used by law enforcement to track and surveil cell phone traffic. These devices emulate a cell tower or boost cell phone signals when used in a legitimate way. Mobile phones are designed to prefer using stations that are the closest and strongest. Any technically proficient attacker can DIY one of these devices for not a lot of money. When an attacker deploys one of these devices, the target’s phone usually has no idea that the device isn’t an official cell tower and happily connects and passes traffic through it. The rogue stations can then be configured to pass the traffic on to an authentic tower and the user will have no idea. These rogue towers can not only collect identifying information about the mobile device that can be used to track or mark a target, they can also monitor voice calls, data, and SMS, as well as perform man-in-the-middle attacks. Often they can disable the native encryption of the target’s phone as well.</p>\r\n<p>Defense against this vector is a bit more complicated:</p>\r\n<ol type=\"1\">\r\n<li>As before, use a VPN.</li>\r\n<li>Use Signal or other encrypted communication apps.</li>\r\n<li>Avoid disclosing sensitive information during voice calls.</li>\r\n<li>There is software that has been developed to detect and notify the user when a rogue station has been detected, but this is not going to be super helpful for standard users. There are also maps online of known cell towers and it is possible to use software to identify your connected tower.</li>\r\n</ol>\r\n<h3 id=\"exploits\">5. Exploits</h3>\r\n<p>Speaking very generally, this attack vector is for the most part less of a concern (depending on your particular threat level), but we all know that the chance of this happening in the wild is probably remote for most people. The technical implementations of exploits such as Rowhammer, Stagefright, and Blueborne are well outside the scope of this particular talk, but we would be incorrect to not mention them and what can be done to protect against them. And we should also pay special attention to more and more exploits being developed to attack mobile devices as attackers have started putting a lot of attention in this area. Even though many of these vulnerabilities are being patched, we all know many users are still using old versions of Android and iOS, and many devices are simply outside the support period offered by the manufacturers and will never be updated past a certain point. Couple that with the general idea that mobile devices (or any device running a non Windows based OS) are “safer” because less exploits exist for them is currently a very poor assumption. This will probably get worse as the cost of keeping up with new devices now being over $1000 and many users won’t be able to get devices that are constantly being patched.</p>\r\n<p>What we can do:</p>\r\n<ol type=\"1\">\r\n<li>Keep your mobile devices updated with most current OS updates and carrier settings. Also keep applications updated. I don’t know how many times I’ve noticed friends or family with devices that are ready to be updated, but the notifications go ignored.</li>\r\n<li>If it’s possible, replace devices when they are outside the support period.</li>\r\n<li>Be paranoid, if it applies to you. What this means is when you use any computer or device, always remember that zero day exploits can exist for years before being disclosed. You could follow ALL the best OPSEC practices, and you could still be vulnerable to exploits that haven’t been disclosed and/or patched. This might not matter if you’re just a general user, but if you work for the government or do intelligence work, act as if.</li>\r\n</ol>\r\n<p>Well, thank you for taking the time to listen to my basic introduction to cell phone cyber defense. I know most of the information I provided is only the tip of the iceberg and if current trends hold up, this will only get worse in the future. If you want to add to or correct any mistakes I may have made, like I stated in the introduction, feel free to email me and let’s have a conversation. I don’t claim to know all there is to know and love feedback and any opportunities to learn more or collaborate with others in the field.</p>\r\n<p>Thanks again, and have a great 2019!</p>\r\n',372,0,1,'CC-BY-SA','Mobile Device Security',0,0,1),
(2718,'2019-01-02','Genre In Storytelling',750,'Lostnbronx takes a look at the importance of genre in storytelling.','<p>Many people see genres as being largely interchangeable, but are they really? Why can some stories only be told in a particular genre? When are genre stories truly alike? And when are setting, character, and plot more important than genre? Lostnbronx takes a quick, rambling look at this complicated subject.</p>\r\n',107,105,0,'CC-BY-SA','stories,storytelling,genre,lostnbronx',1,0,1),
(2725,'2019-01-11','The Illumos Shutdown Command Explained',812,'A short pod cast about the Illumos shutdown command','<p>In response to JWP\'s <a href=\"https://hackerpublicradio.org/eps.php?id=2697\" target=\"_blank\">episode 2697</a> and <a href=\"https://hackerpublicradio.org/eps.php?id=2697#comments\" target=\"_blank\">ClaudioM\'s comment</a>, this show covers the <code>shutdown</code> command as it appeared in Sun Solaris and OpenSolaris, and currently appears in both Oracle Solaris and <a href=\"https://openindiana.org\" target=\"_blank\">OpenIndiana</a>.\r\n\r\n<p>\r\nThe quick version&#58;\r\n</p>\r\n\r\n<ul>\r\n<li><code>shutdown</code></li>\r\n<li><code>-i</code> sets the destination init state (5 to shutdown, 6 to reboot, and so on; see <code>man init</code> for more)</li>\r\n<li><code>-y</code> to answer \"yes\" to the safeguard prompt asking you whether you really want to shutdown</li>\r\n<li><code>-g</code> to set how many seconds until shutdown. Default is 60.\r\n</li>\r\n</ul>\r\n\r\n<p>In practise, I don\'t even use the shutdown command. I use <code>poweroff</code>, which does a shutdown and poweroff.</p>\r\n\r\n<p>\r\nBoth shutdown and poweroff require root permission. On OpenIndiana, you can either use <code>sudo bash</code> or <code>pfexec bash</code> to get a root prompt.\r\n</p>\r\n\r\n<p>Some links&#58;</p>\r\n<p><a href=\"https://docs.openindiana.org/handbook/common-tasks/#system-shutdown-reboot\" target=\"_blank\">OpenIndiana handbook</a></p>\r\n<p><a href=\"https://docs.oracle.com/cd/E23824_01/html/821-1451/gldpm.html\" target=\"_blank\">Sun Microsystem docs</a> (with Oracle branding on it)</p>\r\n\r\n\r\n',78,0,0,'CC-BY-SA','sys admin,systems,unix,illumos',0,0,1),
(2733,'2019-01-23','Writing Web Game in Haskell - News and Notifications',2837,'Tuula talks about the game they\'re writing in Haskell and convoluted news system they made.','<h2 id=\"intro\">Intro</h2>\r\n<p>News and notifications are used in the game to let the players know something noteworthy has happened. It could be discovery of a new planet or construction project finally finishing.</p>\r\n<p>All relevant information in the news is hyperlinked. If news mentions a planet, player can click the link and view current information of that planet.</p>\r\n<h2 id=\"server-interface\">Server interface</h2>\r\n<p>Server has three resources for news, although we’re concentrating only one here:</p>\r\n<pre><code>/api/message           ApiMessageR      GET POST\r\n/api/message/#NewsId   ApiMessageIdR    DELETE\r\n/api/icon              ApiMessageIcons  GET</code></pre>\r\n<p>First one is for retrieving all messages and posting a new one. Second one is for marking one read and third one is for retrieving all icons that players can attach to messages written by them.</p>\r\n<h2 id=\"database\">Database</h2>\r\n<p>Database is defined in /config/models file. For news, there’s only one table:</p>\r\n<pre><code>News json\r\n    content Text\r\n    factionId FactionId\r\n    date Int\r\n    dismissed Bool\r\nderiving Show Read Eq</code></pre>\r\n<p>Content field contains the actual news article data as serialized JSON. This allows storing complex data, without having to have lots of columns or multiple tables.</p>\r\n<h2 id=\"domain-objects\">Domain objects</h2>\r\n<p>There are many kinds of messages that players might see, but we’ll concentrate on one about discovering a new planet</p>\r\n<p>All different kinds of articles are of same type: NewsArticle. Each different kind of article has their own value constructor (PlanetFound in this particular case). And each of those value constructors has single parameter of a specific type that holds information particular to that certain article (PlanetFoundNews in this case). Adding a new article means adding a new value constructor and record to hold the data.</p>\r\n<pre><code>data NewsArticle =\r\n    StarFound StarFoundNews\r\n    | PlanetFound PlanetFoundNews\r\n    | UserWritten UserWrittenNews\r\n    | DesignCreated DesignCreatedNews\r\n    | ConstructionFinished ConstructionFinishedNews\r\n\r\n\r\ndata PlanetFoundNews = PlanetFoundNews\r\n    { planetFoundNewsPlanetName :: Text\r\n    , planetFoundNewsSystemName :: Text\r\n    , planetFoundNewsSystemId   :: Key StarSystem\r\n    , planetFoundNewsPlanetId   :: Key Planet\r\n    , planetFoundNewsDate       :: Int\r\n    }</code></pre>\r\n<p>Given a News object, we can turn it into NewsArticle. These are much nicer to deal with that densely packed News that is stored in database:</p>\r\n<pre><code>parseNews :: News -&gt; Maybe NewsArticle\r\nparseNews =\r\n    decode . toLazyByteString . encodeUtf8Builder . newsContent</code></pre>\r\n<p>Because parsing arbitrary JSON might fail, we get Maybe NewsArticle, instead of NewsArticle. It is possible to write the same code in longer way:</p>\r\n<pre><code>parseNews news =\r\n    let\r\n        content = newsContent news\r\n        utf8Encoded = encodeUtf8Builder content\r\n        byteString = toLazyByteString utf8Encoded\r\n    in\r\n        decode byteString</code></pre>\r\n<p>Similarly there’s two other functions for dealing with Entities (primary key, data - pair really) and list of Entities. Note that parseNewsEntities filters out all News that it didn’t manage to turn into NewsArticle. They have following signatures:</p>\r\n<pre><code>parseNewsEntity :: Entity News -&gt; (Key News, Maybe NewsArticle)\r\n\r\nparseNewsEntities :: [Entity News] -&gt; [(Key News, NewsArticle)]</code></pre>\r\n<p>Writing JSON encoding and decoding is tedious, template Haskell can help us here:</p>\r\n<pre><code>$(deriveJSON defaultOptions &#39;&#39;PlanetFoundNews)\r\n$(deriveJSON defaultOptions &#39;&#39;NewsArticle)</code></pre>\r\n<h2 id=\"turning-articles-into-json\">Turning Articles into JSON</h2>\r\n<p>News articles aren’t much use if they stay on the server, we need to send them to clients too. We can’t have multiple declarations of same typeclass for any type, so we declare complete new type and copy data there before turning it into JSON and sending to client (this is one way of doing this).</p>\r\n<p>First step, define our types (concentrating on planet found news here):</p>\r\n<pre><code>data NewsArticleDto =\r\n    StarFoundDto StarFoundNewsDto\r\n    | PlanetFoundDto PlanetFoundNewsDto\r\n    | UserWrittenDto UserWrittenNewsDto\r\n    | DesignCreatedDto DesignCreatedNewsDto\r\n    | ConstructionFinishedDto ConstructionFinishedNewsDto\r\n    deriving (Show, Read, Eq)\r\n\r\ndata PlanetFoundNewsDto = PlanetFoundNewsDto\r\n    { planetFoundNewsDtoPlanetName :: Text\r\n    , planetFoundNewsDtoSystemName :: Text\r\n    , planetFoundNewsDtoSystemId   :: Key StarSystem\r\n    , planetFoundNewsDtoPlanetId   :: Key Planet\r\n    , planetFoundNewsDtoDate       :: Int\r\n    }\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>We need way to move data into dto and thus define a type class for that operation:</p>\r\n<pre><code>class (ToJSON d) =&gt; ToDto c d | c -&gt; d where\r\n    toDto :: c -&gt; d</code></pre>\r\n<p>For more information about functional dependencies, check following links: <a href=\"https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extension-FunctionalDependencies\" class=\"uri\">https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extension-FunctionalDependencies</a> and <a href=\"https://wiki.haskell.org/Functional_dependencies\" class=\"uri\">https://wiki.haskell.org/Functional_dependencies</a></p>\r\n<p>Writing instances for our type class:</p>\r\n<pre><code>instance ToDto PlanetFoundNews PlanetFoundNewsDto where\r\n    toDto news =\r\n        PlanetFoundNewsDto { planetFoundNewsDtoPlanetName = planetFoundNewsPlanetName news\r\n                           , planetFoundNewsDtoSystemName = planetFoundNewsSystemName news\r\n                           , planetFoundNewsDtoSystemId = planetFoundNewsSystemId news\r\n                           , planetFoundNewsDtoPlanetId = planetFoundNewsPlanetId news\r\n                           , planetFoundNewsDtoDate = planetFoundNewsDate news\r\n                           }\r\n\r\ninstance ToDto NewsArticle NewsArticleDto where\r\n    toDto news =\r\n        case news of\r\n            (StarFound x) -&gt; StarFoundDto $ toDto x\r\n            (PlanetFound x) -&gt; PlanetFoundDto $ toDto x\r\n            (UserWritten x) -&gt; UserWrittenDto $ toDto x\r\n            (DesignCreated x) -&gt; DesignCreatedDto $ toDto x\r\n            (ConstructionFinished x) -&gt; ConstructionFinishedDto $ toDto x</code></pre>\r\n<p>Finally, we want to wrap our news into something that has all the common info (id and link to icon to show)</p>\r\n<pre><code>data NewsDto = NewsDto\r\n    { newsDtoId    :: Key News\r\n    , newsContents :: NewsArticleDto\r\n    , newsIcon     :: Text\r\n    }\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>IconMapper knows how to turn NewsArticleDto (in this case) to corresponding link to the icon. Notice how our ToDto instance includes IconMapper in addition to Key and NewsArticle:</p>\r\n<pre><code>instance ToDto ((Key News, NewsArticle), (IconMapper NewsArticleDto)) NewsDto where\r\n    toDto ((nId, article), icons) =\r\n        let\r\n            content = toDto article\r\n        in\r\n        NewsDto { newsDtoId = nId\r\n                , newsContents = content\r\n                , newsIcon = runIconMapper icons content\r\n                }</code></pre>\r\n<h2 id=\"sideshow-iconmapper\">Sideshow: IconMapper</h2>\r\n<p>IconMapper is a function that knows how to retrieve url to icon that matches the given parameter (for example NewsArticleDto in this case):</p>\r\n<pre><code>newtype IconMapper a =\r\n    IconMapper { runIconMapper :: a -&gt; Text }</code></pre>\r\n<p>One possible implementation that knows how to deal with NewsArticleDto. We have two levels of hierarchicy here, because UserNewsDto has special rules for figuring out which icon to use:</p>\r\n<pre><code>iconMapper :: (Route App -&gt; Text) -&gt; IconMapper UserNewsIconDto -&gt; IconMapper NewsArticleDto\r\niconMapper render userIconMapper =\r\n    IconMapper $ article -&gt;\r\n        case article of\r\n            PlanetFoundDto _-&gt;\r\n                render $ StaticR images_news_planet_png\r\n\r\n            UserWrittenDto details -&gt;\r\n                runIconMapper userIconMapper $ userWrittenNewsDtoIcon details\r\n    ...</code></pre>\r\n<h2 id=\"back-to-json\">Back to JSON</h2>\r\n<p>I wrote ToJSON and FromJSON instances by hand, because I wanted full control on how the resulting JSON looks like. It’s possible to configure how template Haskell names fields for example, but I think that writing these out couple of times is good practice and makes sure that I understand what’s going on behind the scenes if I use template Haskell later.</p>\r\n<pre><code>instance ToJSON NewsDto where\r\n    toJSON (NewsDto { newsDtoId = nId\r\n                    , newsContents = contents\r\n                    , newsIcon = icon }) =\r\n        object [ &quot;id&quot; .= nId\r\n               , &quot;contents&quot; .= contents\r\n               , &quot;tag&quot; .= jsonTag contents\r\n               , &quot;icon&quot; .= icon\r\n               , &quot;starDate&quot; .= newsStarDate contents\r\n               ]\r\n\r\ninstance ToJSON PlanetFoundNewsDto where\r\n    toJSON (PlanetFoundNewsDto { planetFoundNewsDtoPlanetName = pName\r\n                               , planetFoundNewsDtoSystemId = sId\r\n                               , planetFoundNewsDtoPlanetId = pId\r\n                               , planetFoundNewsDtoSystemName = sName\r\n                               }) =\r\n        object [ &quot;planetName&quot; .= pName\r\n               , &quot;systemName&quot; .= sName\r\n               , &quot;planetId&quot; .= pId\r\n               , &quot;systemId&quot; .= sId\r\n               ]</code></pre>\r\n<h2 id=\"time-to-put-it-all-together\">Time to put it all together</h2>\r\n<p>Handler function authenticates user, check they’re member of a faction and then loads all the news:</p>\r\n<pre><code>getApiMessageR :: Handler Value\r\ngetApiMessageR = do\r\n    (_, _, fId) &lt;- apiRequireFaction\r\n    loadAllMessages fId</code></pre>\r\n<p>Loading messages involves multiple steps:</p>\r\n<ul>\r\n<li>retrieve News from database\r\n<ul>\r\n<li>correct faction, not dismissed, sort by date</li>\r\n</ul></li>\r\n<li>parse them into ( Key News, NewsArticle )</li>\r\n<li>get Url render function</li>\r\n<li>create mapper for user icons</li>\r\n<li>map all NewsArticles into ( NewsArticleDto, IconMapper )</li>\r\n<li>turn them into JSON and return that to client</li>\r\n</ul>\r\n<pre><code>loadAllMessages :: Key Faction -&gt; HandlerFor App Value\r\nloadAllMessages fId = do\r\n    loadedMessages &lt;- runDB $ selectList [ NewsFactionId ==. fId\r\n                                         , NewsDismissed ==. False ] [ Desc NewsDate ]\r\n    let parsedMessages = parseNewsEntities loadedMessages\r\n    render &lt;- getUrlRender\r\n    let userIcons = userNewsIconMapper render\r\n    return $ toJSON $ map (toDto . (flip (,) (iconMapper render userIcons))) parsedMessages</code></pre>\r\n<p>\r\n<a href=\"https://hackerpublicradio.org/eps/hpr2733/hpr2733/hpr2733.png\"><img src=\"https://hackerpublicradio.org/eps/hpr2733/hpr2733/hpr2733-small.png\" /></a>\r\n</p>\r\n',364,107,0,'CC-BY-SA','haskell, yesod',0,0,1),
(2726,'2019-01-14','Home Theater - Part 2 Software (High Level)',1249,'I go over a high level of my notes for the software on my Media box as it relates to TV/Movies/Music','<p><a href=\"https://docs.google.com/document/d/1E1xAwWpq-C4vEh8LCRw7MD7jnaclX9Faf2L3dZWiqQY\" class=\"uri\">https://docs.google.com/document/d/1E1xAwWpq-C4vEh8LCRw7MD7jnaclX9Faf2L3dZWiqQY</a></p>\r\n<ul>\r\n<li>Future Eps for Series:\r\n<ul>\r\n<li>Sonarr / Filename Fixes</li>\r\n<li>SABnzbd</li>\r\n<li>Subsonic / orpheus.network /Audio Fixes</li>\r\n</ul></li>\r\n</ul>\r\n\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2726/hpr2726/hpr2726.pdf\">Local copy of the shownotes</a></p>\r\n',36,0,0,'CC-BY-SA','kodi, deluge,Sonarr,Plex,Subsonic,SpiderOakONE,Zoneminder,Borg Backup,rclone,Redshift,Audacity',0,0,1),
(2727,'2019-01-15','Passwords',467,'How to do passwords better. ','<h2 id=\"introduction\">Introduction</h2>\r\n<p>Hello and welcome to Hacker Public Radio, I’m Edward Miro and for this episode I decided to record an episode on the importance of good passwords. This will be part one in a series of podcasts I’m going to call “Information Security for Everyone”. As with most of the content I create in the world of infosec, my goal is to present the information in a way that a majority of people can get value from it and anyone can play this for a friend, colleague or family member and make it easy for the non-hackers in our lives to understand.</p>\r\n<h2 id=\"passwords\">Passwords</h2>\r\n<p>One of the first things most people think about when it comes to online safety is their password. We all know that passwords are to our online accounts what keys are for our locks. Would you use the same key for your house, your car, your office and your safety deposit box? Of course not. And if you did, what would happen if a bad guy could get a copy of just that one key? They’d have access to everything. With so much of our personal, confidential, financial and medical information accessible from our various online accounts, what can we do to make things as safe as possible?</p>\r\n<p>For me personally I employ and advise a three faceted approach:</p>\r\n<ol type=\"1\">\r\n<li>Complex passwords</li>\r\n<li>Unique passwords</li>\r\n<li>Two-factor authentication (where available)</li>\r\n</ol>\r\n<p>Clearly the solution is to use a unique password for each account and make them complicated enough that an attacker couldn’t guess it or crack it in an amount of time that would be actionable. One problem this presents to general users is the inconvenience and difficulty in remembering these passwords or storing them in a secure way. This leads into my first bit of advice:</p>\r\n<h2 id=\"password-managers\">Password Managers</h2>\r\n<p>My recommendation is to use a password manager. I’m going to make references to managers such as LastPass because that’s the one I’ve always used, but I’m not saying it’s the best or would be the best for you. There are many great options and I would rather people use the one that works the best for them and not merely the one I like best. Anyways. Applications like LastPass give you the ability to store all passwords in your encrypted “vault” and then request them through browser add-ons or standalone applications. They also have built in features that allow you to generate secure passwords at any length or complexity.</p>\r\n<p>When using a password manager, all you have to remember is your ONE master password. When you sign in, the manager can then decrypt all your saved passwords and let you use them. When I sign up for a website, I use LastPass to generate the longest and most complex password supported by the site and it gets stored in my vault safely for later use.</p>\r\n<p>There are various options online to choose from and I suggest you do some research and try a few different ones to see what is comfortable for you. One thing to consider when using a password manager is that the master password is your single point of failure and should be a long and complex password that you don’t use ANYWHERE else.</p>\r\n<p>If you’re wondering how to come up with a secure password that you can remember there are various strategies online, but I follow this:</p>\r\n<p>Take a poem, song lyrics or phrase that is easy for you to remember. For this example I’ll use the phrase:</p>\r\n<pre><code>&quot;The stars at night are big and bright. Deep in the heart of Texas.&quot;</code></pre>\r\n<p>Then I take the first letters from each word and that gives me:</p>\r\n<pre><code>TsanababdithoT.</code></pre>\r\n<p>Then I swap out the vowels for some numbers/special characters. And that gives me:</p>\r\n<pre><code>T5@n@b@bd1th0T</code></pre>\r\n<p>I checked that password on Dashlane’s Password Strength Checker, and got the following results:</p>\r\n<pre><code>It would take a computer about 204 million years to crack your password</code></pre>\r\n<p>And that’s just an example of a very secure password that I thought up in just a few seconds that I probably won’t ever be able to forget it.</p>\r\n<h2 id=\"fa-two-factor-authentication\">2FA (two-factor authentication)</h2>\r\n<p>Another very important recommendation I want to touch on in this episode is using two-step authentication. I use it for all accounts that offer it and it’s very easy to set-up and use. It works in tandem with an application on my mobile device called Google Authenticator(though there are others and like LastPass this is just the one I use) and it’s available for Android and iOS. After you install the app, you access the security settings for the account you want to protect and register it with your device.</p>\r\n<p>What it does is provide a “second” password when logging it that is only used one time. When you log in, the site will prompt for the two-step authentication code, you then open the Google Authenticator app and the code for the session will be listed. The codes are only available for a short time and are constantly changing. This makes someone gaining unauthorized access to your account VERY difficult.</p>\r\n<h2 id=\"a-few-closing-thoughts\">A few closing thoughts</h2>\r\n<p>Some information security professionals see a password manager as insecure due to it being a single point of failure. I can understand this and would respond that although this might be true, having a complex master password and using the manager in conjunction with two-step authentication makes it a pretty safe and solid system. And even if there is a breach, none of my passwords are the same and changing them is incredibly fast and easy with a manager.</p>\r\n<p>Also, I usually don’t recommend keeping hard copies of passwords, but if you can guarantee the physical security of your password list, this in my opinion is preferable to using the same, insecure password for all your accounts.</p>\r\n<p>Please remember, if you’re like most people on the internet and you use an easy to crack password or the same password on all your sites, all it takes is one compromised account to give bad guys access to everything.</p>\r\n<p>I’m also including a list of links in the bottom of the show notes to everything I mentioned and also a link to the site <em>Have I Been Pwned</em>. This is a service that collects accounts that have been involved in hacks and lets anyone search for their email address and see if their information is already compromised. If it is, do this NOW:</p>\r\n<ol type=\"1\">\r\n<li>Setup a password manager with a strong master password.</li>\r\n<li>Change all your passwords using the built in password generator in your password manager and save them in your vault as you go.</li>\r\n<li>In the future when breaches happen, it’s incredibly easy to change your password and you’ll also rest easy knowing that the password obtained can’t get them into anything else.</li>\r\n</ol>\r\n<p>I know this will take a long time. But it’s worth it. Then, you only have to remember one master password and you will be exponentially safer online.</p>\r\n<p>I also linked SplashData’s “The Top 100 Worst Passwords of 2018”. PLEASE don’t use anything on this list.</p>\r\n<p>Well, thank you for taking the time to listen to my basic introduction to passwords. I hope this will help any non-hackers in your life and like I say in all my podcasts, I don’t claim to know all there is to know and love feedback and any opportunities to learn more or collaborate with others in the field. As with most of the research and articles I’ve written in the past, these are geared toward standard users in a business setting and are meant to be a jumping off point for further research and to be a foundation for cyber security 101 level training classes. If you like what I do, and want to have me come speak to your team, or just wanna chat, feel free to email me.</p>\r\n<p>Thank you and have a safe 2019!</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.lastpass.com/\" class=\"uri\">https://www.lastpass.com/</a> - My favorite password manager.</li>\r\n<li><a href=\"https://howsecureismypassword.net/\" class=\"uri\">https://howsecureismypassword.net/</a> - Check if your password is strong enough.</li>\r\n<li><a href=\"https://twofactorauth.org/\" class=\"uri\">https://twofactorauth.org/</a> - Setup 2FA on all the accounts you can.</li>\r\n<li><a href=\"https://haveibeenpwned.com/\" class=\"uri\">https://haveibeenpwned.com/</a> - See if your email/accounts have been compromised already.</li>\r\n<li><a href=\"https://www.teamsid.com/100-worst-passwords/\" class=\"uri\">https://www.teamsid.com/100-worst-passwords/</a> - Top 100 Worst Passwords of 2018.</li>\r\n</ul>\r\n',372,74,0,'CC-BY-SA','Information Security for Everyone',0,0,1),
(2730,'2019-01-18','Resizing images for vcard on Android',688,'Automating the steps needed to get images formatted for VCard import into Android phones','<p>I have had problems importing vcards onto my Android phone. After a lot of troubleshooting, I tracked it down to embedded images in the card. The PHOTO;VALUE field to be precise.</p>\r\n\r\n<p>Some images worked and some didn\'t, and looking at the properties some that worked were larger than others that didn\'t. In the end I tracked down a post on <a href=\"https://stackoverflow.com/questions/17834815/how-to-find-the-max-image-size-supported-for-contacts-images\">stackoverflow</a> that hinted that the aspect ratio was important. And sure enough it was.</p>\r\n\r\n<blockquote class=\"wp-block-quote\">\r\n<p>starting with jelly bean (4.1), android now supports contact images that are 720x720.<br />before, starting with ICS (4.0), android has supported contact images that are 256x256.<br />and before that, contact photos had just a size of a thumbnail - 96x96.</p>\r\n<cite><a href=\"https://stackoverflow.com/users/878126/android-developer\">Stack exchange</a> </cite>\r\n</blockquote>\r\n\r\n\r\n<p>I tried a 720x720 on a few phones but decided to settle on 256x256 for now. </p>\r\n\r\n\r\n<p>To do image manipulation, I tend to use the <a href=\"https://www.graphicsmagick.org/\">GraphicsMagick</a> tools instead of the more popular <a href=\"https://www.imagemagick.org/script/index.php\">ImageMagick</a> suite. You should be able to achieve the same result in either.</p>\r\n\r\n\r\n<p>My requirements were:</p>\r\n<ul>\r\n<li>The images should be scaled so that the maximum height/width shrinks to 256, maintaining the aspect ratio.</li>\r\n<li>The images should always be 256x256 in size.</li>\r\n<li>Scaled images should be padded and centered on a white background.</li>\r\n<li>All color profile information should be removed.</li>\r\n</ul>\r\n\r\n\r\n<p>To use an example I took the following image and saved it as Linus_Torvalds.jpg</p>\r\n\r\n\r\n<p>By <a title=\"User:Krd\" href=\"//commons.wikimedia.org/wiki/User:Krd\">Krd</a> (photo)<a class=\"new\" title=\"User:Von Sprat (page does not exist)\" href=\"//commons.wikimedia.org/w/index.php?title=User:Von_Sprat&amp;action=edit&amp;redlink=1\">Von Sprat</a> (crop/extraction) - <a title=\"File:LinuxCon Europe Linus Torvalds 03.jpg\" href=\"//commons.wikimedia.org/wiki/File:LinuxCon_Europe_Linus_Torvalds_03.jpg\">File:LinuxCon Europe Linus Torvalds 03.jpg</a>, <a title=\"Creative Commons Attribution-Share Alike 4.0\" href=\"https://creativecommons.org/licenses/by-sa/4.0\">CC BY-SA 4.0</a>, <a href=\"https://commons.wikimedia.org/w/index.php?curid=54706023\">Link</a></p>\r\n\r\n\r\n<p>Step one is to use the <a href=\"https://href=&quot;https://www.graphicsmagick.org/GraphicsMagick.html#details-size\">-size</a> 256x256 option which you would think would do the scaling, but in fact it only reduces the file to 366x509 which is not what I expected.</p>\r\n\r\n<pre><code>$ gm convert -size 256x256 \"Linus_Torvalds.jpg\" Linus_Torvalds_1.jpg<br />$ gm identify Linus_Torvalds_1.jpg\r\nLinus_Torvalds_1.jpg JPEG 366x509+0+0 DirectClass 8-bit 56.1Ki 0.000u 0m:0.000002</code></pre>\r\n\r\n\r\n<p><img style=\"border-style: solid;\" src=\"https://hackerpublicradio.org/eps/hpr2730/hpr2730/Linus_Torvalds_1.jpg\" /></p>\r\n\r\n\r\n<p>However it appears that the option is used when creating new files, and is also used by the processor to determine the intended target size. Which is why I left it in. So what we actually need is the <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-resize\">-resize</a> option.</p>\r\n\r\n<pre><code>\r\n$ gm convert -size 256x256 \"Linus_Torvalds.jpg\" -resize 256x256 Linus_Torvalds_2.jpg\r\n$ gm identify Linus_Torvalds_2.jpg\r\nLinus_Torvalds_2.jpg JPEG 184x256+0+0 DirectClass 8-bit 47.7Ki 0.000u 0m:0.000001s</code><code>\r\n</code></pre>\r\n\r\n<p><img style=\"border-style: solid;\" src=\"https://hackerpublicradio.org/eps/hpr2730/hpr2730/Linus_Torvalds_2.jpg\" /></p>\r\n\r\n<p>So this has done a good job at scaling the image down. It\'s now scaled correctly so that the biggest edge is scaled down to 256. In this case it was the height but the width is now shorter than what we need. We do want to maintain the aspect ratio so that we don\'t distort the image but 184x256 is not 1:1 aspect ratio nor is it the needed dimensions of 256x256.</p>\r\n\r\n<p>The solution to this is to use the <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-extent\">-extent</a> command.</p>\r\n\r\n<pre><code>$ gm convert -size 256x256 \"Linus_Torvalds.jpg\" -resize 256x256 -extent 256x256 Linus_Torvalds_3.jpg\r\n$ gm identify Linus_Torvalds_3.jpg\r\nLinus_Torvalds_3.jpg JPEG 256x256+0+0 DirectClass 8-bit 48.0Ki 0.000u 0m:0.000001s</code></pre>\r\n\r\n\r\n<p><img style=\"border-style: solid;\" src=\"https://hackerpublicradio.org/eps/hpr2730/hpr2730/Linus_Torvalds_3.jpg\" /></p>\r\n\r\n\r\n<p>This gives us the correct size and a 1:1 aspect ratio, but the image is left justified. To fix this we need to use the <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-gravity\">-gravity</a> command. That needs to be the first argument of the command. Finding the correct order of the commands took some trial and error.</p>\r\n\r\n<pre><code>$ gm convert -gravity center -size 256x256 \"Linus_Torvalds.jpg\" -resize 256x256 -extent 256x256 Linus_Torvalds_4.jpg\r\n$ gm identify Linus_Torvalds_4.jpg\r\nLinus_Torvalds_4.jpg JPEG 256x256+0+0 DirectClass 8-bit 48.5Ki 0.000u 0m:0.000001s</code></pre>\r\n\r\n<p><img style=\"border-style: solid;\" src=\"https://hackerpublicradio.org/eps/hpr2730/hpr2730/Linus_Torvalds_4.jpg\" /></p>\r\n\r\n<p>Finally we remove all profile information using <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-profile\">+profile</a> which should make the image more generic.</p>\r\n\r\n<pre><code>$ gm convert -gravity center -size 256x256 \"Linus_Torvalds.jpg\" -resize 256x256 -extent 256x256 +profile \"*\" Linus_Torvalds_5.jpg\r\n$ gm identify Linus_Torvalds_5.jpg\r\nLinus_Torvalds_5.jpg JPEG 256x256+0+0 DirectClass 8-bit 5.7Ki 0.000u 0m:0.000001s</code></pre>\r\n\r\n<p>Putting it all together we get.</p>\r\n\r\n<pre><code>gm convert <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-gravity\">-gravity</a> center <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-size\">-size</a> 256x256 \"big-image.jpg\" <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-resize\">-resize</a> 256x256 <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-extent\">-extent</a> 256x256 <a href=\"https://www.graphicsmagick.org/GraphicsMagick.html#details-profile\">+profile</a> \"*\" \"256x256_image.jpg\"\r\n</code></pre>\r\n\r\n<p><img style=\"border-style: solid;\" src=\"https://hackerpublicradio.org/eps/hpr2730/hpr2730/Linus_Torvalds_5.jpg\" /></p>\r\n\r\n<p>You should now be able to add these images to vcards without any problem.</p>\r\n\r\n<p>Here is a one liner to create 96x96 256x256 and 720x720 thumbnails of all the jpg images in a directory.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<pre><code>for image in *jpg;do for size in 96x96 256x256 720x720; do gm convert -gravity center -size ${size} \"${image}\" -resize ${size} -extent ${size} +profile \"*\" \"thumbnail-${size}-${image}\";done;done</code></pre>\r\n\r\n<p>Also available <a href=\"https://kenfallon.com/resizing-images-for-vcard-on-android/\">here</a></p>\r\n',30,0,1,'CC-BY-SA','GraphicsMagick, ImageMagick, VCard, Android, LineageOS',0,0,1),
(2728,'2019-01-16','The Unreliable Narrator In Storytelling',814,'Lostnbronx looks at unreliable narrators and narrative techniques in stories.','<p>In some stories, the narrator or dominating character can’t be trusted by the audience, creating opportunities for various storytelling effects. What makes for an unreliable narrator? What are some of the strengths and weaknesses of this technique? How can the underlying structure of a tale be similar to an unreliable narrator, even if the story doesn’t actually have one? Lostnbronx takes a rambling, off-the-cuff look at this interesting literary tool</p>\r\n',107,105,0,'CC-BY-SA','stories,storytelling,narration,lostnbronx',0,0,1),
(2731,'2019-01-21','My 8 bit Christmas',1579,'I got a new, old computer for Christmas - an Acorn BBC microcomputer model B.','<p>For Christmas 2018 Santa – well, Mrs mcnalu – gave me a <a href=\"https://en.wikipedia.org/wiki/BBC_Micro\">BBC Model B</a> which was my first computer back in the early 1980s. This request was heavily implied in <a href=\"https://tuxjam.otherside.network/?p=382\">TuxJam 70 - Gift for Geeks</a>.</p>\r\n<p>I can highly <a href=\"https://www.ebay.co.uk/usr/retrofix-uk?_trksid=p2047675.l2559\">recommend the seller</a> who, as you will hear, was extremely helpful when this 36 year old bundle of 8 bit loveliness became very poorly on Boxing Day. It came with a Turbo MMC installed and you can see it in action on <a href=\"https://www.youtube.com/watch?v=FunVINQS0Rw\">another BBC Model B in this video</a>.</p>\r\n<p>The noise you hear at the start - the beeeeee BEEP - is the sound of me turning on the BBC. I mention in the show that mode 0 of the Beeb, as it is affectionately known, has 80 columns and 40 rows. This isn’t quite right, there are only 32 rows in mode 0.</p>\r\n',268,0,0,'CC-BY-SA','retro,BBC,8-bit,assembler',0,0,1),
(2734,'2019-01-24','Mashpodder',1139,'A poor rushed attempt at covering the excellent podcast client mashppoder','<p>After I recorded this episode I had a little look on the HPR site I found that Ken Fallon had already covered mashpodder, no doubt he did a better job than me as this was done in a bit of a rush.</p>\r\n<p>Hopefully somebody will find this of some use</p>\r\n<p>Related links below:-</p>\r\n<ul>\r\n<li><p>HPR episode by Ken Fallon covering Mashpodder<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=0481\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=0481</a></p></li>\r\n<li><p>HPR episode where I talk about my Compaq Ipaq home server<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>HPR episode where I cover my previous pocast client Hpodder<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>Bashpodder homepage<br />\r\n<a href=\"https://lincgeek.org/bashpodder/\" class=\"uri\">https://lincgeek.org/bashpodder/</a></p></li>\r\n<li><p>Mashpodder homepage<br />\r\n<a href=\"https://github.com/chessgriffin/mashpodder\" class=\"uri\">https://github.com/chessgriffin/mashpodder</a> The original link to mashpodder on google code is dead, currently now on github</p></li>\r\n<li><p>Link to the original Linux reality also now dead, but found a link archive to the shows on podbay<br />\r\n<a href=\"https://podbay.fm/show/125849458\" class=\"uri\">https://podbay.fm/show/125849458</a></p></li>\r\n<li><p>Link to the excellent GNU world order by Klaatu, I think it was this episode that he mentioned the great Chess Griffin from Linux reality. Apologies if this is the wrong episode.<br />\r\n<a href=\"https://gnuworldorder.info/audiophile/gnuWorldOrder_12x24.ogg\" class=\"uri\">https://gnuworldorder.info/audiophile/gnuWorldOrder_12x24.ogg</a></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Podcast, ncurses, command-line',0,0,1),
(2750,'2019-02-15','Windmill is on the Fritz',270,'Using Fritzing to help reverse engineer a circuit in a winter model village windmill','<p>\r\nIn this episode Ken uses <a href=\"https://fritzing.org/\">Fritzing</a> tool to keep track of how a winter model village windmill is wired together. Leading to identifying the problem component.\r\n</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2750/hpr2750/xmas-mill.fzz\"><img src=\"https://hackerpublicradio.org/eps/hpr2750/hpr2750/xmas-mill_schem.jpg\" /></a></p>\r\n\r\n<p>\r\nFritzing is an open-source initiative to develop amateur or hobby CAD software for the design of electronics hardware, to support designers and artists ready to move from experimenting with a prototype to building a more permanent circuit. It was developed at the University of Applied Sciences of Potsdam.\r\n<br />\r\nFrom <a href=\"https://en.wikipedia.org/wiki/Fritzing\">https://en.wikipedia.org/wiki/Fritzing</a></p>\r\n',30,103,0,'CC-BY-SA','Fritzing, Reverse Engineering, LED',0,0,1),
(2732,'2019-01-22','Storytelling formula compliance',1692,'Telling a story? want a reaction? USE THE FORMULA','<p>\r\nStorytelling has had a formula for yearsAndYears. Some people speak of it in disdain (\"it was too formulaïc\") and others (creative writing and intro film teachers, mostly) praise it. Everybody else (us) is a sucker for it.\r\n</p>\r\n\r\n<p>\r\nHere is the literal formula, in pseudo code:\r\n</p>\r\n\r\n<pre><code>{A} \r\n{A} Reinforced\r\n\r\n{Z}\r\n\r\n{A} Returned\r\n\r\n{B...Y}\r\n\r\n{Z} Returned\r\n</code></pre>\r\n\r\n<p>\r\nYou can (and should, because it\'s free and you can throw out your work if you don\'t like it) practise this formula by plugging in events to represent A and Z, where A and Z are polar opposites.\r\n</p>\r\n\r\n<p>\r\nReally obvious examples are any given romantic comedy:\r\n</p>\r\n\r\n<pre><code>{A} Jack is A=\"single and free\"\r\n{A} Scene to reinforce that Jack is in relationships with no strings attached. Jack is {A}.\r\n\r\n{Z} Jack meets Jill, realises she makes him happy. He decides he\'s had enough of being {A} and want to be {Z=married}\r\n\r\n{A} Reunion with old school mate makes Jack question his resolve. He leaves Jill so he can be {A}\r\n\r\n{B...Y} Plot happens. Jack does stuff, Jill does stuff. Funny? Tragic? You decide!\r\n\r\n{Z} Jack realizes at last that he\'s only happy with Jill, and that being {Z} with Jill is the only way to be truly free.\r\n</code></pre>\r\n\r\n<p>\r\nYou can also try it with the old Evil Empire plot line.\r\n</p>\r\n\r\n<pre><code>{A} Jill is an {A=obedient citizen}. Loves her mama, loves Jesus and America, too.\r\n{A} Scene in which Jill witnesses a Rebel being mistreated unjustly, but does nothing to stand up for what is right, because she is {A}.\r\n\r\n{Z} Jill meets Jack, an outlaw and rebel against the Empire. He\'s in trouble, so she helps him evade the police.\r\n\r\n{A} Jill, horrified at her own rebellion, conforms all the more. She is dedicated to the Empire, and works diligently to hunt down Jack and his rag tag band of rebels.\r\n\r\n{B...Y} Plot happens. Action, laser guns, laser swords, nationalism, motorcycle gangs.\r\n\r\n{Z} Jill, seeing the devastation her allegiance has caused, realises that the Empire is actually Evil. She joins the rebels to fight for freedom.\r\n</code></pre>\r\n\r\n<p>\r\nNow go practice this. Soon you will be telling stories, jokes, and anecdotes that have a clear beginning, a clear conflict, and a clear ending.\r\n</p>\r\n\r\n',78,99,1,'CC-BY-SA','story, character, plot, writing',0,0,1),
(2735,'2019-01-25','Soffritto',138,'A short episode on a common cookery technique','<p>Hello and a belated Happy New Year to you all in HPR land, Ken has recently made a call for more shows as the queue is a little light at the moment so I was pondering what to waffle on about.</p>\r\n<p>You may know from a couple of my previous shows that as well as being into tech and Linux I’m also a keen Cook, and try and prepare as much of the food we eat at home from scratch as possible.</p>\r\n<p>One of the keys to good dishes is a base of sweated vegetables such as onion, celery carrot and garlic which when cooked in olive oil, is called a <em>Soffritto</em> in Italian cookery. In other parts of the Mediterranean and Latin America where Europeans settled this base to dishes may include other vegetables such as peppers, tomatoes and mushrooms, and have other names such as <em>mirepoix</em> (/mɪərˈpwɑː/ meer-PWAH); but the idea is the same to give a base flavour to soups, sauces, risotto and stew type dishes.</p>\r\n<p>Although not called the same thing this is also replicated in Asian cookery where spices and other aromatics are included such as ginger, lemon grass, chillies, cumin and coriander seeds.</p>\r\n<p>While it is not obligatory to start dishes in such a way if you do use a base of flavours like this when cooking you will find that the finished dish has a more complex and deep flavour at the end, so if you don’t do this give it a try.</p>\r\n<p>A simple starter is to make a tomato sauce for pasta using a base of finely chopped onion, celery, carrot and garlic soften all the vegetables in a pan with some olive oil, add a tin of tomatoes or jar of passata (sieved tomatoes) reduce for 10-15 minutes until all the flavours combine and use as a sauce over pasta with grated cheese.</p>\r\n<p><a href=\"https://en.wikipedia.org/wiki/Sofrito\" class=\"uri\">https://en.wikipedia.org/wiki/Sofrito</a></p>\r\n',338,93,0,'CC-BY-SA','Food, cookery, how to, food preparation',0,0,1),
(2736,'2019-01-28','Response to show 2720',1104,'Some suggestions on how to improve a Bash script','<h2 id=\"introduction\">Introduction</h2>\n<p>On January 4<sup>th</sup> 2019 Ken Fallon did a great show entitled <a href=\"http://hackerpublicradio.org/eps/hpr2720\" title=\"Download youtube channels using the rss feeds\"><em>hpr2720 :: Download youtube channels using the rss feeds</em></a> where he presented a Bash script called <a href=\"/eps/hpr2720/hpr2720_youtube-rss.bash\" title=\"youtube-rss.bash\"><code>youtube-rss.bash</code></a> for managing YouTube downloads through RSS feeds.</p>\n<p>Ken said he welcomed constructive feedback <font size=\"+3\">☺</font></p>\n<p>When I see a Bash script these days I usually find myself looking for ways to rewrite it to make it fit in with what I have been learning while doing my <em>Bash Tips</em> sub-series. Either that or I find it’s got some better ideas than I’ve been using which I have to find out about.</p>\n<p>I also spend time going over my own old scripts (I was writing them in the 1990’s in some cases) and trying to incorporate newer Bash features.</p>\n<p>Suffice it to say that I spotted some areas for improvement in Ken’s script and thought this might be the way to share my thoughts about them. We’re low on shows as I write this, so that gave me more motivation to make a show rather than add a comment or send Ken an email.</p>\n<p><small><b>Apology:</b> I’m still suffering from the aftermath of some flu-like illness so have had to edit coughing fits out of the audio at various points. If you detect any remnants then I’m sorry!</small></p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2736_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2720\">HPR episode 2720 “<em>hpr2720 :: Download youtube channels using the rss feeds</em>”</a></li>\n<li><a href=\"/eps/hpr2720/hpr2720_youtube-rss.bash\"><code>youtube-rss.bash</code></a></li>\n<li><a href=\"https://en.wikipedia.org/wiki/Cat_(Unix)\">Wikipedia article on <code>cat</code></a>\n<ul>\n<li><a href=\"https://en.wikipedia.org/wiki/Cat_(Unix)#Useless_use_of_cat\">Useless use of <code>cat</code></a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,ShellCheck',0,0,1),
(2737,'2019-01-29','My Pioneer RT-707 Reel-to-Reel Tape Deck',1381,'An intro to more of my legacy audio equipment.','<p>I\'ve had this Pioneer RT-707 reel-to-reel tape deck for something like 10 years, but only recently started using it with enthusiasm. In this episode I talk about the tape deck, about the technology, and about my memories of using this kind of audio tape as a kid. I demonstrate playback of one of my parents\' mix tapes, and I also used this machine to record the last few minutes of the podcast onto a reel to reel tape, which of course I then had to transfer back to digital before submitting the show.</p>\r\n\r\n<p>Click image below to see a photo album relating to the tape deck.</p>\r\n\r\n<a href=\"https://www.flickr.com/photos/137675441@N05/albums/72157705976621534\" title=\"Pioneer Reel-to-Reel Tape Deck\"><img src=\"https://hackerpublicradio.org/eps/hpr2737/hpr2737/hpr2737_46803567611_7e1583f534_z.jpg\" alt=\"Pioneer Reel-to-Reel Tape Deck\"></a>\r\n\r\n<p>Tape deck in action (video)</p>\r\n\r\n<p>\r\n<a href=\"https://www.youtube.com/embed/VezOKPwhZgg\"><img src=\"https://hackerpublicradio.org/eps/hpr2737/hpr2737/hpr2737_maxresdefault.jpg\" alt=\"Tape deck in action (video)\"/></a>\r\n</p>\r\n',238,0,0,'CC-BY-SA','audio, vintage audio, stereo components, audio tape, recording',0,0,1),
(3046,'2020-04-06','HPR Community News for March 2020',4545,'HPR Volunteers talk about shows released and comments posted in March 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/0385.html\" target=\"_blank\">crvs</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=3021\" target=\"_blank\">3021</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-03-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3021\" target=\"_blank\">HPR Community News for February 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=3022\" target=\"_blank\">3022</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-03-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3022\" target=\"_blank\">FOSDEM 2020 Stand Interviews</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=3023\" target=\"_blank\">3023</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-03-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3023\" target=\"_blank\">Critique My Script, Episode 1 - Qots-Crew-Gen</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0380.html\" target=\"_blank\">Carl</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3024\" target=\"_blank\">3024</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-03-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3024\" target=\"_blank\">A funny thing happened the other day</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=3025\" target=\"_blank\">3025</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-03-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3025\" target=\"_blank\">Keep unwanted messages off the Fediverse</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=3026\" target=\"_blank\">3026</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-03-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3026\" target=\"_blank\">Hex Bug and Battle Bots</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=3027\" target=\"_blank\">3027</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-03-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3027\" target=\"_blank\">What is quantum computing and why should we care?</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0379.html\" target=\"_blank\">mightbemike</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3028\" target=\"_blank\">3028</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-03-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3028\" target=\"_blank\">Monads and Haskell</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=3029\" target=\"_blank\">3029</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-03-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3029\" target=\"_blank\">At Union Station with a train delay</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=3030\" target=\"_blank\">3030</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-03-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3030\" target=\"_blank\">My new Samsung tablet</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=3031\" target=\"_blank\">3031</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-03-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3031\" target=\"_blank\">Daniel Persson - Me? Me!</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=3032\" target=\"_blank\">3032</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-03-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3032\" target=\"_blank\">piCore on a Raspberry Pi 1 Model B</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0152.html\" target=\"_blank\">Claudio Miranda</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3033\" target=\"_blank\">3033</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-03-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3033\" target=\"_blank\">32 Bit Time Travel</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=3034\" target=\"_blank\">3034</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-03-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3034\" target=\"_blank\">How to bridge Freenode IRC rooms to Matrix.org</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=3035\" target=\"_blank\">3035</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-03-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3035\" target=\"_blank\">Decentralised Hashtag Search and Subscription in Federated Social Networks</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=3036\" target=\"_blank\">3036</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-03-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3036\" target=\"_blank\">WiiU is dead long live WiiU!</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=3037\" target=\"_blank\">3037</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-03-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3037\" target=\"_blank\">Ambient recording at Union Station</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=3038\" target=\"_blank\">3038</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-03-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3038\" target=\"_blank\">Solo Magic</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=3039\" target=\"_blank\">3039</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-03-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3039\" target=\"_blank\">Making a Raspberry Pi status display</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=3040\" target=\"_blank\">3040</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-03-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3040\" target=\"_blank\">Why use GNU Autotools</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=3041\" target=\"_blank\">3041</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-03-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3041\" target=\"_blank\">How to use GNU Autotools</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=3042\" target=\"_blank\">3042</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-03-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3042\" target=\"_blank\">The COVID-19 Work From Home Stream - Day 0</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</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=3009#comments\" target=\"_blank\">hpr3009</a></strong>\n(2020-02-13) \"<em>Linux Inlaws S01 E01</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=3009#5\" target=\"_blank\">Comment 5</a>:\nbittin on 2020-03-05:\n\"yay\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3019#comments\" target=\"_blank\">hpr3019</a></strong>\n(2020-02-27) \"<em>Linux Inlaws S01E02 FOSDEM shenanigans</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=3019#1\" target=\"_blank\">Comment 1</a>:\nClaudioM on 2020-03-05:\n\"FLOSS Weekly #568\"</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=3023#comments\" target=\"_blank\">hpr3023</a></strong>\n(2020-03-04) \"<em>Critique My Script, Episode 1 - Qots-Crew-Gen</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0380.html\" target=\"_blank\">Carl</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#1\" target=\"_blank\">Comment 1</a>:\nDave Morriss on 2020-03-04:\n\"Bash arithmetic\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-03-04:\n\"Another Bash-ism that might be useful\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#3\" target=\"_blank\">Comment 3</a>:\nnobody on 2020-03-04:\n\"There must be an easier way\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#4\" target=\"_blank\">Comment 4</a>:\nnobody on 2020-03-04:\n\"Little correction to my comment\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#5\" target=\"_blank\">Comment 5</a>:\nCarl on 2020-03-05:\n\"Thanks for the comments\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#6\" target=\"_blank\">Comment 6</a>:\nCarl on 2020-03-05:\n\"Thanks for the comments\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#7\" target=\"_blank\">Comment 7</a>:\nnobody on 2020-03-05:\n\"Re: Re:\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#8\" target=\"_blank\">Comment 8</a>:\nnobody on 2020-03-05:\n\"Standalone increment in ash\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#9\" target=\"_blank\">Comment 9</a>:\nCarl on 2020-03-05:\n\"Neat\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#10\" target=\"_blank\">Comment 10</a>:\nnobody on 2020-03-05:\n\"$(())\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3023#11\" target=\"_blank\">Comment 11</a>:\nCarl on 2020-03-05:\n\"Version 3\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3024#comments\" target=\"_blank\">hpr3024</a></strong>\n(2020-03-05) \"<em>A funny thing happened the other day</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3024#1\" target=\"_blank\">Comment 1</a>:\nTuula on 2020-03-05:\n\"great storytelling\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3024#2\" target=\"_blank\">Comment 2</a>:\nMrX on 2020-03-07:\n\"Re great storytelling\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3025#comments\" target=\"_blank\">hpr3025</a></strong>\n(2020-03-06) \"<em>Keep unwanted messages off the Fediverse</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=3025#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-03-09:\n\"I disagree\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3025#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-03-09:\n\"Further discussion\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3026#comments\" target=\"_blank\">hpr3026</a></strong>\n(2020-03-09) \"<em>Hex Bug and Battle Bots</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=3026#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2020-03-25:\n\"Great episode\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3028#comments\" target=\"_blank\">hpr3028</a></strong>\n(2020-03-11) \"<em>Monads and Haskell</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=3028#1\" target=\"_blank\">Comment 1</a>:\nTuula on 2020-03-11:\n\"welcome!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3028#2\" target=\"_blank\">Comment 2</a>:\ncrvs on 2020-03-11:\n\"Re: welcome!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3031#comments\" target=\"_blank\">hpr3031</a></strong>\n(2020-03-16) \"<em>Daniel Persson - Me? Me!</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=3031#1\" target=\"_blank\">Comment 1</a>:\nKlaatu on 2020-03-22:\n\"History\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3032#comments\" target=\"_blank\">hpr3032</a></strong>\n(2020-03-17) \"<em>piCore on a Raspberry Pi 1 Model B</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0152.html\" target=\"_blank\">Claudio Miranda</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3032#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2020-03-26:\n\"Minimal distros are the best\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3034#comments\" target=\"_blank\">hpr3034</a></strong>\n(2020-03-19) \"<em>How to bridge Freenode IRC rooms to Matrix.org</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3034#1\" target=\"_blank\">Comment 1</a>:\nKlaatu on 2020-03-22:\n\"Did not know this\"</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-March/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-March/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributors for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0385.html\">crvs</a>, <a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a>, <a href=\"https://hackerpublicradio.org/correspondents/0318.html\">Archer72</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 28 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),
(2745,'2019-02-08','My YouTube Subscriptions #1',1262,'Part one of my list of subscribed channels','<p>I am subscribed to a number of YouTube channels, and I am sharing them with you</p>\r\n<ul>\r\n<li>Deep Look - <a href=\"https://www.youtube.com/channel/UC-3SbfTPJsL8fJAPKiVqBLg\" class=\"uri\">https://www.youtube.com/channel/UC-3SbfTPJsL8fJAPKiVqBLg</a></li>\r\n<li>Axanar - <a href=\"https://www.youtube.com/channel/UCxRrQIpejUXUi8i4mAbzSlg\" class=\"uri\">https://www.youtube.com/channel/UCxRrQIpejUXUi8i4mAbzSlg</a></li>\r\n<li>Lawrence Systems - <a href=\"https://www.youtube.com/channel/UCHkYOD-3fZbuGhwsADBd9ZQ\" class=\"uri\">https://www.youtube.com/channel/UCHkYOD-3fZbuGhwsADBd9ZQ</a></li>\r\n<li>Rick Beato - <a href=\"https://www.youtube.com/channel/UCJquYOG5EL82sKTfH9aMA9Q\" class=\"uri\">https://www.youtube.com/channel/UCJquYOG5EL82sKTfH9aMA9Q</a></li>\r\n<li>Wolters’ World - <a href=\"https://www.youtube.com/channel/UCFr3sz2t3bDp6Cux08B93KQ\" class=\"uri\">https://www.youtube.com/channel/UCFr3sz2t3bDp6Cux08B93KQ</a></li>\r\n<li>Fab Four Archivist - <a href=\"https://www.youtube.com/channel/UCxWFyPG8Qgj-1BVqC_r6rLg\" class=\"uri\">https://www.youtube.com/channel/UCxWFyPG8Qgj-1BVqC_r6rLg</a></li>\r\n<li>Fraser Cain - <a href=\"https://www.youtube.com/channel/UCogrSQkBJn1KF0N9I4oM7eQ\" class=\"uri\">https://www.youtube.com/channel/UCogrSQkBJn1KF0N9I4oM7eQ</a></li>\r\n<li>Science and Futurism with Isaac Arthur - <a href=\"https://www.youtube.com/channel/UCZFipeZtQM5CKUjx6grh54g\" class=\"uri\">https://www.youtube.com/channel/UCZFipeZtQM5CKUjx6grh54g</a></li>\r\n<li>Creativity RV - <a href=\"https://www.youtube.com/channel/UCigPwB_DERbV5BlwV4OY9mw\" class=\"uri\">https://www.youtube.com/channel/UCigPwB_DERbV5BlwV4OY9mw</a></li>\r\n<li>Drivin’ and Vibin’ - <a href=\"https://www.youtube.com/channel/UClkhrrakVty75SWLJIbcxDA\" class=\"uri\">https://www.youtube.com/channel/UClkhrrakVty75SWLJIbcxDA</a></li>\r\n<li>Hebard’s Travels - <a href=\"https://www.youtube.com/channel/UCQ5BTuWY7B0hTaa9zK0JKNg\" class=\"uri\">https://www.youtube.com/channel/UCQ5BTuWY7B0hTaa9zK0JKNg</a></li>\r\n<li>RV Roof Installation - <a href=\"https://www.youtube.com/channel/UCPbqiR5gZQukf6uk8waWcoA\" class=\"uri\">https://www.youtube.com/channel/UCPbqiR5gZQukf6uk8waWcoA</a></li>\r\n<li>Enjoy the Journey.Life - <a href=\"https://www.youtube.com/channel/UCuhIeTBsCysER-73DnGEegQ\" class=\"uri\">https://www.youtube.com/channel/UCuhIeTBsCysER-73DnGEegQ</a></li>\r\n<li>Geeks on Tour - <a href=\"https://www.youtube.com/channel/UCLM_wnCtDaGBWkYGQS4T6Bw\" class=\"uri\">https://www.youtube.com/channel/UCLM_wnCtDaGBWkYGQS4T6Bw</a></li>\r\n<li>History with Hilbert - <a href=\"https://www.youtube.com/channel/UC1Zc6_BhPXiCWZlrZP4EsEg\" class=\"uri\">https://www.youtube.com/channel/UC1Zc6_BhPXiCWZlrZP4EsEg</a></li>\r\n<li>Keep Your Daydream - <a href=\"https://www.youtube.com/channel/UCEhJLsShZt8McryMf_DHLZQ\" class=\"uri\">https://www.youtube.com/channel/UCEhJLsShZt8McryMf_DHLZQ</a></li>\r\n<li>Living Free Forever - <a href=\"https://www.youtube.com/channel/UCozdfxd0Z7EwZFnZpBkl9Pw\" class=\"uri\">https://www.youtube.com/channel/UCozdfxd0Z7EwZFnZpBkl9Pw</a></li>\r\n<li>Mike Lux Media - <a href=\"https://www.youtube.com/channel/UCBEHEEUFV6IFY7gF2xhyPYw\" class=\"uri\">https://www.youtube.com/channel/UCBEHEEUFV6IFY7gF2xhyPYw</a></li>\r\n<li>RV Love - <a href=\"https://www.youtube.com/channel/UCsjA83xRW2iaqPox8IbDLKQ\" class=\"uri\">https://www.youtube.com/channel/UCsjA83xRW2iaqPox8IbDLKQ</a></li>\r\n<li>Shadiversity - <a href=\"https://www.youtube.com/channel/UCkmMACUKpQeIxN9D9ARli1Q\" class=\"uri\">https://www.youtube.com/channel/UCkmMACUKpQeIxN9D9ARli1Q</a></li>\r\n<li>The Fit RV - <a href=\"https://www.youtube.com/channel/UCxPSwn42fcQlQdp8DTQGRUA\" class=\"uri\">https://www.youtube.com/channel/UCxPSwn42fcQlQdp8DTQGRUA</a></li>\r\n<li>The More We Explore - <a href=\"https://www.youtube.com/channel/UC33Loj6OxDXepBuc3ry0rMg\" class=\"uri\">https://www.youtube.com/channel/UC33Loj6OxDXepBuc3ry0rMg</a></li>\r\n<li>All About RVs - <a href=\"https://www.youtube.com/channel/UCAxGFcQGIzzyS9OdHijsaLg\" class=\"uri\">https://www.youtube.com/channel/UCAxGFcQGIzzyS9OdHijsaLg</a></li>\r\n<li><a href=\"https://www.palain.com/\" class=\"uri\">https://www.palain.com/</a></li>\r\n</ul>\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1),
(2755,'2019-02-22','My YouTube Subscriptions #2',1329,'Part two of my list of subscribed channels','<p>I am subscribed to a number of YouTube channels, and I am sharing them with you</p>\r\n<ul>\r\n<li>Anthony Robustelli - <a href=\"https://www.youtube.com/channel/UCxgAH7EcmKhC9bLm7xQ971g\" class=\"uri\">https://www.youtube.com/channel/UCxgAH7EcmKhC9bLm7xQ971g</a></li>\r\n<li>Apple Scruff Radio - <a href=\"https://www.youtube.com/channel/UCGAFIXNYCwA7mJWMY5zFxzw\" class=\"uri\">https://www.youtube.com/channel/UCGAFIXNYCwA7mJWMY5zFxzw</a></li>\r\n<li>Arthur C Clarke Center for Human Imagination - <a href=\"https://www.youtube.com/channel/UCigIJEygfuAhNEc9kavK2QA\" class=\"uri\">https://www.youtube.com/channel/UCigIJEygfuAhNEc9kavK2QA</a></li>\r\n<li>Baker Street - <a href=\"https://www.youtube.com/channel/UC8IaZ7-169c2vl3GOehxa6w\" class=\"uri\">https://www.youtube.com/channel/UC8IaZ7-169c2vl3GOehxa6w</a></li>\r\n<li>BBC Earth Unplugged - <a href=\"https://www.youtube.com/channel/UCbwp5B-uDBy-fS4bDA0TEaw\" class=\"uri\">https://www.youtube.com/channel/UCbwp5B-uDBy-fS4bDA0TEaw</a></li>\r\n<li>Brain Stuff - <a href=\"https://www.youtube.com/channel/UCiefLm_nIz_gOH7XHbgpdCQ\" class=\"uri\">https://www.youtube.com/channel/UCiefLm_nIz_gOH7XHbgpdCQ</a></li>\r\n<li>Candyrat Records - <a href=\"https://www.youtube.com/channel/UCMJecdKUslHToOEpeuRGwXg\" class=\"uri\">https://www.youtube.com/channel/UCMJecdKUslHToOEpeuRGwXg</a></li>\r\n<li>Cheryl Brin - <a href=\"https://www.youtube.com/channel/UCtbMXq5siIn3l-u_HKbAmrw\" class=\"uri\">https://www.youtube.com/channel/UCtbMXq5siIn3l-u_HKbAmrw</a></li>\r\n<li>Colonial Airstream - <a href=\"https://www.youtube.com/channel/UCaZKKtI5caSI6-WO4zm3VGQ\" class=\"uri\">https://www.youtube.com/channel/UCaZKKtI5caSI6-WO4zm3VGQ</a></li>\r\n<li>Computerphile - <a href=\"https://www.youtube.com/channel/UC9-y-6csu5WGm29I7JiwpnA\" class=\"uri\">https://www.youtube.com/channel/UC9-y-6csu5WGm29I7JiwpnA</a></li>\r\n<li>Couch’s RV Nation - <a href=\"https://www.youtube.com/channel/UCvAONLxaOn8oc7PS33KN22Q\" class=\"uri\">https://www.youtube.com/channel/UCvAONLxaOn8oc7PS33KN22Q</a></li>\r\n<li>Darren Kitchen - <a href=\"https://www.youtube.com/channel/UCTkpeicFNBuHJCvp4LZEuvw\" class=\"uri\">https://www.youtube.com/channel/UCTkpeicFNBuHJCvp4LZEuvw</a></li>\r\n<li>Don Ross - <a href=\"https://www.youtube.com/channel/UCRd5EO6FvhIrqQnk0cscSDA\" class=\"uri\">https://www.youtube.com/channel/UCRd5EO6FvhIrqQnk0cscSDA</a></li>\r\n<li>Geeks on Tour - <a href=\"https://www.youtube.com/channel/UCLM_wnCtDaGBWkYGQS4T6Bw\" class=\"uri\">https://www.youtube.com/channel/UCLM_wnCtDaGBWkYGQS4T6Bw</a></li>\r\n<li>Duet Justus - <a href=\"https://www.youtube.com/channel/UCIeTn13FYQI1YL4InzvuWuQ\" class=\"uri\">https://www.youtube.com/channel/UCIeTn13FYQI1YL4InzvuWuQ</a></li>\r\n<li>Firesign Theatre - <a href=\"https://www.youtube.com/channel/UCXdhVqpbttKSvBWGWHSBkgw\" class=\"uri\">https://www.youtube.com/channel/UCXdhVqpbttKSvBWGWHSBkgw</a></li>\r\n<li>Hana Malhas - <a href=\"https://www.youtube.com/channel/UCpoMVaoVRf3Xvf10_EIZKrg\" class=\"uri\">https://www.youtube.com/channel/UCpoMVaoVRf3Xvf10_EIZKrg</a></li>\r\n<li>Healthcare Triage - <a href=\"https://www.youtube.com/channel/UCabaQPYxxKepWUsEVQMT4Kw\" class=\"uri\">https://www.youtube.com/channel/UCabaQPYxxKepWUsEVQMT4Kw</a></li>\r\n<li>How Stuff Works - <a href=\"https://www.youtube.com/channel/UCa35qyNpnlZ_u8n9qoAZbMQ\" class=\"uri\">https://www.youtube.com/channel/UCa35qyNpnlZ_u8n9qoAZbMQ</a></li>\r\n<li>Jeff Pevar - <a href=\"https://www.youtube.com/channel/UCGd3v3LEwBJOsXkN-RZgFzQ\" class=\"uri\">https://www.youtube.com/channel/UCGd3v3LEwBJOsXkN-RZgFzQ</a></li>\r\n<li><a href=\"https://www.palain.com/\" class=\"uri\">https://www.palain.com/</a></li>\r\n</ul>\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1),
(2765,'2019-03-08','My YouTube Subscriptions #3',1329,'Part three of my list of subscribed channels','<p>I am subscribed to a number of YouTube channels, and I am sharing them with you</p>\r\n<ul>\r\n<li>Jennie Breeden - <a href=\"https://www.youtube.com/channel/UCMwWHArL7o7n-So1r-T_u3w\" class=\"uri\">https://www.youtube.com/channel/UCMwWHArL7o7n-So1r-T_u3w</a></li>\r\n<li>Kate Techtonics - <a href=\"https://www.youtube.com/channel/UC4uxJvPa2nGe1ItPJsz2ORg\" class=\"uri\">https://www.youtube.com/channel/UC4uxJvPa2nGe1ItPJsz2ORg</a></li>\r\n<li>Lydian Collective - <a href=\"https://www.youtube.com/channel/UCGFAwyexOW5Vi24zvYOSc-A\" class=\"uri\">https://www.youtube.com/channel/UCGFAwyexOW5Vi24zvYOSc-A</a></li>\r\n<li>Metropole Orkest - <a href=\"https://www.youtube.com/channel/UClOuC_V57_bW5sZ5yuh2IKw\" class=\"uri\">https://www.youtube.com/channel/UClOuC_V57_bW5sZ5yuh2IKw</a></li>\r\n<li>Mike Pachelli - <a href=\"https://www.youtube.com/channel/UCHnZrxYdMc0lNk8kEZVUoTA\" class=\"uri\">https://www.youtube.com/channel/UCHnZrxYdMc0lNk8kEZVUoTA</a></li>\r\n<li>Mortons on the Move - <a href=\"https://www.youtube.com/channel/UCirNI5XV3xZZApeIe0a5-6Q\" class=\"uri\">https://www.youtube.com/channel/UCirNI5XV3xZZApeIe0a5-6Q</a></li>\r\n<li>Nixie Pixel - <a href=\"https://www.youtube.com/channel/UCBE-FO9JUOghSysV9gjTeHw\" class=\"uri\">https://www.youtube.com/channel/UCBE-FO9JUOghSysV9gjTeHw</a></li>\r\n<li>Numberphile - <a href=\"https://www.youtube.com/channel/UCoxcjq-8xIDTYp3uz647V5A\" class=\"uri\">https://www.youtube.com/channel/UCoxcjq-8xIDTYp3uz647V5A</a></li>\r\n<li>Nature Video - <a href=\"https://www.youtube.com/channel/UC7c8mE90qCtu11z47U0KErg\" class=\"uri\">https://www.youtube.com/channel/UC7c8mE90qCtu11z47U0KErg</a></li>\r\n<li>Ohio LinuxFest - <a href=\"https://www.youtube.com/channel/UCpbGjYCdBwaenhnN2OKXmRg\" class=\"uri\">https://www.youtube.com/channel/UCpbGjYCdBwaenhnN2OKXmRg</a></li>\r\n<li>Piled Higher and Deeper - <a href=\"https://www.youtube.com/channel/UCUL-pmhmDcZDwsA4cX2HO5w\" class=\"uri\">https://www.youtube.com/channel/UCUL-pmhmDcZDwsA4cX2HO5w</a></li>\r\n<li>Postmodern Jukebox - <a href=\"https://www.youtube.com/channel/UCORIeT1hk6tYBuntEXsguLg\" class=\"uri\">https://www.youtube.com/channel/UCORIeT1hk6tYBuntEXsguLg</a></li>\r\n<li>RV Geeks - <a href=\"https://www.youtube.com/channel/UC2EOriLgUuwQn-uCHl58m_Q\" class=\"uri\">https://www.youtube.com/channel/UC2EOriLgUuwQn-uCHl58m_Q</a></li>\r\n<li>RVtravel - <a href=\"https://www.youtube.com/channel/UCARpsGWj6MJ7JE78OcfWKWw\" class=\"uri\">https://www.youtube.com/channel/UCARpsGWj6MJ7JE78OcfWKWw</a></li>\r\n<li>Science News - <a href=\"https://www.youtube.com/channel/UCBX5er6E37_yWB3gCM32p3g\" class=\"uri\">https://www.youtube.com/channel/UCBX5er6E37_yWB3gCM32p3g</a></li>\r\n<li>SciShow - <a href=\"https://www.youtube.com/channel/UCZYTClx2T1of7BRZ86-8fow\" class=\"uri\">https://www.youtube.com/channel/UCZYTClx2T1of7BRZ86-8fow</a></li>\r\n<li>SciShow Space - <a href=\"https://www.youtube.com/channel/UCrMePiHCWG4Vwqv3t7W9EFg\" class=\"uri\">https://www.youtube.com/channel/UCrMePiHCWG4Vwqv3t7W9EFg</a></li>\r\n<li>Sophie Alloway - <a href=\"https://www.youtube.com/channel/UCCwcpSK-9Zbo8QDsPWdM1Bg\" class=\"uri\">https://www.youtube.com/channel/UCCwcpSK-9Zbo8QDsPWdM1Bg</a></li>\r\n<li>Ten Minute History - <a href=\"https://www.youtube.com/channel/UC22BdTgxefuvUivrjesETjg\" class=\"uri\">https://www.youtube.com/channel/UC22BdTgxefuvUivrjesETjg</a></li>\r\n<li>The Fab Faux - <a href=\"https://www.youtube.com/channel/UCsU8AeRj_497u2IMxVA6OcQ\" class=\"uri\">https://www.youtube.com/channel/UCsU8AeRj_497u2IMxVA6OcQ</a></li>\r\n<li><a href=\"https://www.palain.com/\" class=\"uri\">https://www.palain.com/</a></li>\r\n</ul>\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1),
(2775,'2019-03-22','My YouTube Subscriptions #4',1198,'Part four of my list of subscribed channels','<p>I am subscribed to a number of YouTube channels, and I am sharing them with you</p>\r\n<ul>\r\n<li>The HollyHobs - <a href=\"https://www.youtube.com/channel/UCkhSH-DB2xK4BIJZoql9djQ\" class=\"uri\">https://www.youtube.com/channel/UCkhSH-DB2xK4BIJZoql9djQ</a></li>\r\n<li>Adam Neely - <a href=\"https://www.youtube.com/channel/UCnkp4xDOwqqJD7sSM3xdUiQ\" class=\"uri\">https://www.youtube.com/channel/UCnkp4xDOwqqJD7sSM3xdUiQ</a></li>\r\n<li>Airstream of Scottsdale - <a href=\"https://www.youtube.com/channel/UChNNDq91qW6zDkUXM2IuIYQ\" class=\"uri\">https://www.youtube.com/channel/UChNNDq91qW6zDkUXM2IuIYQ</a></li>\r\n<li>Alternate History Hub - <a href=\"https://www.youtube.com/channel/UClfEht64_NrzHf8Y0slKEjw\" class=\"uri\">https://www.youtube.com/channel/UClfEht64_NrzHf8Y0slKEjw</a></li>\r\n<li>Alton Brown - <a href=\"https://www.youtube.com/channel/UCfDNi1aEljAQ17mUrfUjkvg\" class=\"uri\">https://www.youtube.com/channel/UCfDNi1aEljAQ17mUrfUjkvg</a></li>\r\n<li>Apartment Sessions - <a href=\"https://www.youtube.com/channel/UCpU_PAsVFl2fO649QF6Zj0Q\" class=\"uri\">https://www.youtube.com/channel/UCpU_PAsVFl2fO649QF6Zj0Q</a></li>\r\n<li>AStreaminLife - <a href=\"https://www.youtube.com/channel/UCtrZvxP1SQkBJ8kZLsslimw\" class=\"uri\">https://www.youtube.com/channel/UCtrZvxP1SQkBJ8kZLsslimw</a></li>\r\n<li>Big Truck Big RV - <a href=\"https://www.youtube.com/channel/UCaX2-JkluLd8aG0DXp0L2Xw\" class=\"uri\">https://www.youtube.com/channel/UCaX2-JkluLd8aG0DXp0L2Xw</a></li>\r\n<li>Bill Holbrook - <a href=\"https://www.youtube.com/channel/UChE4ujkOdzJ02k-F9ZqwpMw\" class=\"uri\">https://www.youtube.com/channel/UChE4ujkOdzJ02k-F9ZqwpMw</a></li>\r\n<li>CGP Grey - <a href=\"https://www.youtube.com/channel/UC2C_jShtL725hvbm1arSV9w\" class=\"uri\">https://www.youtube.com/channel/UC2C_jShtL725hvbm1arSV9w</a></li>\r\n<li>Crash Course - <a href=\"https://www.youtube.com/channel/UCX6b17PVsYBQ0ip5gyeme-Q\" class=\"uri\">https://www.youtube.com/channel/UCX6b17PVsYBQ0ip5gyeme-Q</a></li>\r\n<li>Deep Sky Videos - <a href=\"https://www.youtube.com/channel/UCo-3ThNQmPmQSQL_L6Lx1_w\" class=\"uri\">https://www.youtube.com/channel/UCo-3ThNQmPmQSQL_L6Lx1_w</a></li>\r\n<li>Doctor Who - <a href=\"https://www.youtube.com/channel/UCcOkA2Xmk1valTOWSyKyp4g\" class=\"uri\">https://www.youtube.com/channel/UCcOkA2Xmk1valTOWSyKyp4g</a></li>\r\n<li>Emperor Tigerstar - <a href=\"https://www.youtube.com/channel/UCUXqYwTCR6R3Wr-FkLTD4AQ\" class=\"uri\">https://www.youtube.com/channel/UCUXqYwTCR6R3Wr-FkLTD4AQ</a></li>\r\n<li>Fastway Trailer - <a href=\"https://www.youtube.com/channel/UCDKtrIOnj4IvatnpJkh2aXA\" class=\"uri\">https://www.youtube.com/channel/UCDKtrIOnj4IvatnpJkh2aXA</a></li>\r\n<li>fyfluiddynamics - <a href=\"https://www.youtube.com/channel/UCxuET3jfy0v8EJa7TKNiI2g\" class=\"uri\">https://www.youtube.com/channel/UCxuET3jfy0v8EJa7TKNiI2g</a></li>\r\n<li>Haylett RV - <a href=\"https://www.youtube.com/channel/UCRS9u1f7074u0Rrgu05K9Wg\" class=\"uri\">https://www.youtube.com/channel/UCRS9u1f7074u0Rrgu05K9Wg</a></li>\r\n<li>It’s OK To Be Smart - <a href=\"https://www.youtube.com/channel/UCH4BNI0-FOK2dMXoFtViWHw\" class=\"uri\">https://www.youtube.com/channel/UCH4BNI0-FOK2dMXoFtViWHw</a></li>\r\n<li>Less Junk, More Journey - <a href=\"https://www.youtube.com/channel/UC2IENUorXc6kRtIiAGPRKZA\" class=\"uri\">https://www.youtube.com/channel/UC2IENUorXc6kRtIiAGPRKZA</a></li>\r\n<li>Long, Long Honeymoon - <a href=\"https://www.youtube.com/channel/UCw5WYtMXQ799GErKpvR_5Rw\" class=\"uri\">https://www.youtube.com/channel/UCw5WYtMXQ799GErKpvR_5Rw</a></li>\r\n<li>Matt’s RV Reviews - <a href=\"https://www.youtube.com/channel/UCBHww2yk8soPJ9IcbZ0n_Uw\" class=\"uri\">https://www.youtube.com/channel/UCBHww2yk8soPJ9IcbZ0n_Uw</a></li>\r\n<li><a href=\"https://www.palain.com/\" class=\"uri\">https://www.palain.com/</a></li>\r\n</ul>\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1),
(2790,'2019-04-12','My YouTube Subscriptions #5',1206,'Part five of my list of subscribed channels','<p>I am subscribed to a number of YouTube channels, and I am sharing them with you</p>\r\n<ul>\r\n<li>Mental Floss - <a href=\"https://www.youtube.com/channel/UCpZ5qUqpW4hW4zdfuBxMSJA\" class=\"uri\">https://www.youtube.com/channel/UCpZ5qUqpW4hW4zdfuBxMSJA</a></li>\r\n<li>Minute Earth - <a href=\"https://www.youtube.com/channel/UCeiYXex_fwgYDonaTcSIk6w\" class=\"uri\">https://www.youtube.com/channel/UCeiYXex_fwgYDonaTcSIk6w</a></li>\r\n<li>Minute Physics - <a href=\"https://www.youtube.com/channel/UCUHW94eEFW7hkUMVaZz4eDg\" class=\"uri\">https://www.youtube.com/channel/UCUHW94eEFW7hkUMVaZz4eDg</a></li>\r\n<li>Mona Lisa Twins - <a href=\"https://www.youtube.com/channel/UCWK_fTtt5p1nBw__P_V_qBw\" class=\"uri\">https://www.youtube.com/channel/UCWK_fTtt5p1nBw__P_V_qBw</a></li>\r\n<li>Monty Python - <a href=\"https://www.youtube.com/channel/UCGm3CO6LPcN-Y7HIuyE0Rew\" class=\"uri\">https://www.youtube.com/channel/UCGm3CO6LPcN-Y7HIuyE0Rew</a></li>\r\n<li>Objectivity - <a href=\"https://www.youtube.com/channel/UCtwKon9qMt5YLVgQt1tvJKg\" class=\"uri\">https://www.youtube.com/channel/UCtwKon9qMt5YLVgQt1tvJKg</a></li>\r\n<li>OfficialGoRVing - <a href=\"https://www.youtube.com/channel/UC8nwC2SO4k6AF-E2liOiSQQ\" class=\"uri\">https://www.youtube.com/channel/UC8nwC2SO4k6AF-E2liOiSQQ</a></li>\r\n<li>PBS Eons - <a href=\"https://www.youtube.com/channel/UCzR-rom72PHN9Zg7RML9EbA\" class=\"uri\">https://www.youtube.com/channel/UCzR-rom72PHN9Zg7RML9EbA</a></li>\r\n<li>PBS SpaceTime - <a href=\"https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g\" class=\"uri\">https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g</a></li>\r\n<li>Periodic Videos - <a href=\"https://www.youtube.com/channel/UCtESv1e7ntJaLJYKIO1FoYw\" class=\"uri\">https://www.youtube.com/channel/UCtESv1e7ntJaLJYKIO1FoYw</a></li>\r\n<li>Physics Girl - <a href=\"https://www.youtube.com/channel/UC7DdEm33SyaTDtWYGO2CwdA\" class=\"uri\">https://www.youtube.com/channel/UC7DdEm33SyaTDtWYGO2CwdA</a></li>\r\n<li>Rollin’ On TV - <a href=\"https://www.youtube.com/channel/UCAfquicUYGba3nuzQ-n0tnw\" class=\"uri\">https://www.youtube.com/channel/UCAfquicUYGba3nuzQ-n0tnw</a></li>\r\n<li>RV Education 101 - <a href=\"https://www.youtube.com/channel/UCQNg-4bXbDGS61casEa5LyQ\" class=\"uri\">https://www.youtube.com/channel/UCQNg-4bXbDGS61casEa5LyQ</a></li>\r\n<li>RV to Freedom - <a href=\"https://www.youtube.com/channel/UCJxweRfyWOMcbwxpK4FnsyA\" class=\"uri\">https://www.youtube.com/channel/UCJxweRfyWOMcbwxpK4FnsyA</a></li>\r\n<li>Sciencium - <a href=\"https://www.youtube.com/channel/UCGRB1ZjIqAiaGwt-XLq9CnA\" class=\"uri\">https://www.youtube.com/channel/UCGRB1ZjIqAiaGwt-XLq9CnA</a></li>\r\n<li>SciFri - <a href=\"https://www.youtube.com/channel/UCDjGU4DP3b-eGxrsipCvoVQ\" class=\"uri\">https://www.youtube.com/channel/UCDjGU4DP3b-eGxrsipCvoVQ</a></li>\r\n<li>SciShow Psych - <a href=\"https://www.youtube.com/channel/UCUdettijNYvLAm4AixZv4RA\" class=\"uri\">https://www.youtube.com/channel/UCUdettijNYvLAm4AixZv4RA</a></li>\r\n<li><a href=\"https://www.palain.com/\" class=\"uri\">https://www.palain.com/</a></li>\r\n</ul>\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1),
(2800,'2019-04-26','My YouTube Subscriptions #6',1169,'Part six of my list of subscribed channels','<p>I am subscribed to a number of YouTube channels, and I am sharing them with you</p>\r\n<ul>\r\n<li>SgtPepper Channel - <a href=\"https://www.youtube.com/channel/UCAZZwDyOoSG32tIpMjQ-EKA\" class=\"uri\">https://www.youtube.com/channel/UCAZZwDyOoSG32tIpMjQ-EKA</a></li>\r\n<li>Sid Meier’s Civilization - <a href=\"https://www.youtube.com/channel/UCWj7XnnfbKHGVnZ8iSoETSQ\" class=\"uri\">https://www.youtube.com/channel/UCWj7XnnfbKHGVnZ8iSoETSQ</a></li>\r\n<li>Sixty Symbols - <a href=\"https://www.youtube.com/channel/UCvBqzzvUBLCs8Y7Axb-jZew\" class=\"uri\">https://www.youtube.com/channel/UCvBqzzvUBLCs8Y7Axb-jZew</a></li>\r\n<li>Smarter Every Day - <a href=\"https://www.youtube.com/channel/UC6107grRI4m0o2-emgoDnAA\" class=\"uri\">https://www.youtube.com/channel/UC6107grRI4m0o2-emgoDnAA</a></li>\r\n<li>Space Frontier Foundation - <a href=\"https://www.youtube.com/channel/UCe_aC8RselByR6B2UMnprQA\" class=\"uri\">https://www.youtube.com/channel/UCe_aC8RselByR6B2UMnprQA</a></li>\r\n<li>Streamin’ Freedom - <a href=\"https://www.youtube.com/channel/UCEl_3AAj2pA-GvkxTS7-mxg\" class=\"uri\">https://www.youtube.com/channel/UCEl_3AAj2pA-GvkxTS7-mxg</a></li>\r\n<li>Suibhne - <a href=\"https://www.youtube.com/channel/UCQD-0MjUbDBwm2UTVYr0Dag\" class=\"uri\">https://www.youtube.com/channel/UCQD-0MjUbDBwm2UTVYr0Dag</a></li>\r\n<li>Talk More Talk - <a href=\"https://www.youtube.com/channel/UC7rNO8_kPBH-caQH9vzNe8A\" class=\"uri\">https://www.youtube.com/channel/UC7rNO8_kPBH-caQH9vzNe8A</a></li>\r\n<li>The Beatles - <a href=\"https://www.youtube.com/channel/UCc4K7bAqpdBP8jh1j9XZAww\" class=\"uri\">https://www.youtube.com/channel/UCc4K7bAqpdBP8jh1j9XZAww</a></li>\r\n<li>The Economist - <a href=\"https://www.youtube.com/channel/UC0p5jTq6Xx_DosDFxVXnWaQ\" class=\"uri\">https://www.youtube.com/channel/UC0p5jTq6Xx_DosDFxVXnWaQ</a></li>\r\n<li>The Extraordinary Universe - <a href=\"https://www.youtube.com/channel/UC_2MM6tCMKWCj-AnvjIhJtw\" class=\"uri\">https://www.youtube.com/channel/UC_2MM6tCMKWCj-AnvjIhJtw</a></li>\r\n<li>The Great War - <a href=\"https://www.youtube.com/channel/UCUcyEsEjhPEDf69RRVhRh4A\" class=\"uri\">https://www.youtube.com/channel/UCUcyEsEjhPEDf69RRVhRh4A</a></li>\r\n<li>The Planetary Society - <a href=\"https://www.youtube.com/channel/UCi0TZmFfgS4oQPcRQ6-KRXg\" class=\"uri\">https://www.youtube.com/channel/UCi0TZmFfgS4oQPcRQ6-KRXg</a></li>\r\n<li>The Saxy Gamer - <a href=\"https://www.youtube.com/channel/UCJCY4j5zSuV1TFN2VQGeD0Q\" class=\"uri\">https://www.youtube.com/channel/UCJCY4j5zSuV1TFN2VQGeD0Q</a></li>\r\n<li>Totally Trailer - <a href=\"https://www.youtube.com/channel/UCuMYtpUa2kaPaG4tBlJAZOA\" class=\"uri\">https://www.youtube.com/channel/UCuMYtpUa2kaPaG4tBlJAZOA</a></li>\r\n<li>Trailer Life DIY - <a href=\"https://www.youtube.com/channel/UCMmzjxJREn4kDK-ypq9oA7w\" class=\"uri\">https://www.youtube.com/channel/UCMmzjxJREn4kDK-ypq9oA7w</a></li>\r\n<li>Veritasium - <a href=\"https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA\" class=\"uri\">https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA</a></li>\r\n<li>Vintage space - <a href=\"https://www.youtube.com/channel/UCw95T_TgbGHhTml4xZ9yIqg\" class=\"uri\">https://www.youtube.com/channel/UCw95T_TgbGHhTml4xZ9yIqg</a></li>\r\n<li>Vlogbrothers - <a href=\"https://www.youtube.com/channel/UCGaVdbSav8xWuFWTadK6loA\" class=\"uri\">https://www.youtube.com/channel/UCGaVdbSav8xWuFWTadK6loA</a></li>\r\n<li><a href=\"https://www.palain.com/\" class=\"uri\">https://www.palain.com/</a></li>\r\n</ul>\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1),
(2738,'2019-01-30','My Applications',229,'just a short show on the applications I use on my Linux Mint Box','<p>Hi again, this is Tony Hughes from Blackpool in the UK. Ken is still short of shows so here is another quick show to help out with the queue.</p>\r\n<p>This one is going to be about the applications I use on my Linux Mint 19.1 install. I’ve been using Linux for over 10 years now and during that time have never felt that there was anything that was lacking in the software department for day to day productivity and general day to day use, so this is just a list of some of the things that I, and I suspect most computer users, need to make electronic life a reality.</p>\r\n<p>So for internet browsing I use Firefox, I’ve been using this since my Windows days and it was just natural that, as this is the default web browser in Linux Mint, that this is what I would continue to use when I moved over to Linux.</p>\r\n<p>Email – I have several web based accounts which means these are operating system agnostic, but for my Internet Service provider account I use Thunderbird to download and store my e-mail onto my main desktop PC. I can also use this to access my web based accounts and store emails for these off line as well if needed.</p>\r\n<p>Office productivity is provided for with LibreOffice which is a very mature and comprehensive office suite comprising of all the main tools needed such as a word processor, spreadsheet and presentation software. It also has a Database and drawing package, and for maths geeks an advanced maths formula creating program which I have never used, but could be very useful for students and scientists.</p>\r\n<p>For audio and video playback I use VLC which again is something I first used back in my windows days, it works with all the audio and video codecs you can throw at it, and if you have the Libdvdcss codecs installed will play proprietary DVD’s.</p>\r\n<p>For recording and editing audio including this podcast I use Audacity, which is again a cross platform programme and a very powerful piece of software, as myself and many others that use it will be able to tell you</p>\r\n<p>So that is a short list of the programmes that I use on a day to day basis. I hope you found it useful, if not it doesn’t matter as Ken still got a show out of me.</p>\r\n<p>Well that’s it for this one. This is Tony Hughes signing off for now.</p>\r\n',338,0,0,'CC-BY-SA','productivity software',0,0,1),
(2740,'2019-02-01','Pop!_OS 18.10 (quick) review',438,'In this episode, Yannick does a quick review of Pop OS 18.10','<p>This episode is a re-edition of the review of Pop_OS! I did for <a href=\"https://tuxjam.otherside.network/?p=391\">TuxJam</a> back in December 2018. Pop_OS! is published by <a href=\"https://system76.com/pop\">System76</a>.</p>\r\n',370,0,0,'CC-BY-SA','linux,distro,distribution,pop_os,system76,ubuntu',0,0,1),
(2744,'2019-02-07','Yet Another Rambling Drive Into Work',2022,'Yet another rambling attempt at making a show on the way into work','<p>I came across this show sitting in my digital recorder I recorded it back in November 2017 but never posted it, my thoughts on some of the things I mention in this show have since evolved, I’ll stick these changed thoughts at the end of these notes and may also stick in an extra recorded section at the end of the show.</p>\r\n<ul>\r\n<li><p>Previous Ford Focus<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Ford_Focus#First_generation_(1998%E2%80%932004)\">https://en.wikipedia.org/wiki/Ford_Focus#First_generation_(1998%E2%80%932004)</a></p></li>\r\n<li><p>Renault 19, 16V<br />\r\nMine was not a a soft top<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Renault_19#16S\" class=\"uri\">https://en.wikipedia.org/wiki/Renault_19#16S</a><br />\r\n<img src=\"https://upload.wikimedia.org/wikipedia/commons/d/d8/Ren1916vcabph1b.jpg\" alt=\"https://upload.wikimedia.org/wikipedia/commons/d/d8/Ren1916vcabph1b.jpg\" /></p></li>\r\n<li><p>Current Ford Focus<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Ford_Focus#Second_generation_(2004%E2%80%932011)\">https://en.wikipedia.org/wiki/Ford_Focus#Second_generation_(2004%E2%80%932011)</a></p></li>\r\n<li><p>Nissan Leaf 24kw<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nissan_Leaf#2014/15_model_year\" class=\"uri\">https://en.wikipedia.org/wiki/Nissan_Leaf#2014/15_model_year</a></p></li>\r\n<li><p>Nissan Leaf 30Kw<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nissan_Leaf#2016_model_year\" class=\"uri\">https://en.wikipedia.org/wiki/Nissan_Leaf#2016_model_year</a></p></li>\r\n<li><p>Nissan leaf 40Kw<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nissan_Leaf#Second_generation_(2017%E2%80%93present)\">https://en.wikipedia.org/wiki/Nissan_Leaf#Second_generation_(2017%E2%80%93present)</a></p></li>\r\n<li><p>Kilts<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Kilt\" class=\"uri\">https://en.wikipedia.org/wiki/Kilt</a></p></li>\r\n<li><p>Bagpipes<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Bagpipes\" class=\"uri\">https://en.wikipedia.org/wiki/Bagpipes</a></p></li>\r\n<li><p>Accordion<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Accordion\" class=\"uri\">https://en.wikipedia.org/wiki/Accordion</a></p></li>\r\n<li><p>Squeeze Box<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Squeezebox\" class=\"uri\">https://en.wikipedia.org/wiki/Squeezebox</a></p></li>\r\n<li><p>Haggis<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Haggis\" class=\"uri\">https://en.wikipedia.org/wiki/Haggis</a></p></li>\r\n<li><p>Co-op<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Cooperative\" class=\"uri\">https://en.wikipedia.org/wiki/Cooperative</a></p></li>\r\n<li><p>Example of a Haggis Pizza, though not from the Co-op<br />\r\n<a href=\"https://www.sainsburys.co.uk/webapp/wcs/stores/servlet/gb/groceries/cosmo-haggis-pizza-450g?langId=44&amp;storeId=10151&amp;krypto=9555DKfWSs9%2FPZXDDPtNmunNVefFVynanbSeQICSqvaqFAqsHBIPIKiSBqw2aq4oL2g8H8Mht9FuPj%2FYvtWLegub3%2F9KqGLI16COGk2qTEwkFeo9zgw2ELE4DtGbDzzRldgf51yrZVaYL9WXmfOvDS%2FiJx9pqI12OIXlHwmPkmc%3D&amp;ddkey=https%3Agb%2Fgroceries%2Fcosmo-haggis-pizza-450g\">https://www.sainsburys.co.uk/webapp/wcs/stores/servlet/gb/groceries/cosmo-haggis-pizza-450g?langId=44&amp;storeId=10151&amp;krypto=9555DKfWSs9%2FPZXDDPtNmunNVefFVynanbSeQICSqvaqFAqsHBIPIKiSBqw2aq4oL2g8H8Mht9FuPj%2FYvtWLegub3%2F9KqGLI16COGk2qTEwkFeo9zgw2ELE4DtGbDzzRldgf51yrZVaYL9WXmfOvDS%2FiJx9pqI12OIXlHwmPkmc%3D&amp;ddkey=https%3Agb%2Fgroceries%2Fcosmo-haggis-pizza-450g</a></p></li>\r\n<li><p>Nissan Leaf Phone App to remotely control heating system<br />\r\n<a href=\"https://youplus.nissan.co.uk/GB/en/YouPlus/ConnectedServices.html\" class=\"uri\">https://youplus.nissan.co.uk/GB/en/YouPlus/ConnectedServices.html</a></p></li>\r\n<li><p>Citroen BX, Hydraulic suspension<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Citro%C3%ABn_BX\">https://en.wikipedia.org/wiki/Citro%C3%ABn_BX</a></p></li>\r\n<li><p>Reversing sensors, and camera<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Parking_sensor\" class=\"uri\">https://en.wikipedia.org/wiki/Parking_sensor</a></p></li>\r\n</ul>\r\n<p>Here are the changes since I recorded this show in November 2017, it is now October 2018.</p>\r\n<p>Think there was a £4,500 pound grant on new EV cars however it has been announced that this grant will in the near future will be cut to £3500.</p>\r\n<p>I think the Government and Nissan together had a £2000 contribution scheme when you traded in an old car for a 2nd hand leaf I think this is no longer available now that the leaf is more popular.</p>\r\n<p>Fuel costs have gone up and I may have miscalculated I think my true annual fuel bill is nearer to £2,000</p>\r\n<p>Nissan leaf road tax is free</p>\r\n<p>Because of supply and demand the depreciation situation has completely changed had I bought this leaf in November 2017 it would now be worth more today in October 2018. Only time will tell how it all pans out, things are changing rapidly.</p>\r\n<p>After further investigation it looks like battery degradation is less than I first thought and would likely still be in pretty good condition at 6 years old, particularly in a cooler country like here in the UK in Scotland.</p>\r\n<p>There has been some controversy about the new 40kw leaf which may also impact in the older leaf making the older leaf’s more appealing contributing further to the high demand for the older 30kw and 24kw leafs.<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nissan_Leaf#Criticism\" class=\"uri\">https://en.wikipedia.org/wiki/Nissan_Leaf#Criticism</a><br />\r\n<a href=\"https://www.greencarreports.com/news/1116139_2018-nissan-leaf-electric-car-is-there-a-fast-charging-problem\" class=\"uri\">https://www.greencarreports.com/news/1116139_2018-nissan-leaf-electric-car-is-there-a-fast-charging-problem</a></p>\r\n<p>With the increased popularity of the older 24 and 30Kw leafs Nissan may no longer be so keen to give you a no quibble test drive.</p>\r\n<p>I think it’s looking increasingly like I made the wrong decision.</p>\r\n',201,0,1,'CC-BY-SA','Podcast, Cars',0,0,1),
(2746,'2019-02-11','My software part 2',326,'More about the software I use regularly on Linux ','<p>Good day to all in HPR land, this is Tony Hughes coming to you from Blackpool in the UK again. This is a second instalment about some of the software I use on Linux Mint 19.1, on a regular basis. So without further ado lets get on with the show.</p>\r\n<ul>\r\n<li><p>USB Image writer</p></li>\r\n<li><p>VirtualBox – Virtualisation software to virtualise x86 and AMD64 bit PC’s</p></li>\r\n<li><p>OBS – Open Broadcast software</p></li>\r\n<li><p>Brasero/XFburn – CD/DVD writing software</p></li>\r\n<li><p>GIMP – GNU Image manipulation Program</p></li>\r\n</ul>\r\n<p>So that’s it for this episode. I’ll be back to talk about some of the utilities I use on Mint on another show. This is Tony Hughes signing off for now.</p>\r\n',338,0,0,'CC-BY-SA','Linux Mint 19.1,utilities',0,0,1),
(2747,'2019-02-12','checking oil',317,'checking your oil may not be so simple','<blockquote>\r\n<p>a 914 shows up…<br />\r\nit has a 911 engine…<br />\r\ni check the oil…<br />\r\nthe car lives…</p>\r\n</blockquote>\r\n',329,0,1,'CC-BY-SA','automotive',0,0,1),
(2748,'2019-02-13','Writing Web Game in Haskell - Special events',2645,'Tuula walks through implementation of special events in web based game','<h2 id=\"intro\">Intro</h2>\r\n<p>I was tasked to write kragii worms in the game and informed that they’re small (10cm / 4 inches) long worms that burrow in ground and are drawn to farming fields and people. They’re dangerous and might eat harvest or people.</p>\r\n<p>Special events build on top of the new system I explained in <a href=\"https://hackerpublicradio.org/eps.php?id=2733\">episode 2733</a>. They are read from same API as regular news and need same <code>ToJSON</code>, <code>FromJSON</code>, <code>ToDto</code> and <code>FromDto</code> instances as regular news (for translating them data transfer objects and then into JSON for sending to client).</p>\r\n<h2 id=\"loading\">Loading</h2>\r\n<p>Starting from the API interface, the first real difference is when JSON stored into database is turned into <code>NewsArticle</code>. Two cases, where special news have available options added to them and regular news are left unchanged. These options tell player what choices they have when dealing with the situation and evaluated every time special event is loaded, because situation might have changed since special event got stored into database and available options might have changed.</p>\r\n<pre><code>addOptions (key, article) = case article of\r\n                                Special news -&gt;\r\n                                    (key, Special $ availableOptions news)\r\n                                _ -&gt;\r\n                                    (key, article)\r\n\r\navailableOptions :: SpecialNews -&gt; SpecialNews\r\navailableOptions x =\r\n    case x of\r\n        KragiiWorms event _ choice -&gt;\r\n            KragiiWorms event (eventOptions event) choice</code></pre>\r\n<p><code>eventOptions</code> is one of the events defined in <code>SpecialEvent</code> type class that specifies two functions every special event has to have. <code>eventOptions</code> lists what options the event has currently available and <code>resolveEvent</code> resolves the event according to choice user might have made (hence <code>Maybe</code> in it).</p>\r\n<p>Type class is parametrized with three types (imaginatively named to <code>a</code>, <code>b</code> and <code>c</code>). First is data type that holds information about special event (where it’s happening and to who for example), second one is one that tells all possible choices player has and third one lists various results that might occur when resolving the event. In this example they’re <code>KragiiWormsEvent</code>, <code>KragiiWormsChoice</code> and <code>KragiiResults</code>.</p>\r\n<pre><code>data KragiiWormsEvent = KragiiWormsEvent\r\n    { kragiiWormsPlanetId   :: Key Planet\r\n    , kragiiWormsPlanetName :: Text\r\n    , kragiiWormsSystemId   :: Key StarSystem\r\n    , kragiiWormsSystemName :: Text\r\n    , kragiiWormsDate       :: Int\r\n    }\r\n\r\ndata KragiiWormsChoice =\r\n    EvadeWorms\r\n    | AttackWorms\r\n    | TameWorms\r\n\r\ndata KragiiResults =\r\n    WormsStillPresent\r\n    | WormsRemoved\r\n    | WormsTamed\r\n    | CropsDestroyed (RawResource Biological)\r\n    | FarmersInjured</code></pre>\r\n<p>Definition of the <code>SpecialEvent</code> type class is shown below. Type signature of <code>resolveEvent</code> is gnarly because it’s reading and writing database.</p>\r\n<pre><code>class SpecialEvent a b c | a -&gt; b, a -&gt; c where\r\n    eventOptions :: a -&gt; [UserOption b]\r\n    resolveEvent :: ( PersistQueryRead backend, PersistQueryWrite backend\r\n                    , MonadIO m, BaseBackend backend ~ SqlBackend ) =&gt;\r\n                    (Key News, a) -&gt; Maybe b -&gt; ReaderT backend m (Maybe EventRemoval, [c])</code></pre>\r\n<p>One more piece we need is <code>UserOption</code>. This records options in a format that is useful in the client side. Each option player has are given title and explanation that are shown on UI.</p>\r\n<pre><code>data UserOption a =\r\n    UserOption { userOptionTitle :: Text\r\n               , userOptionExplanation :: [Text]\r\n               , userOptionChoice :: a\r\n               }</code></pre>\r\n<p>Current implementation of <code>eventOptions</code> doesn’t allow database access, but I’m planning on adding that at the point where I need it. Example doesn’t show all different options, as they all have same structure. Only first option in the list is shown:</p>\r\n<pre><code>eventOptions _ = [ UserOption { userOptionTitle = &quot;Avoid the worms&quot;\r\n                              , userOptionExplanation = [ &quot;Keep using fields, while avoiding the worms and hope they&#39;ll eventually leave.&quot;\r\n                                                        , &quot;50 units of biologicals lost&quot;\r\n                                                        , &quot;25% chance of worms leaving&quot;\r\n                                                        ]\r\n                              , userOptionChoice = EvadeWorms\r\n                            }\r\n                   , ...\r\n                   ]</code></pre>\r\n<h2 id=\"making-choice\">Making choice</h2>\r\n<p><code>putApiMessageIdR</code> handles updating news with <code>HTTP PUT</code> messages. First steps is to check that caller has autenticated and retrieve id of their faction. News article that is transferred in body as JSON is parsed and checked for type. Updating regular news articles isn’t supported and is signaled with <code>HTTP 403</code> status code. One more check to perform is to check that news article being edited actually belong to the faction player is member of. If that’s not the case <code>HTTP 404</code> message is returned.</p>\r\n<p>If we got this far, news article is updated with the content sent by client (that also contains possible choice made by user). There’s no check that type of news article doesn’t change or that the option selected doesn’t change (I need to add these at later point). In the end, list of all messages is returned back to the client.</p>\r\n<pre><code>putApiMessageIdR :: Key News -&gt; Handler Value\r\nputApiMessageIdR mId = do\r\n    (_, _, fId) &lt;- apiRequireFaction\r\n    msg &lt;- requireJsonBody\r\n    let article = fromDto msg\r\n    _ &lt;- if isSpecialEvent article\r\n            then do\r\n                loadedMessages &lt;- runDB $ selectList [ NewsId ==. mId\r\n                                                     , NewsFactionId ==. fId ] [ Asc NewsDate ]\r\n                if length loadedMessages == 0\r\n                    then apiNotFound\r\n                    else runDB $ update mId [ NewsContent =. (toStrict $ encodeToLazyText article) ]\r\n            else apiForbidden &quot;unsupported article type&quot;\r\n    loadAllMessages fId</code></pre>\r\n<h2 id=\"resolving-event\">Resolving event</h2>\r\n<p>Special event occured, user made (or did not) a choice. Now it’s time to simulate what happens. Below is <code>resolveEvent</code> for kragii attack.</p>\r\n<pre><code>resolveEvent keyEventPair (Just choice) =\r\n    runWriterT . runMaybeT $\r\n        case choice of\r\n                EvadeWorms -&gt;\r\n                    chooseToAvoid keyEventPair\r\n\r\n                AttackWorms -&gt;\r\n                    chooseToAttack keyEventPair\r\n\r\n                TameWorms -&gt;\r\n                    chooseToTame keyEventPair\r\n\r\nresolveEvent keyEventPair Nothing =\r\n    runWriterT . runMaybeT $ noChoice keyEventPair</code></pre>\r\n<p><code>runWriterT</code> and <code>runMaybeT</code> are used as code being called uses monad transformers to add some extra handling. <code>WriterT</code> adds ability to record data (<code>KragiiResult</code> in this case) and <code>MaybeT</code> adds ability to stop computation early if one of the steps return <code>Nothing</code> value.</p>\r\n<p>Let’s walk through what happens when user has chosen to avoid kragii worms and keep working only part of the fields. First step is to load faction information. If faction couldn’t be found, we abort. Next amount of biological matter consumed and how much is left is calculated. Again, if calculation isn’t possible, we’ll abort. This step reaches into database and updates amount of biological matter stored by the faction (again, possibility to stop early). Final step is to check if kragii leave or not (again, chance of abort).</p>\r\n<pre><code>chooseToAvoid :: ( MonadIO m, PersistQueryWrite backend\r\n                 , BaseBackend backend ~ SqlBackend ) =&gt;\r\n                 (Key News, KragiiWormsEvent)\r\n                 -&gt; MaybeT (WriterT [KragiiResults] (ReaderT backend m)) EventRemoval\r\nchooseToAvoid (_, event) = do\r\n    faction &lt;- getFaction event\r\n    (cost, bioLeft) &lt;- calculateNewBio (RawResource 50) (entityVal faction)\r\n    _ &lt;- destroyCrops faction cost bioLeft\r\n    removeNews $ PercentileChance 25</code></pre>\r\n<p>Loading faction has several step. Id is stored in the event is used to load planet. Planet might or might have an owner faction, depending on if it has been settled. This faction id is used to load faction data. Loading might fail if corresponding record has been removed from database and planet might not be settled at the given time. Any of these cases will result <code>Nothing</code> be returned and whole event resolution being aborted. I’m starting to really like that I don’t have to write separate <code>if</code> statements to take care of these special cases.</p>\r\n<pre><code>getFaction :: ( MonadIO m, PersistStoreRead backend\r\n              , BaseBackend backend ~ SqlBackend ) =&gt;\r\n              KragiiWormsEvent\r\n              -&gt; MaybeT (WriterT [KragiiResults] (ReaderT backend m)) (Entity Faction)\r\ngetFaction event = MaybeT $ do\r\n    planet &lt;- lift $ get $ kragiiWormsPlanetId event\r\n    let owner = join $ fmap planetOwnerId planet\r\n    res &lt;- lift $ mapM getEntity owner\r\n    return $ join res</code></pre>\r\n<p>Amount of biological matter in store is stored in faction information. If it’s zero or less, <code>Nothing</code> is returned as there’s nothing to do really. In other cases, amount of biological matter left is calculated and result returned in form of <code>( cost, biological matter left )</code>. I’m carrying around the cost, as it’s later needed for reporting how much matter was removed.</p>\r\n<pre><code>calculateNewBio :: Monad m =&gt;\r\n                RawResource Biological -&gt; Faction\r\n                -&gt; MaybeT (WriterT [KragiiResults] m) ((RawResource Biological), (RawResource Biological))\r\ncalculateNewBio cost faction = MaybeT $ do\r\n    let currentBio = factionBiologicals faction\r\n    return $ if currentBio &gt; 0\r\n                then Just $ ( cost\r\n                            , RawResource $ max 0 (currentBio - unRawResource cost))\r\n                else Nothing</code></pre>\r\n<p><code>destroyCrops</code> updates database with new amount of biological matter in store for the faction and records amount of destruction in <code>CropsDestroyed</code>. <code>tell</code> requires that we have <code>Writer</code> at our disposal and makes recording information nice and easy.</p>\r\n<pre><code>destroyCrops :: ( MonadIO m, PersistQueryWrite backend, BaseBackend backend ~ SqlBackend ) =&gt;\r\n                Entity Faction -&gt; RawResource Biological\r\n                -&gt; RawResource Biological -&gt; MaybeT (WriterT [KragiiResults] (ReaderT backend m)) ()\r\ndestroyCrops faction cost bioLeft = MaybeT $ do\r\n    _ &lt;- lift $ updateWhere [ FactionId ==. entityKey faction ]\r\n                            [ FactionBiologicals =. unRawResource bioLeft ]\r\n    tell [ CropsDestroyed cost ]\r\n    return $ Just ()</code></pre>\r\n<p>Final step is to roll a percentile die against given odds and see what happens. In case of <code>Success</code>, we record that worms were removed and value of function will be <code>Just RemoveOriginalEvent</code>. If we didn’t beat the odds, <code>WormsStillPresent</code> gets recorded and value of function is <code>Just KeepOriginalEvent</code>. Return value will then be used later to mark special event handled.</p>\r\n<pre><code>removeNews :: ( PersistStoreWrite backend, MonadIO m, BaseBackend backend ~ SqlBackend ) =&gt;\r\n              PercentileChance -&gt; MaybeT (WriterT [KragiiResults] (ReaderT backend m)) EventRemoval\r\nremoveNews odds = MaybeT $ do\r\nres &lt;- liftIO $ roll odds\r\n    case res of\r\n        Success -&gt; do\r\n            _ &lt;- tell [ WormsRemoved ]\r\n            return $ Just RemoveOriginalEvent\r\n        Failure -&gt; do\r\n            _ &lt;- tell [ WormsStillPresent ]\r\n            return $ Just KeepOriginalEvent</code></pre>\r\n<p>So result of this whole matter is:</p>\r\n<pre><code>( [KragiiResults], Maybe EventRemoval )</code></pre>\r\n<p>and whole lot of database activity.</p>\r\n<h2 id=\"handling-events-during-simulation\">Handling events during simulation</h2>\r\n<p>Pieces are now in place, time to put things in motion. When handling special events for a faction, first step is to load all unhandled ones and then call <code>handleSpecialEvent</code> for each of them.</p>\r\n<pre><code>handleFactionEvents :: (BaseBackend backend ~ SqlBackend\r\n                       , PersistStoreWrite backend, PersistQueryRead backend\r\n                       , PersistQueryWrite backend, MonadIO m) =&gt;\r\n                       Time -&gt; Entity Faction -&gt; ReaderT backend m [Key News]\r\nhandleFactionEvents date faction = do\r\n    loadedMessages &lt;- selectList [ NewsFactionId ==. (entityKey faction)\r\n                                 , NewsSpecialEvent ==. UnhandledSpecialEvent ] [ Desc NewsDate ]\r\n    let specials = mapMaybe extractSpecialNews $ parseNewsEntities loadedMessages\r\n    mapM (handleSpecialEvent (entityKey faction) date) specials</code></pre>\r\n<p><code>resolveEvent</code> resolves event based on choice user maybe made (this is what we explored earlier in the episode). Depending on the result of <code>resolveEvent</code>, event gets marked to handled and dismissed. In any case, a news article spelling out what happend is created and saved.</p>\r\n<pre><code>handleSpecialEvent :: (PersistQueryWrite backend, MonadIO m\r\n                      , BaseBackend backend ~ SqlBackend) =&gt;\r\n                      Key Faction -&gt; Time -&gt; (Key News, SpecialNews) -&gt; ReaderT backend m (Key News)\r\nhandleSpecialEvent fId date (nId, (KragiiWorms event _ choice)) = do\r\n    (removal, results) &lt;- resolveEvent (nId, event) choice\r\n    _ &lt;- when (removal /= Just KeepOriginalEvent) $\r\n                    updateWhere [ NewsId ==. nId ]\r\n                                [ NewsSpecialEvent =. HandledSpecialEvent\r\n                                , NewsDismissed =. True ]\r\n    insert $ report fId date event choice results</code></pre>\r\n<p>Result article creation is abstracted by <code>ResultReport</code> type class. It has single function <code>report</code> that takes parameters: database key of the faction the event concerns of, current time, special event that was processed, choice that was made and list of records telling what happened during resolution. It will return <code>News</code> that is ready to be saved into database.</p>\r\n<pre><code>class ResultsReport a b c | a -&gt; b, a -&gt; c where\r\nreport :: Key Faction -&gt; Time -&gt; a -&gt; Maybe b -&gt; [c] -&gt; News</code></pre>\r\n<ul>\r\n<li>quite long and verbose instance</li>\r\n<li>essentially take event, choice and results and build a string explaining what actually happened</li>\r\n<li>&lt;&gt; is monoid operation for combining things, here used for text</li>\r\n</ul>\r\n<p>Instance declaration is pretty long, because there’s many different cases to account for and by definition they’re all pretty verbose. I have included it in its entirity below, as it might be interesting to glance over and see different kinds of combinations that resolution might create.</p>\r\n<pre><code>instance ResultsReport KragiiWormsEvent KragiiWormsChoice KragiiResults where\r\n    report fId date event choice results =\r\n        let\r\n            content = KragiiNews { kragiiNewsPlanetId = kragiiWormsPlanetId event\r\n                                 , kragiiNewsPlanetName = kragiiWormsPlanetName event\r\n                                 , kragiiNewsSystemId = kragiiWormsSystemId event\r\n                                 , kragiiNewsSystemName = kragiiWormsSystemName event\r\n                                 , kragiiNewsExplanation = repText\r\n                                 , kragiiNewsDate = timeCurrentTime date\r\n                                 }\r\n        in\r\n            mkNews fId date $ KragiiResolution content\r\n        where\r\n            repText = header choice &lt;&gt; &quot; &quot; &lt;&gt; removed choice (WormsRemoved `elem` results) &lt;&gt; &quot; &quot; &lt;&gt; injury &lt;&gt; &quot; &quot; &lt;&gt; destruction &lt;&gt; &quot; &quot;\r\n\r\n            header (Just EvadeWorms) = &quot;Local farmers had chosen to work on their fields, while avoiding the kragii worms.&quot;\r\n            header (Just AttackWorms) = &quot;Local farmers had decided to attack the worms with chemicals and burning.&quot;\r\n            header (Just TameWorms) = &quot;Decision to try and tame the kragii had been taken.&quot;\r\n            header Nothing = &quot;No decision what to do about worms had been taken.&quot;\r\n\r\n            removed (Just EvadeWorms) True = &quot;After some time, there has been no new kragii sightings and it seems that the threat is now over.&quot;\r\n            removed (Just AttackWorms) True = &quot;Attacks seem to have worked and there has been no new kragii sightings.&quot;\r\n            removed (Just TameWorms) True = &quot;Kragii has been tamed and put into use of improving soil quality.&quot;\r\n            removed Nothing True = &quot;Despite farmers doing nothing at all about the situation, kragii worms disappeared eventually.&quot;\r\n            removed (Just EvadeWorms) False = &quot;Kragii are still present on the planet and hamper farming operations considerability.&quot;\r\n            removed (Just AttackWorms) False = &quot;Despite the best efforts of farmers, kragii threat is still present.&quot;\r\n            removed (Just TameWorms) False = &quot;Taming of the worms was much harder than anticipated and they remain wild.&quot;\r\n            removed Nothing False = &quot;While farmers were debating best course of action, kragii reigned free and destroyed crops.&quot;\r\n\r\n            injury = if FarmersInjured `elem` results\r\n                        then &quot;Some of the personnel involved in the event were seriously injured.&quot;\r\n                        else &quot;There are no known reports of personnel injuries.&quot;\r\n\r\n            totalDestroyed = mconcat $ map (x -&gt; case x of\r\n                                                    CropsDestroyed n -&gt; n\r\n                                                    _ -&gt; mempty) results\r\n            destruction = if totalDestroyed &gt; RawResource 0\r\n                            then &quot;In the end, &quot; &lt;&gt; pack (show (unRawResource totalDestroyed)) &lt;&gt; &quot; units of harvest was destroyed.&quot;\r\n                            else &quot;Despite of all this, no harvest was destroyed.&quot;</code></pre>\r\n<p>While there are still pieces left that need a bit work or are completely missing, the overall structure is in place. While this one took quite a bit of work to get working, I’m hoping that the next special event will be a lot easier to implement. Thanks for listening the episode.</p>\r\n<p>Easiest way to catch me nowdays is either via email or on fediverse where I’m Tuula@mastodon.social</p>\r\n',364,107,0,'CC-BY-SA','haskell, yesod',0,0,1),
(2743,'2019-02-06','Character build in the d20 system',3949,'Klaatu and Lostnbronx build an RPG character in the d20 system of Starfinder','<p>Klaatu and Lostnbronx spend an hour building an RPG character at a leisurely, and hopefully informative, pace. While the build process here is technically specific to the sci-fi (or science fantasy, really) game Starfinder, the idea is to convey the generic process of stepping through a character build instruction, cross-referencing important rules, and generally learning how to build a character in an unfamiliar system.\r\n</p>',78,99,0,'CC-BY-SA','Starfinder,RPG,character,build',0,0,1),
(2749,'2019-02-14','Lostnbronx and Klaatu commentary from episode 2743',890,'Thoughts about RPG character building, modern RPG play style compared to the Old School, and more','<p>\r\nOut-takes from episode 2743. This is commentary about modern RPG play style, the character build process, Starfinder as a system, and more.\r\n</p>\r\n<p>\r\nDid you know that Lostnbronx and Klaatu have a gaming blog? We do! You should go subscribe to it at <a href=\"https://mixedsignals.ml\" target=\"_blank\">mixedsignals.ml</a></p>\r\n\r\n<p>The blog features commentary about gaming, tech, geek culture, a podcast or two, and lots more.</p>',78,0,0,'CC-BY-SA','rpg, game, gaming',0,0,1),
(2751,'2019-02-18','Battling with English - part 3',822,'Misunderstandings about English grammar, spelling, punctuation, etc.','<h1 id=\"battling-with-english---part-3\">Battling with English - part 3</h1>\n<h2 id=\"some-word-confusions\">Some word confusions</h2>\n<p>In this episode, the third of this series, I’m looking at some words that are sometimes used in the wrong places, often being confused one with another. These words are often particularly difficult to differentiate by people for whom <a href=\"https://www.englishpractice.com/common-mistakes\" title=\"English Practice - Common Mistakes\">English is not their first language</a>.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>As usual I have provided detailed notes and examples for this episode, and these can be <a href=\"hpr2751_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li>Been:\n<ul>\n<li>Oxford Dictionaries: <a href=\"https://en.oxforddictionaries.com/definition/been\">Definition of “been”</a></li>\n<li>Online Etymology Dictionary: <a href=\"https://www.etymonline.com/word/been\">“been”</a></li>\n</ul></li>\n<li>Being:\n<ul>\n<li>Oxford Dictionaries: <a href=\"https://en.oxforddictionaries.com/definition/being\">Definition of “being”</a></li>\n<li>Online Etymology Dictionary: <a href=\"https://www.etymonline.com/word/being\">“being”</a></li>\n</ul></li>\n<li>Been versus Being\n<ul>\n<li><a href=\"https://www.englishpractice.com/common-mistakes/difference-9/\">English Practice - Difference between being and been</a></li>\n</ul></li>\n<li>Examples of the use of Being:\n<ul>\n<li><a href=\"https://sentence.yourdictionary.com/being\">Example sentences using <em>being</em></a></li>\n</ul></li>\n</ul>\n<ul>\n<li>Weather:\n<ul>\n<li>Oxford Dictionaries: <a href=\"https://en.oxforddictionaries.com/definition/weather\">Definition of “weather”</a></li>\n<li>Online Etymology Dictionary: <a href=\"https://www.etymonline.com/word/weather\">“weather”</a></li>\n</ul></li>\n<li>Wether:\n<ul>\n<li>Oxford Dictionaries: <a href=\"https://en.oxforddictionaries.com/definition/wether\">Definition of “wether”</a></li>\n<li>Online Etymology Dictionary: <a href=\"https://www.etymonline.com/word/wether\">“wether”</a></li>\n</ul></li>\n<li>Whether:\n<ul>\n<li>Oxford Dictionaries: <a href=\"https://en.oxforddictionaries.com/definition/whether\">Definition of “whether”</a></li>\n<li>Online Etymology Dictionary: <a href=\"https://www.etymonline.com/word/whether\">“whether”</a></li>\n</ul></li>\n<li>Wither:\n<ul>\n<li>Oxford Dictionaries: <a href=\"https://en.oxforddictionaries.com/definition/wither\">Definition of “wither”</a></li>\n<li>Online Etymology Dictionary: <a href=\"https://www.etymonline.com/word/wither\">“wither”</a></li>\n</ul></li>\n<li>Whither:\n<ul>\n<li>Oxford Dictionaries: <a href=\"https://en.oxforddictionaries.com/definition/whither\">Definition of “whither”</a></li>\n<li>Online Etymology Dictionary: <a href=\"https://www.etymonline.com/word/whither\">“whither”</a></li>\n</ul></li>\n<li>Weather, wether, and the rest:\n<ul>\n<li><a href=\"https://grammarist.com/usage/wither-whither/\">Grammarist</a></li>\n<li><a href=\"https://www.grammar-monster.com/easily_confused/weather_whether_wether.htm\">Grammar Monster</a></li>\n</ul></li>\n</ul>\n<ul>\n<li>Previous episodes in this series:\n<ul>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2558\">Battling with English - part 1</a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2596\">Battling with English - part 2</a></li>\n</ul></li>\n</ul>\n',225,120,1,'CC-BY-SA','grammar,spelling,punctuation,word misuse,English',0,0,1),
(3857,'2023-05-16','Yesterday I saw a solar flare',668,'An account of the first time I saw a solar flare with my own eyes.','<p>A solar flare is a huge release of energy at and near the surface of the Sun in the form of electromagnetic radiation and fast particles. On 19 January 2023 at around 11:00 UTC I was lucky enough to see a solar flare with my own eyes using a <a href=\"https://www.meadeuk.com/Coronado-Personal-Solar-Telescope-PST.html\">Coronado PST Solar Telescope</a> that belongs to the <a href=\"https://theasg.org.uk/\">Astronomical Society of Glasgow</a>.</p>\n\n<p>This audio was recorded the day after I had seen it so the details remained fresh in my mind.</p>\n\n<p>A view of how the Sun appears through the Coronado PST H&alpha; telescope taken with the main camera of Samsung Galaxy S9+ phone at the eyepiece, after much trial and error! This was taken on 20 January 2023 at 13:08 UTC the day after the flare. The enormous sun spot is still visible.</p>\n<p><a href=\"https://hackerpublicradio.org/eps/hpr3857/hpr3857/20230120_111458_1.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr3857/hpr3857/20230120_111458_1_thumbnail.jpg\" title=\"The enormous sun spot is still visible on 20 January 2023 at 13:08 UTC.\" alt=\"Sunspot\" /></a></p>\n<!-- INSERT 20230120_111458_1.jpg -->\n\n<p>The X-ray flux from the Sun measured by the <a href=\"https://www.swpc.noaa.gov/products/goes-x-ray-flux\">GOES satellite(s)</a>.</p>\n<p><a href=\"https://hackerpublicradio.org/eps/hpr3857/hpr3857/goes_190123.png\"><img src=\"https://hackerpublicradio.org/eps/hpr3857/hpr3857/goes_190123_thumbnail.png\" title=\"The X-ray flux from the Sun\" alt=\"X-ray flux\" /></a></p>\n<!-- INSERT goes_190123.png -->\n\n<p>A short movie of images covering the period from 10:01 UTC to 11:21 UTC  observed by the <a href=\"https://sdo.gsfc.nasa.gov/data/\">SDO satellite\'s AIA instrument</a>.</p>\n<video controls width=\"800\">\n<source src=\"https://hackerpublicradio.org/eps/hpr3857/hpr3857/2023_01_19_10_01_17_2023_01_19_11_21_41_AIA_304-hq.mp4\" type=\"video/mp4\">\nYour browser does not support the video tag.\n</video>\n<!-- INSERT  2023_01_19_10_01_17_2023_01_19_11_21_41_AIA_304-hq.mp4 -->\n',268,0,0,'CC-BY-SA','solar,astronomy,telescopes,planes',0,0,1),
(2752,'2019-02-19','XSV for fast CSV manipulations - Part 2',1359,'Part 2 of my introduction to the XSV tool','<h1 id=\"xsv-for-fast-csv-manipulations---part-1-basic-usage\">XSV for fast CSV manipulations - Part 1: Basic Usage</h1>\r\n<blockquote>\r\n<p><a href=\"https://github.com/BurntSushi/xsv\" class=\"uri\">https://github.com/BurntSushi/xsv</a></p>\r\n</blockquote>\r\n<h2 id=\"introduction\">Introduction</h2>\r\n<p>xsv is a command line program for indexing, slicing, analyzing, splitting and joining CSV files. Commands should be simple, fast and composable:</p>\r\n<ol>\r\n<li>Simple tasks should be easy.</li>\r\n<li>Performance trade offs should be exposed in the CLI interface.</li>\r\n<li>Composition should not come at the expense of performance.</li>\r\n</ol>\r\n<p>We will be using the CSV file provided in the <a href=\"https://burntsushi.net/stuff/worldcitiespop.csv\">documentation</a>.</p>\r\n<h2 id=\"commands-covered-in-this-episode\">Commands covered in this episode</h2>\r\n<ul>\r\n<li><strong>fixedlengths</strong> - Force a CSV file to have same-length records by either padding or truncating them.</li>\r\n<li><strong>fmt</strong> - Reformat CSV data with different delimiters, record terminators or quoting rules. (Supports ASCII delimited data.)</li>\r\n<li><strong>input</strong> - Read CSV data with exotic quoting/escaping rules.</li>\r\n<li><strong>partition</strong> - Partition CSV data based on a column value.</li>\r\n<li><strong>split</strong> - Split one CSV file into many CSV files of N chunks.</li>\r\n<li><strong>sample</strong> - Randomly draw rows from CSV data using reservoir sampling (i.e., use memory proportional to the size of the sample).</li>\r\n<li><strong>cat</strong> - Concatenate CSV files by row or by column.</li>\r\n</ul>\r\n',300,0,0,'CC-BY-SA','xsv,csv,command-line,data',0,0,1),
(2759,'2019-02-28','Cleaning the Potentiometers on a Peavey Bandit 65',1244,'I disassemble and clean the pots on my Peavey Bandit 65 to fix static in the knobs.','<p>Since my daughter has been learning a bit of guitar in the last several months, I\'ve actually gotten my old electric guitar and amplifier back out again after many years in the closet. The amp is a Peavey Bandit 65, which was a an affordable solid-state workhorse kind of amp back in the mid-80s and I\'ve had it since it was new. In this episode I talk through the process of removing the brains of the amp and cleaning the potentiometers to try to get rid of some of the static that\'s happening when I turn the knobs. I also discover belatedly that the reason I was not getting any distortion when I turned the saturation up was that the amp was stuck on the clean channel — shows how long it\'s been since I used the amp, I kind of forgot how the thing works!</p>\r\n\r\n<p>Click image below to view photo gallery</p>\r\n\r\n<p><a href=\"https://www.flickr.com/photos/137675441@N05/albums/72157706214884694\" title=\"Peavey Bandit 65 Cleaning\" target=\"_blank\"><img src=\"https://hackerpublicradio.org/eps/hpr2759/hpr2759/hpr2759.jpg\" alt=\"Peavey Bandit 65 Cleaning\"></a></p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://peavey.com/\">Peavey Electronics Corporation</a></li>\r\n	<li><a href=\"https://www.fender.com/products/electric-guitars/stratocaster\">The Fender Stratocaster</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>\r\n',238,0,0,'CC-BY-SA','Guitars, electronics, amplifiers, maintenance, repair',0,0,1),
(2753,'2019-02-20','Specific Settings In Storytelling',1027,'Lostnbronx looks at why you might choose specific settings for your tales.','<p>How does setting interact with plot or character? Why would you choose one type of setting over another? And how do certain specific settings become intrinsic aspects of the story itself?</p>\r\n<p>Lostnbronx takes a breezy, mostly incoherent stab at this rather complicated topic.</p>\r\n',107,105,0,'CC-BY-SA','stories, storytelling, setting, lostnbronx',0,0,1),
(2758,'2019-02-27','Haskell - Data types and database actions',2566,'Brief summary of how to declare your own datatypes in Haskell and how to store data in database','<h2 id=\"intro\">Intro</h2>\r\n<p>I have been doing series about web programming in Haskell and realized that I might have skipped over some very basic details. Better later than never, I’ll go over some of them briefly (data types and database actions). Hopefully things will make more sense after this (like with my friend, whose last programming course was programming 101 and they said afterwards that now all that 3d and game programming is suddenly making sense).</p>\r\n<h2 id=\"data-types\">Data types</h2>\r\n<p>Data here has nothing to do with databases (yet). This is how you can declare your own data types in Haskell. They’re declared with keyword <code>data</code> followed with type name, equals sign and one or more value constructors. Type name and value constructors have to start with uppercase letter.</p>\r\n<p>Simplest type is following:</p>\r\n<pre><code>data Simple = One</code></pre>\r\n<p>This declares a type called <code>Simple</code> that has single possible value: <code>One</code>.</p>\r\n<p>More interesting type is shown below. <code>Colour</code> has three possible values: <code>Red</code>, <code>Green</code> and <code>Blue</code>.</p>\r\n<pre><code>data Colour =\r\n    Red\r\n    | Green\r\n    | Blue</code></pre>\r\n<p>It’s possible to have parameters in value constructor. Following is <code>Payment</code> type that could be used to indicate how payment was done. In case of <code>Cash</code> amount is stored. In case of <code>IOU</code> free text is recorded.</p>\r\n<pre><code>data Payment =\r\n    Cash Double\r\n    | IOU Text</code></pre>\r\n<p>Fictional usage of the <code>Payment</code> is shown below. Function <code>paymentExplanation</code> takes a <code>Payment</code> as parameter and returns <code>Text</code> describing the payment. In case of cash payment, brief explanation of how much was paid is returned. In case of IOU slip the function returns explanation stored in <code>IOU</code> value.</p>\r\n<p><code>paymentExplanation :: Payment -&gt; Text</code> part is type declaration. It states that <code>paymentExplanation</code> takes argument of type <code>Payment</code> and returns result as <code>Text</code>.</p>\r\n<pre><code>paymentExplanation :: Payment -&gt; Text\r\npaymentExplanation payment =\r\n    case payment of\r\n        Cash amount -&gt;\r\n            &quot;Cash payment of &quot; &lt;&gt; (show amount) &lt;&gt; &quot; euros&quot;\r\n        IOU explanation -&gt;\r\n            explanation</code></pre>\r\n<p>Parameters don’t have to be hard coded in the type definition. Parametrized types allows creating more general code. <code>Maybe</code> is very useful data type that is often used for data that might or might not be present. It can have two values: <code>Nothing</code> indicating that there isn’t value and <code>Just a</code> indicating that value is present.</p>\r\n<pre><code>data Maybe a =\r\n    Nothing\r\n    | Just a</code></pre>\r\n<p><code>a</code> is type parameter that is filled in when declaring type. Below is a function that takes <code>Maybe Payment</code> as a parameter and if value of <code>payment</code> parameter is <code>Just</code> returns explanation of it (reusing the function we declared earlier). In case of <code>Nothing</code> <code>&quot;No payment to handle&quot;</code> is returned.</p>\r\n<pre><code>invoice :: Maybe Payment -&gt; Text\r\ninvoice payment =\r\n    case payment of\r\n        Just x -&gt;\r\n            paymentExplanation x\r\n        Nothing -&gt;\r\n            &quot;No payment to handle&quot;</code></pre>\r\n<p>Alternatively one can omit <code>case</code> expression as shown below and write different value constructors directly as parameters. In both cases, compiler will check that programmer has covered all cases and emit a warning if that’s not the case.</p>\r\n<pre><code>invoice :: Maybe Payment -&gt; Text\r\ninvoice (Just payment) =\r\n    paymentExplanation payment\r\n\r\ninvoice Nothing =\r\n    &quot;No payment to handle&quot;</code></pre>\r\n<p>Having several parameters gets soon unwieldy, so lets introduce records. With them, fields have names that can be used when referring to them (either when creating or when accessing the data). Below is <code>Person</code> record with two fields. <code>personName</code> is of type <code>Text</code> and <code>personAge</code> of type <code>Age</code> (that we’ll define in the next step).</p>\r\n<pre><code>data Person = Person\r\n    { personName :: Text\r\n    , personAge :: Age\r\n    }</code></pre>\r\n<p>To access data in a record, just use field as a function (there’s a bug, I’m turning 40, this month (today even, to be specific, didn’t realize this until I was about to upload the episode), but forgot such a minor detail when recording the episode):</p>\r\n<pre><code>me = Person { personName = &quot;Tuukka&quot;, personAge = 37 }\r\nmyAge = personAge me\r\nmyName = personName me</code></pre>\r\n<p>New type is special type of record that can has only one field. It is often used to make sure one doesn’t mix similar data types (shoe size and age can both be Ints and thus mixed if programmer isn’t being careful). Compiler will optimize new types away during compilation, after checking that they’re being used correctly. This offers a tiny performance boost and makes sure one doesn’t accidentally mix different things that happen to look similar.</p>\r\n<pre><code>newtype Age = { getAge :: Int }</code></pre>\r\n<p>One can instruct compiler to derive some common functions for the data types. There are quite many of these, but the most common ones I’m using are <code>Show</code> (for turning data into text), <code>Read</code> (turning text into data) and <code>Eq</code> (comparing equality).</p>\r\n<pre><code>data Payment =\r\n    Cash Double\r\n    | IOU Text\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<h2 id=\"database\">Database</h2>\r\n<p>In case of Yesod and Persistent, database structure is defined in models file that usually located in config directory. It is read during compile time and used to generate data types that match the database. When the program starts up, it can check structure of the database and update it to match the models file, if migrations are turned on. While this is handy for development, I wouldn’t dare to use it for production data.</p>\r\n<p>Following definitions are lifted from the models file of the game I’m working.</p>\r\n<pre><code>StarSystem\r\n    name Text\r\n    coordX Int\r\n    coordY Int\r\n    deriving Show Read Eq</code></pre>\r\n<p>This defines a table <code>star_system</code> with columns <code>id</code>, <code>name</code>, <code>coord_x</code>, <code>coord_y</code>. All columns have <code>NOT NULL</code> constraint on them. It also defines record <code>StarSystem</code> with fields <code>starSystemName</code>, <code>starSystemCoordX</code> and <code>starSystemCoordY</code>.</p>\r\n<pre><code>Star\r\n    name Text\r\n    starSystemId StarSystemId\r\n    spectralType SpectralType\r\n    luminosityClass LuminosityClass\r\n    deriving Show Read Eq</code></pre>\r\n<p>This works in the same way and defines table <code>star</code> and record <code>Star</code>. New here is column <code>star_system_id</code> that has foreign key constraint linking it to <code>star_system</code> table. <code>Star</code> record has field <code>starStarSystemId</code> (silly name, I know, but that’s how the generated names go), which has type <code>Key StarSystem</code>.</p>\r\n<p><code>spectral_type</code> and <code>luminosity_class</code> columns in the database are textual (I think <code>VARCHAR</code>), but in the code they’re represented with <code>SpectralType</code> and <code>LuminosityClass</code> data types. In order this to work, we have to define them as normal data types and use <code>derivePersistField</code> that generates extra code needed to store them as text in database:</p>\r\n<pre><code>data SpectralType = O | B | A | F | G | K | M | L | T\r\n    deriving (Show, Read, Eq)\r\nderivePersistField &quot;SpectralType&quot;\r\n\r\ndata LuminosityClass = Iap | Ia | Iab | Ib | II | III | IV | V | VI | VII\r\n    deriving (Show, Read, Eq)\r\nderivePersistField &quot;LuminosityClass&quot;</code></pre>\r\n<p>Final piece in the example is <code>Planet</code>:</p>\r\n<pre><code>Planet\r\n    name Text\r\n    position Int\r\n    starSystemId StarSystemId\r\n    ownerId FactionId Maybe\r\n    gravity Double\r\n    SystemPosition starSystemId position\r\n    deriving Show Read Eq</code></pre>\r\n<p>This introduces two new things: <code>ownerId FactionId Maybe</code> removes <code>NOT NULL</code> constraint for this column in the database, allowing us to omit storing a value there. It also changes type of <code>planetOwnerId</code> into <code>Maybe (Key Faction)</code>. Thus, planet might or might not have an owner, but if it has, database ensures that the link between <code>planet</code> and <code>faction</code> (not shown here) is always valid.</p>\r\n<p>Second new thing is <code>SystemPosition starSystemId position</code> that creates unique index on columns <code>star_system_id</code> and <code>position</code>. Now only one planet can exists on any given position in a star system.</p>\r\n<p>Database isn’t any good, if we can’t insert any data into it. We can do that with a function shown below, that create a solar system with a single planet:</p>\r\n<pre><code>createSolarSystem = do\r\n    systemId &lt;- insert $ StarSystem &quot;Solar system&quot; 0 0\r\n    starId &lt;- insert $ Star &quot;Sol&quot; systemId G V\r\n    planetId &lt;- insert $ Planet &quot;Terra&quot; 3 systemId Nothing 1.0\r\n    return (systemId, starId, planetId)</code></pre>\r\n<p>To use the function, we have to use <code>runDB</code> function that handles the database transaction:</p>\r\n<pre><code>res &lt;- runDB createSolarSystem</code></pre>\r\n<p>There are various ways of loading data from database. For loading a list of them, <code>selectList</code> is used. Here we’re loading all planets that have gravity exactly 1.0 and ordering results by the primary key in ascending order:</p>\r\n<pre><code>planets &lt;- runDB $ selectList [ PlanetGravity ==. 1.0 ] [ Asc PlanetId ]</code></pre>\r\n<p>Loading by primary key is done with <code>get</code>. It returns <code>Maybe</code>, because data might or might be present that match the primary key. Programmer then has to account both cases when handling the result:</p>\r\n<pre><code>planet &lt;- runDB $ get planetId</code></pre>\r\n<p>Updating a specific row is done with <code>update</code> function (<code>updateWhere</code> is for multiple rows):</p>\r\n<pre><code>_ &lt;- runDB $ update planetId [ PlanetName =. &quot;Earth&quot; ]</code></pre>\r\n<p>Finally, sometimes it’s nice to be able to delete the data:</p>\r\n<pre><code>_ &lt;- runDB $ delete planetId\r\n_ &lt;- runDB $ deleteWhere [ PlanetGravity &gt;. 2 ]</code></pre>\r\n<p>While persistent is relatively easy to use after you get used to it, it lacks ability to do joins. In such cases one can use library called Esqueleto, that is more powerful and has somewhat more complex API.</p>\r\n<h2 id=\"extra\">Extra</h2>\r\n<p>Because functions are values in Haskell, nothing prevents storing them in data types:</p>\r\n<pre><code>data Handler =\r\n    Simple (Int -&gt; Boolean)\r\n    | Complex (Int -&gt; Int -&gt; Int)</code></pre>\r\n<p><code>Handler</code> type has two possible values: <code>Simple</code> has a function that turns <code>Int</code> into <code>Boolean</code> (for example <code>odd</code> used to check if given number is odd) and <code>Complex</code> that takes two values of type <code>Int</code> and returns <code>Int</code> (basic arithmetic for example, adding and subtracting).</p>\r\n<p>Hopefully this helps you to follow along as I work on the game.</p>\r\n<p>Easiest way to catch me nowadays is either via email or on fediverse where I’m Tuula@mastodon.social</p>\r\n',364,107,0,'CC-BY-SA','haskell, database',0,0,1),
(2754,'2019-02-21','Craigslist Scam Catch',460,'Helped a client avoid being scammed on Craigslist and wanted to share some tips to HPR.','<h2 id=\"introduction\">Introduction</h2>\r\n<p>Hello and welcome to Hacker Public Radio, I’m Edward Miro and for this episode I decided to record on a personal experience I had recently helping a client catch a Craigslist Scam. This will be part two in my series I’m calling “Information Security for Everyone”. As with most of the content I publish in the world of INFOSEC, my goal is to present the information in a way that a majority of people can get value from and anyone can play this for a friend, colleague or family member and make it easy for the non-hackers in our lives to understand. This particular episode shows a powerful way social-engineering can be implemented to steal money from unsuspecting victims and I will break down a few main points and red flags to look out for at the end.</p>\r\n<p>A couple weeks ago I was sitting with a client when she asked me offhandedly if I’d ever sent a Moneygram before. I told her I had and ask curiously why she wanted to know. She explained that she was very excited to be adopting a puppy from online and she needed to send $350 USD to the service that ships pets across the country. This immediately caused my hacker-sense to start tingling so I probed a bit more about the transaction.</p>\r\n<p>I asked if she had spoken to the seller on the phone, and she said she hadn’t. I said that seemed weird, but she assured me that the seller said it had to do with her religion. I wasn’t aware of any religious prohibitions to speaking on the phone that also allowed using Craigslist, but okay. I told her that that seemed a bit fishy to me. She asserted that she thought it did too at first, but she knew it was legit because she wasn’t sending the money to the seller, it was being sent to a third party pet transportation company that the seller had had contact her. She even showed the website of the company on her cell phone, which to be blunt, to my eyes looked extremely janky. I asked her if we could sit down for a few minutes and take a look at a few details before she sends anyone any money. She reluctantly agreed and really wanted this puppy.</p>\r\n<p>The first thing I asked to look at was the emails back and forth from the seller. I checked Google and all other major social media sites for the sellers name. No matches. Couldn’t Google the sellers email address due to the Craigslist email relay system. This in and of itself might be okay, we all use pseudonyms online sometimes and Craigslist is a site you might not wanna use your real name. Fine.</p>\r\n<p>She then showed me the email thread with the shipping company.</p>\r\n<p>The first strange thing I noticed from the emails was the link to the pet shipping company. The name didn’t match the URL in the link. You’d think a business would be able to get their own name right. I also saw that if you Googled the name given by the shipper, it’s extremely similar to a legitimate pet shipping company and indeed that legit company comes up as the first site found due to Google “fixing” our query. When you go to the link in the email however, the site itself was terrible to my eyes, but not to my client who is not as seasoned as I am at catching scams. I also showed her that the “company” didn’t have any social media presence. At all. No Facebook, Twitter, anything. Also the email address that was contacting her was <code>reallylongcompanyname@outlook.com</code></p>\r\n<p>She also told me she had spoken to the shippers on the phone and I asked if she still had their number. She did, but she told me she couldn’t ever get through when she called them and they’d always have to call her back. I asked for the number and called it on my phone. It was a Google Voice number! Not only that it was set to screening mode. She also told me when he did call her, he was rude and tried to get her to hurry up and send the money. I told her I was 100% confident this was a scam and I advised her to not go through with the deal.</p>\r\n<p>At this point she was extremely unhappy, but felt it was still a legitimate transaction because she had pictures sent to her of not only the puppy, but of the puppy in the shipping crate at the shipping company waiting for payment to be shipped. She explained that it’s not like it was a person trying to sell dogs or from a puppy mill. It was a lady giving it away for free and the money was for was the shipping. She just didn’t see why a scammer would go to the trouble of doing that and felt the pictures were authentic. I asked her to save all the images to her device and then showed her a site she could use to do reverse image searches. Before she did it, I asked her if she agreed that if this wasn’t a scam those pictures wouldn’t exist anywhere on the internet. She agreed and each of the pictures was found at least 9 other places online. Her heart sank and she didn’t have any further rebuttals to my concerns. She knew it was a scam and I just saved her from losing at least $350 USD. Not to mention that the scammer would have also asked for more money later for “shots” and “insurance”. Who knows how far they might have gotten.</p>\r\n<p>So here are the main red flags:</p>\r\n<ul>\r\n<li>Seller wouldn’t talk on phone</li>\r\n<li>Seller name didn’t seem legitimate</li>\r\n<li>Name of shipping company didn’t match URL in email</li>\r\n<li>Googling company name shows close match with legitimate company</li>\r\n<li>Company website very poorly designed and implemented</li>\r\n<li>Company has no social media presence</li>\r\n<li>Email address of contact at company using generic email address and not a legit domain</li>\r\n<li>Contact at company could only call her and she was never able to make inbound calls</li>\r\n<li>Phone number of company was Google Voice number</li>\r\n<li>Reverse image searches showed “proof” photos unoriginal</li>\r\n</ul>\r\n<p>A few of the tricks used by the scammers in this scam to make it more successful:</p>\r\n<ul>\r\n<li>Listed as adoption versus a sale to alleviate concern</li>\r\n<li>Handed off to “second party” to build legitimacy</li>\r\n<li>Use cute puppy pictures to appeal to emotion and overrule suspicion</li>\r\n<li>Counted on target not paying attention to detail</li>\r\n<li>Shipper established a sense of urgency</li>\r\n</ul>\r\n<p>She was very thankful and I told her to be very careful when anyone from online ever asks her to send money. I told her in all likelihood this was probably one person the whole time, hence why the person adopting out the dog “couldn’t talk on the phone”. They were also probably not even in this country as we know many of these scams aren’t. She did say that the shippers English wasn’t good. I also told her to make she shares this experience with all her friends and family. I always feel the best way to handle someone getting caught in a scam is to be on their side and never shame them. We are all susceptible to scams and social engineering and the best way to proceed is to empower them to share what they’ve learned. I also sent her a link to an article on the BBB site about these very types of scams that I’ll also link below. She was shocked how similar her experience was to the ones explained on the article.</p>\r\n<p>Well, thank you for taking the time to listen to my experience helping a client avoid getting caught in the all too common Craigslist scam. I hope this will help any non-hackers in your life and like I say in all my podcasts, I don’t claim to know all there is to know and love feedback and any opportunities to learn more or collaborate with others in the field. As with most of the research and articles I’ve written in the past, these are geared toward standard users in a business setting and are meant to be a jumping off point for further research and to be a foundation for cyber security 101 level training classes. If you like what I do, and want to have me come speak to your team, or just wanna chat, feel free to email me.</p>\r\n<p>Thank you and have a great day!</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<p><a href=\"https://www.bbb.org/article/investigations/14214-puppy-scams-how-fake-online-pet-sellers-steal-from-unsuspecting-pet-buyers-a-bbb-study\" class=\"uri\">https://www.bbb.org/article/investigations/14214-puppy-scams-how-fake-online-pet-sellers-steal-from-unsuspecting-pet-buyers-a-bbb-study</a></p>\r\n<p><a href=\"https://www.rover.com/blog/internet-dog-puppy-scams/\" class=\"uri\">https://www.rover.com/blog/internet-dog-puppy-scams/</a></p>\r\n',372,74,1,'CC-BY-SA','craigslist,scam,con,social engineering,puppy,dog,money,moneygram,infosec,cyber-security 101',0,0,1),
(2756,'2019-02-25','Bash Tips - 20',1955,'Deleting arrays; positional and special parameters in Bash','<h2 id=\"tidying-loose-ends-some-collateral-bash-tips\">Tidying loose ends <small><small>(Some collateral Bash tips)</small></small></h2>\n<h3 id=\"deleting-arrays\">Deleting arrays</h3>\n<p>I forgot to cover one thing on my list when doing the last show: I forgot to explain how to delete arrays and array elements. I’ll cover that topic in this episode.</p>\n<h3 id=\"positional-and-special-parameters\">Positional and Special parameters</h3>\n<p>I have also avoided talking much about the positional and special parameters in Bash: <code>\'$1\'</code>, <code>\'$2\'</code>, <code>\'$#\'</code> and the rest. I will cover (some of) these in this episode.</p>\n<h3 id=\"silly-titles\">Silly titles</h3>\n<p>I stopped doing the weird episode titles by episode 14 because I thought the joke was getting tired. However, I think a few people missed them (and a certain HPR colleague was found <em>vandalising my new titles as they were being posted</em> ;-), so I have added them inside the notes on the older shows and am adding one here – as a homage to silliness.</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode, and these can be <a href=\"hpr2756_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/bash/manual/bash.html\">\"<em>GNU BASH Reference Manual</em>\"</a>\n<ul>\n<li>Section <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion\">\"3.4 Shell Parameters\"</a></li>\n<li>Section <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Shell-Builtin-Commands\">\"4 Shell Builtin Commands\"</a>\n<ul>\n<li>Section <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins\">\"4.1 Bourne Shell Builtins\"</a></li>\n<li>Section <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Bash-Builtins\">\"4.2 Bash Builtin Commands\"</a></li>\n</ul></li>\n<li>Section <a href=\"https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin\">\"4.3.1 The Set Builtin\"</a></li>\n</ul></li>\n</ul>\n<ul>\n<li><p>POSIX Shell Command Language: <a href=\"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#unset\"><em>unset</em></a></p></li>\n<li><p><a href=\"https://hackerpublicradio.org/series/0042.html\">HPR series: <em>Bash Scripting</em></a></p></li>\n<li>Previous episodes under the heading <em>Bash Tips</em>:\n<ol>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 \"<em>Bash parameter manipulation</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 \"<em>Some Bash tips</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 \"<em>Some more Bash tips</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 \"<em>Some further Bash tips</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 \"<em>Some additional Bash tips</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 \"<em>Some other Bash tips</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 \"<em>Some supplementary Bash tips</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 \"<em>More supplementary Bash tips</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 \"<em>Some ancillary Bash tips - 9</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 \"<em>More ancillary Bash tips - 10</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 \"<em>Further ancillary Bash tips - 11</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 \"<em>Additional ancillary Bash tips - 12</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2679\">HPR episode 2679 \"<em>Extra ancillary Bash tips - 13</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2689\">HPR episode 2689 \"<em>Bash Tips - 14 (Some auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2699\">HPR episode 2699 \"<em>Bash Tips - 15 (More auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2709\">HPR episode 2709 \"<em>Bash Tips - 16 (Further auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2719\">HPR episode 2719 \"<em>Bash Tips - 17 (Additional auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2729\">HPR episode 2729 \"<em>Bash Tips - 18 (Extra auxiliary Bash tips)</em>\"</a></li>\n<li><a href=\"hhttp://hackerpublicradio.org/eps/hpr2739\">HPR episode 2739 \"<em>Bash Tips - 19 (Supplemental auxiliary Bash tips)</em>\"</a></li>\n</ol></li>\n</ul>\n<ul>\n<li>Resources:\n<ul>\n<li>Examples: <a href=\"hpr2756_bash20_ex1.sh\">bash20_ex1.sh</a>, <a href=\"hpr2756_bash20_ex2.sh\">bash20_ex2.sh</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,array,delete,positional parameters',0,0,1),
(2757,'2019-02-26','How to DM',2694,'Klaatu explains how to DM an RPG, and Lostnbronx demonstrates, step by step, how to build a dungeon','<h2>Klaatu</h2>\r\n<p>\r\nI\'ve gotten a lot of great feedback on the Interface Zero play-through and the episode about getting started with RPGs I did with Lostnbronx.\r\nPeople have told me that one of the biggest blockers to getting started is knowing what to do as GM.</p><p>\r\nNow, I\'ve read lots of rulebooks and GM guides, and it seems to me that most of them assume you\'ve either played an RPG before, and so you\'ve seen an example of a Game Master at play, or you\'ve seen one on Youtube or Twitch. It\'s a safe assumption, but it\'s easy to forget all of those great examples under pressure.\r\nSo in this episode, Lostnbronx and I are going to provide you with some clear and direct instructions on what exactly a GM does.\r\n</p><p>\r\nThe short version is this:</p>\r\n<ol><li><p>\r\nTell the players where they are and what they see around them.\r\n</p></li><li><p>\r\nListen to the players when they tell you what they want to do.\r\n</p></li><li><p>\r\nTell the players the outcome, based on your privileged knowledge of the game world or on a roll of the dice, of their actions.\r\n</p></li></ol>\r\n<p>\r\nYou loop over that sequence, and you\'re game mastering!\r\n</p><p>\r\nBut that makes for a short episode, and anyway, there are details about the process that we can talk about to make you feel more comfortable with the prospect of deciphering a game world with your friends.\r\n</p><p>\r\nTo that end, Lostnbronx and I have started a <a href=\"https://mixedsignals.ml\" target=\"_blank\">website dedicated to gaming</a>&#33; You should check it out, subscribe to our feed. We discuss everything game-related there, plus a little tech and all manner of topics of interest to geeks.\r\n</p>\r\n\r\n<h2>Lostnbronx</h2>\r\n<p>\r\nRight off the bat, it\'s important to understand that every GM is different. No two styles of running a game match completely, nor should they. And while there\'s no one correct way to run a game, there are plenty of ways to do it poorly. The GM wears many hats, but in my opinion, the most important job is to make sure that everyone has a good time. Your players are giving you an evening out of their lives. Next week they\'ll probably give you another. It\'s your job to make sure that time isn\'t wasted.\r\n</p><p>\r\nBy definition, games, even role-playing games, are a form of entertainment -- like reading a book, watching a movie, or enjoying the circus. When you go to that, the GM is the ringmaster, presenting the show; while the players are both the audience, and the main attraction. The GM controls the world, the people, the monsters, the history, even the weather. The GM controls everything, in fact...except for the player characters. A game master presents the situation, but it\'s the players who decide what to do with that information.\r\n</p><p>\r\nNow, this is all pretty vague, and describing RPG\'s is far less informative than playing them. Considering this is a podcast, I encourage you to go back and listen to Klaatu\'s aforementioned \"Interface Zero\" episodes. These are excellent examples of actual game play. If you\'re having a hard time imagining how RPG\'s are presented and experienced, you\'ll appreciate those shows.\r\n</p><p>\r\nNow then, almost all games are divided into genre types: sword and sorcery; space opera; spies; super-heroes; and pretty much everything else. And I mean everything! If there\'s a genre of fiction and storytelling that you enjoy, chances are there\'s a game or game setting for it somewhere. The most popular style of RPG\'s out there are fantasy. Think \"Lord of the Rings\". Think \"Harry Potter\". Think of anything, in fact, because all of it is possible.\r\n</p><p>\r\nA staple of the high fantasy genre of gaming is the dungeon. Now, that term has two meanings in this sort of game: first, the usual meaning, of what amounts to the basement of a castle, with jails, interrogation rooms, storage rooms, and more. The other meaning refers specifically to a type of adventuring environment. Both of these are usually found underground, but an adventuring dungeon may have nothing to do with any castle. It might be a lost crypt, a cave system, an abandoned gold mine, or the lair of some dreaded beast that\'s been terrorizing the countryside. In the dungeon might be enemies, monsters, and treasure protected by deadly traps. Magic abounds. There might be puzzles, dark secrets, or a kidnapped prince to rescue.\r\n</p><p>\r\nAs a new GM, you can start off any way you want, but in my experience, the best way to get used to how the game works, and how the whole process of providing an evening\'s entertainment to your friends or family works in this context, is to create a dungeon and run your players through it.\r\n</p><p>\r\nDungeons generally require set-up time; that is to say, you have to design it in advance. Now, Klaatu and I are currently working on ways to ease that burden, with the ultimate goal of eliminating the pre-work entirely. But for now, let\'s talk about the traditional way to approach all this. What follows is a step-by-step process, but understand, it\'s only one of an infinite possible number of them.\r\n</p><p>\r\nSTEP 01 -- CREATE THE COUNTRYSIDE\r\nSome GM\'s say creating the world is the first step. Some say creating the godly pantheons of the world is the first. Some say it\'s the history, or the fantasy races. They\'re not wrong, but trust me, when you\'re just starting out, none of that stuff matters. In this example, you\'ll be running the players through a dungeon. That dungeon is out in the country, within the middle of a large forest.\r\n</p><p>\r\nNow, it will make the beginning and end of the adventure easier if you have a small village nearby where the player characters all live. We\'ll call it Forestdale for the lack of anything better. In Forestdale, there\'s an inn or tavern. This is where people get together, tell tall tales, and become inspired to go adventuring, so let\'s give it a name as well: \"The Prancing Unicorn\". That\'s home base. Every player character knows this place, and everyone in it knows them.\r\n</p><p>\r\nOne of the stories being swapped at \"The Unicorn\" lately is about a tribe of dangerous creatures living in an underground lair somewhere within the forest. They are led by an evil wizard, or so the tales go. They have been attacking farmers and merchants who travel through the roads and foot paths of the woods in order to sell their goods in Forestdale. One of the merchants says he saw them travel down the Western path near the Old Bridge. Something must be done, but who would be brave or foolhardy enough to even try?\r\n</p><p>\r\nAnd that\'s all you need to create for the world right now. Remember, this stuff is new; no one needs large amounts of detail just yet, least of all you. You\'ll have enough to juggle.\r\n</p><p>\r\n\r\n\r\nSTEP 02 -- CREATE THE DUNGEON FLOOR PLAN\r\nOne of the rumors to be heard at \"The Prancing Unicorn\" is that there\'s an underground cave system or labyrinth somewhere in the forest. Some say it\'s a myth, others say their cousin\'s uncle\'s sister\'s best friend came across it once. Either way, its existence is shrouded in mystery, and people are said to go in, but not always come out.\r\n</p><p>\r\nThis is your first dungeon. You don\'t want to do more work than you need to. Let\'s make this dungeon a single level. Later, you can add a secret panel somewhere that can reveal a set of stairs down to a second level (and from there, a third, fourth, tenth, or more). Right now, it\'s one level, hidden below the forest. It\'s dark, it\'s dangerous. It\'s plenty.\r\n</p><p>\r\nPutting a dungeon together can be difficult, but it doesn\'t have to be. The traditional way to create one of these is to use graph or hex paper and draw out the floor map. Each square of the graph paper is equal to ten feet, or, say, three meters. You make note of all rooms, caves, doors, hallways, stairs up or down, floor traps, hidden doors, and anything else you want in there. Be sure to put a set of stone stairs that lead from the forest above, down to this dank and gloomy dungeon.\r\n</p><p>\r\nThere are no standard symbols for the different things on the map, despite what anyone might tell you, but for now, let\'s turn the paper landscape style, and at the top of the page, now held that way, outline one square of the graph paper with a pencil. Inside the square, draw three or four small lines at an angle. This will represent a set of stairs. Next to the stairs, write the letter \"U\". This is the way to get to the forest above. Granted, it\'s how the player characters will come down here to begin with, but once they are here, they have to go up to leave, hence the \"U\". If that\'s confusing, you can write, \"To The Forest Above\", next to this square, maybe with a little arrow. You can write anything you want, but this is how the player characters will get in and out of your dungeon.\r\n</p>\r\n<img src=\"https://mixedsignals.ml/games/blog/user/pages/_img/01-stairs-down-600x337.jpg\" />\r\n<p>\r\nWe\'re going to draw the floor plan from the top of the page down. The entire dungeon map will be on this one side of the paper. In the corner, draw an arrow pointing up, and put a letter \"N\" there. That\'s North. We\'ll be using compass directions from now on. Granted that when underground, it\'s hard to get your bearings without a compass, but for this first dungeon, we won\'t worry about that. North, South, East, West. It makes life easy.\r\n</p><p>\r\nOn the bottom of the page, to the South, draw a box in the middle of the page that\'s ten by ten squares in size. This is where the dungeon tunnels all will be leading, and where we\'ll have the biggest fight of the adventure. We\'re setting that up now, so we always know where we\'re heading. Now go back to the stairs at the top of the page.\r\n</p><p>\r\nDraw a long line from the lower edge of the stairs going West. Stop the line a square or two from the edge of the paper. Now do the same thing going East. Next, move down one square, and draw another line parallel to both of these, going entirely from one side of the page to the other, East to West. You\'ve just created a place for the players to explore, so imagine it for a moment: they come down some broken, forgotten stairs. Let\'s say they travel at least a hundred feet down, tripping over tree roots and walking through cobwebs, until the stairs deposit them in the middle of a dark tunnel, ten feet wide. It stretches to either side, running East and West out of sight (you know that it goes hundreds of feet in both directions, but you\'ll let them discover that for themselves). They listen, and can hear nothing but the scurrying of unseen vermin. At least, they hope that\'s what it is. Not a bad start.\r\n</p>\r\n<img src=\"https://mixedsignals.ml/games/blog/user/pages/_img/02-first-tunnel-600x337.jpg\" />\r\n<p>\r\nAlong this hallway, you\'ll draw little rectangles, like black bars, on random squares along the Southern side of the tunnel. Not too many, just a few here and there, with generous space in between. These are heavy wooden doors. Some may be locked. That\'s your choice. If they are, put a little symbol near them. It could be as simple as the letter \"L\", so let\'s go with that. Now you know where the all doors are in this particular tunnel, and you know which of them will be a challenge for the player characters to open.\r\n</p><p>\r\nThis is just the first tunnel of a larger complex. This complex can be as big or as small as you\'d like. Let\'s say it\'s moderately sized. Before we draw more tunnels, let\'s draw the rooms behind those doors. This will tell us how much map space we\'ll have for further tunnels. Some GM\'s like to draw all the tunnels first, and then fit in the rooms. You can do it however way you want later on; right now, let\'s just use this method. Pick a door. Draw a box behind it, three or four squares in size. That\'s the room. Do the same behind the other doors. Make the rooms different shapes and sizes, but not too big. Let the big room at the bottom be the star. When you\'re done, you have a huge tunnel, with several mysterious doors, behind which are some good-sized rooms.\r\n</p><p>\r\nOn the part of the tunnel that ends on the West side, draw a connecting tunnel South for five squares, and then turn the direction back to the East. Draw this tunnel going that way for ten squares. Put a door or two along here, and draw some rooms for them. Turn the tunnel South again, and go five or six squares, and turn it East again for four squares. Draw a door and room. Maybe it\'s locked, maybe not. Continue with this meandering, jagged floor plan, wandering East and then West, but always moving South. Add occasional doors and rooms as you go, until your tunnel finally ends on the Western side of the large ten by ten square room at the bottom of the page. Draw a door to get in there.\r\n</p>\r\n<img src=\"https://mixedsignals.ml/games/blog/user/pages/_img/03-west-side-600x337.jpg\" />\r\n<p>\r\nNow go back up to the long tunnel at the top, and repeat this whole process on the Eastern side, eventually bringing that part of the tunnel to the Eastern edge of the big room at the bottom. Put a door there.\r\n</p>\r\n<img src=\"https://mixedsignals.ml/games/blog/user/pages/_img/04-east-side-600x337.jpg\" />\r\n<p>\r\nNow, number your rooms on the map, starting at at the top, and working your way down, until you\'ve marked each one. Room numbers are essential, because you\'ll be keeping track of each one.\r\n</p>\r\n<img src=\"https://mixedsignals.ml/games/blog/user/pages/_img/05-numbered-rooms-600x337.jpg\" />\r\n<p>\r\nThe floor plan to your first dungeon is complete. Now you need to put interesting things in it.\r\n</p><p>\r\n\r\nSTEP 03 -- POPULATE YOUR DUNGEON\r\nOkay, on a separate piece of paper, list the rooms of your dungeon. Start at #1, and go down. Beside the room number, you put in a brief description, along with any monsters, treasure, or other points of interest. You\'ll be consulting this list throughout the game, so write down everything you need to know, in order to minimize the amount of time you\'ll inevitably have your nose in the rulebook while playing. Monster statistics, including their weapons, and and the damage they do, should all be on this list, though there are ways to simplify the process, once of which I\'ll go into in a moment.\r\n</p>\r\n<img src=\"https://mixedsignals.ml/games/blog/user/pages/_img/06-room-list-pg1-pg2-600x533.jpg\" />\r\n<p>\r\nWhen putting creatures and things into your dungeon, the first thing to remember is to not overload it. Each room does not need a monster. Not every room needs treasure. It might be helpful to think in terms of what you\'d like to see in the dungeon as a whole. Remember the stories of evil creatures, and possibly a wizard, which you heard at \"The Dancing Unicorn\"? We\'ll use that as our springboard. This is a starting dungeon, not just for you, but also for the player characters. Starting dungeons mean low-level monsters, so let\'s go with goblins.\r\n</p><p>\r\nGoblins are generally quite impressed with magic, so we\'re going to assume a wizard of dubious character has bullied a small tribe of them into being his thugs. They\'ve been waylaying passing merchants and farmers, stealing their wares, and carrying off food (along with the occasional peasant worker, as goblins love the taste of human flesh). Stupid, but dreadful creatures, they have displayed a level of tactical organization that\'s not normal for them. This, of course, is because the wizard\'s in charge. Look up the statistics for goblins, and understand what they\'re like. For this adventure, we\'re not going to worry about goblin captains, or goblin chiefs, both of which are tougher than your average goblin. No, all the creatures for this adventure have the same statistics. Don\'t drive yourself crazy writing them down, over and over. Write them once at the bottom of the room description page, and every time the player characters run into a goblin, consult them.\r\n</p><p>\r\nLet\'s say there are a total of fifteen goblins in this dungeon. They won\'t all be together; the player characters will encounter a few of them here and there, in various rooms, or maybe ust wandering the tunnels. The rooms themselves will have the spoils of all their raids, including barrels of wine, hams and sides of beef; furs, and a few copper, silver, and gold coins. If there\'s wine in one of the rooms, maybe the goblins there are drunk, fighting at a penalty to hit and damage. And remember, not all rooms need things in them. Maybe this was once a temple, and there\'s just broken furniture, and rotting religious robes in some of the rooms. In one, there might also be a tapestry against the wall, depicting a miracle of whatever god this place was once dedicated to. What you might not tell the player characters up front is that the tapestry could fetch a fair amount of gold coins in the market back in Forestdale. Too big to carry while exploring the dungeon, such a thing could always be rolled up and fetched on their way out. Not all treasure is found in wooden chests.\r\n</p><p>\r\nThen again, a lot of it is, so why not put one in the big room to the South? Of course, you have to defeat the evil wizard and his goblin cohorts, wh are hanging out in there. As a rule of thumb, you might want to sprinkle half the goblins throughout the dungeon, leaving the other half here, for the final fight. Stealth matters. Approaching the big room noisily, and kicking open one of the doors, is not stealthy. The player characters might be able to catch the wizard and his minions off-guard, if they move quietly.\r\n</p><p>\r\nIn order to be a credible threat to the player characters, this wizard should be of a slightly higher level, say 2nd or 3rd. He\'ll have some aggressive spells, and he\'ll have his goblins handy. You\'ll roll up the wizard the same way the players rolled up their characters, only you\'ll make him more experienced, and with more spells at his command. Maybe he even has a magic item of some sort. Should the players defeat this guy, this magic item will be part of the treasure; until then, it\'s something the wizard will use against them. Don\'t make it too tough. Maybe don\'t make it tough at all: a +1 Ring of Protection, maybe. Or perhaps, a +1 dagger. That might not sound like much, but it\'s more than the player character\'s have when they start.\r\n</p><p>\r\nNot enough excitement, maybe? Just add in a couple of giant rats in one of the rooms. Maybe some large spiders in another. Don\'t forget to put their statistics down in the room description. Judging how tough or easy a dungeon needs to be comes with experience. My suggestion is to err on the side of toughness, to put more challenges in there than maybe you feel comfortable with. If the player characters are looking depleted and injured, you can say the room is empty, instead of filled with spiders. Also, it doesn\'t hurt at all to remind the players now and then that it\'s okay to retreat. They can always come back another day when they\'re rested, and have made plans based on the knowledge they gained the first time around. It sets up a grudge match...the heroes vs. the evil wizard and his goblin hoard. You, as the GM, just repopulate the goblins, move them around a bit, so they\'re not all in the same rooms as before (though the big room should still be for the final fight), and //voila//! You\'ve just provided your players with two night\'s worth of entertainment, for the effort of only one.\r\n</p><p>\r\nAnd there you have it: a stocked dungeon that dovetails into the local lore of the countryside, ready for your players to explore.\r\n</p><p>\r\n\r\n\r\nSTEP 04 -- ROLLING UP CHARACTERS\r\nSome GM\'s will want a whole night just for this process. Others will just have the players arrive at the game with their characters ready to go, especially if they are experienced with the game. I won\'t go over the character creation process here, because each game is different, and some are VERY different. I mention this now, though, because the players need characters, and creating them comes before the adventure starts. If the game is as new to them as it is to you, take that whole night to help them create their characters. It\'s fun all on its own, and it allow\'s everyone to be familiar with the other characters -- something vital to party survival.\r\n</p><p>\r\nI\'m not going to go into detail about the process of rolling up characters, because, like you, Klaatu and I have dedicated an evening just to this process. In a previous episode in this mini-series, the two of us created a character from the ground up, so you can hear what\'s involved, and how you might want to approach the process with your own players.\r\n</p>\r\n<h2>Klaatu</h2>\r\n<p>\r\nIf designing your own custom dungeon seems intimidating to you, there is another way. And it\'s a time-honoured, legitimate way to play, and it\'s quite often the way I play: you go find an adventure that someone else has already written.\r\n</p><p>\r\nAn adventure is the scenario you and your players experience when you sit down at the table to play. It\'s arguably the *game* (the rulebooks are the game engine, or the mechanics). Wizards of the Coast, Paizo, Catalyst, Kobold Press, Frog God, and many others publish adventures (sometimes called \"modules\", \"scenarios\", or \"adventure paths\") written by professional game designers. Published adventures provide the story framework for your game.\r\n</p><p>\r\nNot all systems publish adventures, though, or you may choose not to use one. If that\'s the case, spend some time developing a story. Writing a good game is part science, part craft, and part magic, but if you and your players are up to the challenge, then running blindly through a story that\'s mostly being created spontaneously on the spot can be a lot of fun. If that sounds overwhelming, though, get a published adventure!\r\n</p><p>\r\nQuick tip: Free, small, or introductory adventures are often available from https://drivethrurpg.com, https://dmsguild.com, and https://www.opengamingstore.com\r\n</p><p>\r\nMany adventures have text blocks that provide you with introductory text for each part of the game, they explain clearly what the goal of the players is during that segment, and give you guidance on what players will find in the area and how those discoveries lead to the next plot point.\r\n</p><p>\r\nBroadly speaking, there are two types of published adventures: there are \"one-shots\" and there are \"modules\" or \"adventure paths\".\r\n</p><p>\r\nA one-shot adventure is analogous to a quest in a video game: it\'s a single, clearly-defined task with a very obvious and immediate result; for example, goblins are terrorizing the hapless citizens of the local village, so go to their cave and clear it out: if you do, you\'ll relieve the villagers of the horrors, and you get to keep any gold or weapons you find.\r\n</p><p>\r\nThe advantage is that it\'s designed to be a quick, one-time game session, so it\'s perfect for playing with friends you only see once in a while, or with someone who\'s never played before and just isn\'t sure if it\'s something they want to commit to. Don\'t be fooled by the page count of these small adventures: it may only be 5 to 10 pages long, sometimes less, but you\'ll be surprised at how long players can spend exploring a boundless world existing only in their imagination.\r\n</p><p>\r\nAdventure paths or modules or campaigns are bigger stories with\r\nloftier goals. You can think of them as lots of little one-shots\r\nstrung together so that once players accomplish all the tasks and\r\nsolve all the mysteries over the course of 200 pages, they have a\r\nfinal showdown with some Big Bad, and win themselves a place in the\r\nlegends of the game world. It\'s an epic poem instead of a short\r\nstory. It feels grander, it feels important. The losses along the way\r\nare more profound, and the victories sweeter. These campaigns take\r\nmonths to play through and usually expect a gaming group to meet\r\nweekly or fortnightly or at least monthtly to work their way through\r\nthe tale.\r\n</p><p>\r\nI should mention one more kind of book you might stumble across, and\r\nthose are source books. I mention this because I\'ve had friends go and\r\nbuy books more or less blindly, and then they bring them back home\r\ndisappointed that instead of a book of lore about dark elves, they\r\nbought an adventure set in the underdark. Or the other way round: they\r\nwanted an adventure and ended up with a rule book.\r\n</p><p>\r\nThis happens with the bigger systems that produce a lot of media, like\r\n{D&amp;D, Shadowrun, Pathfinder, Warhammer}, so get clarity on what you\'re\r\nbuying before you make a purchase. If you come across a cool ShadowRun\r\nbook called RUN FASTER expecting a campaign to run with your friends,\r\nyou\'ll be surprised to find that you\'ve purchased a source book full\r\nof metatypes, expanded rules, and alternate character creation\r\nmethods: sort of a Shadowrun Core Rulebook part 2. Same goes for, say,\r\nVolo\'s Guide with D&amp;D, or Ultimate Campaign in Pathfinder. It can be\r\noverwhelming and they\'re not aways labelled clearly (or if they are,\r\nthe label gets lost in the word cloud of RPG jargon that you\'re not\r\nused to yet), so do a little research first.\r\n</p><p>\r\nI\'ve played through dungeons that a GM created over his lunch break, and I\'ve played through adventures written by clever game designers, and I can confidently say that they\'re both great ways to RPG. But as a GM, if you feel overwhelmed by the idea of designing a dungeon, a published adventure is a great way to start. Aside from reading a chapter ahead before each game night, all the prep work is done for you, and there\'s very little thinking required.\r\n</p><p>\r\nAnother part of being GM is deciding when a die roll is necessary. Die rolls represent the chance of success or failure when a specific action is taken, but the confusing thing is: if you think hard enough about anything in the world you can find a chance of success or failure. As a GM, it\'s up to you to decide what\'s \"important\" enough for a roll. Strictly speaking, that\'s determined by the rules. The rules told you what requires a roll, and you\'re expected to know the rules well enough to make the call.\r\n</p><p>\r\nIn practise, however, you have a lot of stuff to track in you head, and remembering what requires a die roll, or deciding to request a die roll even though it may not be strictly required, can feel overwhelming for a new GM.\r\n</p><p>\r\nGood news: Players intuitively know when to roll dice. A player knows their character\'s skills (because they built the character and wrote it down on their character sheet), so sometimes the actions they choose to take are chosen because it falls within a category of a skill they happen to have. A thief probably wouldn\'t ever think to *look* for hidden door if the thief were a fighter (who would more likely think to pound on the wall rather than to slyly look for a hidden door). So if your player reaches for dice, let them roll because they\'re probably right.\r\n</p><p>\r\nI\'m sure it\'s possible to take it too far, but people like to roll dice. It\'s part of the fun of an RPG, the uncertainty of subjecting yourself to the whims of fate. So when in doubt, either make your players roll dice, or roll dice yourself. I use dice rolls to help me decide everything from NPC reactions to weather conditions. It\'s usually safe to default to rolling.\r\n</p><p>\r\nWorst case scenario is that die are only picked up for fights and a literal interpretation of skills: and that works because those are the rules as written.\r\n</p><h2>Klaatu</h2>\r\n<p>\r\nPlayers drive the story. In video game or movie terminology, they control the \"camera\". When players are exploring or investigating, let them ask questions or take actions (\"I look in the closet\"), and answer them as you see fit (\"You open the closest and see an array of fine garments.\")\r\n</p><p>\r\n\"I\'ll move the clothes aside and examine the walls, and the floor. I\'m looking for trap doors or hidden compartments, or anything suspicious.\"\r\n</p><p>\r\nAnd so on. Players can choose to investigate and explore for as much as they want. That\'s the beauty of a pen-and-paper RPG: the world is infinite. That said, you\'re the GM and you owe it to your players to keep the game moving. You don\'t to let your players spend 3 real hours searching a room that, in the end, has no bearing upon the plot whatsoever.    That can be a delicate matter, because the nature of the game means that you know things that the other players don\'t, meaning much of the puzzle for players is what they don\'t know.\r\n</p><p>\r\nUsually I let players explore a space on their own until I feel that they\'ve explored the obvious parts of it, and then I remind them where the exits are, or I remind them how many other rooms there are to explore, or some subtle clue to say, without saying, that they\'ve secured an area.\r\n</p><p>\r\nIf players are especially suspicious of something, though, you certainly have the power to generate a subplot, and often times you should do that. It\'s fun for you and rewarding to players. For instance, if a player is convinced that there\'s a secret panel in a closet and spends a lot of time investigating, then you might decide that there IS a secret panel in the closet, and then roll on a random table to determine what could possible inside that compartment. Or you could leave the compartment empty, thereby creating a story hook to return to later...what used to be in that compartment? who took it, and why? What were the implications?\r\n</p><p>\r\nKeeping the gaming moving is an inexact, unscientific process, but usually it comes pretty naturally. When you start to get bored of the players exploring, you can bet that they\'re probably getting bored too, and that\'s when you know to urge them forward. If all else fails, you can always have something lure them from one space to another: a mysterious sound, an oncoming threat, or a supernatural or divine instinct.\r\n</p>\r\n',78,95,0,'CC-BY-SA','rpg,dm,gm,game master,dungeon master,dnd',0,0,1),
