(2927,'2019-10-22','Stardrifter RPG Playtest Part 09',1584,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 9 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>In this part, the characters agree to join someone else’s treasure hunt, with the success (or failure) of their own mission in the balance!</p>\r\n<p>Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2893,'2019-09-04','Whats in the box! Part 2',727,'NYbill finishes a guitar pedal kit Timttmy sent him. ','<p>In this short follow up episode NYbill troubleshoots the Tremlo guitar kit Timttmy sent him.</p>\r\n<p>Here is a hint, there were two problems, not just one.</p>\r\n<p>Pics for the episode:</p>\r\n<p><a href=\"https://media.gunmonkeynet.net/u/nybill/collection/whats-in-the-box-part-2/\" class=\"uri\">https://media.gunmonkeynet.net/u/nybill/collection/whats-in-the-box-part-2/</a></p>\r\n',235,103,0,'CC-BY-SA','guitar, pedal, tremlo, kit, DIY, soldering',0,0,1),
(2932,'2019-10-29','Stardrifter RPG Playtest Part 10',3255,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 10 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>It’s not unusual for a game master to have two sets of maps for an adventure: one is for the players, which only has the sort of information on it that their characters might reasonably have access to; the other is NOT for the players, as it shows all the special information they shouldn’t know about (at least, not all at once). This is where you’d make note of secret doors, hidden objects or enemies, and/or, as in the case of this playtest, the physical condition of the ship as it stands at the moment.</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2932/hpr2932/Player-Cargo-Ship-2000x2624.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2932/hpr2932/Player-Cargo-Ship-666x874.jpg\" alt=\"Player Map\" width=\"666\" height=\"874\" /></a><br />\r\nPlayer Map</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2932/hpr2932/GM-Cargo-Ship-2000x2786.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2932/hpr2932/GM-Cargo-Ship-627x874.jpg\" alt=\"Game Master Map\" width=\"627\" height=\"874\" /></a><br />\r\nGame Master Map</p>\r\n<p>Additionally, here’s a zip file containing the adventure, the maps, the floor plan descriptions, some miscellaneous non-player characters, and the Stardrifter RPG rules in EPUB format. Again, these are no longer the LATEST version of the rules, but they are what we used for these episodes.</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2932/hpr2932/Stardrifter-RPG-Playtest_Squatters-Rights.zip\">Stardrifter-RPG-Playtest_Squatters-Rights.zip</a></p>\r\n<p>In this final part of the mini-series, the players provide their hard-working game designer with some valuable feedback, observations, and general opinions!</p>\r\n<p>Special thanks to my playtesters in this episode: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2896,'2019-09-09','Orange PI Zero LTS version',737,'A general overview of the Orange PI Zero LTS','<ul>\r\n<li><p>A general overview of the Orange PI Zero LTS version<br />\r\n<a href=\"https://www.orangepi.org/orangepizerolts/\" class=\"uri\">https://www.orangepi.org/orangepizerolts/</a><br />\r\n<a href=\"https://www.geeky-gadgets.com/raspberry-pi-alternative-12-08-2019/\" class=\"uri\">https://www.geeky-gadgets.com/raspberry-pi-alternative-12-08-2019/</a></p></li>\r\n<li><p>This is the one I really liked<br />\r\n<a href=\"https://www.cnx-software.com/2019/07/31/buy-orange-pi-zero-lts-sbc/\" class=\"uri\">https://www.cnx-software.com/2019/07/31/buy-orange-pi-zero-lts-sbc/</a></p></li>\r\n<li><p>This is were the software is<br />\r\n<a href=\"https://www.armbian.org\" class=\"uri\">https://www.armbian.org</a></p></li>\r\n</ul>\r\n',129,0,0,'CC-BY-SA','Raspberry PI, OrangePI, Armbian, Hobby Computing, VNC',0,0,1),
(2901,'2019-09-16','Describing how I listen to podcasts PART 3',835,'In this episode I cover the 1st add-on board I purchased for one of my raspberry pi\'s','<p>In this series I cover how I listen to podcasts and how the process has changed over the years. In this episode I cover the 1st add-on board I purchased for one of my raspberry pi’s I then go on to explain what I do with it.</p>\r\n<ul>\r\n<li><p>Raspberry pi<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Raspberry_Pi\" class=\"uri\">https://en.wikipedia.org/wiki/Raspberry_Pi</a></p></li>\r\n<li><p>Piface Digital IO, pictures and links<br />\r\n<a href=\"https://www.piface.org.uk/products/piface_digital/\" class=\"uri\">https://www.piface.org.uk/products/piface_digital/</a><br />\r\n<a href=\"https://www.piface.org.uk/products/piface_digital_2/\" class=\"uri\">https://www.piface.org.uk/products/piface_digital_2/</a><br />\r\nSoftware Documentation <a href=\"https://piface.github.io/pifacedigitalio/\" class=\"uri\">https://piface.github.io/pifacedigitalio/</a></p></li>\r\n<li>Command used to install the software &amp; libraries to use the Piface Digital IO board, command from companies website:</li>\r\n</ul>\r\n<pre><code>    sudo apt-get install python{,3}-pifacedigitalio</code></pre>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2901/hpr2901/Picture-01.JPG\" alt=\"Picture 1\" /><br />\r\nPicture 1, shows the Piface Digital IO board installed on top of my raspberry pi</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2901/hpr2901/Picture-02.JPG\" alt=\"Picture 2\" /><br />\r\nPicture 2, shows the extension board I built. The extension board increases the number of available LED’s and switches. The board is attached via a ribbon cable with the ends of the wire inserted into the green and orange screw down chocolate blocks attached to the Piface Digital IO board.</p>\r\n<ul>\r\n<li><p>Command to toggle between play and pause in moc is<br />\r\n<code>mocp -G</code> or <code>mocp –toggle-pause</code><br />\r\nmoc man page <a href=\"https://www.mankier.com/1/mocp\" class=\"uri\">https://www.mankier.com/1/mocp</a><br />\r\nmoc homepage <a href=\"https://moc.daper.net/\" class=\"uri\">https://moc.daper.net/</a></p></li>\r\n<li><p>Uptime man page <a href=\"https://linux.die.net/man/1/uptime\" class=\"uri\">https://linux.die.net/man/1/uptime</a></p></li>\r\n</ul>\r\n<h3 id=\"explanation-of-how-to-read-a-binary-display\">Explanation of how to read a binary display</h3>\r\n<p>The board I built which attaches to the Piface Digital board has a total of 8 LED’s. I use the 8 LED’s to display a number in binary format. In binary each LED has only two values either on or off, with 1 LED you can count to 1 with two LED’s you can count to 3. This may seem confusing if you’ve never dealt with binary before. Starting from the right each subsequent LED represents double the value of the previous one so the 1st LED has a value of 1 the 2nd LED has a value of 2, the third LED has a value of 4 and so on. See below</p>\r\n<pre><code>LED Number   8   7   6   5  4  3  2  1\r\nLED VALUES 128, 64, 32, 16, 8, 4, 2, 1</code></pre>\r\n<p>LED on represents 1, LED off represents 0</p>\r\n<p><code>[Example 1]    0   0   0   0  0  0  0  1  [Represented value 1]</code><br />\r\n1st LED on value = 1</p>\r\n<p><code>[Example 2]    0   0   0   0  0  0  1  1  [Represented value 3]</code><br />\r\n1st and 2nd LED on, LED VALUE 1 + 2 = 3</p>\r\n<p><code>[Examples 3]   0   0   0   0  1  0  1  0  [Represented value 10]</code><br />\r\n2nd and 4th LED on, LED VALUE 2 + 8 = 10</p>\r\n<p>With practice it gets easy to convert from binary to decimal, at my work we still have a very old computer which contains a front panel with LED’s and binary switches. To load the computer instructions must be loaded in binary using flip switches and LED’s with practice it becomes second nature.</p>\r\n<h3 id=\"links\">Links</h3>\r\n<ul>\r\n<li><p>Further information on binary numbers <a href=\"https://en.wikipedia.org/wiki/Binary_number\" class=\"uri\">https://en.wikipedia.org/wiki/Binary_number</a></p></li>\r\n<li><p><code>df</code> man page (Disk Free) <a href=\"https://linux.die.net/man/1/df\" class=\"uri\">https://linux.die.net/man/1/df</a></p></li>\r\n<li><p><code>aplay</code> man page <a href=\"https://linux.die.net/man/1/aplay\" class=\"uri\">https://linux.die.net/man/1/aplay</a></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, hardware, electronics, Raspberry Pi',0,0,1),
(2918,'2019-10-09','Selecting random item from weighted list',1604,'How to selected random item from weighted list using Haskell','<h2 id=\"intro\">Intro</h2>\r\n<p>We’re going to have a look how to select random item from weighted list. There isn’t that much code this time, but it certainly took many tries to get it working and looking nice.</p>\r\n<h2 id=\"analogy\">Analogy</h2>\r\n<p>Imagine stack of building blocks of different heights stacked on top of each other. Height of the each block is chance of how often it will be selected. Selection is done by chopping a stick so that its length at maximum is height of the stack. Place stick next to the stack and select the block that stick reaches at.</p>\r\n<h2 id=\"explanation-of-algorithm\">Explanation of algorithm</h2>\r\n<p>We have list of items and associated weight, defined as <code>Frequency a = Frequency Int a</code>.</p>\r\n<p>Total is sum of all the weights and we select a random number <code>n</code> between 1 and total.</p>\r\n<p><code>pick</code> function has signature of <code>[Frequency a] -&gt; n -&gt; Maybe a</code>. Empty list will result <code>Nothing</code>. When picking item, if <code>n</code> is equal or less than weight of the first item, return that item. Otherwise, drop the first item, subtract weight of that first item from <code>n</code> and try again. Eventually we either arrive to item which weight is greater than <code>n</code> or to empty list.</p>\r\n<h2 id=\"quick-detour-on-random-number-generators\">Quick detour on random number generators</h2>\r\n<p>Haskell functions are pure, meaning that with same input, you are guaranteed to get the same output (safe for some specific cases). Which makes concept of random numbers at first glance to be impossible. This is solved by passing in a random number generator, which can supply you a random value a new random number generator. Using this new random number generator to generate a value yields you a yet another value and yet another random number generator.</p>\r\n<p>Passing these random number generators around in code gets tedious, but there’s different solution: <code>MonadRandom</code>. Using it will thread along generators automatically behind the scenes, ensuring that you always have access to a fresh generator. There’s several functions that can be used to generate random values, but we’re using this one: <code>getRandomR :: Random a =&gt; (a, a) -&gt; m a</code>. Given a lower and upper bound, it will return you a random value wrapped in context that carries that new random number generator.</p>\r\n<p>In the end, we need to take our computation (that can be complex and use multiple calls to random number generator) and turn that <code>m a</code> into <code>a</code>. This is done with <code>runRand :: RandomGen g =&gt; Rand g a -&gt; g -&gt; (a, g)</code>. We give it our computation and a <code>RandomGen g</code> that can generate random values and receive <code>(a, g)</code> where <code>a</code> is our result and <code>g</code> new random number generator. In cases where we aren’t going to use the new generator, we can use <code>evalRand :: RandomGen g =&gt; Rand g a -&gt; g -&gt; a</code>, which discards it and returns just <code>a</code>.</p>\r\n<h2 id=\"actual-implementation-with-explanation\">Actual implementation with explanation</h2>\r\n<p>First, <code>Frequency</code> for expressing weight of individual item. It’s parametrized, so can be used with any data.</p>\r\n<pre><code>data Frequency a = Frequency Int a\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>Next, determining which item to choose, based on stack and measuring stick. In case a value outside of valid range has been selected, we end up with <code>Nothing</code>, otherwise with <code>Just a</code>. First case is for empty list (either we called this originally with empty list or picked number that is greater than total sum of weights), second one either picks the first item of list or recursive calls itself removing first item.</p>\r\n<pre><code>pick :: [Frequency a] -&gt; Int -&gt; Maybe a\r\npick [] _ = Nothing\r\n\r\npick (Frequency x item:xs) i\r\n    | i &lt;= x = Just item\r\n    | otherwise = pick xs (i - x)</code></pre>\r\n<p>Finally, function for calculating total of weights and choosing random number. We’re using that <code>Rand g (Maybe a)</code> I explained earlier. First case is for empty list again and latter case for list with at least one item.</p>\r\n<pre><code>choose :: RandomGen g =&gt; [Frequency a] -&gt; Rand g (Maybe a)\r\nchoose [] =\r\n    return Nothing\r\n\r\nchoose items = do\r\n    let total = sum $ fmap (\\(Frequency x _) -&gt; x) items\r\n    n &lt;- getRandomR (1, total)\r\n    return $ pick items n</code></pre>\r\n<p>Notice how we can get random number by <code>n &lt;- getRandomR (1, total)</code>, without talking about generators. <code>MonadRandom</code> is handling generators and making sure that there’s always a fresh generator available and new generator is stored ready to be used.</p>\r\n<p>And that’s all the code this time (I told the amount of code is small this time).</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>This probably sounds a lot more complicated than it actually is. I arrived to the result after quite many detours, but the end result looks pretty nice.</p>\r\n<p>Next time we’re going to have a look where to use our <code>choose</code> function.</p>\r\n<p>In the meantime, questions, comments and feedback are welcomed. Best way to reach me is email or fediverse where I’m <code>Tuula@mastodon.social</code>. Or even better, record your own Hacker Public Radio episode.</p>\r\n',364,107,0,'CC-BY-SA','haskell, random, monad',0,0,1),
(2904,'2019-09-19','DIY URL shortening',738,'Quick tip on how to shorten an URL without a silly SaaS','<p>\r\nMake a directory to house your shortened URLs.\r\n</p>\r\n\r\n<pre><code>\r\n$ ssh example.com mkdir public_html/u\r\n</code></pre>\r\n\r\n<p>\r\nOn demand, create a subdirectory for the shortened URL you want to create.\r\n</p>\r\n\r\n<pre><code>\r\n$ ssh example.com mkdir public_html/u/hpr\r\n</code></pre>\r\n\r\n<p>\r\nCreate an HTTP redirect in an index.html file.\r\n</p>\r\n\r\n<pre><code>\r\n$ ssh example.com echo \"\"&lt;html>&lt;title>Shortened URL&lt;/title>&lt;head>&lt;meta http-equiv=\'refresh\' content=\'0; URL=http:&#47;&#47;hackerpublicradio.org&#47;correspondents/0078.html\' />&lt;/head>&lt;/html>\"\" &gt; www/u/hpr/index.html\r\n</code></pre>\r\n\r\n<p>\r\nYour shortened URL is example.com/u/hpr\r\n</p>\r\n',78,0,0,'CC-BY-SA','html, url shortner',0,0,1),
(2928,'2019-10-23','Building markov chains with Haskell',1798,'How to build markov chains with Haskell','<h2 id=\"intro\">Intro</h2>\r\n<p>Last time we built a weighted list, this time we’re using that to build markov chains. Wikipedia states that “A Markov chain is a stochastic model describing a sequence of possible events in which the probability of each event depends only on the state attained in the previous event.” and that they’re named after the Russian mathematician Andrey Markov.</p>\r\n<h2 id=\"configuration\">Configuration</h2>\r\n<p>We’re after generic system, hence parametrized data types.</p>\r\n<p>First part is <code>Configuration a</code> that lists possible starting elements of chain and elements that can follow a particular element.</p>\r\n<pre><code>data Config a = Config\r\n    { configStarts :: ![Item a]\r\n    , configContinuations :: !(Map a [Item a])\r\n    } deriving (Show, Read, Eq)</code></pre>\r\n<p>Second part is <code>Item a</code>, that just holds single item that could appear in chain and relatively frequency for its appearance.</p>\r\n<pre><code>data Item a =\r\n    Item (Frequency (Maybe a))\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>We’re using <code>Maybe a</code> as in some cases there’s chance of element being last element in chain. Thus, <code>Nothing</code> will represent end of chain.</p>\r\n<p>In previous episode, we implemented <code>choose</code>, but later on I decided to rename it to <code>chooseM</code>. So when you see <code>chooseM</code>, it’s just different name for what we implemented previously.</p>\r\n<h2 id=\"building-a-chain\">Building a chain</h2>\r\n<p>Since building a configuration depends on the case quite a bit, we’re just going to assume that we have one at hand.</p>\r\n<p>Our chains are built by <code>chainM :: (Ord a, RandomGen g) =&gt; Config a -&gt; Rand g [a]</code>. Given a config, it creates computation that when run will return list of <code>a</code>, which is our chain.</p>\r\n<p>Implementation is fairly straightforward:</p>\r\n<pre><code>chainM config = do\r\n    starter &lt;- chooseM (itemToFreq &lt;$&gt; configStarts config)\r\n    case join starter of\r\n        Nothing -&gt;\r\n            return []\r\n\r\n        Just h -&gt; do\r\n            t &lt;- tailOfChain config h\r\n            return $ h : t</code></pre>\r\n<p>First we select item from starting elements. In case there isn’t one, result will be a empty list. Otherwise we use <code>tailOfChain</code> to compute rest of the list and return a list of starter element followed by that tail.</p>\r\n<p>For tail we need to figure out first what possible elements there are that can follow a given element. This is done by <code>candidates</code> function. <code>lookup</code> finds a possible list of elements in <code>configContinuations</code>. We use <code>itemToFreq</code> to turn this list into frequencies. Since <code>items</code> might be <code>Nothing</code> (in case where there aren’t any suitable continuations present) and any continuation in the list might be <code>Nothing</code> (in case where this is possibly terminating element), we have to use <code>(fmap . fmap)</code> to apply <code>itemToFreq</code> to each possible element. Moreover, <code>concat</code> turns our <code>Maybe [Frequency (Maybe a)]</code> into <code>[Frequency (Maybe a)]</code>, if we have <code>Nothing</code> at this stage, result will be an empty list <code>[]</code>.</p>\r\n<pre><code>candidates :: (Ord a) =&gt; Config a -&gt; a -&gt; [Frequency (Maybe a)]\r\ncandidates config x =\r\n    concat $ (fmap . fmap) itemToFreq items\r\n    where\r\n        items = lookup x (configContinuations config)</code></pre>\r\n<p>That <code>concat</code> part could have been written as:</p>\r\n<pre><code>    case (fmap . fmap) itemToFreq items of\r\n        Nothing -&gt;\r\n            []\r\n\r\n        Just x -&gt;\r\n            x</code></pre>\r\n<p>and the end result would be identical.</p>\r\n<p>Now that we know how to figure our possible continuation elements, we can implement computing tail of chain:</p>\r\n<pre><code>tailOfChain :: (Ord a, RandomGen g) =&gt; Config a -&gt; a -&gt; Rand g [a]\r\ntailOfChain config c = do\r\n    item &lt;- chooseM (candidates config c)\r\n    case join item of\r\n        Nothing -&gt;\r\n            return []\r\n\r\n        Just x -&gt; do\r\n             xs &lt;- tailOfChain config x\r\n             return $ x : xs</code></pre>\r\n<p>Function first select <code>item</code> from candidates. If there isn’t suitable item or item is <code>Nothing</code>, result will be an empty list. Otherwise function recurses, computes tail starting from selected element and constructs chain starting by selected <code>item</code> and followed by tail.</p>\r\n<p><code>join item</code> at the start of case analysis collapses two nested <code>Maybe</code>s together:</p>\r\n<ul>\r\n<li><code>Nothing</code> will result <code>Nothing</code> (no suitable continuation)</li>\r\n<li><code>Just Nothing</code> will also result <code>Nothing</code> (end of chain reached)</li>\r\n<li><code>Just a</code> will result <code>Just a</code> (suitable element found)</li>\r\n</ul>\r\n<p>In the end we have list that is sort of like: <code>h : chooseM (candidates config h) : chooseM (candidates config h\') : chooseM (candidates config h\'\') : ... : []</code></p>\r\n<h2 id=\"extra\">Extra</h2>\r\n<p>For convenience we define two other functions. First one is for when we don’t want to use <code>Rand g a</code>. It’s done by applying <code>runRand</code> function with our <code>chainM</code> function, config and <code>RandomGen</code>.</p>\r\n<pre><code>chain :: (Ord a, RandomGen g) =&gt; Config a -&gt; g -&gt; ([a], g)\r\nchain config g =\r\n    runRand (chainM config) g</code></pre>\r\n<p>More interesting is <code>chains</code> which builds infinite list of chains:</p>\r\n<pre><code>chains :: (Ord a, RandomGen g) =&gt; Config a -&gt; g -&gt; [[a]]\r\nchains config g =\r\n        c : chains config g&#39;\r\n    where\r\n        (c, g&#39;) = chain config g</code></pre>\r\n<p>This uses <code>chain</code> function to create starting element (which is markov chain) and new generator <code>g\'</code>. Then it builds a list where that first chain is followed by list of chains that is created by calling <code>chains</code> with that new random generator. Since there’s no termination case in the function, it will compute infinitely long list of markov chains. This works because elements are computed only when needed. For all intents and purposes for program using this infinite list, items are there when needed.</p>\r\n<h2 id=\"closing\">Closing</h2>\r\n<p>Hardest part working with markov chains (at least in my opinion) is building suitable configuration. When you have that configuration at hand, building chains from it requires relatively small amount of code. In the next episode we’re going to use this chains for our space game.</p>\r\n<p>Questions, comments and feedback are always welcome. Best way to reach me is by email or in fediverse where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','markov chains, Haskell',0,0,1),
(2905,'2019-09-20','Two HPR hosts living in the same region finally meet up!',1145,'Dave Morriss and MrX meet up and record a conversation','<h2 id=\"introduction\">Introduction</h2>\r\n<p>Two HPR hosts who live in the Edinburgh locality in Scotland met on Saturday 24<sup>th</sup> August for a chat.</p>\r\n<p>The hosts are:</p>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" title=\"MrX\">MrX</a> - first HPR show <a href=\"https://hackerpublicradio.org/eps.php?id=911\">“Hobbies”</a> on 2012-01-27</li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" title=\"Dave Morriss\">Dave Morriss</a> - first HPR show <a href=\"https://hackerpublicradio.org/eps.php?id=1091\">“Useful Vim Plugins”</a> on 2012-10-05</li>\r\n</ul>\r\n<p>Some of the meeting was recorded and is presented here.</p>\r\n<h3 id=\"recording-information\">Recording information</h3>\r\n<p>We were both recording this chat. Dave was using his Zoom H2n (with the microphones in <em>XY</em> mode) and MrX had left his small <em>Dictaphone</em>-like recorder on the table.</p>\r\n<p>Most of the audio here was from the Zoom, but at one point it switches to MrX’s recorder for comparison. The sample is at about 18 minutes into the recording (hard to judge since an intro sequence will have been added on the HPR site). A “chirp” effect has been added at the start and end of this sample to help with identification.</p>\r\n<p>The Zoom track had noise reduction applied to it, using a noise sample from the start as a reference. The sample from MrX’s recorder also had noise reduction applied, and both tracks were amplified.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>MrX’s shows that we were talking about:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2879\">Describing how I listen to podcasts PART 1</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2889\">Describing how I listen to podcasts PART 2</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2901\">Describing how I listen to podcasts PART 3</a></li>\r\n</ul></li>\r\n<li>The radio device for the Pi mentioned by Dave:\r\n<ul>\r\n<li>ESP8266 IoT pHAT from Pimoroni (now discontinued)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/ESP8266\">Wikipedia page on the ESP8266</a></li>\r\n<li><a href=\"https://learn.pimoroni.com/tutorial/hal13/getting-started-with-iot-phat\">Pimoroni Tutorial on using the pHAT</a></li>\r\n</ul></li>\r\n</ul>\r\n',225,0,1,'CC-BY-SA','HPR,hosts,meeting,Dave Morriss,MrX',0,0,1),
(2906,'2019-09-23','Feature Engineering for Data-Driven Decision Making',1006,'In this episode, I explain feature engineering, and how it can be used to make decisions','<h2 id=\"example-of-the-input-data\">Example of the input data</h2>\r\n<table>\r\n<thead>\r\n<tr class=\"header\">\r\n<th>Client name</th>\r\n<th>Date ordered</th>\r\n</tr>\r\n</thead>\r\n<tbody>\r\n<tr class=\"odd\">\r\n<td>Client 1</td>\r\n<td>2019-01-01</td>\r\n</tr>\r\n<tr class=\"even\">\r\n<td>Client 1</td>\r\n<td>2019-01-01</td>\r\n</tr>\r\n<tr class=\"odd\">\r\n<td>Client 3</td>\r\n<td>2019-01-01</td>\r\n</tr>\r\n<tr class=\"even\">\r\n<td>Client 3</td>\r\n<td>2019-01-01</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<h2 id=\"example-of-the-engineered-features\">Example of the engineered features</h2>\r\n<table>\r\n<thead>\r\n<tr class=\"header\">\r\n<th>Client name</th>\r\n<th>volume</th>\r\n<th>last order date</th>\r\n<th>first order date</th>\r\n<th>days since last order</th>\r\n</tr>\r\n</thead>\r\n<tbody>\r\n<tr class=\"odd\">\r\n<td>Client 1</td>\r\n<td>292</td>\r\n<td>2019-09-03</td>\r\n<td>2015-03-04</td>\r\n<td>10</td>\r\n</tr>\r\n<tr class=\"even\">\r\n<td>Client 2</td>\r\n<td>18</td>\r\n<td>2019-09-09</td>\r\n<td>2019-09-04</td>\r\n<td>4</td>\r\n</tr>\r\n<tr class=\"odd\">\r\n<td>Client 3</td>\r\n<td>300</td>\r\n<td>2019-08-16</td>\r\n<td>2016-11-15</td>\r\n<td><strong>28</strong></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<h2 id=\"links\">Links</h2>\r\n<ol type=\"1\">\r\n<li><a href=\"https://en.wikipedia.org/wiki/Feature_engineering\">Feature Engineering</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Feature_(machine_learning)\">Feature</a></li>\r\n</ol>\r\n',300,0,0,'CC-BY-SA','data',0,0,1),
(2909,'2019-09-26','ONICS Basics Part 3:  Networking Fundamentals',3031,'This show discusses basic principles of networks and how to send data using ONICS','<h1 id=\"theory\">Theory</h1>\r\n<p>In this episode I decided to take a slight diversion into networking fundamentals. As before, if you want to learn more about installing the ONICS tool suite, go back and listen to HPR 2882.</p>\r\n<p>There are three key concepts to understand about modern networks. They are:</p>\r\n<ul>\r\n<li><p>digital - the networks carry bits and bytes (binary digits)</p></li>\r\n<li><p>packet switched - devices break data into blobs of data called &quot;packets&quot; and take turns sending and receiving those packets to/from other devices attached to the network</p></li>\r\n<li><p>internetworked -- machines communicate using a protocol that allows traffic to traverse across multiple, independently-managed networks in a uniform way</p></li>\r\n</ul>\r\n<h1 id=\"my-setup\">My Setup</h1>\r\n<ul>\r\n<li><p>2 laptops connected to a home wifi network that has Internet connectivity.</p></li>\r\n<li><p>Practicing sending data from a source machine to a destination machine. Both are running Linux.</p></li>\r\n<li><p>Source machine:</p>\r\n<ul>\r\n<li>Wifi interface: wlan0</li>\r\n<li>Ethernet address: 00:22:fa:a7:69:90</li>\r\n<li>IP address: 192.168.0.4</li>\r\n</ul></li>\r\n<li><p>Destination machine</p>\r\n<ul>\r\n<li>Wifi interface: wlo1</li>\r\n<li>Ethernet address: 6c:88:14:7c:2e:14</li>\r\n<li>IP address: 192.168.0.248</li>\r\n</ul></li>\r\n<li><p>Internet Router:</p>\r\n<ul>\r\n<li>Ethernet address: 00:0d:b9:23:f2:51</li>\r\n<li>IP address: 192.168.0.1</li>\r\n</ul></li>\r\n</ul>\r\n<h1 id=\"more-terminology\">More Terminology</h1>\r\n<ul>\r\n<li><p>Address - a number that identifies a machine\'s interface in a network</p></li>\r\n<li><p>Packet - a blob of binary data sent as a unit over a network</p></li>\r\n<li><p>Route - a rule that specifies how to forward traffic to a given address</p></li>\r\n<li><p>Router / Gateway - a machine that uses the IP protocol and forwards traffic between multiple networks that it connects to</p></li>\r\n<li><p>Network Protocol - a set of rules and data formats for exchanging information over a network</p></li>\r\n</ul>\r\n<h1 id=\"standard-unix-commands\">Standard UNIX Commands</h1>\r\n<ul>\r\n<li>ifconfig (no arguments or \'-a\')\r\n<ul>\r\n<li>list interfaces on a machine</li>\r\n</ul></li>\r\n<li>ifconfig IFNAME\r\n<ul>\r\n<li>list properites about a given interface</li>\r\n</ul></li>\r\n<li>ping -c 1 IPADDRESS\r\n<ul>\r\n<li>send an echo request to machine IPADDRESS</li>\r\n</ul></li>\r\n<li>arp -na\r\n<ul>\r\n<li>Dump the Ethernet addresses of known nearby machines</li>\r\n</ul></li>\r\n<li>netstat -nr\r\n<ul>\r\n<li>Dump the routes in a system</li>\r\n</ul></li>\r\n<li>netstat -nr | grep &quot;^0.0.0.0&quot;\r\n<ul>\r\n<li>Find the route (and thus IP address) of the default gateway</li>\r\n</ul></li>\r\n</ul>\r\n<h1 id=\"onics-commands-in-this-episode\">ONICS Commands in this Episode</h1>\r\n<ul>\r\n<li><p>rawpkt - take a blob of data and wrap it in an XPKT format (so other ONICS tools can understand what it is)</p></li>\r\n<li><p>ethwrap - take an XPKT and prepend an Ethernet header to it</p></li>\r\n<li><p>ipwrap - take an XPKT and prepend an IP header to it</p></li>\r\n<li><p>pktin - read a stream of packets from a network interface</p></li>\r\n<li><p>pflt - filter a stream of packets so that only those matching a pattern get through</p></li>\r\n<li><p>pktout - send a stream of packets to a network interface</p></li>\r\n<li><p>x2hpkt - convert XPKTs into a hex dump</p></li>\r\n<li><p>xpktdump - like x2hpkt, but send the output to a pager like \'less\' for easy reading</p></li>\r\n</ul>\r\n<h1 id=\"sending-an-ethernet-packet-to-the-destination\">Sending an Ethernet Packet to the Destination</h1>\r\n<ul>\r\n<li>On the receiver:</li>\r\n</ul>\r\n<pre><code>    $ sudo pktin wlo1 |\r\n      pflt &quot;not ip and eth.dst == 6c:88:14:7c:2e:14&quot; |\r\n      x2hpkt\r\n</code></pre>\r\n<ul>\r\n<li>On the sender:</li>\r\n</ul>\r\n<pre><code>    $ echo &quot;hello world&quot; |\r\n      rawpkt |\r\n      ethwrap &quot;eth.dst = 6c:88:14:7c:2e:14; &quot;\r\n              &quot;eth.src = 00:22:fa:a7:69:90; &quot;\r\n              &quot;eth.ethtype = 12;&quot; |\r\n      sudo pktout wlan0\r\n</code></pre>\r\n<p>Note that while I broke up the field setting commands into multiple lines in ethwrap, they can all be part of a single quoted string if desired. To store the packet to a file rather than send it instead do something</p>\r\n<pre><code>$ echo ... | rawpkt | ethwrap ... &gt; outfile.xpkt\r\n</code></pre>\r\n<p>One can then dump the packet by running:</p>\r\n<pre><code>$ xpktdump outfile.xpkt\r\n</code></pre>\r\n<p>or send the packet by running:</p>\r\n<pre><code>$ sudo pktout outfile.xpkt wlan0\r\n</code></pre>\r\n<h1 id=\"sending-an-ip-packet-to-the-destination-over-the-local-network\">Sending an IP Packet to the Destination over the Local Network</h1>\r\n<ul>\r\n<li>On the reciever:</li>\r\n</ul>\r\n<pre><code>    $ sudo pktin wlo1 |\r\n      pflt &quot;ip and ip.proto == 255&quot; |\r\n      x2hpkt\r\n</code></pre>\r\n<ul>\r\n<li>On the sender:</li>\r\n</ul>\r\n<pre><code>    $ echo &quot;hello world&quot; |\r\n      rawpkt |\r\n      ipwrap &quot;ip.saddr = 192.168.0.4;&quot;\r\n             &quot;ip.daddr = 192.168.0.248;&quot;\r\n             &quot;ip.len = 32;&quot;\r\n             &quot;ip.ttl = 64;&quot;\r\n             &quot;ip.proto = 255;&quot; |\r\n      ethwrap &quot;eth.dst = 6c:88:14:7c:2e:14; &quot;\r\n              &quot;eth.src = 00:22:fa:a7:69:90; &quot;\r\n              &quot;eth.ethtype = 0x800;&quot; |\r\n      sudo pktout wlan0\r\n</code></pre>\r\n<p>Note that while I broke up the field setting commands into multiple lines in ipwrap and ethwrap, they can all be part of a single quoted string if desired. Also note that it is not actually necessary to set the \'ip.len\' and \'eth.ethtype\' fields: the tools will do that automatically.</p>\r\n<h1 id=\"sending-an-ip-packet-to-the-destination-via-ip\">Sending an IP Packet to the Destination via IP</h1>\r\n<ul>\r\n<li>On the receiver:</li>\r\n</ul>\r\n<pre><code>    $ sudo pktin wlo1 |\r\n      pflt &quot;ip and ip.proto == 255&quot; |\r\n      x2hpkt\r\n</code></pre>\r\n<ul>\r\n<li>One the sender:</li>\r\n</ul>\r\n<pre><code>    $ echo &quot;hello world&quot; |\r\n      rawpkt |\r\n      ipwrap &quot;ip.saddr = 192.168.0.4;&quot;\r\n             &quot;ip.daddr = 192.168.0.248;&quot;\r\n             &quot;ip.ttl = 64;&quot;\r\n             &quot;ip.proto = 255;&quot; |\r\n      ethwrap &quot;eth.dst = 00:0d:b9:23:f2:51; &quot;\r\n              &quot;eth.src = 00:22:fa:a7:69:90; &quot; |\r\n      sudo pktout wlan0\r\n</code></pre>\r\n<h1 id=\"challenge\">Challenge</h1>\r\n<p>There are several differences between the packets that arrive at the destination machine when sending directly over the local network versus sending via an IP gateway (router). I\'ve mentioned how the Ethernet header is different. Can you find the other differences? What causes these differences?</p>\r\n<p>TIP: instead of sending the <code>pktin</code> command to x2hpkt, send it to a file. Do this for both local network send and for sending via the router saving each to different files. Then run <code>pdiff</code> on the two files to highlight the differences.</p>\r\n',259,61,0,'CC-BY-SA','command-line, networking, basics',0,0,1),
(2911,'2019-09-30','my internet connection',655,'a bloviated harang with a smattering of spewed expetives, while describing available ISPs','<p>Any notes for this episode should probably contain links to the ISPs mentioned in the show. Since I do not wish to harm any listeners, I have opted to not include links to evil ISPs.</p>',243,0,1,'CC-BY-SA','internet service, satellite',0,0,1),
(2938,'2019-11-06','Naming pets in space game',1236,'How to use markov chains to generate names','<h2 id=\"intro\">Intro</h2>\r\n<p>In the two previous episodes we built a weighted list and used that to build markov chains. This time we’re going to use them to generate some names based on examples. I’m skipping over a lot of uninteresting code in this episode, concentrating only the parts that deal with names.</p>\r\n<h2 id=\"idea\">Idea</h2>\r\n<p>Person in game might hear scurrying sounds inside walls of their quarters. Then they have option of getting a cat, taming a rat or letting someone else deal with the problem. Depending on their choice, they might end up with a cat or a rat, that of course needs a name. Game offers 3 different options of names that haven’t been used before and person can always opt for completely random one.</p>\r\n<h2 id=\"config\">Config</h2>\r\n<p>While we’re not going to dig very deep into making configurations for markov chains, we can have look at the overall process.</p>\r\n<p>We have list of names to serve as examples and three functions, which implementation I won’t delve into:</p>\r\n<ul>\r\n<li><code>start</code> for adding starting element</li>\r\n<li><code>links</code> for recording link between two elements</li>\r\n<li><code>end</code> adds ending element</li>\r\n</ul>\r\n<p><code>addName</code> function is used to add single name into config:</p>\r\n<pre><code>addName :: Int -&gt; Text -&gt; Config Text -&gt; Config Text\r\naddName n s config =\r\n    links pairs $\r\n            end elements $\r\n            start elements config\r\n    where\r\n        elements = chunksOf n s\r\n        pairs = zip elements (safeTail elements)</code></pre>\r\n<p>First <code>s</code> (name) is split into strings of length <code>n</code>. These <code>elements</code> are then combined into pairs, where consecutive elements form a pair. Final step is to add start and ending elements into config, followed by links between elements of pairs.</p>\r\n<p>We can then fold a list of examples into config:</p>\r\n<pre><code>nameConfig :: [Text] -&gt; Int -&gt; Config Text\r\nnameConfig xs n =\r\n    foldr (addName n) emptyConfig xs</code></pre>\r\n<p>This starts with <code>emptyConfig</code> and calls <code>addName</code> repeatedly until all elements of list containing examples have been processed.</p>\r\n<h2 id=\"implementation\">Implementation</h2>\r\n<p>Now that we have configuration, we can start generating names. As usual, I like to keep things specific and generate <code>PetName</code> instead of just <code>Text</code>. I happened to have list of ancient greek names at hand, so I used that. Later on we’ll have to add more cultures, like Romans, Parthians, Persians, Germans, Phoenicians and so on.</p>\r\n<p>General implementation of generating infinite list of strings of specific kind is shown below:</p>\r\n<pre><code>names :: (RandomGen g, Eq b) =&gt; (Text -&gt; b) -&gt; Config Text -&gt; g -&gt; [b]\r\nnames t config g =\r\n    nub $ (t . toTitle . concat) &lt;$&gt; chains config g</code></pre>\r\n<p>It’s easier to read if you start from right. <code>chains config g</code> generates infinite list of markov chains with given configuration. Next we create a new function <code>(t . toTitle . concat)</code>, which uses <code>concat</code> to combine list of <code>Text</code> into single <code>Text</code>, <code>toTitle</code> to capitalize is correctly and <code>t</code> to transform it to something (<code>PetName</code> in our case). <code>&lt;$&gt;</code> is then used to apply this function to each element of our infinite list. Finally <code>nub</code> is used to remove duplicate entries.</p>\r\n<p>With <code>names</code> we can then define <code>petNames</code>:</p>\r\n<pre><code>petNames :: (RandomGen g) =&gt; g -&gt; [PetName]\r\npetNames =\r\n    names MkPetName greekNameConfig</code></pre>\r\n<p><code>MkPetName</code> is value constructor that turns <code>Text</code> into <code>PetName</code> (this is <code>t</code> used by <code>names</code> function).</p>\r\n<h2 id=\"pets\">Pets</h2>\r\n<p>Pets are currently very much work in progress. They have few attributes and there can be two different kinds of pets:</p>\r\n<pre><code>Pet json\r\n    name PetName\r\n    type PetType\r\n    dateOfBirth StarDate\r\n    dateOfDeath StarDate Maybe\r\n    ownerId PersonId\r\n    deriving Show Read Eq</code></pre>\r\n<pre><code>data PetType\r\n    = Cat\r\n    | Rat\r\n    deriving (Show, Read, Eq, Ord, Enum, Bounded)</code></pre>\r\n<p>The actual beef is <code>namingPetEvent</code> function. When applied with <code>Entity Person</code>, <code>Entity Pet</code> and <code>StarDate</code>, it will create <code>News</code> that can be saved into database and later on showed to player. While the code is shown below, I’m not going to go over it line by line:</p>\r\n<pre><code>namingPetEvent :: (PersistQueryRead backend, MonadIO m,\r\n    BaseBackend backend ~ SqlBackend) =&gt;\r\n    Entity Person -&gt; Entity Pet -&gt; StarDate -&gt; ReaderT backend m News\r\nnamingPetEvent personE petE date = do\r\n    pets &lt;- selectList [ PetOwnerId ==. (entityKey personE)\r\n                       , PetDateOfDeath ==. Nothing\r\n                       ] []\r\n    let names = (petName . entityVal) &lt;$&gt; pets\r\n    g &lt;- liftIO getStdGen\r\n    let availableNames = take 3 $ filter (\\x -&gt; not (x `elem` names)) $ petNames g\r\n    let content = NamingPet (NamingPetEvent { namingPetEventPersonId = entityKey personE\r\n                                            , namingPetEventPetId = entityKey petE\r\n                                            , namingPetEventPetType = (petType . entityVal) petE\r\n                                            , namingPetEventDate = date\r\n                                            , namingPetNameOptions = availableNames\r\n                                            })\r\n                            [] Nothing\r\n    return $ mkPersonalSpecialNews date (entityKey personE) content</code></pre>\r\n<p>General idea is to use <code>selectList</code> to load living pets of given person and then extract their names. With random generator <code>g</code>, we create a infinite list of <code>PetName</code>s, remove already used names from it and take 3 first ones. These names are then used to create <code>NamingPetEvent</code>.</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>Names are probably one of the most common applications of markov chains in games. Same technique can be used to generate nonsense books and articles that look realistic on a glance.</p>\r\n<p>Questions, comments and feedback is welcomed, best way to reach is email or in fediverse where I’m <code>Tuula@mastodon.social</code>. Or even better, record your own episode for Hacker Public Radio.</p>\r\n<p>ad astra!</p>\r\n',364,107,0,'CC-BY-SA','haskell, markov chains',0,0,1),
(2913,'2019-10-02','Windows, SDN, and Firewalls',2483,'Being a Windows User for the past 3 years, Information on SDN, and a DIY approach to a home Firewall','<pre>\r\nIntro\r\n\r\nLast Upload was hpr1468 March 19, 2014 \r\n\r\npython\r\n\r\n>>> print (D.today() - D(2014, 3, 19)).days\r\n\r\n1999\r\n\r\n>>> 2000/365\r\n\r\n5\r\n</pre>\r\n\r\n<p><a href=\"https://unix.stackexchange.com/questions/24626/quickly-calculate-date-differences\" class=\"uri\">https://unix.stackexchange.com/questions/24626/quickly-calculate-date-differences</a></p>\r\n<p>In the last 5 years:</p>\r\n<ul>\r\n<li>Traveled the world.</li>\r\n<li>Deployed a lot of things for work.</li>\r\n<li>Taken on a new role which moves me from Datacenters to Networks.</li>\r\n<li>Learned a lot about Operations, Datacenter Infrastructure, People around the world, and why it is important to have your house in order.</li>\r\n<li>Read over 3 dozen books.</li>\r\n<li>Paid off debt and focused on long term financial goals.</li>\r\n<li>Humility, Humanity, and Harmony: Three things I have continued to strive for in my personal life, work, and hobbies.</li>\r\n</ul>\r\n<p>Let\'s Start The Show off in the wrong direction</p>\r\n<h2 id=\"windows\">Windows</h2>\r\n<ul>\r\n<li>Chocolatey\r\n<ul>\r\n<li>Great Tool for Downloading free software from the windows powershell command line</li>\r\n<li><a href=\"https://chocolatey.org/docs/installation\" class=\"uri\">https://chocolatey.org/docs/installation</a></li>\r\n</ul></li>\r\n</ul>\r\n<h3 id=\"sublime-text-3\">Sublime Text 3</h3>\r\n<ul>\r\n<li>Fantastic Text editor and very powerful. I use this to quickly parse data using regex searches and push this to spreadsheets or other tools that allow me to organize data quickly. Overall Great tool for anyone</li>\r\n</ul>\r\n<h3 id=\"summary\">Summary:</h3>\r\n<ul>\r\n<li>Overall: The importance of being an everyday Windows User has allowed me to focus on solving problems in different and unique ways. I\'ve found that the way I use Windows is not the same as most normal Windows Users. I live most of the time inside of Chrome so Windows is just another OS to get my Chrome Browser running.</li>\r\n<li>Observation: Windows has definitely matured over the past 10 years. I find myself enjoying the time I save using Windows 10.</li>\r\n<li>Contradictions: I still use Linux, but as a VM to work on things that I just can\'t do inside of Windows.</li>\r\n</ul>\r\n<h2 id=\"web-stuff\">Web Stuff</h2>\r\n<ul>\r\n<li>Regex\r\n<ul>\r\n<li>Test and debug your regex. It is a great tool that combines pastebin and regex debugging. This allows you to share your regex with other by simply using a link. There is a lot of useful information on the site about what each portion of your regex is doing.</li>\r\n<li><a href=\"https://regex101.com\" class=\"uri\">https://regex101.com</a></li>\r\n</ul></li>\r\n<li>Maps\r\n<ul>\r\n<li>USGS Maps\r\n<ul>\r\n<li>Very nice site that allows you to download PDFs of 1:24000 or 7.5 minute Maps. You can print these off and use a Map grid tool to navigate your journey. This is kind of an analog tool but you are downloading the maps to your computer or phone. Good to have maps saved offline while you hike, that way you don\'t get lost.</li>\r\n<li><a href=\"https://store.usgs.gov/map-locator\" class=\"uri\">https://store.usgs.gov/map-locator</a></li>\r\n</ul></li>\r\n</ul></li>\r\n<li>SDN Information\r\n<ul>\r\n<li>If you\'re just starting with Software Defined Networking or are already working with it in a production environment, there is much to learn but very few places to find aggregated information. The GitHub Page called awesome-sdn has tons of links on NOS,Controllers, Libraries, and more. I have A couple of Northbound network and Aruba switches at home to use with my SDN projects. I highly recommend you start getting familiar with network automation using ansible or other automation best practices at the least. For the more technical stuff definitely start looking at SDN.</li>\r\n<li>Awesome-SDN\r\n<ul>\r\n<li><a href=\"https://github.com/sdnds-tw/awesome-sdn/blob/master/README.md\" class=\"uri\">https://github.com/sdnds-tw/awesome-sdn/blob/master/README.md</a></li>\r\n</ul></li>\r\n<li>Northbound Networks SDN Devices\r\n<ul>\r\n<li><a href=\"https://northboundnetworks.com/\" class=\"uri\">https://northboundnetworks.com/</a></li>\r\n</ul></li>\r\n<li>ZeroTier is an example of SDN WAN or Edge Networking\r\n<ul>\r\n<li><a href=\"https://www.zerotier.com/download/\" class=\"uri\">https://www.zerotier.com/download/</a></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"home-hacks\">Home Hacks</h2>\r\n<ul>\r\n<li>Home Phone\r\n<ul>\r\n<li>Cheap way to have a home phone\r\n<ul>\r\n<li>Google Voice Number</li>\r\n<li>OBi200 VoIP Telephone Adapter 100Mb LAN\r\n<ul>\r\n<li>Has the Option to sign up for 911 but with just Google Voice Number it is a free way to have a house phone</li>\r\n<li><a href=\"https://www.obitalk.com/info/products/obi200\" class=\"uri\">https://www.obitalk.com/info/products/obi200</a></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"firewalls\">Firewalls</h2>\r\n<ul>\r\n<li>Off the shelf vs DIY options\r\n<ul>\r\n<li>Off The Shelf Ubiquiti Option\r\n<ul>\r\n<li>Ubiquiti \"SDN\" Like FW decent enough for homes with 100Mb/s Uplinks but not for homes with 1Gb/s uplinks.</li>\r\n<li>USG3 can\'t handle IPS throughput past 50Mb/s</li>\r\n<li>USG3 can\'t handle FW PPS past 400Mb/s at 100B packets, which is around 500,000 PPS</li>\r\n<li>The Ubiquiti alternative would be to spend money on an XG which is well over $1000 USD.</li>\r\n</ul></li>\r\n<li>DIY Option\r\n<ul>\r\n<li>The best alternative would be to purchase a used SFF PC with at least 1 Gb onboard NIC and 2 PCIe x16 or x 8 lanes. This would allow for 10Gb NIC options</li>\r\n<li>4x10Gb Intel Nics are a steal</li>\r\n<li>or 4 x 1Gb Nics which are an even better deal.</li>\r\n<li>Going SFP+ is a great option because you can use Copper or Fiber Modules in the same NIC card.</li>\r\n</ul></li>\r\n</ul></li>\r\n<li>Summary\r\n<ul>\r\n<li>The most important part about the SFF Option, you get to use a xeon processor, at least 32 GBs of RAM, and install up to 4 HDDs in the System. You can even install a PCIe NVME or M.2 Sata using a PCIe peripheral.</li>\r\n<li>For software, PFSense or Sophos XG will be great options. If you really want to get technical, load up a hypervisor and then install the Firewall as a VM. This would allow you to leverage the SFF system for more than just a FW and allow for easy testing of other types of FW solutions.</li>\r\n</ul></li>\r\n<li>Hardware Info\r\n<ul>\r\n<li>Intel X722DA4FH Ethernet Network Adapter X722-DA4\r\n<ul>\r\n<li><a href=\"https://g.co/kgs/j9aNJz\" class=\"uri\">https://g.co/kgs/j9aNJz</a></li>\r\n</ul></li>\r\n<li>HP Z240 SFF\r\n<ul>\r\n<li><a href=\"https://g.co/kgs/ax2hwq\" class=\"uri\">https://g.co/kgs/ax2hwq</a></li>\r\n</ul></li>\r\n</ul></li>\r\n<li>Firewall OSes\r\n<ul>\r\n<li>PFSense\r\n<ul>\r\n<li><a href=\"https://www.pfsense.org/\" class=\"uri\">https://www.pfsense.org/</a></li>\r\n</ul></li>\r\n<li>Sophos\r\n<ul>\r\n<li><a href=\"https://www.sophos.com/en-us/products/next-gen-firewall.aspx\" class=\"uri\">https://www.sophos.com/en-us/products/next-gen-firewall.aspx</a></li>\r\n</ul></li>\r\n<li>OPNSense\r\n<ul>\r\n<li><a href=\"https://opnsense.org/\" class=\"uri\">https://opnsense.org/</a></li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n',231,61,1,'CC-BY-SA','Windows, Firewalls, SDN',0,0,1),
(2914,'2019-10-03','Describing how I listen to podcasts PART 4',526,'In this episode I cover my 2nd add on board for the raspberry pi','<ul>\r\n<li><p>PiFace Control and Display<br />\r\n<a href=\"https://www.piface.org.uk/products/piface_control_and_display/\" class=\"uri\">https://www.piface.org.uk/products/piface_control_and_display/</a></p></li>\r\n<li><p>How to fit, setup and install the required software for your Raspberry Pi running the Raspbian Operating system<br />\r\n<a href=\"https://www.piface.org.uk/guides/setting_up_pifacecad/fitting_PiFace_Control_and_Display/\" class=\"uri\">https://www.piface.org.uk/guides/setting_up_pifacecad/fitting_PiFace_Control_and_Display/</a></p></li>\r\n</ul>\r\n<p>Pictures 01, 02 and 03 show how the PiFace Control and Display board and raspberry pi fit into the case<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/hpr2914/Picture-01.JPG\" alt=\"Picture-01.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/hpr2914/Picture-02.JPG\" alt=\"Picture-02.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/hpr2914/Picture-03.JPG\" alt=\"Picture-03.JPG\" /></p>\r\n<p>Pictures 04 and 05 shows the piece of plastic used to transfer the light from the LED’s on the Pi board to the holes in the casing. This is supposed to allow you to monitor the PI LED’s. I held it in place using a piece of Blu Tack.<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/hpr2914/Picture-04.JPG\" alt=\"Picture-04.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/hpr2914/Picture-05.JPG\" alt=\"Picture-05.JPG\" /></p>\r\n<ul>\r\n<li>Wikipedia article about Blu Tack<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Blu_Tack\" class=\"uri\">https://en.wikipedia.org/wiki/Blu_Tack</a></li>\r\n</ul>\r\n<p>Picture 6 shows the completed box<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/hpr2914/Picture-06.JPG\" alt=\"Picture-06.JPG\" /></p>\r\n<p>Pictures 7 and 8 show the project in operation and mounted on a spare Anker tablet stand that I had lying about.<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/hpr2914/Picture-07.JPG\" alt=\"Picture-07.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2914/hpr2914/Picture-08.JPG\" alt=\"Picture-08.JPG\" /></p>\r\n<p>This is an example of the Anker stand I used. I use it to hold my project at a 45 degree angle so I can see it from around the room, it is intended to be used as a tablet stand.<br />\r\n<a href=\"https://www.ebay.co.uk/itm/Anker-Multi-Angle-Portable-Stand-for-Tablets-7-10-inch-E-readers-and-0-4lb-for-/282696421630?_trksid=p2385738.m4383.l4275.c10\">Anker stand for my Nexus 7, pictures, links</a></p>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Raspberry Pi, hardware, electronics, projects',0,0,1),
(2915,'2019-10-04','Intro - My Recording Setup',1248,'My first HPR episode. A bit of an intro and then a description of my recording setup.','<p>I discuss loading Fedora on various bits of older hardware and devise a plan to turn one of those bits of older hardware into a dedicated headless audio processor using its firewire port to keep yet another older piece of hardware alive: a Yamaha GO46 audio interface.</p>\r\n<p>Having done that and finding that it all performs admirably, I illogically decide to replace it with newer (but not new) hardware and buy yet another different model firewire audio interface: a Focusrite Saffire Pro 24.</p>\r\n<p>I record the end of the show on audio interface #3: a USB based Steinberg UR22mkII, which one could argue that I should have been using all along, leaving the firewire gear in the last decade where it belongs (?).</p>',380,0,0,'CC-BY-SA','Fedora, Firewire, Audio Interface',0,0,1),
(2919,'2019-10-10','hosting software in HPR show notes',626,'boats are awesome, but might lead to hosting software in the HPR show notes ','<pre><code>#!/usr/bin/env python\r\nimport urllib.request\r\nimport json\r\nimport re\r\nimport subprocess\r\n\r\n# see https://www.weather.gov/documentation/services-web-api\r\n\r\n#where are we? GPS coordinates\r\nlat = 39.275235\r\nlon = -120.9199507\r\n#what is the user agent string?\r\nagent = &quot;Jezra&#39;s fun lil script&quot;\r\n#minimum wind speed in mph?\r\nmin_speed = 9\r\n\r\ndef get_api_data(endpoint):\r\n  print(endpoint)\r\n  #prepare the connection with custom headers\r\n  request = urllib.request.Request(endpoint, headers={&quot;User-Agent&quot;:agent})\r\n  #create a handler for the request\r\n  handler = urllib.request.urlopen(request)\r\n  #get the text\r\n  text = handler.read()\r\n  #parse the json text to a python object\r\n  obj = json.loads(text)\r\n  return obj\r\n\r\ndef wind_is_good(s):\r\n  #use regex to find the matches\r\n  matches = re.findall(&quot;[0-9]+&quot;,s)\r\n  for match in matches:\r\n    #convert string to int\r\n    m = int(match)\r\n    #is the speed good?\r\n    if(m&gt;=min_speed):\r\n      return True\r\n  #if we get here, there is no match :(\r\n  return False\r\n\r\nstart_url = &quot;https://api.weather.gov/points/{0},{1}&quot;.format(lat,lon)\r\n#get the json response from the start_url as a python object\r\nobj = get_api_data(start_url)\r\n\r\n#get the forecast url from the returned data\r\nforecast_url = obj[&#39;properties&#39;][&#39;forecast&#39;]\r\n\r\n# process the forecast url\r\nforecast = get_api_data(forecast_url)\r\n\r\n#loop through the forcast periods\r\nfor period in forecast[&#39;properties&#39;][&#39;periods&#39;]:\r\n  #put name and windspeed into easier to handle variable names\r\n  name= period[&#39;name&#39;]\r\n  wind = period[&#39;windSpeed&#39;]\r\n  print (name, wind)\r\n  #check the wind speed\r\n  if wind_is_good(wind):\r\n    subprocess.call([&quot;textjezra&quot;,&quot;{0}: {1}&quot;.format(name,wind)])\r\n</code></pre>\r\n',243,25,0,'CC-BY-SA','canoe, ptython, api, weather',0,0,1),
(2921,'2019-10-14','Geocaching with the family',2916,'Dave and his family take a wander around a wood looking for Geocaches','<p>In this episode, Dave and his family wander the paths of <a href=\"https://www.doncaster.gov.uk/services/culture-leisure-tourism/sandall-beat-wood\">Sandall Beat Wood</a> in <a href=\"https://en.wikipedia.org/wiki/Doncaster\">Doncaster</a> to participate in the game of <a href=\"https://en.wikipedia.org/wiki/Geocaching\">Geocaching</a>. During this time, which demonstrates an unusual level of failure in us playing the game, we try and explain what the game is all about.</p>\r\n<p>No, not <a href=\"https://en.wikipedia.org/wiki/The_Game_(mind_game)\">The Game</a>...</p>\r\n<p>As I explain at the beginning of the episode, this is a fairly long episode which hasn\'t been edited down much, so there are a lot of ambient pauses and heavy breathing to be enjoyed.</p>\r\n<p><em>Recorded in the field on my <a href=\"https://www.amazon.co.uk/Olympus-DM-3-Digital-Voice-Recorder/dp/B003UP6ALA\">Olympus DM-3</a> voice recorder.</em></p>\r\n<h2 id=\"caches-explored\">Caches explored</h2>\r\n<ul>\r\n<li>Cache 1 - <a href=\"https://coord.info/GC7F8ND\">GC7F8ND</a> - not found</li>\r\n<li>Cache 2 - <a href=\"https://coord.info/GC50TVW\">GC50TVW</a> - not found</li>\r\n<li>Cache 3 - <a href=\"https://coord.info/GC7KRHH\">GC7KRHH </a> - found!</li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://next.moobug.net/index.php/apps/gallery/s/iGwmZMtyaD52ecg\">Link to photos and screenshot</a></li>\r\n<li><a href=\"https://geocaching.com\">geocaching.com</a></li>\r\n<li>Official Geocaching App: <a href=\"https://play.google.com/store/apps/details?id=com.groundspeak.geocaching.intro\">Google Play</a> | <a href=\"https://itunes.apple.com/app/apple-store/id329541503\">App Store</a></li>\r\n<li>c:geo Geocaching app: <a href=\"https://play.google.com/store/apps/details?id=cgeo.geocaching\">Google Play</a></li>\r\n</ul>\r\n',314,0,0,'CC-BY-SA','geocaching, outdoors, family',0,0,1),
(2948,'2019-11-20','Testing with Haskell',2560,'Introduction on HSpec and QuickCheck','<h2 id=\"intro\">Intro</h2>\r\n<p>I have liked writing automated tests for a long time, so it’s not a surprise that I end up writing them in Haskell too. This is very broad topic, so this episode only scratches the surface.</p>\r\n<h2 id=\"hspec\">HSpec</h2>\r\n<p>HSpec is testing framework that automatically detects tests, like most of the modern systems. It supports hierarchies, so one can organize tests by feature for example.</p>\r\n<pre><code>spec :: Spec\r\nspec = do\r\n    describe &quot;Very important feature&quot; $ do\r\n        it &quot;Execution should be error free&quot; $ do\r\n            ...\r\n\r\n        it &quot;Flux capacitors can be charged&quot; $ do\r\n            ...\r\n\r\n    describe &quot;Somewhat less important feature&quot; $ do\r\n        ...</code></pre>\r\n<h2 id=\"unit-test\">Unit test</h2>\r\n<p>Unit test tests a single case with fixed set of inputs. With pure functions these are a pleasure to write as they’re really just data in, data out, verify results. Below is two examples:</p>\r\n<pre><code>spec :: Spec\r\nspec = do\r\n    describe &quot;Markov chain configuration&quot; $ do\r\n        it &quot;Adding new starting element to empty configuration creates item with frequency of 1&quot; $ do\r\n            let config = addStart (&quot;AA&quot; :: DT.Text) emptyConfig\r\n            config ^? (configStartsL . _head . itemFreqL) `shouldBe` Just 1\r\n            config ^? (configStartsL . _head . itemItemL . _Just) `shouldBe` Just &quot;AA&quot;\r\n\r\n        it &quot;Adding same element twice to empty configuration creates item with frequency of 2&quot; $ do\r\n            let config = addStart &quot;AA&quot; $\r\n                         addStart (&quot;AA&quot; :: DT.Text) emptyConfig\r\n            config ^? (configStartsL . _head . itemFreqL) `shouldBe` Just 2\r\n            config ^? (configStartsL . _head . itemItemL . _Just) `shouldBe` Just &quot;AA&quot;</code></pre>\r\n<p>Both are for testing configuring markov chains. First one checks that adding a starting element in empty configuration results correct item with correct weight being added. Second checks that adding same starting element twice results weight of 2.</p>\r\n<p>Both tests use lenses for reading nested data structure. Episode doesn’t cover them much at all, as it’s enough to know that <code>(configStartsL . _head . itemFreqL)</code> focuses on starting elements of configuration, selects first item of the list and then selects frequency of that item. Lenses can also be used for modifying data and they don’t have to focus on only one element.</p>\r\n<p>Unit tests are easy enough to write, they verify single thing about the unit being tested and are usually super fast to run and not error prone.</p>\r\n<h2 id=\"property-based-test\">Property based test</h2>\r\n<p>Property based tests are used to check that a certain property holds with randomly generated input parameters. I’m using HSpec as testing framework and QuickCheck as tool for generating test data:</p>\r\n<pre><code>spec :: Spec\r\nspec = do\r\n    describe &quot;planets&quot; $ do\r\n        describe &quot;food&quot; $ do\r\n            it &quot;food requirement for positive amount of population is more than zero&quot; $ do\r\n                forAll positivePopulation $ \\x -&gt; foodRequirement x  &gt; RawResource 0\r\n\r\n            it &quot;food base production for farms is equal or greater than their amount&quot; $ do\r\n                forAll someFarms $ \\x -&gt; (sum (fmap foodBaseProduction x)) &gt; (RawResource $ length x)</code></pre>\r\n<p>Above we have two tests. First one checks that with any non-zero population, <code>foodRequirement</code> is greater than 0. Second one check that with any positive amount of farm, <code>foodBaseProduction</code> is greater than amount of the farms.</p>\r\n<p><code>positivePopulation</code> is Generator, that is used by QuickCheck to generate random data for testing. Its definition is shown below:</p>\r\n<pre><code>singlePopulation :: Gen PlanetPopulation\r\nsinglePopulation = do\r\n    let aPlanetId = toSqlKey 0\r\n    let aRaceId = toSqlKey 0\r\n    aPopulation &lt;- arbitrary `suchThat` \\x -&gt; x &gt; 0\r\n    return $ PlanetPopulation aPlanetId aRaceId aPopulation\r\n\r\npositivePopulation :: Gen [PlanetPopulation]\r\npositivePopulation = do\r\n    k &lt;- arbitrary `suchThat` \\x -&gt; x &gt; 0\r\n    vectorOf k singlePopulation</code></pre>\r\n<p>Generated data can be really simple or very complex. Generating complex data is often convenient to break into smaller steps and write generators for them.</p>\r\n<p>Property based tests are somewhat harder to write than unit tests, but they can potentially cover edge cases that might otherwise not been discovered.</p>\r\n<h2 id=\"working-with-database\">Working with database</h2>\r\n<p>All tests shown so far have been testing pure code, that is, code that is data in, data out. When database is introduced, things get more complicated. Suddenly there’s much more possibilities for errors. Below is an example of such a test:</p>\r\n<pre><code>spec :: Spec\r\nspec = withApp $ do\r\n\r\n    describe &quot;Status handling&quot;  $ do\r\n        describe &quot;Planet statuses&quot;  $ do\r\n            it &quot;Expired planet statuses are removed and news created&quot; $ do\r\n\r\n                sId &lt;- runDB $ insert $ StarSystem\r\n                        { starSystemName = &quot;Aldebaraan&quot;\r\n                        , starSystemCoordX = 10\r\n                        , starSystemCoordY = 20\r\n                        , starSystemRulerId = Nothing\r\n                        }\r\n\r\n                fId &lt;- runDB $ insert $ Faction\r\n                        { factionName = &quot;Star lords&quot;\r\n                        , factionHomeSystem = sId\r\n                        , factionBiologicals = 10\r\n                        , factionMechanicals = 10\r\n                        , factionChemicals = 10\r\n                        }\r\n\r\n                pId1 &lt;- runDB $ insert $ Planet\r\n                        { planetName = &quot;New Earth&quot;\r\n                        , planetPosition = 3\r\n                        , planetStarSystemId = sId\r\n                        , planetOwnerId = Just fId\r\n                        , planetGravity = 1.0\r\n                        , planetRulerId = Nothing\r\n                        }\r\n\r\n                _ &lt;- runDB $ insert $ PlanetStatus\r\n                        { planetStatusPlanetId = pId1\r\n                        , planetStatusStatus = GoodHarvest\r\n                        , planetStatusExpiration = Just 20201\r\n                        }\r\n\r\n                let status = Simulation 20201\r\n                _ &lt;- runDB $ insert status\r\n\r\n                news &lt;- runDB $ removeExpiredStatuses (simulationCurrentTime status)\r\n\r\n                statuses &lt;- runDB $ selectList [ PlanetStatusPlanetId ==. pId1 ] []\r\n                loadedNews &lt;- runDB $ selectList [] [ Asc NewsDate ]\r\n\r\n                liftIO $ statuses `shouldSatisfy` (\\x -&gt; length x == 0)\r\n                liftIO $ news `shouldSatisfy` (\\x -&gt; length x == 1)\r\n                liftIO $ loadedNews `shouldSatisfy` (\\x -&gt; length x == 1)</code></pre>\r\n<p>There’s a lot more code that had to be written for this test and majority of it is for setting up database state. The test if for ensuring that when good harvest boost expires, it is removed from database and respective news article is created.</p>\r\n<p>These kinds of tests have a lot more code and are much more slower to run because of the communication with a database. There’s also more cases where something can go wrong. But in the end, these kinds of tests are needed if one wants to verify that interaction with database is working as planned.</p>\r\n<h2 id=\"testing-api\">Testing API</h2>\r\n<p>Last example is about testing REST API. There are two tests, where the first one is checking that proper access control is in place and second one checks that pending messages are correctly retrieved.</p>\r\n<pre><code>spec :: Spec\r\nspec = withApp $ do\r\n    describe &quot;Message handling&quot; $ do\r\n        it &quot;unauthenticated user can&#39;t access messages&quot; $ do\r\n            _ &lt;- get ApiMessageR\r\n            statusIs 401\r\n\r\n        it &quot;pending messages are loaded&quot; $ do\r\n            (pId, fId) &lt;- setupPerson\r\n            _ &lt;- runDB $ insert $ researchCompleted 25250 fId HighSensitivitySensors\r\n            user &lt;- createUser &quot;Pete&quot; (Just pId)\r\n            authenticateAs user\r\n            _ &lt;- get ApiMessageR\r\n            resp &lt;- getResponse\r\n            let jsonM = join (decode &lt;$&gt; simpleBody &lt;$&gt; resp) :: Maybe Value\r\n\r\n            assertEq &quot;message tag&quot;\r\n                     (jsonM ^? (_Just . _Array . _head . key &quot;tag&quot; . _String))\r\n                     (Just &quot;ResearchCompleted&quot;)\r\n            assertEq &quot;star date&quot;\r\n                     (jsonM ^? (_Just . _Array . _head . key &quot;starDate&quot; . _Integer))\r\n                     (Just 25250)\r\n            assertEq &quot;technology&quot;\r\n                     (jsonM ^? (_Just . _Array . _head . key &quot;contents&quot; . key &quot;Technology&quot; . _String))\r\n                     (Just &quot;HighSensitivitySensors&quot;)\r\n\r\n            statusIs 200</code></pre>\r\n<p>Here extra complication is created by the fact that many features of the system are behind authentication and authorization. Luckily Yesod comes with helper function <code>authenticateAs</code>, that allows code to authenticate when system is running in development mode.</p>\r\n<p>These test are even slower than any of the previous ones, but on the other hand, they test whole chain from user interaction to database and back.</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>There’s lots of things that I couldn’t cover in such a short time, like various types of tests: UI testing, performance testing, security testing, long running testing…, the list goes on and on. But hopefully this episode gave you ideas what kinds of tests one can write and how to get started doing so using Haskell.</p>\r\n<p>Best way to reach me is email or at fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','haskell, testing, HSpec, QuickCheck',0,0,1),
(2924,'2019-10-17','Hacking an Alarm Clock to Make it Quieter',365,'I talk about installing a resistor in the speaker wire of an alarm clock so it won\'t be so loud','<p>The alarm clock on my bedside table had a very loud alarm&mdash;so loud that it scared me and made my heart race when it went off. I know you\'re thinking I should just use an alarm on my phone, but for whatever reason I wanted to use the alarm clock. In this episode I talk about installing a resistor in the speaker wires of the alarm clock so that it won\'t be so loud when it goes off. It\'s all good now. Loud enough to wake me up, but not so loud that it scares everyone.</p>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157710800691661\" title=\"Alarm Clock Hack\" target=\"_blank\"><img src=\"https://live.staticflickr.com/65535/48718052852_81d452d4c8.jpg\" width=\"500\" height=\"394\" alt=\"Alarm Clock Hack\"></a></p>\r\n',238,0,0,'CC-BY-SA','clocks, electronics, decibels, noise levels, alarm clocks, alarms',0,0,1),
(2937,'2019-11-05','Lord D\'s Film Reviews: His Girl Friday',2937,'Lostnbronx reviews an old screwball comedy.','<p>Ignore the address for the film that I give in the review. Here’s a MUCH better copy than the one I watched. It’s another upload on Archive.org:</p>\r\n<p><a href=\"https://archive.org/details/HisGirlFriday-1940\" class=\"uri\">https://archive.org/details/HisGirlFriday-1940</a></p>\r\n<p>Boy, I wish I’d found this one first!</p>\r\n',107,109,0,'CC-0','review, film, lord d',0,0,1),
(2933,'2019-10-30','A walk through my PifaceCAD Python code – Part 1',871,'In this series a do whirl wind tour of the Python code I developed for my PifaceCAD board','<p>In this series a do whirl wind tour of the Python code I developed to control my PifaceCAD raspberry pi add on board. I this use to control a music player running on a remote raspberry pi upstairs.</p>\r\n<p>In this episode I cover my use of global variables.</p>\r\n<p>List of global variables along with associated comments explaining what they are used for</p>\r\n<pre><code># GLOBAL VARIABLES\r\n\r\nRemoteDevice = &quot;pi@192.168.1.13&quot;\r\n# Username and ip address of the remote device to control\r\n\r\nSeekMin = -6\r\n# Sets the minimum value of the variable SeekPosition\r\n\r\nSeekMax = 6\r\n# Sets the maximum value of the variable SeekPosition\r\n\r\nSeekPosition = 0\r\n# stores seek menu position,\r\n\r\nSeekMenu = False\r\n# used to track seek menu state, ie are we in seek menu or not\r\n\r\nFirstPass = True\r\n# Used to track 1st time button 5 (backlight toggle) is pushed, turns off blinkstick\r\n\r\nLcdLightOn = False\r\n# used to track toggle sate of backlight button 5\r\n\r\nMenuMin = 0\r\n# Sets the minimum value of variable &quot;Menu&quot;\r\n\r\nMenuMax = 2\r\n# Sets the maximum value of variable &quot;Menu&quot;\r\n\r\nMenu = 0\r\n# global variable used to keep trak of selected menu\r\n\r\nIrActive = False\r\n# used to track toggle state of active infrared buttons, when false disables\r\n# all buttons on the remote control except the blue button.\r\n\r\nStoredTime = 0\r\n# Stores curent time in seconds when a button is pushed, used by double button tap feature\r\n\r\n#GET_IP_CMD = &quot;hostname –all-ip-addresses&quot;\r\n# Debian 7 wheezy, Command to get IP adress\r\n\r\nGET_IP_CMD = &quot;hostname --all-ip-addresses | cut -d&#39; &#39; -f1&quot;\r\n# Debian 8 jessie, Command to get IP adress\r\n\r\n#GET_ESSID_CMD = &quot;iwconfig wlan0 | grep &#39;ESSID:&#39; | cut -d&#39;:&#39; -f2&quot;\r\n# Debian 7 wheezy, Command to get wifi ESSID\r\n\r\nGET_ESSID_CMD = &quot;/sbin/iwconfig wlan0 | grep &#39;ESSID:&#39; | cut -d&#39;:&#39; -f2&quot;\r\n# Debian 8 wheezy, Command to get wifi ESSID\r\n\r\nGET_WIFI_STRENGTH_CMD = &quot;/sbin/iwconfig wlan0 | grep &#39;Link Quality=&#39; | awk &#39;{ print $2 }&#39;&quot;\r\n# Command to get wifi signal strength</code></pre>\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(2923,'2019-10-16','Describing how I listen to podcasts PART 5',1750,'In this episode I cover how I use my 2nd add on board the PiFace Control and Display','<p>Below are examples of messages shown on the screen during operation</p>\r\n<p><em>System Up</em> (Unfortunately I didn’t get a picture of this message)</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-01.JPG\" alt=\"Picture 01\" /><br />\r\nShows the unit waiting to get a wi-fi connection and get given an IP address.</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-02.JPG\" alt=\"Picture 02\" /><br />\r\nUnit goes to the HPR site and gets the number of days to free slot in the show queue. At the time when I took the picture the queue had a healthy 22 shows!</p>\r\n<p>Links to three previous shows I did that mention the Blinkstick</p>\r\n<ol type=\"1\">\r\n<li><p>Solving a problem I had with my Blinkstick<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2089\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2089</a></p></li>\r\n<li><p>Tracking the HPR queue using python and a Blinkstick<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2340\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2340</a></p></li>\r\n<li><p>Follow on to HPR2340 (Tracking the HPR queue in Python)<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2344\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2344</a></p></li>\r\n</ol>\r\n<ul>\r\n<li>Link to Moc, Music On Console<br />\r\n<a href=\"https://moc.daper.net/\" class=\"uri\">https://moc.daper.net/</a></li>\r\n</ul>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-03.JPG\" alt=\"Picture 03\" /> <img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-04.JPG\" alt=\"Picture 04\" /><br />\r\nMenu 0 Podcasts screens</p>\r\n<pre><code>0 [PODCASTS]\r\n0 1 &lt;|| PLAY/PAUSE (Toggles moc between play and Pause)\r\n0 2 &lt;&lt;  INFORMATION(Displays information about the current track)\r\n0 3 &lt;&lt;  (Move to previous track in playlist)\r\n0 4 &lt;&lt;  (Move to next track in playlist)\r\n0 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Seek forward or back in current track)</code></pre>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-05.JPG\" alt=\"Picture 05\" /> <img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-06.JPG\" alt=\"Picture 06\" /><br />\r\nMenu 1 Audiobooks screens</p>\r\n<pre><code>1 [AUDIOBOOKS]\r\n1 1 &lt;|| PLAY/PAUSE (Toggles moc between play and Pause)\r\n1 2 &lt;&lt;  INFORMATION(Displays information about the current track)\r\n1 3 &lt;&lt;  (Move to previous track in playlist)\r\n1 4 &lt;&lt;  (Move to next track in playlist)\r\n1 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Seek forward or back in current track)</code></pre>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-07.JPG\" alt=\"Picture 07\" /> <img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-08.JPG\" alt=\"Picture 08\" /><br />\r\nMenu 2 System screens</p>\r\n<pre><code>2 [SYSTEM]\r\n2 1 Sys Information (System information)\r\n2 2 WiFi (Displays WiFi inofrmation such SSID &amp; signal strength)\r\n2 3 HPR (Displays the number days to the next free slots on FPR que)\r\n2 4 Not shown, (Not in use)\r\n2 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Shut-down the Raspberry Pi)</code></pre>\r\n<p>Infra-red Sensor</p>\r\n<ul>\r\n<li><p>Example of my <a href=\"https://www.google.com/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=images&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=2ahUKEwin95XTnLbeAhURzaQKHcNIADEQjRx6BAgBEAU&amp;url=http%3A%2F%2Fwww.remotes4you.eu%2Fen%2Fsamsung-original-samsung-remote-control-aa59-00465.html&amp;psig=AOvVaw04vHTRnb1mBQYLrBKpOAKf&amp;ust=1541265724536724\">Samsung TV remote control</a></p></li>\r\n<li><p>Lirc Article from Wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/LIRC\" class=\"uri\">https://en.wikipedia.org/wiki/LIRC</a></p></li>\r\n</ul>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-09.JPG\" alt=\"Picture 09\" /><br />\r\nInfra-red sensor turned on</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-10.JPG\" alt=\"Picture 10\" /><br />\r\nInfra-red sensor turned off</p>\r\n<ul>\r\n<li>Kodi article on Wikipedia, (Formerly XBMC)<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Kodi_(software)\" class=\"uri\">https://en.wikipedia.org/wiki/Kodi_(software)</a></li>\r\n</ul>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-11.JPG\" alt=\"Picture 11\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-12.JPG\" alt=\"Picture 12\" /><br />\r\nExample of a message being sent to the unit telling me that a backup is complete. The bright pink LED on the Blinkstick lets me know at a glance that a message has been sent to the display.</p>\r\n<ul>\r\n<li><p>EEE PC article on Wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Asus_Eee_PC\" class=\"uri\">https://en.wikipedia.org/wiki/Asus_Eee_PC</a></p></li>\r\n<li><p>Switch Bounce article on Wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Switch#Contact_bounce\" class=\"uri\">https://en.wikipedia.org/wiki/Switch#Contact_bounce</a></p></li>\r\n</ul>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-13.JPG\" alt=\"Picture 13\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-14.JPG\" alt=\"Picture 14\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-15.JPG\" alt=\"Picture 15\" /><br />\r\nA flavour of what information is shown when the information button 2 is pushed. The picture showing the title scrolling from right to left was blurred so I didn’t include this.</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-16.JPG\" alt=\"Picture 16\" /><br />\r\nThe menu displayed during seek, this in initiated by pushing and releasing the toggle button while either in the Podcasts main menu 0 or Audio book main menu 1.</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2923/hpr2923/Picture-17.JPG\" alt=\"Picture 17\" /><br />\r\nThe shut-down menu this in initiated by pushing and releasing the toggle button while in the System main menu 2.</p>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(2925,'2019-10-18','LinuxLugCast\'s Memorial for FiftyOneFifty ',7541,'We are here tonight to share memories of our friend Donald Grier aka FiftyOneFifty.','<p><a href=\"https://www.linuxlugcast.com/category/https-honkeymagoo-000webhostapp-com-home-podcast-2\">LinuxLugCast Memorial</a></p>\r\n\r\n<p>We are here tonight to share memories of our friend<strong> Donald Grier</strong> aka <strong>FiftyOneFifty</strong></p>\r\n<p>Fifty was involved with many podcast over the years</p>\r\n<ul class=\"bullet\">\r\n<li>Obviously LinuxLugCast <a href=\"https://www.linuxlugcast.com\">https://www.linuxlugcast.com</a></li>\r\n<li><a href=\"https://archive.org/search.php?query=linuxlugcast\">https://archive.org/search.php?query=linuxlugcast</a></li>\r\n<li>Hacker Public Radio <a href=\"https://hackerpublicradio.org/\">https://hackerpublicradio.org/</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0131.html\">https://hackerpublicradio.org/correspondents/0131.html</a></li>\r\n<li>/dev/random <a href=\"https://devrandomshow.org/\">https://devrandomshow.org/</a></li>\r\n<li><a href=\"https://devrandomshow.org/shows/?f=all.html\">https://devrandomshow.org/shows/?f=all.html</a></li>\r\n<li>Kernal Panic Oggcast <a href=\"https://archive.org/search.php?query=KernelPanic+Oggcast&page=2\">https://archive.org/search.php?query=KernelPanic+Oggcast&page=2</a></li>\r\n</ul>\r\n<p><u>Shared thoughts and memories</u>:<br>\r\n<strong>Ken Fallon</strong></p>\r\n<p>I was in the back room pottering away when espeak notified me that 5150<br>\r\nhad passed away. I went back to the computer and read the announcement<br>\r\nin the IRC Logs and confirmed the news. Some dude I had never met, never<br>\r\nseen in my life, and didn’t even know his real name, was gone and I was<br>\r\nin the back room crying my eyes out.</p>\r\n<p>Crying for the loss of a friend.</p>\r\n<p>When had he become a friend ?</p>\r\n<p>People have been socializing since the dawn of humans, be it at the camp<br>\r\nfire, the forge, pub, hairdresser, sports club, church, or wherever.</p>\r\n<p>For us it was via Linux podcasting. You are there because you share a<br>\r\ncommon interest. If you were into Linux podcasting then you could not<br>\r\nhelp but get to know fiftyonefifty. The guy turned up everywhere if not<br>\r\non the podcasts themselves he was commenting on them. I have 619<br>\r\nmessages from him about HPR alone.</p>\r\n<p>He submitted his first show back in 2010 and has been a regular since<br>\r\nthen. At some point after that I knew that he was on my “special list”<br>\r\nof people who I could rely upon to fill the queue if needed.</p>\r\n<p>And as I sat there crying I realized that he had also sneaked onto my<br>\r\nlist of friends.</p>\r\n<p>I’ve not always been a fan of the New Year Show, but now I am glad for<br>\r\nit. While I may never get to share a beer with him any more, or take him<br>\r\nup on his promise to let me fire off some rounds on his farm, I did at<br>\r\nleast get to shoot the breeze with him for many a happy hour.</p>\r\n<p>Goodbye old friend you will be missed</p>\r\n<p><strong>Anonymous</strong><br>\r\nA Ramble for FiftyOneFifty: King of Ramblers</p>\r\n<p>I am writing a Ramble for a man I knew only as FiftyOneFifty.  I never knew his real name,<br>\r\nnor do I know if he knew mine.  In many things, Names do not matter, People, Actions, and<br>\r\nfeeling do.   We podcasted together off and on, over several years.  I don’t recall exactly<br>\r\nhow many.   It doesn’t matter now, since they are all that there will ever be.  We grew to be<br>\r\ngood friends.  I never met him in person, online life is like that.  I only know my life would be<br>\r\nmuch poorer, if I had not known him.  Hearing he died, shattered me.  This Ramble is my try<br>\r\nat putting most the pieces back in place.  Of course, nothing can replace the largest piece,<br>\r\nthe Man Himself.  My heart and prayers go out to those friends and family dealing with his loss.</p>\r\n<p>His death is a harsh, unchangeable, fact.  I shall focus on his life, and things better remembered<br>\r\nthan the wall we all will hit one day.  Fifty was a man if Life, Joy, and passions.  That is how I shall<br>\r\nwrite of him.  I had a far too short time, to learn about him, and from him.  It will also  warm my heart,<br>\r\nwhere he live yet, and has for a long time.  I learned this fact, only after I could no longer talk with him.</p>\r\n<p>I found him easy to talk with, and listen to.  He was also “Vaccinated with a Victrola Needle ”  as<br>\r\nmy relatives might say.  He could ramble on for hours. enjoyably.  He virtually always made sense,<br>\r\neven when in his cups.  He shared himself, his hobbies, experience, and his travels with us, on our<br>\r\npodcasts.  While he went to Linux events, he never limited himself to just linux topics.  He reported the<br>\r\nnon Linux features of events.  This great for choosing family trips to them.   He included accommodations, restaurants, and pubs in the area.  I don’t travel, or drive, so these second hand visit were a delight.</p>\r\n<p>His research and Linux activities made up much of his contribution to our podcasts.  He life also<br>\r\nflowed in, to entertain and inform us.  He lived in the country, farming, cows, trouble getting Internet<br>\r\nservice were included.  My parents can off farms, so he even kept my ties to that life alive.  Firearms, cars, especially his beloved Hearse were shared interests.  tale from his tech support work, for businesses and schools enlightened me.  Farmers are natural pack rats, so gathering all sorts of discarded computer gear was natural.   Unfortunately he lost most of it in the fire which destroyed his house.   Losing his house, and even his dear father, never seemed to blight his spirit or life, in the long run.  It would be natural to keep such private matters from more distant friends, as I was.  Nor did his long illness color the side of him I saw.  it got in his way, sometimes,  as I recall, but never in his spirit.  I wish I had been closer, to offer myself more to the man I miss dearly.  I must just try to use his independent example, in my own life.  Anyone could do much, worse.   His quiet touch helped heal me in ways I am only now realizing.</p>\r\n<p>I started the day in tears, still aching from losing a rare, true friend.  Then I recalled a song from Toby Keith, called “Cryin’ for Me (Wayman’s Song ) written about he loss of his close friend, Wayman Tisdale.  Toby found about his friends passing on Friday.  On Sunday Toby was driven to write the memorial song.  In it he says his tears are not for his lost friend, who is now in Heaven, but for Toby himself, and all those family, and friends, Wayman left behind.  I believe Fifty is in Heaven, with his Dad, and those who have gone before.  He will see things from the Good Seats.  He can enjoy all the Holidays, and never feel the cold.  I was driven to write like Toby, to handle my own shock and grief.  We Cry and Mourn, those left behind in the Mortal world, for our loss and pain.  Our dear One is beyond pain, perhaps for the first time in years.  He has earned his time in Grace.  He as paid as we pay now, for life beyond grief, with those who have gone ahead.   I hope my words and memories may help  the ones he left behind.  Pain is a Mortal thing. It need not be deadly, or poisonous.  Fifty’s Life is a great example of this and many other things.  I hope we can go forward, with his example helping heal our loss of him.    God Bless You, Fifty, and those you touched in turn.</p>\r\n',269,0,1,'CC-BY-SA','LinuxLugCast, FiftyOneFifty, Memorial, Syndication',0,0,1),
(2929,'2019-10-24','Recovering Files from a Dead MacBook Air',482,'I talk about recovering the files from my wife\'s dead MacBook Air using an Ubuntu Live CD.','<p>I talk about becoming a household hero by recovering my wife\'s files from her dead MacBook Air. Her laptop would not boot, shutting down seconds into the process each time she tried to start it up. I used an Ubuntu Live CD (DVD), with the commands <code>fdisk</code> and <code>fsck</code> to repair the damaged filesystem on the Mac. It still wouldn\'t boot even with the repaired filesystem, but I was able to mount the drive and copy her files to a USB drive.</p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li>Blog post Howto: <a href=\"https://miteshshah.github.io/mac/repair-fix-mac-hfs-partition-using-ubuntu/\">Repair/Fix MAC HFS+ Partition Using Ubuntu</a></li>\r\n</ul>\r\n',238,0,0,'CC-BY-SA','Ubuntu,Mac OS X,File Recovery,Filesystem Repair',0,0,1),
(2931,'2019-10-28','Wallabag for on premises article aggregation',690,'In this episode, I describes my trials and eventual triumph in installing Wallabag','<h2 id=\"addendum\">Addendum</h2>\r\n<p>I forgot to mention that Wallabag is also offered as a service for a small fee. Check out the website for more information.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://wallabag.org/en\">Wallabag website</a></li>\r\n<li><a href=\"https://doc.wallabag.org/en/admin/installation/installation.html\">Wallabag documentation</a></li>\r\n<li><a href=\"https://hub.docker.com/r/wallabag/wallabag\">Wallabag on Docker Hub</a></li>\r\n<li><a href=\"https://cockpit-project.org/\">Cockpit website</a></li>\r\n</ul>\r\n',300,0,0,'CC-BY-SA','self-hosted, docker',0,0,1),
(2939,'2019-11-07','Submit a show to Hacker Public Radio in 10 easy steps',601,'This is a 10 step walkthrough of submitting a show to HPR','<h2 id=\"steps\">Steps</h2>\r\n<ol>\r\n<li>Record your episode</li>\r\n<li>Go to <a href=\"https://hackerpublicradio.org\" class=\"uri\">https://hackerpublicradio.org</a></li>\r\n<li>Click on &quot;Give Shows&quot;</li>\r\n<li>Click on &quot;Calendar&quot; (the link is not obvious, so use your browser\'s find functionality to search for the word &quot;Calendar&quot;).<br />\r\n<small><em>Edit: Please use the ⇧Upload⇧ link in the menu bar</em></small>\r\n</li>\r\n<li>Choose a slot</li>\r\n<li>Submit your email address</li>\r\n<li>Click the link in the confirmation email</li>\r\n<li>Create your profile (if new), then fill in the form with title, summary and show notes</li>\r\n<li>Attach your episode and submit (wait for long upload process)</li>\r\n<li>Receive your confirmation email, and enjoy your episode!</li>\r\n</ol>\r\n',300,45,0,'CC-BY-SA','podcast, hpr, how-to',0,0,1),
(2926,'2019-10-21','Full Circle Magazine',181,'Just a short show to request support for one of the Linux communities longest standing Magazines','<p>Hi Everyone in HPR land this is Tony Hughes coming to you from Studio B at Woodbrooke Quaker Study Centre in Birmingham in the UK, where I am currently staying for a week of voluntary work.</p>\r\n<p>The reason for this short episode is to talk about a community magazine that I have been reading since I started to use Ubuntu Linux back in 2007. Full Circle magazine actually produced a pilot issue in April of 2007 and issue one was issued in June 2007. All issues are published as a free pdf download and all the content is under a Creative Commons licence.</p>\r\n<p>Free Circle Magazine initially started as an Ubuntu (and official spins of Ubuntu) magazine but over the years while still being officially about Ubuntu or Linux Distributions based on Ubuntu, many of the articles are applicable to those across the Linux community.</p>\r\n<p>Over the years, as well as printing one off articles about individuals’ journey to using Linux, reviews and letters from readers, there have been regular series on topics such as Inkscape, Python programming, Open/LibreOffice, Virtualisation and much more.</p>\r\n<p>Sadly after over 12 years of producing a regular monthly magazine for the Linux community some of the regular article series are coming to an end and due to ill health at least one regular writer is not able to contribute at the moment, and this is leaving the magazine short of content and in danger of possibly coming to an end.</p>\r\n<p>As a podcast community that is used to the idea of crowd sourced content, many of whom are also Linux users, could I ask that some of you that have read Full Circle, but never contributed, consider sending in some content. It could be an article on how you started using Linux, about some Linux software that you think the readers may be interested in learning more about, or just a letter to Ronnie to say thanks for all his efforts putting out a magazine every month for the last 12+ years.</p>\r\n<p>Like many things we often don’t miss them until they are gone, and I would hate to think that Full Circle Magazine is one of those things that I will miss in the future. I have put my money where my mouth is and in coming issues you may see me in print, talking about podcasting. You could even use any writing you do as the base for a HPR show, and achieve two goals in one go.</p>\r\n<p>All the best for now.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.woodbrooke.org.uk/\" class=\"uri\">https://www.woodbrooke.org.uk/</a></li>\r\n<li><a href=\"https://fullcirclemagazine.org/\" class=\"uri\">https://fullcirclemagazine.org/</a></li>\r\n<li><a href=\"https://fullcirclemagazine.org/issue-149/\" class=\"uri\">https://fullcirclemagazine.org/issue-149/</a></li>\r\n</ul>\r\n',338,0,0,'CC-BY-SA','Full Circle Magazine, Ubuntu, Linux, Free Magazine, Creative Commons',0,0,1),
(2934,'2019-10-31','Server Basics 106: Namespaces and containers',2033,'Klaatu talks about the unshare and lxc commands','<p>\r\nNamespaces provide context and constraints for processes on a Linux system.\r\nThey are utilised by the infrastructure of \"the cloud\" to create distinct \"containers\", in which processes may run without awareness of the system they are actually running upon.\r\n</p>\r\n\r\n<pre><code>\r\n// prove you are not running some process\r\n\r\n$ pidof tcsh\r\n// nothing\r\n\r\n$ sudo pidof tcsh\r\n// nothing\r\n\r\n// launch tcsh in a new namespace with unshare:\r\n\r\n$ sudo unshare --fork --pid --mount-proc tcsh\r\n\r\n// from within that session:\r\n\r\n# pidof tcsh\r\n1\r\n\r\n// wait what??\r\n// yes tcsh is the first pid of its own namespace\r\n\r\n// from another term\r\n$ ps 1\r\ninit\r\n\r\n$ pidof tcsh\r\n26814\r\n\r\n// from inside the namespace, pid is seen as 1\r\n// from outside, pid is normal\r\n\r\n$ ps tree | less\r\n// search for tcsh\r\n\r\n// See evidence of namespaces:\r\n\r\n$ ls /proc/*/ns\r\n\r\n$ ls /proc/26814/ns\r\nipc net pid user uts [...]\r\n</code></pre>\r\n\r\n<p>\r\nTo see this in action for a slightly more pragmatic purpose, you can use the <code>lxc</code> command.\r\nThe <a href=\"https://linuxcontainers.org/lxc/getting-started/\" target=\"_blank\">LXC</a> system uses namespaces and cgroups to create functional containers that act, more or less, like a Virtual Machine, except that they are built in containers so that they do not have to emulate hardware.\r\n</p>\r\n<p>If your system doesn\'t have LXC installed, first install it:\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo dnf install lxc lxc-templates lxc-doc\r\n\r\n// on Ubuntu or Debian:\r\n\r\n$ apt install lxc\r\n</code>\r\n</pre>\r\n\r\n<p>\r\nYou also need to create a network bridge so that your container and your host system (that\'s the computer you\'re sitting in front of right now) can communicate.\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo ip link add br0 type bridge\r\n$ sudo ip addr show br0\r\n7: br0: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc\r\n   noop state DOWN group default qlen 1000\r\n   link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff\r\n</code></pre>\r\n<p>\r\nNow give your bridge device an IP address that doesn\'t conflict with any existing IP address on your network:\r\n</p>\r\n<pre><code>\r\n$ sudo ip addr add 192.168.168.168 dev br0\r\n$ sudo ip link set br0 up\r\n</code></pre>\r\n\r\n<p>\r\nCreate a configuration for your container.\r\nYou can base this on the samples provided by lxc (located in /usr/share/docs/lxc or similar).\r\nEverything but <strong>veth</strong>, <strong>br0</strong>, and <strong>up</strong> is arbitrary. You can make up all the values.\r\n</p>\r\n\r\n<pre><code>\r\nlxc.utsname = hackerpublicradio\r\nlxc.network.type = veth\r\nlxc.network.flags = up\r\nlxc.network.link = br0\r\nlxc.network.hwaddr = 4a:49:43:49:79:bd\r\nlxc.network.ipv4 = 192.168.168.1/24\r\nlxc.network.ipv6 = 2003:db8:1:0:214:c0ff:ee0b:3596\r\n</code></pre>\r\n\r\n<p>\r\nNow install an OS into your container.\r\nOS templates are provided by LXC in /usr/share/doc/lxc/templates or a similar location.\r\n</p>\r\n\r\n<pre><code>\r\n$ ls -m /usr/share/lxc/templates/\r\nlxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos [...]\r\n</code></pre>\r\n\r\n<p>\r\nChoose a template and install.\r\nI use Alpine in the recorded show, because it\'s supposed to be really small.\r\nI don\'t necessarily recommend Alpine. I recommend Slackware, of course.\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo lxc-create --name slackware --template slackware\r\n</code></pre>\r\n\r\n<p>\r\nOnce the install is done, start your container:\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo lxc-start --name slackware\r\n--rcfile ~/mycontainer.conf\r\n</code></pre>\r\n\r\n<p>\r\nNow attach to the container:\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo lxc-attach --name slackware\r\n#\r\n</code></pre>\r\n\r\n<p>\r\nRun a command.\r\n</p>\r\n\r\n<pre><code>\r\n# uname -av\r\nLinux hackerpublicradio 5.3.0.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\r\n</code></pre>\r\n\r\n<p>\r\nThis is the technology that Docker and <a href=\"https://www.opencontainers.org/\" target=\"_blank\">OCI</a> projects use to create containers.\r\nAnd when a bunch of containers start swarming around on a bunch of hosts, you eventually end up with a cloud.\r\nHow do you manage all of these things?\r\nThat will be the topic for the next entry in this series, I\'ll bet.\r\n</p>\r\n',78,0,0,'CC-BY-SA','server,container,docker,serverless,cloud,sys admin,kubernetes',0,0,1),
(2935,'2019-11-01','The work of fire fighters, part 3',1807,'The continued introduction into the work of fire fighters','<h2 id=\"continued-general-basic-knowledge-of-fire-fighting.\">Continued general basic knowledge of fire fighting.</h2>\r\n<p>Talking about large water system, breathing gear, “the walk”, flash-over and back-draft.</p>\r\n',369,0,0,'CC-BY-SA','fire fighting, fire brigade',0,0,1),
(2941,'2019-11-11','Server Basics 107: Minishift and container management',2331,'Klaatu introduces Minishift, a local test environment for a single-node cloud','<p>Learn \"the OS of the cloud\" with <a href=\"https://www.okd.io/minishift/\" target=\"_blank\">minishift</a> or <a href=\"https://github.com/kubernetes/minikube\" target=\"_blank\">minikube</a>\r\n</p>',78,0,0,'CC-BY-SA','server,container,docker,serverless,cloud,sys admin,kubernetes',0,0,1),
(2943,'2019-11-13','Music as Life',582,'quantum harmony','<ul>\r\n<li>Thomas Orr Anderson<br />\r\n<a href=\"https://www.phisonics.com/about-2/\" class=\"uri\">https://www.phisonics.com/about-2/</a></li>\r\n<li>Find the audio that I listened to here<br />\r\n<a href=\"https://www.phisonics.com/podcast-blog-research/\" class=\"uri\">https://www.phisonics.com/podcast-blog-research/</a></li>\r\n</ul>\r\n<p>Background sounds provided by some road noise, and a train.</p>\r\n',329,0,1,'CC-BY-SA','science',0,0,1),
(3196,'2020-11-02','HPR Community News for October 2020',5375,'Dave and Ken review the months happenings, and try various pronunciations of Cedric De Vroeys name.','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nThere were no new hosts this month.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3174\" target=\"_blank\">3174</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3174\" target=\"_blank\">Linux Inlaws S01E14: The big programming language panel</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3175\" target=\"_blank\">3175</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3175\" target=\"_blank\">International Keyboard</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3176\" target=\"_blank\">3176</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-10-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3176\" target=\"_blank\">HPR Community News for September 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3177\" target=\"_blank\">3177</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-10-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3177\" target=\"_blank\">Zero cost VPN</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3178\" target=\"_blank\">3178</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-10-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3178\" target=\"_blank\">Finishing the Recumbent Bicycle</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0326.html\" target=\"_blank\">Brian in Ohio</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3179\" target=\"_blank\">3179</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3179\" target=\"_blank\">MakeMKV to back up media, and a Question</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3180\" target=\"_blank\">3180</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3180\" target=\"_blank\">GIMP: Miscellaneous Tools</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3181\" target=\"_blank\">3181</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-10-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3181\" target=\"_blank\">RealVNC cloud offering</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0129.html\" target=\"_blank\">JWP</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3182\" target=\"_blank\">3182</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-10-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3182\" target=\"_blank\">Yo-ho-ho, and a bottle of Cholecalciferol</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3183\" target=\"_blank\">3183</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-10-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3183\" target=\"_blank\">Don\'t trust zipfiles</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3184\" target=\"_blank\">3184</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3184\" target=\"_blank\">Linux Inlaws S01E15: IT Security and stick insects</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3185\" target=\"_blank\">3185</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3185\" target=\"_blank\">Pandemics In History</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3186\" target=\"_blank\">3186</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-10-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3186\" target=\"_blank\">A light bulb moment, part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3187\" target=\"_blank\">3187</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-10-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3187\" target=\"_blank\">Ansible for Dynamic Host Configuration Protocol</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3188\" target=\"_blank\">3188</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-10-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3188\" target=\"_blank\">Thrift store quick fix</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3189\" target=\"_blank\">3189</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3189\" target=\"_blank\">How the Dutch dig Graves</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3190\" target=\"_blank\">3190</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3190\" target=\"_blank\">GIMP Brushes</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3191\" target=\"_blank\">3191</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-10-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3191\" target=\"_blank\">Swedish Corona Experience</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3192\" target=\"_blank\">3192</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-10-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3192\" target=\"_blank\">A light bulb moment, part 3</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3193\" target=\"_blank\">3193</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-10-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3193\" target=\"_blank\">Meet Antithesis</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3194\" target=\"_blank\">3194</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-10-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3194\" target=\"_blank\">Linux Inlaws S01E16: The count and the questions</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3195\" target=\"_blank\">3195</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-10-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3195\" target=\"_blank\">For your Consideration - the ideal Ham Radio setup</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 14 comments in total.</p>\n<h3>Past shows</h3>\n<p>There is 1 comment on\n1 previous show:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3153#comments\" target=\"_blank\">hpr3153</a></strong>\n(2020-09-02) \"<em>Fixing eBooks with Calibre and pdfcrop</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3153#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-10-21:\n\"Thank for this\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 13 comments on 9 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3175#comments\" target=\"_blank\">hpr3175</a></strong>\n(2020-10-02) \"<em>International Keyboard</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3175#1\" target=\"_blank\">Comment 1</a>:\nGumnos on 2020-10-03:\n\"Using the X \"Compose\" key\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3176#comments\" target=\"_blank\">hpr3176</a></strong>\n(2020-10-05) \"<em>HPR Community News for September 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3176#1\" target=\"_blank\">Comment 1</a>:\nMike Ray on 2020-10-05:\n\"YAML, spacing and ansible-lint\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3179#comments\" target=\"_blank\">hpr3179</a></strong>\n(2020-10-08) \"<em>MakeMKV to back up media, and a Question</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3179#1\" target=\"_blank\">Comment 1</a>:\njanedoc on 2020-10-09:\n\"using make mkv\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3180#comments\" target=\"_blank\">hpr3180</a></strong>\n(2020-10-09) \"<em>GIMP: Miscellaneous Tools</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3180#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2020-10-10:\n\"contribution back\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3180#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2020-10-10:\n\"Donating to Fedora\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3184#comments\" target=\"_blank\">hpr3184</a></strong>\n(2020-10-15) \"<em>Linux Inlaws S01E15: IT Security and stick insects</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3184#1\" target=\"_blank\">Comment 1</a>:\nClinton Roy on 2020-10-15:\n\"Mix not quite right?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3184#2\" target=\"_blank\">Comment 2</a>:\nCedric De Vroey on 2020-10-26:\n\"Great show keep them comming :-)\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3185#comments\" target=\"_blank\">hpr3185</a></strong>\n(2020-10-16) \"<em>Pandemics In History</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3185#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-10-16:\n\"fear porn\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3185#2\" target=\"_blank\">Comment 2</a>:\nCedric De Vroey on 2020-10-26:\n\"Ahuka\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3187#comments\" target=\"_blank\">hpr3187</a></strong>\n(2020-10-20) \"<em>Ansible for Dynamic Host Configuration Protocol</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3187#1\" target=\"_blank\">Comment 1</a>:\nCedric De Vroey on 2020-10-26:\n\"Also getting into Ansible\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3189#comments\" target=\"_blank\">hpr3189</a></strong>\n(2020-10-22) \"<em>How the Dutch dig Graves</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3189#1\" target=\"_blank\">Comment 1</a>:\nCedric De Vroey on 2020-10-26:\n\"Love graveyards\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3189#2\" target=\"_blank\">Comment 2</a>:\nClinton Roy on 2020-10-28:\n\"Interesting\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3191#comments\" target=\"_blank\">hpr3191</a></strong>\n(2020-10-26) \"<em>Swedish Corona Experience</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3191#1\" target=\"_blank\">Comment 1</a>:\nmcnalu on 2020-10-26:\n\"Interesting info from Sweden\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-October/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-October/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"call-for-shows\">Call for shows</h3>\n<ul>\n<li>There are just a few days until the next free slot on the calendar. More shows are urgently needed!</li>\n</ul>\n<h3 id=\"question\">Question</h3>\n<ul>\n<li>Which undead would you rather be from D&amp;D v 5 - Lich or Vampire ? And why ?</li>\n</ul>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></b></p>\n<p>Over the period tags and/or summaries have been added to 6 shows which were without them.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3221,'2020-12-07','HPR Community News for November 2020',2948,'HPR Volunteers talk about shows released and comments posted in November 2020','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new host: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0388.html\" target=\"_blank\">Padraig Jeroen Fallon</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3196\" target=\"_blank\">3196</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3196\" target=\"_blank\">HPR Community News for October 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3197\" target=\"_blank\">3197</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-11-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3197\" target=\"_blank\">Pens, pencils, paper and ink - 3</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3198\" target=\"_blank\">3198</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-11-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3198\" target=\"_blank\">Income Life insurance and then Chopin</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3199\" target=\"_blank\">3199</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-11-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3199\" target=\"_blank\">Bad Audio Weed Eater Bugs Sprinkler and Bubbles !</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3200\" target=\"_blank\">3200</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-11-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3200\" target=\"_blank\">Better Social Media 17 - OcapPub</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3201\" target=\"_blank\">3201</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3201\" target=\"_blank\">A small intro to 3D printing</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3202\" target=\"_blank\">3202</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-11-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3202\" target=\"_blank\">A big Question</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0388.html\" target=\"_blank\">Padraig Jeroen Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3203\" target=\"_blank\">3203</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-11-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3203\" target=\"_blank\">The Paul Quirk show: Retro Computing</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3204\" target=\"_blank\">3204</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-11-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3204\" target=\"_blank\">Getting Started in 3D Printing</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3205\" target=\"_blank\">3205</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-11-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3205\" target=\"_blank\">Backups of your Backups of Backups</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3206\" target=\"_blank\">3206</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3206\" target=\"_blank\">Dungeons and Dragons for the blind</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3207\" target=\"_blank\">3207</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-11-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3207\" target=\"_blank\">Fireside chat with E Nigma</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3208\" target=\"_blank\">3208</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-11-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3208\" target=\"_blank\">The Paul Quirk show: Wacom with Pinebook, and thoughts on the DMCA takedown</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3209\" target=\"_blank\">3209</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-11-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3209\" target=\"_blank\">Linux Inlaws S01E17: Nextcloud</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3210\" target=\"_blank\">3210</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-11-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3210\" target=\"_blank\">GIMP: Patterns and Gradients</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3211\" target=\"_blank\">3211</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3211\" target=\"_blank\">Chainsaws</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3212\" target=\"_blank\">3212</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-11-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3212\" target=\"_blank\">A Pi Model 3B as your daily driver? You must be joking.</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0246.html\" target=\"_blank\">Beeza</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3213\" target=\"_blank\">3213</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-11-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3213\" target=\"_blank\">Electrical Safety</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3214\" target=\"_blank\">3214</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-11-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3214\" target=\"_blank\">Rant about websites</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3215\" target=\"_blank\">3215</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-11-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3215\" target=\"_blank\">Why I Gave Away a 3-D Printer</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3216\" target=\"_blank\">3216</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-11-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3216\" target=\"_blank\">Buying a second home in France</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 13 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 7 comments on\n6 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=1771#comments\" target=\"_blank\">hpr1771</a></strong>\n(2015-05-18) \"<em>Audacity: Label Tracks</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0238.html\" target=\"_blank\">Jon Kulp</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=1771#4\" target=\"_blank\">Comment 4</a>:\nKen Fallon on 2020-11-19:\n\"Yes - found it\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=1796#comments\" target=\"_blank\">hpr1796</a></strong>\n(2015-06-22) \"<em>Audacity - Chains, Notches and Labels</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0307.html\" target=\"_blank\">cheeto4493</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=1796#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-11-19:\n\"And this one as well\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2881#comments\" target=\"_blank\">hpr2881</a></strong>\n(2019-08-19) \"<em>Automatically split album into tracks in Audacity</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2881#3\" target=\"_blank\">Comment 3</a>:\nKen Fallon on 2020-11-19:\n\"And the final piece of the puzzle\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3126#comments\" target=\"_blank\">hpr3126</a></strong>\n(2020-07-27) \"<em>Metrics part II</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3126#3\" target=\"_blank\">Comment 3</a>:\nmcnalu on 2020-11-25:\n\"Thanks for the comments\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3179#comments\" target=\"_blank\">hpr3179</a></strong>\n(2020-10-08) \"<em>MakeMKV to back up media, and a Question</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3179#2\" target=\"_blank\">Comment 2</a>:\nArcher72 on 2020-11-03:\n\"re: janedoc\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3193#comments\" target=\"_blank\">hpr3193</a></strong>\n(2020-10-28) \"<em>Meet Antithesis</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3193#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-11-03:\n\"dark-table\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3193#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-11-03:\n\"Agree with Brian\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 6 comments on 5 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3202#comments\" target=\"_blank\">hpr3202</a></strong>\n(2020-11-10) \"<em>A big Question</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0388.html\" target=\"_blank\">Padraig Jeroen Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3202#1\" target=\"_blank\">Comment 1</a>:\nEnigma on 2020-11-10:\n\"Great first show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3206#comments\" target=\"_blank\">hpr3206</a></strong>\n(2020-11-16) \"<em>Dungeons and Dragons for the blind</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3206#1\" target=\"_blank\">Comment 1</a>:\nMike Ray on 2020-11-16:\n\"Thanks for a great show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3208#comments\" target=\"_blank\">hpr3208</a></strong>\n(2020-11-18) \"<em>The Paul Quirk show: Wacom with Pinebook, and thoughts on the DMCA takedown</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3208#1\" target=\"_blank\">Comment 1</a>:\nCharliebrownau on 2020-11-23:\n\"Feedback - HPR 3208e\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3209#comments\" target=\"_blank\">hpr3209</a></strong>\n(2020-11-19) \"<em>Linux Inlaws S01E17: Nextcloud</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3209#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2020-11-19:\n\"I loved the show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3213#comments\" target=\"_blank\">hpr3213</a></strong>\n(2020-11-25) \"<em>Electrical Safety</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3213#1\" target=\"_blank\">Comment 1</a>:\nnorrist on 2020-11-25:\n\"Great episode\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3213#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2020-11-27:\n\"I loved the show\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-November/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-November/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>There were no tag or summary updates in the past month.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(2942,'2019-11-12','Why I love lisps',509,'A very wooden and scripted episode about why I love the lisp programming language family','<h2 id=\"syntax-example\">Syntax example</h2>\r\n<pre><code>(define (fib-rec n)\r\n  (if (&lt; n 2)\r\n      n\r\n      (+ (fib-rec (- n 1))\r\n         (fib-rec (- n 2)))))\r\n</code></pre>\r\n<h2 id=\"structured-editing\">Structured Editing</h2>\r\n<p>Parinfer: <a href=\"https://shaunlebron.github.io/parinfer/\" class=\"uri\">https://shaunlebron.github.io/parinfer/</a></p>\r\n<p>Paredit: <a href=\"https://www.emacswiki.org/emacs/ParEdit\" class=\"uri\">https://www.emacswiki.org/emacs/ParEdit</a></p>\r\n<h2 id=\"clojure-libraries\">Clojure libraries</h2>\r\n<p>core.match (adds pattern matching): <a href=\"https://github.com/clojure/core.match\" class=\"uri\">https://github.com/clojure/core.match</a></p>\r\n<p>core.logic (prolog-like stuff): <a href=\"https://github.com/clojure/core.logic\" class=\"uri\">https://github.com/clojure/core.logic</a></p>\r\n<p>overtone: <a href=\"https://github.com/overtone/overtone\" class=\"uri\">https://github.com/overtone/overtone</a></p>\r\n<h2 id=\"other-stuff\">Other stuff</h2>\r\n<p>Clojure macro explanation: <a href=\"https://learnxinyminutes.com/docs/clojure-macros/\" class=\"uri\">https://learnxinyminutes.com/docs/clojure-macros/</a></p>\r\n<h2 id=\"books\">Books</h2>\r\n<p>The little schemer: <a href=\"https://mitpress.mit.edu/books/little-schemer-fourth-edition\" class=\"uri\">https://mitpress.mit.edu/books/little-schemer-fourth-edition</a></p>\r\n<p>Clojure for the brave and true: <a href=\"https://www.braveclojure.com/\" class=\"uri\">https://www.braveclojure.com/</a></p>\r\n',381,0,0,'CC-BY-SA','lisp, programming',0,0,1),
(2955,'2019-11-29','Machine Learning / Data Analysis Basics',1293,'We talk about different machine learning techniques','<p>In this episode, I talk about different techniques that we can use to predict the outcome of some question depending on input features.</p>\r\n<p>The different techniques I will go through are the ZeroR and OneR that will create a baseline for the rest of the methods.</p>\r\n<p>Next up, we have the Naive Bayes classifier that is simple but powerful for some applications.</p>\r\n<p>Nearest neighbor and Decision trees are next up that requires more training but is very efficient when you infer results.</p>\r\n<p>Multi-layer perceptron (MLP) is the first technique that is close to the ones we usually see in Machine Learning frameworks used today. But it is just a precursor to Convolutional Neural Network (CNN) because of the size requirements. MLPs have the same size for all the hidden layers, which makes it unfeasible for larger networks.</p>\r\n<p>CNNs, on the other hand, uses subsampling that will shrink the layer maps to reduce the size of the network without reducing the accuracy of the predictions.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Some references for further reading on Wikipedia.\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Naive_Bayes_classifier\" class=\"uri\">https://en.wikipedia.org/wiki/Naive_Bayes_classifier</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Nearest_neighbor_search\" class=\"uri\">https://en.wikipedia.org/wiki/Nearest_neighbor_search</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Decision_tree\" class=\"uri\">https://en.wikipedia.org/wiki/Decision_tree</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Support-vector_machine\" class=\"uri\">https://en.wikipedia.org/wiki/Support-vector_machine</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Multilayer_perceptron\" class=\"uri\">https://en.wikipedia.org/wiki/Multilayer_perceptron</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Convolutional_neural_network\" class=\"uri\">https://en.wikipedia.org/wiki/Convolutional_neural_network</a></li>\r\n</ul></li>\r\n<li>A video I made some years ago where you can see some visual aids for this subject.<br />\r\n<a href=\"https://youtu.be/Xys1N_7MbSs\" class=\"uri\">https://youtu.be/Xys1N_7MbSs</a></li>\r\n</ul>',382,0,0,'CC-BY-SA','machine learning, basics, theory',0,0,1),
(2944,'2019-11-14','ONICS Basics Part 4: Network Flows and Connections',989,'I try to add a bit more basic networking info while writing a quick script for Dave Morris','<h1 id=\"terminology\">Terminology</h1>\r\n<ul>\r\n<li>connection - a bi-directional communication channel between two programs over a network</li>\r\n<li>client - the initiator of a connection</li>\r\n<li>server - the receiver of the connection</li>\r\n<li>port - a common term for the address of a program or service on a given machine</li>\r\n<li>5-tuple - the combination of protocol, client machine network address, client port, server machine network address, server port that uniquely identifies a connection</li>\r\n<li>flow - a grouping of packets to be treated in a common way</li>\r\n<li>microflow - a flow with a fine level of granularity such as the packets from one direction of traffic in a connection</li>\r\n</ul>\r\n<h1 id=\"the-topflowsh-script\">The topflow.sh Script</h1>\r\n<pre><code>#!/bin/sh\r\n\r\n# Start a capture in the background that drops the packets\r\n# and just reports the flow events\r\npktin $1 | nftrk -d -f /tmp/flows.txt &amp;\r\nPID=$!\r\n\r\n# On CTRL-C clean kill the capture and clean up\r\ntrap &quot;kill $PID ; rm -f /tmp/flows.txt /tmp/topflows.txt /tmp/namecache.txt ; exit 0&quot; INT TERM\r\n\r\n# Once per second do\r\n#   look at the last 100 flows\r\n#   sort them by 5-tuple\r\n#   remove duplicates\r\n#   convert ports, protocols and addresses to names\r\n#   sort by data usage per flow in reverse order (highest first)\r\n#   a little more pretty printing\r\n#   only take the top 20 lines\r\n#   clear the screen and print the result\r\nwhile [ 1 ] ; do\r\n    tail -100 /tmp/flows.txt |\r\n            sort -s -t &#39;|&#39; -k 3,3 |\r\n            awk -f uniqflows.awk  |\r\n            awk -f prflow.awk  |\r\n            sort -s -t &#39;,&#39; -k 3 -r |\r\n            awk -f columns.awk |\r\n            head -20 &gt; /tmp/topflows.txt\r\n    clear\r\n    cat /tmp/topflows.txt\r\n    sleep 1\r\ndone\r\n</code></pre>\r\n<p>You can find the complete code at: <a href=\"https://gitlab.com/onics/onics-examples\" class=\"uri\">https://gitlab.com/onics/onics-examples</a></p>\r\n',259,61,0,'CC-BY-SA','command line networking',0,0,1),
(2945,'2019-11-15','Saturday at OggCamp Manchester 2019',2225,'Interviews and chat from the UK\'s largest FLOSS event.','<p>\r\n<a href=\"https://www.oggcamp.org/\">OggCamp</a> is an unconference celebrating Free Culture, Free and Open Source Software, hardware hacking, digital rights, and all manner of collaborative cultural activities and is committed to creating a conference that is as inclusive as possible.<br />\r\nThis year a team of HPR volunteers hit the show.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191018_122746Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191018_122746Z-small.jpg\"></a><br />\r\nKen\'s recording kit and some of the stickers.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_081508Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_081508Z-small.jpg\"></a><br />\r\n<a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave</a>, <a href=\"https://hackerpublicradio.org/correspondents/0268.html\">Andrew Conway/mcnalu</a> and Timttmy getting the booth ready.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_081704Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_081704Z-small.jpg\"></a><br />\r\nOnly <a http=\"https://hackerpublicradio.org/correspondents.php\">HPR hosts</a> can sign the booth.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_085140Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_085140Z-small.jpg\"></a><br />\r\n<a href=\"https://hackerpublicradio.org/correspondents/0370.html\">Yannick</a> signs the booth.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_091705Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_091705Z-small.jpg\"></a><br />\r\nTimttmy\'s script to turn an Android phone into a webcam. Two versions of the script to take a screenshot and post it to the web.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_091709Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_091709Z-small.jpg\"></a><br />\r\nSurveillance state ?\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_095727Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_095727Z-small.jpg\"></a><br />\r\nOur latest host <a href=\"https://hackerpublicradio.org/correspondents/0381.html\">Nihilazo</a> signs the booth.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_133636Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_133636Z-small.jpg\"></a><br />\r\nAn Interview with Ban Parsons from the <a href=\"https://matrix.org/\">Matrix</a> <em>An open network for secure, decentralized communication</em>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_135427Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_135427Z-small.jpg\"></a><br />\r\nAn Interview with <a href=\"https://www.mystorm.uk/\">mystorm.uk</a> makers of the open FPGA. An FPGA chip is a re-programmable piece of silicon hardware, it can be reconfigured or programmed to a logic circuit of your own design.\r\n\r\n<br/>\r\n<em>In 2016 we decided to setup up the myStorm project in order to build OpenSource FPGA hardware. Several years later we are building the 5th generation of <a href=\"https://github.com/folknology/BlackIceMx/wiki\">BlackIce</a> Development boards. <a href=\"https://www.tindie.com/products/Folknology/blackice-mx/\">BlackIce Mx</a> the latest generation of our hardware has been built using BlackEdge open hardware standard which enable the \'Core\' Board <a href=\"https://github.com/folknology/IceCore/wiki/IceCore-Getting-Started\">IceCore</a> to be separated from its carrier board which provides MixMod and Pmod hardware add-ons. Please take a look at the <a href=\"https://forum.mystorm.uk\">myStorm forum</a> to ask questions and participate in our community. </em>\r\n\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_135429Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_135429Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_141427Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_141427Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2945/hpr2945/IMG_20191019_143611Z.jpg\"><img src=\"../eps/hpr2945/hpr2945/IMG_20191019_143611Z-small.jpg\"></a><br />\r\nAn Interview with Erik Grun of the <a href=\"https://fsfe.org/\">Free Software Foundation Europe</a> about their campaign for <strong><a href=\"https://fsfe.org/campaigns/publiccode/index.en.html\">Public Money? Public Code!</a></strong>\r\n</p>\r\n',30,78,0,'CC-BY-SA','OGGCamp, FSFE, Matrix, BlackEdge, mystorm, blackice, fswebcam, android, sshpass',0,0,1),
(2946,'2019-11-18','Sunday at OggCamp Manchester 2019',3378,'Interviews and chat from the UK\'s largest FLOSS event.','<p>\r\n<a href=\"../eps/hpr2946/hpr2946/434340905_92324.jpg\"><img src=\"../eps/hpr2946/hpr2946/434340905_92324-small.jpg\"></a><br />\r\n<a href=\"https://hackerpublicradio.org/correspondents/0288.html\">beni</a>, <a href=\"https://hackerpublicradio.org/correspondents/0268.html\">Andrew Conway/mcnalu</a>, Timttmy, and <a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave</a> at the HPR booth.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_100452Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_100452Z-small.jpg\"></a><br />\r\nMichael from <a href=\"https://www.electricflapjack.com/\">Electric Flap Jack</a> Custom Built Guitars, and author of <a href=\"https://efguitars.s3.amazonaws.com/fretboard-generator.html\">Fretboard Template Generator</a> available on <a href=\"https://github.com/mdales/Fretboard-generator\">GitHub</a>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_132900Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_132900Z-small.jpg\"></a><br />\r\nPerspex template for carving the body and neck.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_132904Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_132904Z-small.jpg\"></a><br />\r\nA work in progress.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_132909Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_132909Z-small.jpg\"></a><br />\r\nTools for making guitar, including the tool to round the frets.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_132913Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_132913Z-small.jpg\"></a><br />\r\nAnd of course you need a guitar stand.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_132918Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_132918Z-small.jpg\"></a><br />\r\n<a href=\"https://efguitars.s3.amazonaws.com/fretboard-generator.html\">Fretboard Template Generator</a> available on <a href=\"https://github.com/mdales/Fretboard-generator\">GitHub</a>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_101726Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_101726Z-small.jpg\"></a><br />\r\nTai Kedzierski hanging out with \"Grumpy\" Mike Cook.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_101754Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_101754Z-small.jpg\"></a><br />\r\nMike produces electronic musical instruments for people with accessibility issues.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_103658Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_103658Z-small.jpg\"></a><br />\r\nHe also has a book called <a href=\"https://www.apress.com/gp/book/9781484217207\">Arduino Music and Audio Projects</a> to help you do this yourself.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_103704Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_103704Z-small.jpg\"></a><br />\r\n<em>\r\nAt <a href=\"https://www.drakemusic.org/\">Drake Music</a> we are leaders in music, disability and technology.<br />\r\nWe are innovators, educators, curators and advocates. We believe everyone has the right to express themselves creatively through music. We use new technologies and ideas to open up access to music for all. Our vision is a world where disabled and non-disabled musicians work together as equals.</em>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_103728Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_103728Z-small.jpg\"></a><br />\r\nThe <em>bat base</em>.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_103744Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_103744Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_103749Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_103749Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_103821Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_103821Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_103722Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_103722Z-small.jpg\"></a><br />\r\nThe <em>Cattle Caster</em>.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_103713Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_103713Z-small.jpg\"></a><br />\r\nThe <em>Arduino Caster</em>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_105735Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_105735Z-small.jpg\"></a><br />\r\nThe <a href=\"https://www.openrightsgroup.org/\">Open Rights Group</a>.<br />\r\n<em>\r\n<a href=\"https://www.openrightsgroup.org/ourwork/\">Open Rights Group</a> protects the digital rights of people in the UK including privacy and free speech online. We are funded by over <a href=\"https://www.openrightsgroup.org/join/\">3,000 people like you</a>.\r\n</em>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_115630Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_115630Z-small.jpg\"></a><br />\r\n<a href=\"https://manchestergreyhats.co.uk/\">Manchester Grey Hats</a><br />\r\n<p>Manchester Grey Hats is a place for all those interested in hacking and cyber security to learn and share. We run capture the flags, workshops and perform/present security research.</p>\r\n<p>We encourage all skill levels and those from all backgrounds. Are you an aspiring hacker or a developer thinking about security? Come along and learn. Presenting is open to all members, so if you have something you’d like to present but aren’t ready for the big conferences, get in touch.</p>\r\n\r\n<p>Said best by The Mentor – “This is our world now… the world of the electron and the switch, the beauty of the baud”</p>\r\n\r\n<p>Although we meet face to face once a month, MGH is mostly an online community. We encourage people to join us in person for workshops and events but if you can\'t, join us on Slack and our live stream.</p>\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_115639Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_115639Z-small.jpg\"></a><br />\r\nAn example of the of the locks that needed to be picked for the FlawCon Capture the Flag event.\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_115654Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_115654Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_115701Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_115701Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_115719Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_115719Z-small.jpg\"></a><br />\r\n</p>\r\n<p>\r\n<a href=\"../eps/hpr2946/hpr2946/IMG_20191020_115905Z.jpg\"><img src=\"../eps/hpr2946/hpr2946/IMG_20191020_115905Z-small.jpg\"></a><br />\r\nHow to hold the lock while you are picking it.\r\n</p>\r\n',30,78,0,'CC-BY-SA','OGGCamp, FSFE, Matrix, BlackEdge, mystorm, blackice, fswebcam, android, sshpass',0,0,1),
(2947,'2019-11-19','The Mimblewimble Protocol',1261,'mimblewimble is a new blockchain protocol for scalability, privacy and fungibility','<p>Financial privacy is critical for adoption of cryptocurrency as a means of exchange. Individuals worry about employers monitoring their spending details, insurers increasing rates based on purchases and landlords raising rents when they get a promotion. Businesses can only operate using cryptocurrency if they can prevent disclosure of vendor payments, rates paid to suppliers, payroll details, and so on. At the same time, they need to selectively disclose financial data to governments and might need to demonstrate compliance in some industries.</p>\r\n<p>Mimblewimble is a new protocol that uses cryptography to achieve striking reductions in blockchain size, so users can run a full node on low powered devices like phones. It offers the strongest privacy protection assurances around, through a variety of clever tricks. For one thing, transaction history is not recorded, which also results in a smaller blockchain. There are no addresses and no transaction amounts are recorded.</p>\r\n<p>We’re not going to focus on the cryptography, although it’s a fascinating example of just how much progress is being made in recent years. We’ll focus instead on what makes this mysterious network protocol unique among cryptocurrencies.</p>\r\n',379,110,0,'CC-BY-SA','blockchain, privacy',0,0,1),
(2954,'2019-11-28','Wrestling As You Like It episode 1',462,'A Wrestling podcast reporting on indie wrestling. Today we are talking about different TV styles.','<p>TV and pro wrestling go hand in hand. Both have fed off of each other, and with the internet we are now exposed to many different promotions with their own visual style in order to broadcast wrestling in the ring.</p>\r\n',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1),
(2949,'2019-11-21','Grin and Beam: The 2 major mimblewimble blockchains',1387,'Grin and Beam are two mimblewimble implementations that are very different & we take a look at both','<p>Last time we reviewed the mimblewimble protocol for blockchain networks. This is an innovative protocol focused on privacy and scalability.</p>\r\n<p>In this episode we take a closer look at the two major implementations of mimblewimble, called Grin and Beam. They are both interesting projects that take very different approaches, yet both have managed to launch working blockchains that preserve the core strengths of the protocol.</p>',379,110,1,'CC-BY-SA','blockchain, privacy',0,0,1),
(2960,'2019-12-06','Dehydrated Foods',835,'Dehydrating your own fruits and vegetables for healthy snacks','<p>I have begun to dehydrate fruits and vegetables at home with my own dehydrator, and it lets me have fresher products without all of the additives. In this episode I discuss both the why and the how.</p>\r\n<ul>\r\n<li><a href=\"https://www.mayoclinic.org/tests-procedures/a1c-test/about/pac-20384643\" class=\"uri\">https://www.mayoclinic.org/tests-procedures/a1c-test/about/pac-20384643</a></li>\r\n<li><a href=\"https://www.webmd.com/food-recipes/news/20090323/7-rules-for-eating#1\" class=\"uri\">https://www.webmd.com/food-recipes/news/20090323/7-rules-for-eating#1</a></li>\r\n<li><a href=\"https://www.amazon.com/NESCO-FD-37A-Dehydrator-Speckled-Marbled/dp/B00CS5ZI6G\" class=\"uri\">https://www.amazon.com/NESCO-FD-37A-Dehydrator-Speckled-Marbled/dp/B00CS5ZI6G</a></li>\r\n<li><a href=\"https://www.rei.com/blog/hike/how-to-dehydrate-food\" class=\"uri\">https://www.rei.com/blog/hike/how-to-dehydrate-food</a></li>\r\n<li><a href=\"https://smile.amazon.com/Beginners-Guide-Dehydrating-Food-2nd/dp/1635860245/ref=sr_1_1?keywords=The+Beginner%27s+Guide+to+Dehydrating+Food%2C+2nd+Edition%3A+How+to+Preserve+All+Your+Favorite+Vegetables%2C+Fruits%2C+Meats%2C+and+Herbs&amp;qid=1570990745&amp;s=books&amp;sr=1-1\">https://smile.amazon.com/Beginners-Guide-Dehydrating-Food-2nd/dp/1635860245/ref=sr_1_1?keywords=The+Beginner%27s+Guide+to+Dehydrating+Food%2C+2nd+Edition%3A+How+to+Preserve+All+Your+Favorite+Vegetables%2C+Fruits%2C+Meats%2C+and+Herbs&amp;qid=1570990745&amp;s=books&amp;sr=1-1</a></li>\r\n<li><a href=\"https://addapinch.com/homemade-ranch-seasoning-mix-recipe/\" class=\"uri\">https://addapinch.com/homemade-ranch-seasoning-mix-recipe/</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=674\" class=\"uri\">https://www.palain.com/?page_id=674</a></li>\r\n</ul>',198,100,0,'CC-BY-SA','Health, Diet',0,0,1),
(2958,'2019-12-04','Haskell modules',1387,'Tuula talks about haskell modules','<p>With small programs it’s easy enough to have all code in single file. But as the program grows, you eventually want to organize things into separate files. In this episode I’ll talk a bit how to define modules and how to use them.</p>\r\n<h2 id=\"defining\">Defining</h2>\r\n<p>Each module is defined in separate file. In our example, we have file called <code>multiplexer.hs</code>, which contains our module definition.</p>\r\n<p>At the beginning of the file, we have following:</p>\r\n<pre><code>module Multiplexer (mix, match, Plexer, Scooper(..))\r\n  where\r\n  ....</code></pre>\r\n<p>We’re omitting actual function and type definitions as they aren’t important to this episode. In any case, there’s two functions: <code>mix</code> and <code>match</code> and two types: <code>Plexer</code> and <code>Scooper</code> that module exports (that is, these are available outside of the module). <code>Plexer</code> is imported as a type only and <code>Scooper</code> with field accessors or value constructors depending if it’s a record or algebraic datatype.</p>\r\n<h2 id=\"using-modules\">Using modules</h2>\r\n<p>In order to be able to use identifiers defined in separate module, we have to import them into our current one. In our imaginary program, we have <code>main.hs</code> that defines entry point for our program and we would like to import the definitions from <code>Multiplexer</code> module.</p>\r\n<p>Easiest one is to just have <code>import Multiplexer</code> at the start of the <code>main</code>. This brings all exported identifiers from <code>Multiplexer</code> and we can then use them. Both qualified and unqualified names are imported. Qualified means name is prepended with module name: <code>Multiplexer.mix</code> instead of just <code>mix</code>.</p>\r\n<p>If we want, we can specify what exactly should be imported: <code>import Multiplexer (mix, match)</code>. This causes only functions <code>mix</code> and <code>match</code> be imported, while <code>Plexer</code> and <code>Scooper</code> are unavailable for us. Again, both qualified and unqualified names are imported.</p>\r\n<p>In case we want only qualified names, we’ll write <code>import qualified Multiplexer</code>. After this <code>mix</code> isn’t available, but <code>Multiplexer.mix</code> is (and all the other identifiers exported by <code>Multiplexer</code>).</p>\r\n<p>Sometimes module name is long and tedious to repeat when using qualified names. In these cases, renaming module while importing is a good option. This can be done by writing <code>import Multiplexer as M</code>. After this, instead of <code>Multiplexer.mix</code> you write <code>M.mix</code>.</p>\r\n<p>Final thing I’m going to mention is importing everything else except specified identifiers. This is done by writing <code>import Multiplexer hiding (mix)</code>. This imports everything exported by <code>Multiplexer</code>, except <code>mix</code>.</p>\r\n<h2 id=\"summary\">Summary</h2>\r\n<p>There are many ways of importing and they can be mixed. Here’s a list of them:</p>\r\n<ul>\r\n<li><code>import Multiplexer</code></li>\r\n<li><code>import Multiplexer ()</code></li>\r\n<li><code>import Multiplexer (mix, match, Plexer, Scooper(..))</code></li>\r\n<li><code>import qualified Multiplexer</code></li>\r\n<li><code>import qualified Multiplexer (mix, match, Plexer, Scooper(..))</code></li>\r\n<li><code>import Multiplexer hiding (mix, match)</code></li>\r\n<li><code>import qualified Multiplexer hiding (Plexer, Scooper)</code></li>\r\n<li><code>import Multiplexer as M</code></li>\r\n<li><code>import Multiplexer as M (mix, match)</code></li>\r\n<li><code>import qualified Multiplexer as M</code></li>\r\n<li><code>import qualified Multiplexer as M (Plexer, Scooper(..))</code></li>\r\n</ul>\r\n<p>In short:</p>\r\n<ul>\r\n<li>Some identifiers can be chosen to be imported, while leaving others unimported</li>\r\n<li>Modules can be imported qualified (forcing an obligatory namespace qualifier to imported identifiers).</li>\r\n<li>Some identifiers can be skipped via the hiding clause.</li>\r\n<li>The module namespace can be renamed, with an as clause.</li>\r\n</ul>\r\n<h2 id=\"prelude\">Prelude</h2>\r\n<p>Prelude is base module containing lots of helpful types and functions, which is automatically imported by every module. If this is not what you want, there’s two options. First one is to use pragma at start of the file: <code>{-# LANGUAGE NoImplicitPrelude #-}</code>, which causes <code>Prelude</code> not to be imported. Another one is to manually import <code>Prelude</code>, which turns of automatic import: <code>import qualified Prelude as P</code>.</p>\r\n<h2 id=\"closing\">Closing</h2>\r\n<p>When system grows, it’s helpful to break it into more manageable pieces. For this we use modules. <code>import</code> is used to bring identifiers from other modules into current one.</p>\r\n<p>Questions, comments and feedback is welcomed. Best way to reach me is either email or in fediverse where I’m <code>Tuula@mastodon.social</code></p>\r\n',364,107,0,'CC-BY-SA','haskell, modules',0,0,1),
(2951,'2019-11-25','A walk through my PifaceCAD Python code – Part 2',888,'In this episode I cover some generic functions at the top of the code.','<h2 id=\"code\">Code</h2>\r\n<p>The script being discussed in this show is available for download with this show: <a href=\"https://hackerpublicradio.org/eps/hpr2951/hpr2951/cad-menu.py\">cad-menu.py</a></p>\r\n<h2 id=\"generic-functions\">GENERIC FUNCTIONS</h2>\r\n<ul>\r\n<li><code>def get_hpr_que():</code><br />\r\nGoto hacker public stats page and extract the number of days to next free slot turns on blinkstick LED with colour dependent on the number of days to next free slot in HPR queue prints number of days to next free slot to the display</li>\r\n</ul>\r\n<h2 id=\"generic-blinkstick-functions\">GENERIC BLINKSTICK FUNCTIONS</h2>\r\n<ul>\r\n<li><p><code>def bstick_off():</code><br />\r\nSearch for all attached blinksticks and turn them all off</p></li>\r\n<li><p><code>def bstick_on(colour):</code><br />\r\nTurn blinkstick on and set led colour to string value stored in var colour. valid colours are, black, silver, gray, white, maroon, red, purple, fuchsia, green, lime, olive, yellow, navy, blue, teal, aqua</p></li>\r\n<li><p><code>def bstick_on_random():</code><br />\r\nTurn blinkstick on colour random</p></li>\r\n<li><p><code>def bstick_blink(colour):</code><br />\r\nTurn blinkstick on with supplied colour</p></li>\r\n</ul>\r\n<h2 id=\"end-blinkstick-functions\">END BLINKSTICK FUNCTIONS</h2>\r\n<ul>\r\n<li><p><code>def run_cmd(cmd):</code><br />\r\nUsed to run an external linux command</p></li>\r\n<li><p><code>def get_my_ip():</code><br />\r\nReturns ip address</p></li>\r\n<li><p><code>def get_my_essid():</code><br />\r\nReturns wifi ESSID</p></li>\r\n<li><p><code>def get_my_wifi_strength():</code><br />\r\nReturns wifi signal strength as a percentage</p></li>\r\n<li><p><code>def wait_for_ip():</code><br />\r\nTries 10 times to get IP address</p></li>\r\n<li><p><code>def show_wifi_info():</code><br />\r\nShow WiFi information on display, shows essid on first line and both the wifi signal strength as a percentage and ip address on the second line.</p></li>\r\n<li><p><code>def custom_bitmaps():</code><br />\r\nSelection of custom bitmaps to use on LCD display</p></li>\r\n<li><p>Article in pifacecad documentation giving details about creating custom bitmaps on the pifacecad<br />\r\n<a href=\"https://piface.github.io/pifacecad/creating_custom_bitmaps.html\" class=\"uri\">https://piface.github.io/pifacecad/creating_custom_bitmaps.html</a></p></li>\r\n<li><p>This tool referenced in the pifacecad documentation link above can help design custom bitmaps. Make sure you select 5x8<br />\r\n<a href=\"https://www.quinapalus.com/hd44780udg.html\" class=\"uri\">https://www.quinapalus.com/hd44780udg.html</a></p></li>\r\n<li><p><code>def writelongstring(longstring):</code><br />\r\nWrites a long string to the piface control and display LCD &amp; scrolls it to the left until the last character appears on the right hand side of the screen</p></li>\r\n</ul>\r\n<pre><code># Local Variables (for function writelongstring)\r\nDisplaySize = 15\r\n# Number of characters  that can be displayed on 1 line of display\r\n\r\nStepSize = 4\r\n# Step size when scrolling message on display\r\n\r\nScrollSpeed =   0.55\r\n# Adjusts scroll speed, delay in seconds between scrolls\r\n\r\nScroll = 0\r\n# Default value for scroll, used when string is smaller than display size</code></pre>\r\n<ul>\r\n<li><p><code>def init_display():</code><br/>\r\n# Setup LCD display for selected menu 0 (Podcasts), 1 (Audiobooks), 2 (System)</p></li>\r\n<li><p><code>def display_main_menu(event):</code><br/>\r\n# Clear LCD &amp; dsplays the appropriate main menu message</p></li>\r\n</ul>\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(2952,'2019-11-26','Publishing your book using open source tools',1562,'How I evolved from writing with a publisher to self-publishing using open source tools','<p>Printing on demand website: <a href=\"https://www.lulu.com\" class=\"uri\">https://www.lulu.com</a></p>',369,0,0,'CC-BY-SA','asciidoc,asciidoctor,lulu,writing,books',0,0,1),
(2953,'2019-11-27','How I got started in Linux',276,'How I start in Linux, computing, and Free Software','<p>Osdisc.com is the website that I mentioned while distro hopping. Unfortunately, as of August 2019, their site is no longer sending CD’s/DVD’s.</p>\r\n<p>How I recorded:<br />\r\nAndroid phone, lapel mic, and Audio Recorder app found here:</p>\r\n<p><a href=\"https://play.google.com/store/apps/details?id=com.github.axet.audiorecorder\" class=\"uri\">https://play.google.com/store/apps/details?id=com.github.axet.audiorecorder</a></p>\r\n<p>And here:</p>\r\n<p><a href=\"https://f-droid.org/en/packages/com.github.axet.audiorecorder/\" class=\"uri\">https://f-droid.org/en/packages/com.github.axet.audiorecorder/</a></p>\r\n',318,29,0,'CC-BY-SA','Linux, FreeBSD, Computers',0,0,1),
(2957,'2019-12-03','Lord D\'s Film Reviews: Ever',1025,'Lostnbronx reviews a recent drama/romance.','<p><b>Ever</b><br />\r\nWritten/Directed by Josh Beck<br />\r\nStarring Wendy McColm &amp; Christina Elizabeth Smith<br />\r\nCinematography by Micah Van Hove<br />\r\nRunning Time: 1:37:42</p>\r\n<p><a href=\"https://www.youtube.com/watch?v=5F-XfwIvmMg\" class=\"uri\">https://www.youtube.com/watch?v=5F-XfwIvmMg</a></p>\r\n<p>A young woman named Ever, while grieving over a devastating loss, meets Emily, who helps her to heal and find love again.</p>\r\n',107,109,0,'CC-0','review, film, lord d',0,0,1),
(2959,'2019-12-05','Interview with Josh Clements about gpodder.net ',2314,'What starts as an Interview and ends in a brain storm.','<p>\r\nIn today\'s show Ken interviews Josh Clements from the <a href=\"https://gpodder.net\">gpodder.net</a> project.\r\n</p>\r\n<p>\r\nJosh answered the <a href=\"https://github.com/gpodder/mygpo/blob/master/maintainer-needed.md\">call to arms</a> he heard on the <a href=\"https://ubuntupodcast.org/2019/08/08/s12e18-pilotwings/\">Ubuntu Podcast</a>. We discuss <em>the plan</em> and explain how you can also get involved.\r\n</p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://github.com/gpodder/mygpo/blob/master/maintainer-needed.md\">https://github.com/gpodder/mygpo/blob/master/maintainer-needed.md</a></li>\r\n<li><a href=\"https://ubuntupodcast.org/2019/08/08/s12e18-pilotwings/\">https://ubuntupodcast.org/2019/08/08/s12e18-pilotwings/</a></li>\r\n<li><a href=\"https://github.com/gpodder/\">https://github.com/gpodder/</a></li>\r\n<li><a href=\"https://gpodder.github.io/docs/mailing-list.html\">https://gpodder.github.io/docs/mailing-list.html</a></li>\r\n<li><a href=\"https://feeds.gpodder.net/\">https://feeds.gpodder.net/</a></li>\r\n<li><a href=\"https://prgmr.com/xen/\">https://prgmr.com/xen/</a></li>\r\n<li><a href=\"mailto:support@gpodder.net\">support@gpodder.net</a></li>\r\n</ul>\r\n',30,78,0,'CC-BY-SA','gpodder.net, Josh Clements',0,0,1),
(2961,'2019-12-09','Kubernetics / Cloud - Terminology',664,'We talk about terms often used when using Kubernetes','<p>We talk about terms often used when using Kubernetes.</p>\r\n<p>Terms we talk about</p>\r\n<ul>\r\n<li>Node - Machine to run jobs on.</li>\r\n<li>Cluster - Grouping of nodes to deploy work to.</li>\r\n<li>Container - Compute unit that we can run in the cloud</li>\r\n<li>Pod - One or more containers that are one unit in the cloud that could be started, stopped, or restarted.</li>\r\n<li>Service - Different network services that serve the pods\r\n<ul>\r\n<li>Load balancers - Balance network calls to different pods</li>\r\n<li>Certmanager - Handles certificates, for instance, let’s encrypt.</li>\r\n<li>Ingress - Handles traffic from the external network</li>\r\n</ul></li>\r\n<li>Volumes - External resources used by pods to keep state</li>\r\n<li>ConfigMap - Configuration parameters that could be changed without restarting the pods or deployment.</li>\r\n<li>Deployment - A configuration of all the terms mentioned that you use to deploy as a unit to the cluster.</li>\r\n</ul>\r\n',382,0,0,'CC-BY-SA','kubernetics, basic, terminology',0,0,1),
(2968,'2019-12-18','Life and Times of a Geek part 3',2441,'Part 3 of my personal story of experiences with computers','<h2 id=\"introduction\">Introduction</h2>\n<p>In the last part of my story (show <a href=\"http://hackerpublicradio.org/eps/hpr1811\" title=\"Life and Times of a Geek part 2\">1811</a> in 2015) I told you about some of my experiences at the University of Manchester as a postgraduate student from around 1973.</p>\n<p>Today I want to talk a little more about my time in Manchester and mention some of the things I did that may be of interest to Hackers!</p>\n<h2 id=\"researching-for-the-episode\">Researching for the episode</h2>\n<p>As I have been researching for this HPR episode I realise how long ago some of these events were - in Internet years particularly. In many cases I could find no online records of places, equipment or people. This seems to be because any records there might be are on paper and have never made it online. I contacted a company that made some of the laboratory equipment I used that I thought might be of interest, and the person I contacted said that although he remembered what I was referring to the company had kept no records of it and had had to discontinue it due to modern safety concerns.</p>\n<p>I find this somewhat dispiriting and it makes me feel very very old!</p>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>I have provided detailed notes as usual for this episode. The HTML version can be <a href=\"hpr2968_full_shownotes.html\">viewed here</a> and the ePub version downloaded from <a href=\"hpr2968_full_shownotes.epub\">here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li>Building experimental apparatus:\n<ul>\n<li>Wikipedia page for <a href=\"https://en.wikipedia.org/wiki/Dexion\">Dexion</a> - for building metal structures</li>\n<li>Wikipedia page on the “<em>Skinner Box</em>” or <a href=\"https://en.wikipedia.org/wiki/Operant_conditioning_chamber\">Operant Conditioning Chamber</a></li>\n<li>“<em><a href=\"https://handytube.co.uk/\">Handy Tube</a></em>” used for making Skinner Boxes</li>\n</ul></li>\n<li>Video tape recorders:\n<ul>\n<li>The Rewind Museum <a href=\"https://www.rewindmuseum.com/reeltoreelvideo.htm\">reel-to-reel video recorders</a></li>\n<li>Wikipedia page on <a href=\"https://en.wikipedia.org/wiki/Video_tape_recorder\">Video tape recorders</a></li>\n<li>Youtube video about a <a href=\"https://www.youtube.com/watch?v=xwbMXqp0XtA\">Sanyo Reel to Reel Video Tape Recorder</a></li>\n</ul></li>\n<li>Logic programming:\n<ul>\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/Logic_gate\">Logic Gate</a></li>\n<li>Wikipedia page on the (electronic) <a href=\"https://en.wikipedia.org/wiki/Flip-flop_(electronics)\">“<em>Flip-Flop</em>”</a></li>\n</ul></li>\n<li>D-MAC Digitiser:\n<ul>\n<li>StackExchange article discussing the <a href=\"https://history.stackexchange.com/questions/48789/what-is-this-d-mac-device\"><em>D-MAC</em></a> digitiser</li>\n</ul></li>\n<li>ICT (ICL) computers:\n<ul>\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/ICT_1900_series\">ICT (ICL) 1900 series</a></li>\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/GEORGE_%28operating_system%29\">ICL GEORGE operating system</a></li>\n</ul></li>\n<li>Teleprinter:\n<ul>\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/Teletype_Model_33\">Teletype Model 33</a></li>\n</ul></li>\n<li>CDC computers:\n<ul>\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/CDC_Cyber\">CDC Cyber range</a></li>\n</ul></li>\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/APL_%28programming_language%29\">APL language</a></li>\n<li>Sinclair calculators:\n<ul>\n<li>Wikipedia page on the <a href=\"https://en.wikipedia.org/wiki/Sinclair_Scientific\">Sinclair Scientific</a></li>\n<li><a href=\"https://books.google.co.uk/books?id=FS6D5VL2qo4C&amp;pg=PA639#v=onepage&amp;q&amp;f=false\">New Scientist advertisement</a> December 1975</li>\n<li><a href=\"https://phils.bitboxes.co.uk/scan_and_ocr/manuals/sinclair_scientific/\">Sinclair Scientific operating instructions</a> [<em>This link might be dead; try the archive.org one below</em>]\n<ul>\n<li><a href=\"https://web.archive.org/web/20141021211903/https://phils.bitboxes.co.uk/scan_and_ocr/manuals/sinclair_scientific/\" class=\"uri\">https://web.archive.org/web/20141021211903/https://phils.bitboxes.co.uk/scan_and_ocr/manuals/sinclair_scientific/</a></li>\n</ul></li>\n<li><a href=\"https://files.righto.com/calculator/sinclair_scientific_simulator.html\">Sinclair Scientific simulator</a></li>\n<li><a href=\"https://www.vintagecalculators.com/html/sinclair1.html\">Vintage Calculators</a></li>\n<li><a href=\"https://www.calculator.org/rpn.aspx\">Reverse Polish Notation</a></li>\n</ul></li>\n<li>Previous episodes:\n<ul>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1664\"><em>Life and Times of a Geek</em> part 1</a> (2014-12-18)</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1811\"><em>Life and Times of a Geek</em> part 2</a> (2015-07-13)</li>\n</ul></li>\n<li>Resources:\n<ul>\n<li><a href=\"hpr2968_full_shownotes.html\">Full show notes</a></li>\n<li><a href=\"hpr2968_full_shownotes.epub\">ePub show notes</a></li>\n</ul></li>\n</ul>\n',225,29,1,'CC-BY-SA','video recorder,Skinner box,logic gate,digitiser,Dobbie McInnes,Data General,teletype,Cyber-72,APL,Si',0,0,1),
(2975,'2019-12-27','SimpleScreenRecorder and Vidcutter',311,'Two useful applications to record a screen, and to chop and trim a video ','<p>In today’s show Ken talks about two small applications to make recording and trimming video easy.</p>\r\n<h3>What is SimpleScreenRecorder?</h3>\r\n<blockquote>\r\n<p>SimpleScreenRecorder is a Linux program that I’ve created to record programs and games. There were already a few programs that could do this, but I wasn’t 100% happy with any of them, so I created my own.</p>\r\n<p>My original goal was to create a program that was just really simple to use, but as I was writing it I started adding more and more features, and the result is actually a pretty powerful program. It’s ‘simple’ in the sense that it’s easier to use than ffmpeg/avconv or VLC, because it has a straightforward user interface.</p>\r\n</blockquote>\r\n<h3>What is VidCutter</h3>\r\n<blockquote>\r\n<p>The simplest &amp; sexiest tool for cutting and joining your videos without the need for re-encoding or a diploma in multimedia. VidCutter focuses on getting the job done using tried and true tech in its arsenal via mpv and FFmpeg.</p>\r\n</blockquote>\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://www.maartenbaert.be/simplescreenrecorder/\">SimpleScreenRecorder</a> Homepage</li>\r\n<li><a href=\"https://github.com/ozmartian/vidcutter\">vidcutter</a> Homepage</li>\r\n<li><a href=\"https://www.linuxandubuntu.com/home/vidcutter-linux-video-cutting-or-trimming-app\">VidCutter – Linux Video Cutting Or Trimming App</a> review on <a href=\"https://www.linuxandubuntu.com/\">Linux And Ubuntu</a></li>\r\n</ul>\r\n',30,0,1,'CC-BY-SA','SimpleScreenRecorder, Vidcutter, ffmpeg, ffprobe, mediainfo',0,0,1),
(2980,'2020-01-03','FLOSS Weekly 553 - Hacker Public Radio',4037,'Randal Schwartz and Aaron Newcomb featured HPR on FLOSS Weekly ','<p>On the 30th Oct 2019 <a href=\"https://hackerpublicradio.org/correspondents/0198.html\">Kevin O’Brien (Ahuka)</a> and <a href=\"https://hackerpublicradio.org/correspondents/0030.html\">Ken Fallon</a> were interviewed about <a href=\"https://hackerpublicradio.org\">Hacker Public Radio</a> by <a href=\"https://twit.tv/people/randal-schwartz\">Randal Schwartz</a> and <a href=\"https://twit.tv/people/aaron-newcomb\">Aaron Newcomb</a> for <a href=\"https://twit.tv/shows/floss-weekly/episodes/553\">FLOSS Weekly 553</a>.</p>\r\n<p>This is that show and is released under a <a href=\"https://creativecommons.org/licenses/by-nc-nd/4.0/\">Creative Commons Attribution Non-Commercial No-Derivatives 4.0 International license</a>.</p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://twit.tv/people/randal-schwartz\">https://twit.tv/people/randal-schwartz</a></li>\r\n<li><a href=\"https://twit.tv/people/aaron-newcomb\">https://twit.tv/people/aaron-newcomb</a></li>\r\n<li><a href=\"https://twit.tv/shows/floss-weekly/episodes/553\">https://twit.tv/shows/floss-weekly/episodes/553</a></li>\r\n<li><a href=\"https://creativecommons.org/licenses/by-nc-nd/4.0/\">https://creativecommons.org/licenses/by-nc-nd/4.0/</a></li>\r\n<li><a href=\"https://hackerpublicradio.org\">https://hackerpublicradio.org</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0198.html\">https://hackerpublicradio.org/correspondents/0198.html</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0030.html\">https://hackerpublicradio.org/correspondents/0030.html</a></li>\r\n</ul>',30,78,0,'CC-BY-NC-ND','Randal Schwartz, Aaron Newcomb, FLOSS Weekly',0,0,1),
(2962,'2019-12-10','Bespoke bike building',1474,'Brian in Ohio continues his bike building project','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1282\">hpr 1282</a> john kulps efforts</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2869\">hpr 2869</a> part one of my build</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2875\">hpr 2875</a> part two</li>\r\n<li>recycled recumbent<br />\r\n<a href=\"https://sites.google.com/site/recycledrecumbents/home\" class=\"uri\">https://sites.google.com/site/recycledrecumbents/home</a></li>\r\n<li>fish mouth cutting on recumbents.com<br />\r\n<a href=\"https://www.wisil.recumbents.com/wisil/Plans/frametubes.htm\" class=\"uri\">https://www.wisil.recumbents.com/wisil/Plans/frametubes.htm</a></li>\r\n</ul>\r\n<h2 id=\"pictures\">Pictures</h2>\r\n<p>(The images below may be clicked to view the full-sized versions)</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture01-mocking-up-the-parts.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture01-mocking-up-the-parts-small.jpg\" alt=\"Mocking up parts\" /></a><br />\r\nmocking up parts to see spacing, especially the crankset</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture02-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture02-cutting-fishmouths-small.jpg\" alt=\"Laying out fishmouths\" /></a><br />\r\nlaying out ‘fishmouth’ cut, used to connect two tubes</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture03-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture03-cutting-fishmouths-small.jpg\" alt=\"Cutting fishmouths\" /></a><br />\r\nlay out fishmouth</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture04-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture04-cutting-fishmouths-small.jpg\" alt=\"Cutting fishmouths\" /></a><br />\r\nanother layout picture, note marks on tube</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture05-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture05-cutting-fishmouths-small.jpg\" alt=\"Cutting fishmouths\" /></a><br />\r\nfinished product</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture06-cutting-fishmouths.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture06-cutting-fishmouths-small.jpg\" alt=\"Cutting fishmouths\" /></a><br />\r\ntest fitting assembly one, the engine room</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture07-assembly-one-complete.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture07-assembly-one-complete-small.jpg\" alt=\"Brazing complete\" /></a><br />\r\nbrazing complete! assembly one done</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture08-readying-assembly-two.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture08-readying-assembly-two-small.jpg\" alt=\"Readying assembly\" /></a><br />\r\nsetting up assembly tube, gray tube slips inside the red tube</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture09-readying-assemby-two.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture09-readying-assemby-two-small.jpg\" alt=\"Removing tab\" /></a><br />\r\nneed to cut that small tab off, get to hear this in the recording</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture10-jigging-up-assembly2.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture10-jigging-up-assembly2-small.jpg\" alt=\"Jigging up\" /></a><br />\r\njigging up the frame, similar to john kulps set up, see hpr 1282</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture11-assemby2-done.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture11-assemby2-done-small.jpg\" alt=\"Still in the jig\" /></a><br />\r\nstill in the jig but all brazed up, top half of frame done!</p>\r\n<p><a href=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture12-next-next-brazing-here.jpg\"><img src=\"https://hackerpublicradio.org/eps/hpr2962/hpr2962/picture12-next-next-brazing-here-small.jpg\" alt=\"More brazing to do\" /></a><br />\r\nthe next part will be modifiying the rear triangle and brazing it where i’m pointing to.</p>\r\n<h2 id=\"summary\">Summary</h2>\r\n<ul>\r\n<li>all in all, went better than expected, i’ll clean up those brazing joints after the bike is done and has been ridden for a while, before I paint it.</li>\r\n<li>brazing isn’t as difficult as i thought it might be. give it a try its a cool hacker skill!</li>\r\n</ul>\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent, recycle',0,0,1),
(2963,'2019-12-11','A walk through my PifaceCAD Python code – Part 3',880,'In this episode I cover functions activated when a button is pushed on the PiFaceCAD board','<h3 id=\"code\">Code</h3>\r\n<p>The script being discussed in this show is available for download with the previous show: <a href=\"https://hackerpublicradio.org/eps/hpr2951/cad-menu.py\">cad-menu.py</a></p>\r\n<h3 id=\"functions\">Functions</h3>\r\n<ul>\r\n<li><p><code>def button0(event):</code><br />\r\nPlay / Pause Button<br />\r\nPrint message to lcd and toggle between play and pause for podcasts, then runs <code>init_display</code> to display available options</p></li>\r\n<li><p><code>def button1(event):</code><br />\r\nTrack Information button<br />\r\nPrint message to lcd then display current moc track information such as moc state, current time, time left, current playlist number of total playlist number &amp; podcast title.<br />\r\n<br />\r\nExample output from command <code>mocp --info</code></p>\r\n<pre><code>State: PAUSE\r\nFile: /home/pi/files/mp3/hpr1597.mp3\r\nTitle: Steve Smethurst - HPR1597: Extravehicular Activity (Hacker Public Radio)\r\nArtist: Steve Smethurst\r\nSongTitle: HPR1597: Extravehicular Activity\r\nAlbum: Hacker Public Radio\r\nTotalTime: 14:11\r\nTimeLeft: 02:47\r\nTotalSec: 851\r\nCurrentTime: 11:24\r\nCurrentSec: 684\r\nBitrate: 64kbps\r\nAvgBitrate: 64kbps\r\nRate: 44kHz</code></pre></li>\r\n<li><p><code>def button2(event):</code><br />\r\nPrevious Track Button<br />\r\nButton is only active if button is pushed twice within 0.3 seconds. This was added to stop moving to a new track by accidental pushing of button. If menu = 0 or 1 and value of variable TimeDiff is less than 0.3 then Print message to lcd and move to previous track in playlist. If menu = 2 and button pressed twice within 0.3 then display number of HPR shows in the queue</p></li>\r\n<li><p><code>def button3(event):</code><br />\r\nNext track Button<br />\r\nButton is only active if button is pushed twice within 0.3 seconds. This was added to stop moving to a new track by accidental pushing of button. If menu = 0 or 1 and value of variable TimeDiff is less than 0.3 then Print message to lcd and move to next track in playlist Button currently has no function if menu = 2</p></li>\r\n<li><p><code>def button4(event):</code><br />\r\nToggle backlight Button<br />\r\nIf 1st time button is pushed then turn off blinkstick and display main menu else Toggle lcd backlight between on and off</p></li>\r\n<li><p><code>def moc_seek():</code><br />\r\nUsed to seek backward or forward in track being played in mocp SeekPosition is a global variable used to store the current seek position, its value changes up and down when using button6 and button7</p></li>\r\n<li><code>def button5(event):</code><br />\r\nJogg switch<br />\r\nThis button is selected by momentarily pushing in the left/right toggle button. Button located on the top of unit<br />\r\n\r\n<ul>\r\n<li>If menu equals 0 or 1, [PODCASTS or AUDIOBOOKS] menu then<br />\r\n\r\n<ul>\r\n<li>if not in seek menu then display seek menu</li>\r\n<li>if in seek menu then jump forward or back in track by the amount currently displayed on the seek menu, uses function <code>moc_seek()</code></li>\r\n</ul></li>\r\n<li>If menu equals 2, [SYSTEM] menu then\r\n<ul>\r\n<li>Get date and time information, Clear screen, turn on LCD backlight print the shutdown message with date and time info to lcd &amp; then issue the shutdown command</li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<!-- -->\r\n<ul>\r\n<li><code>def button6(event):</code><br />\r\nLeft Jogg switch decrement through menus also used during seek<br />\r\nThis button is selected by momentarily pushing the toggle switch to the left. Button located on the top of unit<br />\r\nButton only active if more than 0.3 seconds has passed since it was last pushed, this was added to get around switch bounce causing multiple jumps in menu, think left and right jogg switch is a bit noisy.\r\n<ul>\r\n<li>If in seek menu\r\n<ul>\r\n<li>SeekPosition decrements by one until SeekMin is reached, and then returns to 0</li>\r\n<li>each time the display is updated with the decremented value stored in dictionary SeekDisplay</li>\r\n</ul></li>\r\n<li>If not in seek menu\r\n<ul>\r\n<li>Menu decrements down by one until MenuMin is reached then rolls over to MenuMax</li>\r\n</ul></li>\r\n</ul></li>\r\n<li><p><code>def button7(event):</code><br />\r\nSame as button6 above but instead increments value, i.e. menu or seek value is incremented by 1</p></li>\r\n<li><p><code>def print_ir_code(event):</code><br />\r\nUsed during debugging to get remote control working, came from piface examples page, prints IR code <code>print(event.ir_code)</code></p></li>\r\n<li><p><code>def ir_play(event):</code><br />\r\nIf the play button is pushed on the remote control twice within 0.5 seconds and if IR is active then toggle backlight and toggle between play and pause</p></li>\r\n<li><p><code>def ir_info(event):</code><br />\r\nIf the info button (pause) is pushed on the remote control twice within 0.5 seconds and if IR is active then toggle backlight and display on the LCD information about the current track</p></li>\r\n<li><p><code>def ir_rewind(event):</code><br />\r\nIf the rewind button is pushed on the remote control and if IR is active then toggle backlight and go to previous track on playlist</p></li>\r\n<li><p><code>def ir_forward(event):</code><br />\r\nIf the forward button is pushed on the remote control and if IR is active then toggle backlight and go to next track on playlist</p></li>\r\n<li><p><code>def ir_stop(event):</code><br />\r\nIf the stop button is pushed on the remote control and if IR is active then toggle backlight</p></li>\r\n<li><p><code>def ir_blue(event):</code><br />\r\nActivate and deactivate IR buttons on the remote control, turns blinkstick on red when IR active. When blue button is pushed twice within 0.5 seconds on remote control, toggle backlight and display momentary message on LCD display giving IR status i.e. are the remote control buttons active or deactive.<br />\r\n<br />\r\nAll remote buttons bar this one are affected. This feature was added to remotely disable all the buttons while using the TV remote control media buttons these would sometimes falsely trigger things<br />\r\n<br />\r\nThe double push of the blue button within 0.5 seconds was added as sometimes a single push of it was required on my TV and this would falsely activate it<br />\r\n<br />\r\nFeature added to check if var FirstPass is set to true, i.e. backlight button4 has not pushed since boot<br />\r\n<br />\r\nbutton4 normally toggles backlight but turns off hpr queue LED first time it’s pushed after boot.</p></li>\r\n</ul>\r\n',201,38,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(2964,'2019-12-12','Bolos and Bowties: Neckwear for Nerds',980,'I talk about ties, at least the kind I like to wear when the occasion calls for it.','<p>It\'s probably because of a non-conformist streak in me, but I\'ve never liked traditional neckties. In fact I never wanted to wear any ties until I got my first bolo tie, which was sufficiently different from everyone else and easy enough to put on that I decided I could wear bolo ties. I\'ve built a collection of about a dozen of these and they always get positive comments, especially the ones made from recycled circuit boards. Recently I\'ve expanded my horizons to include bowties, which have a more formal appearance and the added nerd factor of being difficult to tie for most people. In this episode I talk about my ties.</p>\r\n\r\n<h3>Click image to view photo gallery</h3>\r\n\r\n<p><a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/137675441@N05/albums/72157711876166718\" title=\"Bolos and Bowties\"><img src=\"https://live.staticflickr.com/65535/49100398632_cf81d6b66b.jpg\" width=\"500\" height=\"281\" alt=\"Bolos and Bowties\"></a></p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://circuitbreakerlabs.myshopify.com/\" target=\"_blank\">Circuit Breaker Labs</a> upcycled Jewelry made from circuit boards.</li>\r\n	<li><a href=\"https://www.hightidebowties.com/blogs/news/15522315-10-reasons-why-you-should-wear-a-bow-tie\">10 Reasons to Wear a Bowtie</a></li>\r\n</ul>\r\n',238,0,0,'CC-BY-SA','Style, Fashion, Recycling, Upcycling, Circuit Boards, Ties, Bowties, Bolo Ties, Neck ties',0,0,1),
(2969,'2019-12-19','Crewing a spaceship in Haskell',1358,'How to calculate amount of crew needed for a spaceship','<h2 id=\"intro\">Intro</h2>\r\n<p>Every spaceship in game needs a crew to operate it. Smaller ships with fewer components require less crew than huge ones with lots of components.</p>\r\n<h2 id=\"types\">Types</h2>\r\n<p>Unit stats lists amount of crew required to operate a spaceship and if they need sleeping quarters.</p>\r\n<pre><code>data UnitStats = UnitStats\r\n    { unitStatsMinimumCrew :: ![CrewRequirement]\r\n    , unitStatsNominalCrew :: ![CrewRequirement]\r\n    , unitStatsCrewSpace :: !TotalCrewSpace\r\n    , unitStatsCrewSpaceRequired :: !CrewSpaceReq\r\n    } deriving (Show, Read, Eq)</code></pre>\r\n<p>Different positions a crew can have is an enumeration:</p>\r\n<pre><code>data CrewPosition =\r\n    Commander\r\n    | Navigator\r\n    | Signaler\r\n    | SensorOperator\r\n    | Gunner\r\n    | Doctor\r\n    | Nurse\r\n    | Driver\r\n    | Helmsman\r\n    | Artificer\r\n    | Crew\r\n    | Passenger\r\n    deriving (Show, Read, Eq, Enum, Bounded)\r\nderivePersistField &quot;CrewPosition&quot;</code></pre>\r\n<p>Rank of a crew member isn’t a military rank, but rather their position in ship’s internal hierarchy:</p>\r\n<pre><code>data CrewRank =\r\n    SecondClass\r\n    | FirstClass\r\n    | Senior\r\n    | Chief\r\n    deriving (Show, Read, Eq, Enum, Bounded)\r\nderivePersistField &quot;CrewRank&quot;</code></pre>\r\n<p>Amount of crew is newtype that helps me not to mix different types of numbers with each other.</p>\r\n<pre><code>newtype CrewAmount = CrewAmount { unCrewAmount :: Int }\r\n    deriving (Show, Read, Eq, Ord, Num)</code></pre>\r\n<p>Total crew space of a ship is divided to three different types: steerage, standard and luxury.</p>\r\n<pre><code>data TotalCrewSpace = TotalCrewSpace\r\n    { totalCrewSpaceSteerage :: !(CrewSpace SteerageQuarters)\r\n    , totalCrewSpaceStandard :: !(CrewSpace StandardQuarters)\r\n    , totalCrewSpaceLuxury :: !(CrewSpace LuxuryQuarters)\r\n    } deriving (Show, Read, Eq)</code></pre>\r\n<p>Again, crew space is newtype so I don’t mix different types of numbers with each other.</p>\r\n<pre><code>data CrewSpace a =\r\n    CrewSpace { unCrewSpace :: CrewAmount }\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>I could have modeled fact that vehicle might need crew space with <code>Bool</code>, but having a descriptive name and type is more to my liking.</p>\r\n<pre><code>data CrewSpaceReq =\r\n    CrewSpaceRequired\r\n    | CrewSpaceOptional\r\n    deriving (Show, Read, Eq)\r\nderivePersistField &quot;CrewSpaceReq&quot;</code></pre>\r\n<p>The fact that single person could manage multiple components is reflected by <code>ComponentCrewReq</code> having <code>Double</code> instead of <code>Integer</code></p>\r\n<pre><code>-- | Crew requirements for a component\r\ndata ComponentCrewReq =\r\n    ComponentCrewReq CrewPosition Double\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>If you have questions, comments or feedback, easiest way to catch me nowdays is by email or in fediverse where I’m <code>Tuula@mastodon.social</code></p>\r\n',364,107,0,'CC-BY-SA','haskell, problem solving',0,0,1),
(2965,'2019-12-13','instant feedback for students in maths',838,'How we use old CAS software to give students instant feedback in their maths homework','<p>I\'m trying to make sure that this show doesn\'t come across as as advertisment placement on HPR I won\'t provide a link to our application (which wouldn\'t help a lot anyway as we don\'t really have much of a web site anyway.).</p>\r\n<p>However I\'ll link to some of the technical components:</p>\r\n<p>The Computer Algebra System we use is called <a href=\"https://maxima.sourceforge.net/\">Maxima</a>, its history goes back to the early 80s. It\'s written in common lisp.</p>\r\n<p>We have considered switching to <a href=\"https://www.sympy.org/\">SymPy</a> as a more modern alternative. SymPy doesn\'t offer the feature completeness Maxima does, though. It has still a long way to go.</p>\r\n<p>Our servers run <a href=\"https://debian.org/\">Debian</a>. The current version is written in <a href=\"https://www.php.net/\">PHP</a> but we are working on a new version based on dockerized <a href=\"https://www.djangoproject.com/\">Django</a> with a JS frontend in <a href=\"https://emberjs.com/\">Ember</a> along with some micro services written in <a href=\"https://golang.org/\">Go</a>, <a href=\"https://python.org/\">Python</a> and <a href=\"https://www.php.net/\">PHP</a>.</p>\r\n<p>To render math we use <a href=\"https://www.mathjax.org/\">MathJax</a> in the current version and <a href=\"https://katex.org/\">KaTeX</a> in the new version. The PDF-export of worksheets is of course done in <a href=\"https://www.latex-project.org/\">LaTeX</a>.</p>',288,0,0,'CC-BY-SA','maths,education,learning',0,0,1),
(2966,'2019-12-16','World of Commodore 2019 Episode 1: The Interviews',1174,'In this first episode, I interview exhibitors and members at the World of Commodore in 2019.','<p>Hello, good people of Hacker Public Radio, my name is Paul Quirk and this is my very first ever podcast. I would like to give credit Klaatu of Gnu World Order for making me aware of Hacker Public Radio, which I’ve been a listener of for the past year. As we near the holiday season of the winter solstice, I decided to give back to the open source community with this gift of a mini series of podcasts about the World of Commodore from December 7, 2019.</p>\r\n<p>The World of Commodore is an annual computer expo dedicated to Commodore computers that is normally held on the first Saturday of December in the city of Mississauga, Ontario. It started off back in 1983 by Commodore Canada as a trade show where Commodore and related vendors could showcase their latest products for the holiday season. As a Commodore computer nerd kid of the 1980’s living within an hour’s drive of Mississauga, this was an event I always looked forward to with excitement. For me, this was bigger and better than Santa Claus. Commodore went bankrupt in 1994, but a decade later, the show was revived by the Toronto PET user’s group, or TPUG, one of the world’s oldest computer user groups of which I am a member. Today’s World of Commodore is very different from the expo’s of the 1980’s, and has transformed into an event where hackers from around the world gather together to share ideas and show off their own discoveries and products, both open source and commercial.</p>\r\n<p>Since many listeners and contributors of Hacker Public Radio got started with a Commodore computer at some time, and since this event has grown beyond Commodore products and into open source hardware and software, I thought this event would be of great interest to this community, and it is my hope that many of you listeners might join us at next year’s World of Commodore.</p>\r\n<p>I have decided to create a miniseries of podcasts of this event which I will release on a weekly schedule. In this first episode, I walk around the trade show floor and interview various exhibitors, vendors, and members of TPUG. As there is a visual element to this podcast, I have posted pictures of the exhibits in my personal non-commercial blog at pquirk.com, which I encourage you to visit in order to get the full experience. And so, with no further ado, let’s all go to the wonderful world of Commodore.</p>\r\n<ul>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://signalsfromspace.ca/\" class=\"uri\">https://signalsfromspace.ca/</a></li>\r\n<li><a href=\"https://doublesidedgames.com/\" class=\"uri\">https://doublesidedgames.com/</a></li>\r\n<li><a href=\"https://pquirk.com/2019/12/08/world-of-commodore-2019-episode-1/\" class=\"uri\">https://pquirk.com/2019/12/08/world-of-commodore-2019-episode-1/</a></li>\r\n</ul>\r\n',383,103,0,'CC-BY-SA','Commodore,PET,Amiga,Gecko,retro',0,0,1),
(2967,'2019-12-17','Wrestling As You Like It Episode 2',1599,'Wrestling As You Like It Episode 2','<p>Today’s episode is about the landscape of professional wrestling today, the hierarchy, and how it came to be that way, and a brief explanation of different styles of professional wrestling.</p>',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1),
(2970,'2019-12-20','The Fediverse',1142,'The Fediverse is the open network of social media platforms','<p>The Fediverse is the name given to the collection of social media platforms that are distributed and interconnected. Distributed means that the servers are not centrally controlled, but are available to users in a variety of forms and conditions. And interconnected means they use protocols that are designed to allow communication between different platforms as well as different servers. The most common of these protocols is ActivityPub.</p>\r\n<p><a href=\"https://www.zwilnik.com/?page_id=1050\" class=\"uri\">https://www.zwilnik.com/?page_id=1050</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/\" class=\"uri\">https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/</a></li>\r\n<li><a href=\"https://www.w3.org/TR/activitypub/\" class=\"uri\">https://www.w3.org/TR/activitypub/</a></li>\r\n<li><a href=\"https://hacks.mozilla.org/2018/11/decentralizing-social-interactions-with-activitypub/\" class=\"uri\">https://hacks.mozilla.org/2018/11/decentralizing-social-interactions-with-activitypub/</a></li>\r\n<li><a href=\"https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/\" class=\"uri\">https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/</a></li>\r\n<li><a href=\"https://github.com/pump-io/pump.io/blob/master/API.md\" class=\"uri\">https://github.com/pump-io/pump.io/blob/master/API.md</a></li>\r\n<li><a href=\"https://blog.diasporafoundation.org/4-islamic-state-fighters-on-diaspora\" class=\"uri\">https://blog.diasporafoundation.org/4-islamic-state-fighters-on-diaspora</a></li>\r\n<li><a href=\"https://emojos.in/\" class=\"uri\">https://emojos.in/</a></li>\r\n<li><a href=\"https://mwl.io/\" class=\"uri\">https://mwl.io/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/ActivityPub\" class=\"uri\">https://en.wikipedia.org/wiki/ActivityPub</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Diaspora_(social_network)\" class=\"uri\">https://en.wikipedia.org/wiki/Diaspora_(social_network)</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Open_standard\" class=\"uri\">https://en.wikipedia.org/wiki/Open_standard</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/OStatus\" class=\"uri\">https://en.wikipedia.org/wiki/OStatus</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/XMPP\" class=\"uri\">https://en.wikipedia.org/wiki/XMPP</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1050\" class=\"uri\">https://www.zwilnik.com/?page_id=1050</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(2971,'2019-12-23','World of Commodore 2019 Episode 2: Hacking GeckOS',2960,'Glen Holmer explains how he got Linux running on a Commodore 64.','<ul>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n<li><a href=\"https://www.lyonlabs.org/\" class=\"uri\">https://www.lyonlabs.org/</a></li>\r\n<li><a href=\"https://www.youtube.com/user/TorontoPETUsersGroup/\" class=\"uri\">https://www.youtube.com/user/TorontoPETUsersGroup/</a></li>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n</ul>',383,103,0,'CC-BY-SA','Commodore,PET,Amiga,Geckos,retro,Linux,Open Source',0,0,1),
(2972,'2019-12-24','The foot of the ski slope',2681,'MrX and Dave Morriss chat about nerdy things near a ski slope','<h2 id=\"another-in-the-chat-series-from-edinburgh\">Another in the chat series from Edinburgh</h2>\r\n<h3 id=\"hosted-by-mrx1-and-dave-morriss2\">Hosted by <a href=\"https://hackerpublicradio.org/correspondents/0201.html\" title=\"MrX\">MrX</a> and <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" title=\"Dave Morriss\">Dave Morriss</a></h3>\r\n<p>This time we met up for breakfast on Sunday 24<sup>th</sup> November in a pub/restaurant in an area called <a href=\"https://en.wikipedia.org/wiki/Hillend,_Edinburgh\" title=\"Hillend, Midlothian\">Hillend</a>, just outside Edinburgh in <a href=\"https://en.wikipedia.org/wiki/Midlothian\" title=\"Midlothian municipal district\">Midlothian</a>. The hill close by is the location of the <a href=\"https://en.wikipedia.org/wiki/Midlothian_Snowsports_Centre\" title=\"Midlothian Snowsports Centre\">Midlothian Snowsports Centre</a>, an artificial Ski Slope which is very popular in the region for recreation and training.</p>\r\n<p>We chatted for a while inside then moved to <em>Studio C</em> in the car park and recorded this episode.</p>\r\n<h3 id=\"pdas-and-the-like\">PDAs and the like</h3>\r\n<p>We were talking about PDAs (Personal Data Assistants) from the 1980’s.</p>\r\n<ul>\r\n<li>MrX had recently been offered a <a href=\"https://en.wikipedia.org/wiki/Gemini_(PDA)\" title=\"Gemini PDA\">Gemini</a> device and had at one time owned a <a href=\"https://en.wikipedia.org/wiki/Psion_Series_3\" title=\"Psion Series 3\">Psion Series 3c</a>.</li>\r\n<li>Dave owns a broken <a href=\"https://en.wikipedia.org/wiki/Psion_Series_5\" title=\"Psion Series 5\">Psion Series 5</a> (and recently parted with a working one after much bargaining).</li>\r\n<li>Dave struggled to remember devices like the <a href=\"https://en.wikipedia.org/wiki/PalmPilot\" title=\"Palm Pilot\">Palm Pilot</a> which were quite popular in the 80’s and 90’s. These had no keyboard, but offered a touch-sensitive screen, used with a stylus, and had handwriting recognition<a href=\"#fn1\" class=\"footnote-ref\" id=\"fnref1\"><sup>1</sup></a>.</li>\r\n<li>MrX mentioned the Compaq <a href=\"https://en.wikipedia.org/wiki/IPAQ\" title=\"Compaq/HP iPAQ PDA\">iPAQ PDA</a> (Compaq was later acquired by Hewlett Packard) from the 2000’s, which was a much advanced PDA with similar features.</li>\r\n</ul>\r\n<h3 id=\"software-annoyances\">Software annoyances</h3>\r\n<ul>\r\n<li>Mr X has had some problems with the latest Audacity on Ubuntu. It sometimes does not launch from the menu link after an upgrade.</li>\r\n<li>Calibre on Dave’s <em>Debian Testing</em> system has stopped working recently, due to a Python error.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></li>\r\n<li>Dave uses Clementine, the music player, which turns off the UI when you close it down the wrong way and apparently doesn’t provide a way to enable it again without hacking the configuration file<a href=\"#fn3\" class=\"footnote-ref\" id=\"fnref3\"><sup>3</sup></a>.</li>\r\n<li>MrX had problems with audio device recognition and uses <code>hdajackretask</code> to correct this. This is part of the <code>alsa-tools-gui</code> package on Debian (and related)<a href=\"#fn4\" class=\"footnote-ref\" id=\"fnref4\"><sup>4</sup></a>, but has a non-intuitive UI.</li>\r\n</ul>\r\n<h3 id=\"os-choices\">OS choices</h3>\r\n<ul>\r\n<li>Dave uses Raspbian Lite on his headless Raspberry Pis (which he secures using advice from Ken Fallon’s HPR show on preparing the <a href=\"https://hackerpublicradio.org/eps.php?id=2356\" title=\"hpr2356 :: Safely enabling ssh in the default Raspbian Image\">Raspbian image</a>).</li>\r\n<li>MrX uses standard Raspian on RPis, Ubuntu as his main Linux version, as well as OSMC (Open Source Media Center) on a Raspberry Pi, for watching media.</li>\r\n<li>Dave originally started with Fedora (actually Red Hat version 4 for a brief time) then moved to Ubuntu (Kubuntu) before moving to Debian Testing on his desktop, and KDE Neon on his laptop.</li>\r\n<li>Both had used Crunchbang at one point, another Debian-based distribution.</li>\r\n</ul>\r\n<h3 id=\"a-few-other-topics\">A few other topics</h3>\r\n<ul>\r\n<li>MrX uses a Wiki service (<a href=\"https://www.wikidot.com/\" class=\"uri\">https://www.wikidot.com/</a>). Dave uses MediaWiki on a Raspberry Pi and has scripts that update some of the contents (mainly tables). There was discussion about using Pandoc (<a href=\"https://pandoc.org/\" class=\"uri\">https://pandoc.org/</a>) to generate MediaWiki markup from something like Markdown.</li>\r\n<li>Emulating a Bash session in a web browser. One example is: <a href=\"https://bellard.org/jslinux/\" class=\"uri\">https://bellard.org/jslinux/</a></li>\r\n<li>Online Python tools. For example: <a href=\"https://repl.it/languages/python3\" class=\"uri\">https://repl.it/languages/python3</a></li>\r\n<li>Midnight Commander (<a href=\"https://midnight-commander.org/\" class=\"uri\">https://midnight-commander.org/</a>) contains its own editor.</li>\r\n<li>Notepadqq (<a href=\"https://notepadqq.com/\" class=\"uri\">https://notepadqq.com/</a>) is a Notepad++-like editor for the Linux desktop.</li>\r\n<li>File managers:\r\n<ul>\r\n<li>MrX has problems with the Ubuntu file manager; he uses Nemo (<a href=\"https://en.wikipedia.org/wiki/Nemo_(file_manager)\" class=\"uri\">https://en.wikipedia.org/wiki/Nemo_(file_manager)</a>) for its more advanced features</li>\r\n<li>Dave uses KDE’s Dolphin (<a href=\"https://en.wikipedia.org/wiki/Dolphin_(file_manager)\" class=\"uri\">https://en.wikipedia.org/wiki/Dolphin_(file_manager)</a>)</li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>Location:\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Hillend,_Edinburgh\">Hillend</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Midlothian\">Midlothian</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Midlothian_Snowsports_Centre\">Midlothian Snowsports Centre</a> (Wikipedia)</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>PDAs (Personal Data Assistants - <a href=\"https://en.wikipedia.org/wiki/Personal_digital_assistant\">Wikipedia page</a>)\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Psion_Organiser\">Psion Organiser II</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Psion_Series_3\">Psion Series 3</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Psion_Series_5\">Psion Series 5</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/PalmPilot\">Palm Pilot</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Gemini_(PDA)\">Gemini PDA</a> (Wikipedia)</li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/IPAQ\">Compaq/HP iPAQ PDA</a> (Wikipedia)</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Compaq computers\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/IPAQ_(desktop_computer)\">iPAQ</a></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Software niggles:\r\n<ul>\r\n<li><a href=\"https://www.audacityteam.org/\">Audacity software</a></li>\r\n<li><a href=\"https://calibre-ebook.com/\">Calibre e-book Manager</a></li>\r\n<li><a href=\"https://www.clementine-player.org/\">Clementine music player</a></li>\r\n<li><code>hdajackretask</code> from the <a href=\"https://alsa-project.org/wiki/Main_Page\">ALSA Project</a></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Operating system choices:\r\n<ul>\r\n<li><a href=\"https://www.raspberrypi.org/downloads/raspbian/\">Raspbian Lite</a>\r\n<ul>\r\n<li>Dave’s HPR show about his <a href=\"https://hackerpublicradio.org/eps.php?id=2496\"><code>what_pi</code></a> script</li>\r\n</ul></li>\r\n<li><a href=\"https://osmc.tv/\">Open Source Media Center (OSMC)</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/CrunchBang_Linux\">Crunchbang Linux</a> (Wikipedia)</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>MrX’s shows that we were talking about:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2879\">Describing how I listen to podcasts PART 1</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2889\">Describing how I listen to podcasts PART 2</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2901\">Describing how I listen to podcasts PART 3</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2914\">Describing how I listen to podcasts PART 4</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2923\">Describing how I listen to podcasts PART 5</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2933\">A walk through my PifaceCAD Python code – Part 1</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2951\">A walk through my PifaceCAD Python code – Part 2</a></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>The previous episode:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2905\">Two HPR hosts living in the same region finally meet up!</a></li>\r\n</ul></li>\r\n</ul>\r\n<section class=\"footnotes\">\r\n<hr />\r\n<ol>\r\n<li id=\"fn1\"><p><small>The person using a Palm Pilot to take meeting notes had an external keyboard, and wasn’t using handwriting recognition!</small><a href=\"#fnref1\" class=\"footnote-back\">↩</a></p></li>\r\n<li id=\"fn2\"><p><small><code>calibre</code> was failing with the error: <code>ImportError: No module named functools_lru_cache</code>. It later proved possible to fix this by reinstalling a Python module: <code>pip2 install --force backports.functools_lru_cache</code></small><a href=\"#fnref2\" class=\"footnote-back\">↩</a></p></li>\r\n<li id=\"fn3\"><p><small>There have been no releases of Clementine since 2016 sadly, though there are more recent changes on the GitHub page.</small><a href=\"#fnref3\" class=\"footnote-back\">↩</a></p></li>\r\n<li id=\"fn4\"><p><small>Information on the web about <em>alsa-tools-gui</em> seems a little sparse. The <em>hdajackretask</em> application has a README file in the distribution that gives some information.</small><a href=\"#fnref4\" class=\"footnote-back\">↩</a></p></li>\r\n</ol>\r\n</section>',225,0,1,'CC-BY-SA','HPR,hosts,meeting,technology',0,0,1),
(2976,'2019-12-30','A walk through my PifaceCAD Python code – Part 4',391,'This is the last show in the series and covers the main program section at the bottom of my script','<p>This is the last show in the series. The series was recorded in one go and split into multiple parts. This last section is pretty short; it covers the main program section at the bottom of my script that calls all the other functions and allows the user to quit the program. In this episode I also mention explanatory notes that I included in my script. These are mainly for my own benefit so I could remember how I set up lirc. I’ve included these notes at the end of these show notes.</p>\r\n<p><b>Main program</b><br />\r\nTurn LCD backlight on, print <em>System up</em> message to LCD, wait a few seconds then clear screen. Activate push buttons on control and display board. Activates various IR buttons waiting on input from the remote control. Print quit message to terminal, waiting for input, repeat message until q is entered by user. When q is entered deactivate buttons and turn LCD backlight off.</p>\r\n<p>Below are my Lirc explanatory comments at the end of my Python script.</p>\r\n<blockquote>\r\n<p><code>lirc</code><br />\r\nThis is the Linux IR control program<br />\r\nLIRC (Linux Infrared remote control) is an open source package that allows users to receive and send infrared signals with a Linux-based computer system.</p>\r\n<p><code>Irrecord</code><br />\r\nTool used to record valid IR codes from your remote control. It generates the file <code>/etc/lirc/lircd.conf</code>, possibly overwrites original file so use with caution. It attempts to recognise your remote control from a series of button pushes. If the remote is not recognised then it captures the codes in raw mode, I abandoned this tool and got a valid IR file for a very similar remote control on the internet, see info below</p>\r\n<p><code>/etc/lirc/lircd.conf</code><br />\r\nFile used to store IR codes for your remote control, either using the tool <code>irrecord</code> or from somewhere on the internet. This file is a direct copy of file <code>\"BN59-00861A-SAMSUNG-TV.conf\"</code> I added the Samsung TV string to the file name.</p>\r\n<p><code>irw</code><br />\r\nTool used to get the key names for your particular remote control, for this to work you must first have a valid <code>/etc/lirc/lircd.conf</code> file</p>\r\n<p><code>~/.lircrc</code><br />\r\nThis file is used to store the remote control key names that you want to activate, and what action is to be taken when the button is pushed. Adding the field <code>\"remote =\"</code> allows the use of multiple remote controls. The remote control key names can be found by using the command <code>\"irw\"</code>, I created a file called <code>~/scripts/remote-key-names-sorted.txt</code> to store the valid key names for my Samsung remote control</p>\r\n<p><code>~/scripts/remote-key-names-sorted.txt</code><br />\r\nList of valid remote control key names for my Samsung remote control, this was generated using the <code>irw</code> command. I used the <code>\"tee\"</code> command to pipe output to the screen and write output to this file at the same time, see file for further details of commands I used.</p>\r\n</blockquote>\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1),
(3241,'2021-01-04','HPR Community News for December 2020',4055,'HPR Volunteers Dave, ToeJet, and Ken talk about shows released and comments posted in December 2020','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new host: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0011.html\" target=\"_blank\">Pat from TLLTS</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3217\" target=\"_blank\">3217</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3217\" target=\"_blank\">Sump Minion</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0326.html\" target=\"_blank\">Brian in Ohio</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3218\" target=\"_blank\">3218</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3218\" target=\"_blank\">An introduction to Darktable</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3219\" target=\"_blank\">3219</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3219\" target=\"_blank\">Linux Inlaws S01E18: Voice Recognition and Text to Speech</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3220\" target=\"_blank\">3220</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-12-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3220\" target=\"_blank\">PixelFed</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3221\" target=\"_blank\">3221</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-12-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3221\" target=\"_blank\">HPR Community News for November 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3222\" target=\"_blank\">3222</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3222\" target=\"_blank\">Musings about writing a book about the Odoo software suite</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3223\" target=\"_blank\">3223</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3223\" target=\"_blank\">My COVID year summary</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3224\" target=\"_blank\">3224</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3224\" target=\"_blank\">Adventures in Retrocomputing with the Mac Plus</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3225\" target=\"_blank\">3225</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-12-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3225\" target=\"_blank\">Grill repair</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3226\" target=\"_blank\">3226</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-12-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3226\" target=\"_blank\">Using taskwarrior to structurize your work</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3227\" target=\"_blank\">3227</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3227\" target=\"_blank\">Fresh water Aquarium Basics</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3228\" target=\"_blank\">3228</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3228\" target=\"_blank\">YAML basics</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3229\" target=\"_blank\">3229</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3229\" target=\"_blank\">Linux Inlaws S01E19: Redis</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3230\" target=\"_blank\">3230</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-12-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3230\" target=\"_blank\">Introduction to Layers</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3231\" target=\"_blank\">3231</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-12-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3231\" target=\"_blank\">USB Key</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0273.html\" target=\"_blank\">ToeJet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3232\" target=\"_blank\">3232</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3232\" target=\"_blank\">Nextcloud</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3233\" target=\"_blank\">3233</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3233\" target=\"_blank\">HPR RPG Club reviews Shadowrun 5e</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3234\" target=\"_blank\">3234</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3234\" target=\"_blank\">Apple products I have owned</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3235\" target=\"_blank\">3235</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-12-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3235\" target=\"_blank\">Soldering Tips</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3236\" target=\"_blank\">3236</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-12-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3236\" target=\"_blank\">The State of Linux Audio Apps in 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0011.html\" target=\"_blank\">Pat from TLLTS</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3237\" target=\"_blank\">3237</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-12-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3237\" target=\"_blank\">Cloning a Hard Drive with Clonezilla</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0238.html\" target=\"_blank\">Jon Kulp</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3238\" target=\"_blank\">3238</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-12-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3238\" target=\"_blank\">Linux Inlaws S01E20: The Xmas and New Year Special</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3239\" target=\"_blank\">3239</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-12-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3239\" target=\"_blank\">New Community Project Proposal</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 18 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 3 comments on\n3 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3090#comments\" target=\"_blank\">hpr3090</a></strong>\n(2020-06-05) \"<em>Locating Computer on a Enterprise Network</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3090#3\" target=\"_blank\">Comment 3</a>:\nnstr on 2020-12-01:\n\"wow\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3158#comments\" target=\"_blank\">hpr3158</a></strong>\n(2020-09-09) \"<em>Fingerprint access control? LOL... </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3158#3\" target=\"_blank\">Comment 3</a>:\ncrust punk on 2020-12-03:\n\"untitled\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3207#comments\" target=\"_blank\">hpr3207</a></strong>\n(2020-11-17) \"<em>Fireside chat with E Nigma</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3207#1\" target=\"_blank\">Comment 1</a>:\noperat0r on 2020-12-04:\n\"old days\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 15 comments on 8 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3218#comments\" target=\"_blank\">hpr3218</a></strong>\n(2020-12-02) \"<em>An introduction to Darktable</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3218#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2020-12-03:\n\"Another great show\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3218#2\" target=\"_blank\">Comment 2</a>:\nRay Arachelian on 2020-12-06:\n\"would have been useful to have this podcast as a video instead\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3218#3\" target=\"_blank\">Comment 3</a>:\nKen Fallon on 2020-12-08:\n\"Supporting Video\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3220#comments\" target=\"_blank\">hpr3220</a></strong>\n(2020-12-04) \"<em>PixelFed</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3220#1\" target=\"_blank\">Comment 1</a>:\nsesamemucho on 2020-12-05:\n\"A complete and conclusive report\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3220#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-12-05:\n\"You are most welcome\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3223#comments\" target=\"_blank\">hpr3223</a></strong>\n(2020-12-09) \"<em>My COVID year summary</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3223#1\" target=\"_blank\">Comment 1</a>:\nBrian-in-ohio on 2020-12-12:\n\"compliment\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3223#2\" target=\"_blank\">Comment 2</a>:\nMr. Young on 2020-12-21:\n\"re: compliment\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3226#comments\" target=\"_blank\">hpr3226</a></strong>\n(2020-12-14) \"<em>Using taskwarrior to structurize your work</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0369.html\" target=\"_blank\">Jeroen Baten</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3226#1\" target=\"_blank\">Comment 1</a>:\nJon Kulp on 2020-12-16:\n\"I like it but probably won\'t switch completely\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3226#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-12-20:\n\"Write a manual!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3227#comments\" target=\"_blank\">hpr3227</a></strong>\n(2020-12-15) \"<em>Fresh water Aquarium Basics</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3227#1\" target=\"_blank\">Comment 1</a>:\nJon Kulp on 2020-12-16:\n\"Pictures!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3231#comments\" target=\"_blank\">hpr3231</a></strong>\n(2020-12-21) \"<em>USB Key</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0273.html\" target=\"_blank\">ToeJet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3231#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2020-12-29:\n\"Great technique\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3232#comments\" target=\"_blank\">hpr3232</a></strong>\n(2020-12-22) \"<em>Nextcloud</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3232#1\" target=\"_blank\">Comment 1</a>:\nthe pro on 2020-12-22:\n\"this is a nice group\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3232#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2020-12-22:\n\"Upgrade via the UI ?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3232#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2020-12-23:\n\"Good inspiration!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3236#comments\" target=\"_blank\">hpr3236</a></strong>\n(2020-12-28) \"<em>The State of Linux Audio Apps in 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0011.html\" target=\"_blank\">Pat from TLLTS</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3236#1\" target=\"_blank\">Comment 1</a>:\nClaudioM on 2020-12-28:\n\"Links for the Episode\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-December/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-December/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a></b></p>\n<p>Over the period tags and/or summaries have been added to 3 shows which were without them.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3261,'2021-02-01','HPR Community News for January 2021',3606,'HPR Volunteers talk about shows released and comments posted in January 2021','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new host: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0389.html\" target=\"_blank\">TrumpetJohn</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3240\" target=\"_blank\">3240</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3240\" target=\"_blank\">Linux Under Attack</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3241\" target=\"_blank\">3241</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-01-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3241\" target=\"_blank\">HPR Community News for December 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3242\" target=\"_blank\">3242</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-01-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3242\" target=\"_blank\">The eternal battle over how to run your chromebook is about to begin</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3243\" target=\"_blank\">3243</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-01-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3243\" target=\"_blank\">Pictor - free and open radio astronomy</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3244\" target=\"_blank\">3244</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-01-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3244\" target=\"_blank\">Interview with Anco Scholte ter Horst CEO of Freedom Internet</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3245\" target=\"_blank\">3245</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3245\" target=\"_blank\">ELECTRICITY</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3246\" target=\"_blank\">3246</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-01-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3246\" target=\"_blank\">LXCast: freeing the Fairphone 3 (and many other phones) </a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0285.html\" target=\"_blank\">2BFrank</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3247\" target=\"_blank\">3247</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-01-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3247\" target=\"_blank\">Saturday Morning Automotive Routine</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0389.html\" target=\"_blank\">TrumpetJohn</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3248\" target=\"_blank\">3248</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-01-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3248\" target=\"_blank\">SARS-CoV-2 detection by PCR explanation</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3249\" target=\"_blank\">3249</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-01-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3249\" target=\"_blank\">Linux Inlaws S01E21: The Big Linux Inlaws Peep Show</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3250\" target=\"_blank\">3250</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3250\" target=\"_blank\">GIMP: Getting Started With Layers</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3251\" target=\"_blank\">3251</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-01-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3251\" target=\"_blank\">Opposing Views on Alcohol</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0215.html\" target=\"_blank\">Windigo</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3252\" target=\"_blank\">3252</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-01-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3252\" target=\"_blank\">Simple JSON querying tool (also YAML, and to a lesser extent XML)</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0385.html\" target=\"_blank\">crvs</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3253\" target=\"_blank\">3253</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-01-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3253\" target=\"_blank\">Pandas Intro</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3254\" target=\"_blank\">3254</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-01-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3254\" target=\"_blank\">The Markdown editor Retext</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3255\" target=\"_blank\">3255</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3255\" target=\"_blank\">garage door part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3256\" target=\"_blank\">3256</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-01-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3256\" target=\"_blank\">Update, MS Teams, Covid 19, Raspberry PI 400 Raspberry PI 4 8GB Centos</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0129.html\" target=\"_blank\">JWP</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3257\" target=\"_blank\">3257</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-01-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3257\" target=\"_blank\">Lack of diversity in Linux and other open source communities</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3258\" target=\"_blank\">3258</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-01-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3258\" target=\"_blank\">Linux Inlaws S01E22: The Linux Professional Institute</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3259\" target=\"_blank\">3259</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-01-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3259\" target=\"_blank\">Nextcloud - The easy way</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3260\" target=\"_blank\">3260</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-01-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3260\" target=\"_blank\">Free, Public Domain and Creative Commons Assets</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 21 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 2 comments on\n2 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3236#comments\" target=\"_blank\">hpr3236</a></strong>\n(2020-12-28) \"<em>The State of Linux Audio Apps in 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0011.html\" target=\"_blank\">Pat from TLLTS</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3236#2\" target=\"_blank\">Comment 2</a>:\nMarc Lavallee on 2021-01-10:\n\"Jack and Pulseadio\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3237#comments\" target=\"_blank\">hpr3237</a></strong>\n(2020-12-29) \"<em>Cloning a Hard Drive with Clonezilla</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0238.html\" target=\"_blank\">Jon Kulp</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3237#1\" target=\"_blank\">Comment 1</a>:\njezra on 2021-01-04:\n\"blather\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 19 comments on 12 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3240#comments\" target=\"_blank\">hpr3240</a></strong>\n(2021-01-01) \"<em>Linux Under Attack</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3240#1\" target=\"_blank\">Comment 1</a>:\nGreat episode on 2021-01-11:\n\"Important information, thank you\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3242#comments\" target=\"_blank\">hpr3242</a></strong>\n(2021-01-05) \"<em>The eternal battle over how to run your chromebook is about to begin</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3242#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2021-01-06:\n\"Video\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3242#2\" target=\"_blank\">Comment 2</a>:\nKlaatu on 2021-01-07:\n\"Cool skills\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3242#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-01-08:\n\"I loved the show\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3242#4\" target=\"_blank\">Comment 4</a>:\nReto on 2021-01-17:\n\"I like the concept\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3244#comments\" target=\"_blank\">hpr3244</a></strong>\n(2021-01-07) \"<em>Interview with Anco Scholte ter Horst CEO of Freedom Internet</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3244#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-01-12:\n\"I\'m jealous!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3244#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2021-01-24:\n\"Great show for lifting the spirits\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3245#comments\" target=\"_blank\">hpr3245</a></strong>\n(2021-01-08) \"<em>ELECTRICITY</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3245#1\" target=\"_blank\">Comment 1</a>:\nPaul Quirk on 2020-11-07:\n\"Show warning\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3246#comments\" target=\"_blank\">hpr3246</a></strong>\n(2021-01-11) \"<em>LXCast: freeing the Fairphone 3 (and many other phones) </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0285.html\" target=\"_blank\">2BFrank</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3246#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-01-19:\n\"I loved the show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3247#comments\" target=\"_blank\">hpr3247</a></strong>\n(2021-01-12) \"<em>Saturday Morning Automotive Routine</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0389.html\" target=\"_blank\">TrumpetJohn</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3247#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-01-19:\n\"Excellent!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3248#comments\" target=\"_blank\">hpr3248</a></strong>\n(2021-01-13) \"<em>SARS-CoV-2 detection by PCR explanation</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" target=\"_blank\">Mr. Young</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3248#1\" target=\"_blank\">Comment 1</a>:\nnorrist on 2021-01-13:\n\"Is Mr. Young  a genius?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3248#2\" target=\"_blank\">Comment 2</a>:\nKevin O&#39;Brien on 2021-01-20:\n\"Another fantastic show\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3249#comments\" target=\"_blank\">hpr3249</a></strong>\n(2021-01-14) \"<em>Linux Inlaws S01E21: The Big Linux Inlaws Peep Show</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3249#1\" target=\"_blank\">Comment 1</a>:\nOperat0r on 2021-01-22:\n\"greets!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3252#comments\" target=\"_blank\">hpr3252</a></strong>\n(2021-01-19) \"<em>Simple JSON querying tool (also YAML, and to a lesser extent XML)</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0385.html\" target=\"_blank\">crvs</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3252#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2021-01-29:\n\"Using this today\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3253#comments\" target=\"_blank\">hpr3253</a></strong>\n(2021-01-20) \"<em>Pandas Intro</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3253#1\" target=\"_blank\">Comment 1</a>:\nMr. Young on 2021-01-20:\n\"New info, even for me\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3257#comments\" target=\"_blank\">hpr3257</a></strong>\n(2021-01-26) \"<em>Lack of diversity in Linux and other open source communities</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3257#1\" target=\"_blank\">Comment 1</a>:\nMr. Young on 2021-01-26:\n\"I can relate\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3257#2\" target=\"_blank\">Comment 2</a>:\nTony Hughes on 2021-01-26:\n\"The lack of diversity in Linux\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3257#3\" target=\"_blank\">Comment 3</a>:\nBeeza on 2021-01-27:\n\"Thoughts on diversity\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3258#comments\" target=\"_blank\">hpr3258</a></strong>\n(2021-01-27) \"<em>Linux Inlaws S01E22: The Linux Professional Institute</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3258#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-01-28:\n\"I loved the show\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-January/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-January/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a></b></p>\n<p>Over the period tags and/or summaries have been added to 3 shows which were without them.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(2973,'2019-12-25','Introduction to Advent of Code',836,'Advent of code is a challenge each year between 1-25 of December.','<p>I discuss all the challenges we have seen so far during the Advent of Code and talk about what they entailed and how hard they were to solve.</p>',382,0,0,'CC-BY-SA','coding, challenge',0,0,1),
(2974,'2019-12-26','Guitar Setup pt. 2',3107,'NYbill finish a guitar setup.','<p>Heh, listen to NYbill tune a guitar for an hour.</p>\r\n<p>Part two of guitar set up. Fret polishing, neck relief, string height, and intonation.</p>\r\n<h3 id=\"suppliers\">Suppliers:</h3>\r\n<ul>\r\n<li><p>Stewart MacDonald:<br />\r\n<a href=\"https://www.stewmac.com/\" class=\"uri\">https://www.stewmac.com/</a></p></li>\r\n<li><p>Warmoth:<br />\r\n<a href=\"https://www.warmoth.com/\" class=\"uri\">https://www.warmoth.com/</a></p></li>\r\n<li><p>Allied Lutherie:<br />\r\n<a href=\"https://alliedlutherie.com/\" class=\"uri\">https://alliedlutherie.com/</a></p></li>\r\n<li><p>Guitar Fetish:<br />\r\n<a href=\"https://www.guitarfetish.com/\" class=\"uri\">https://www.guitarfetish.com/</a></p></li>\r\n<li><p>Zona micro fiber polishing paper:<br />\r\n<a href=\"https://www.zonatool.net/cat/scroll-sander-sanding-tools/3m-wet-dry-micron-graded-polishing-papers/\" class=\"uri\">https://www.zonatool.net/cat/scroll-sander-sanding-tools/3m-wet-dry-micron-graded-polishing-papers/</a></p></li>\r\n<li><p>Pics for the episode:<br />\r\n<a href=\"https://media.gunmonkeynet.net/u/nybill/collection/guitar-setup-pt-2/\" class=\"uri\">https://media.gunmonkeynet.net/u/nybill/collection/guitar-setup-pt-2/</a></p></li>\r\n</ul>\r\n',235,0,0,'CC-BY-SA','Guitar, Setup, Repair',0,0,1),
(2977,'2019-12-31','World of Commodore 2019 Episode 3: Life after Commodore',1660,'A presentation by Dr. Richard Immers, author of \"Inside Commodore DOS\"','<p>Some relevant links of note:</p>\r\n<ul>\r\n<li><a href=\"https://www.goodreads.com/author/show/826731.Richard_C_Immers\" class=\"uri\">https://www.goodreads.com/author/show/826731.Richard_C_Immers</a></li>\r\n<li><a href=\"https://www.youtube.com/user/TorontoPETUsersGroup/\" class=\"uri\">https://www.youtube.com/user/TorontoPETUsersGroup/</a></li>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>\r\n',383,78,0,'CC-BY-SA','Commodore,PET,Amiga,64,Geckos,retro,Inside Commodore,DOS',0,0,1),
(2978,'2020-01-01','GARAGE DOOR',738,'I talk about various GARAGE DOOR and fixes','<p>Are you afraid if your garage door ? Have no fear!</p>',36,0,1,'CC-BY-SA','home improvement, garage door ,DIY',0,0,1),
(2982,'2020-01-07','World of Commodore 2019 Episode 4: Bare metal c64 Emulation on Raspberry Pi',2420,'Randy Rossi\'s presentation of his Github project on bare metal emulation of the C64 on a Pi 3.','<p>Links of note:</p>\r\n<ul>\r\n<li><a href=\"https://github.com/randyrossi/bmc64\" class=\"uri\">https://github.com/randyrossi/bmc64</a></li>\r\n<li><a href=\"https://www.youtube.com/user/TorontoPETUsersGroup/\" class=\"uri\">https://www.youtube.com/user/TorontoPETUsersGroup/</a></li>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>',383,103,0,'CC-BY-SA','Raspberry,Pi,emulation,Commodore,64,World of Commodore,TPUG,Toronto,Pet,Users,Group,Github,Open Sour',0,0,1),
(2985,'2020-01-10','Firefox Update',1046,'Some recent updates to Firefox that add useful features','<p>Firefox has been the more secure alternative to Chrome, and it has over the last few months made some updates. So we may want to take a look and see if these are any good, and ask if they add to the security. In some cases there are valuable improvements, such as Facebook Container and the Monitor service.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.mozilla.org/en-US/firefox/flashback/\" class=\"uri\">https://www.mozilla.org/en-US/firefox/flashback/</a></li>\r\n<li><a href=\"https://www.mozilla.org/en-US/firefox/privacy/\" class=\"uri\">https://www.mozilla.org/en-US/firefox/privacy/</a></li>\r\n<li><a href=\"https://www.mozilla.org/en-US/privacy/firefox/\" class=\"uri\">https://www.mozilla.org/en-US/privacy/firefox/</a></li>\r\n<li><a href=\"https://support.mozilla.org/en-US/kb/firefox-accounts-managing-account-data\" class=\"uri\">https://support.mozilla.org/en-US/kb/firefox-accounts-managing-account-data</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1072\" class=\"uri\">https://www.zwilnik.com/?page_id=1072</a></li>\r\n</ul>\r\n',198,74,0,'CC-BY-SA','Firefox, Sync, Container',0,0,1),
(2986,'2020-01-13','Onlykey Updated',1390,'Onlykey more like you better have two keys!','<p>I chat about Onlykey updates along with plugins / updates / issues/ fixes</p>\r\n<p><a href=\"https://chrome.google.com/webstore/detail/onlykey-configuration/adafilbceehejjehoccladhbkgbjmica?hl=en-US\" class=\"uri\">https://chrome.google.com/webstore/detail/onlykey-configuration/adafilbceehejjehoccladhbkgbjmica?hl=en-US</a></p>\r\n',36,74,1,'CC-BY-SA','fob,2fa,onlykey,security,computers',0,0,1),
(2991,'2020-01-20','Fix yer fog machine',674,'Save Your Fog Machine today!','<p><a href=\"https://smile.amazon.com/gp/product/B077HYSYSG\" class=\"uri\">https://smile.amazon.com/gp/product/B077HYSYSG</a></p>\r\n',36,0,1,'CC-BY-SA','Halloween,fog machine,DIY',0,0,1),
(2996,'2020-01-27','Spideroak Update',465,'I give you an update on my cloud backup solution and fixes','<p><a href=\"https://spideroak.support/hc/en-us/articles/115001891343-Command-Line-Reference\" class=\"uri\">https://spideroak.support/hc/en-us/articles/115001891343-Command-Line-Reference</a></p>\r\n<p>service script:</p>\r\n<pre><code># Make sure you have space or link the base path to some place else\r\n# make sure you have R/W for the plex user\r\n# ln -s /media/data/SPIDEROAK_CONFIG/ /home/plex/.config/SpiderOakONE\r\n\r\n[Unit]\r\nDescription=SPIDEROAK STARTUP\r\nAfter=network.target\r\n\r\n[Service]\r\nUser=plex\r\nGroup=adm\r\n\r\nType=simple\r\nExecStart=/bin/bash -c &#39;\r\nPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ;\r\n/usr/bin/SpiderOakONE --headless --verbose&#39;\r\n\r\n[Install]\r\nWantedBy=multi-user.target</code></pre>\r\n',36,0,1,'CC-BY-SA','cloud backup,computers,linux,spideroak one,spideroak',0,0,1),
(3006,'2020-02-10','Hijack Auxiliary Input of your car!',2159,'I talk about my Q40 and getting Auxiliary Input when your car does not have one','<p><a href=\"https://www.myg37.com/forums/audio-video-and-electronics/285929-2015-infiniti-q40-4dr-with-crap-audio.html\" class=\"uri\">https://www.myg37.com/forums/audio-video-and-electronics/285929-2015-infiniti-q40-4dr-with-crap-audio.html</a></p>\r\n<p><a href=\"https://rmccurdy.com/.scripts/downloaded/www.nicoclub.com/FSM/Q40/2015%20Q40/\" class=\"uri\">https://rmccurdy.com/.scripts/downloaded/www.nicoclub.com/FSM/Q40/2015%20Q40/</a></p>\r\n<p><strong>Updated: Solved:</strong> The audio could use a dac or something nice but this will do. Not (DO NOT PLUG IN THE HARNESS WRONG ORDER OR YOU WILL BLOW AT LEAST 4 FUSES ) I had to swap out 3 in the passenger side and 1 for the rear lights on the IPDM E/R next to the battery in a #@$% spot.</p>\r\n<p>pulled the pins and soldered a audio jack to them and fed it though the AC vent :</p>\r\n<p>pin 1 - G : Satellite radio sound signal LH pin 2 + R : Satellite radio sound signal LH pin 3 - w : Satellite radio sound signal RH pin 4 + b : Satellite radio sound signal RH</p>\r\n<h4 id=\"reference\">Reference:</h4>\r\n<ul>\r\n<li><a href=\"https://www.myg37.com/forums/audio-v...ml#post4253485\" class=\"uri\">https://www.myg37.com/forums/audio-v...ml#post4253485</a></li>\r\n<li><a href=\"https://rmccurdy.com/.scripts/downlo...5%20Q40/av.pdf\" class=\"uri\">https://rmccurdy.com/.scripts/downlo...5%20Q40/av.pdf</a> pg 42</li>\r\n</ul>\r\n<p><b>NOT SOLVED 08/21/2019 :</b> So I\'m sick of this jank setup .. the software is wonky and works about 1/2 the time .. I have to ƒ@#$ with it for about 5-10 min every time I want to use it … WIRELINQ is crap.. and I don\'t want the 600$ BT mod .. I just want AUX in !! I dont care if CD or SAT is spliced!</p>\r\n<ul>\r\n<li>NO I\'m not using a Apple device ..</li>\r\n<li>NO I\'m not going BT because its crap audio ..</li>\r\n<li>NO I\'m not using MONO or anything like that (discord) because that\'s even worse then BT…</li>\r\n<li>NO I\'m not using a FM Transmitter because that\'s just stupid its a 2015 car it should have AUX input ..</li>\r\n</ul>\r\n<p>maybe I can hack it myself the issue is that the SAT is in the @<span class=\"math inline\"></span>^ing trunk .. so I would have to find the wires that go to the trunk. I use a long speaker wire with alligator clips on it and a continuity tester (volt meter ) to hunt for it …</p>\r\n<p>Part No<br />\r\n2591a 1ma5e</p>\r\n<p>Model No<br />\r\ncv-vn01e04d</p>\r\n<p>\"11 12 Infiniti G25 G37 Radio CD Player 2591A-1MA5E Bulk 711\"</p>\r\n<p><b>SOLVED 01/20/2018 :</b> YAY ! this works and I dont have to have grap BT audio</p>\r\n<ul>\r\n<li>2015 INFINITI Q40 NONAV ANDROID</li>\r\n<li>IPOD WIRELINQ GROM-WLQ</li>\r\n<li>Electop 2 Pack USB 2.0 A Female to USB Micro Female Adapter Converter</li>\r\n<li>Wsken Mini2 Micro USB Magnetic LED Display Data Sync Fast Charge 3.28ft Cable for Android (Silver)</li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','Car Audio,DIY,music,cars,auto',0,0,1),
(3011,'2020-02-17','Linux is HARD rant with Intel graphics',1228,'I go over my issues around Linux in general specifically Video issues','<p>Help me help you! I rant about linux and Video drivers etc …</p>\r\n<p>Get Video and CPU Info<br />\r\nchrome://gpu</p>\r\n<pre><code># gives you info about video GPU in chrome!\r\nchrome://gpu</code></pre>\r\n<p>phoronix-test-suite system-info</p>\r\n<pre><code># neat little project to dump out all kinds of info\r\nphoronix-test-suite system-info</code></pre>\r\n<pre><code># get hard disk temperatures !\r\n\r\nhddtemp /dev/sdb\r\n/dev/sdb: WDC WD4003FZEX-00Z4SA0: 37°C\r\nhddtemp /dev/sdc\r\n/dev/sdc: WDC WD4003FZEX-00Z4SA0: 36°C</code></pre>\r\n<p>vainfo - display information from VA API driver</p>\r\n<p>lspci specific device</p>\r\n<pre><code>lspci -v -s 00:02.0\r\n00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Desktop) (prog-if 00 [VGA controller])\r\n        Subsystem: ASRock Incorporation Device 3e92\r\n        Flags: bus master, fast devsel, latency 0, IRQ 126\r\n        Memory at a0000000 (64-bit, non-prefetchable) [size=16M]\r\n        Memory at 90000000 (64-bit, prefetchable) [size=256M]\r\n        I/O ports at 4000 [size=64]\r\n        [virtual] Expansion ROM at 000c0000 [disabled] [size=128K]\r\n        Capabilities: [40] Vendor Specific Information: Len=0c &lt;?&gt;\r\n        Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00\r\n        Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable- 64bit-\r\n        Capabilities: [d0] Power Management version 2\r\n        Capabilities: [100] Process Address Space ID (PASID)\r\n        Capabilities: [200] Address Translation Service (ATS)\r\n        Capabilities: [300] Page Request Interface (PRI)\r\n        Kernel driver in use: i915\r\n        Kernel modules: i915\r\nlshw\r\n#  lshw is a small tool to extract detailed information on the hardware configuration of the machine\r\n\r\nlshw -c video\r\n  *-display\r\n       description: VGA compatible controller\r\n       product: UHD Graphics 630 (Desktop)\r\n       vendor: Intel Corporation\r\n       physical id: 2\r\n       bus info: pci@0000:00:02.0\r\n       version: 00\r\n       width: 64 bits\r\n       clock: 33MHz\r\n       capabilities: pciexpress msi pm vga_controller bus_master cap_list rom\r\n       configuration: driver=i915 latency=0\r\n       resources: irq:126 memory:a0000000-a0ffffff memory:90000000-9fffffff ioport:4000(size=64) memory:c0000-dffff</code></pre>\r\n<p>glxinfo</p>\r\n<p>The glxinfo program shows information about the OpenGL and GLX implementations running on a given X display.</p>\r\n<pre><code>glxinfo | egrep -i &#39;device|memory|OpenGL|direct&#39;</code></pre>\r\n<p>dmesg</p>\r\n<pre><code>dmesg | grep -e IOMMU -e DMAR\r\n\r\ndmesg | grep -E &#39;drm|radeon&#39; | grep -iE &#39;firmware|microcode&#39;\r\ndmesg | grep -i -e i915 -e drm -e vga</code></pre>\r\n<p>dmidecode - DMI table decoder</p>\r\n<pre><code>dmidecode -t baseboard | grep -i &#39;Product&#39;</code></pre>\r\n<p>GPU usage</p>\r\n<pre><code>apt-get install intel-gpu-tools | intel_gpu_top</code></pre>\r\n<p>Google Dorks</p>\r\n<ul>\r\n<li>when googleing try -ubuntu -xubuntu</li>\r\n<li>when searching for start up stuff use ‘systemd’ in your query</li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','linux,video,DIY,xbmc,kodi,ubuntu,debian',0,0,1),
(3016,'2020-02-24','Nixie tube clock and friends!',874,'I chat about Novice Nixie tubes and tronics soldering etc','<p>Nixie tube (English: /ˈnɪk. siː/ NIK-see), or cold cathode display, is an electronic device for displaying numerals or other information using glow discharge.</p>\r\n<p><a href=\"https://www.tindie.com/products/robg/msp430-nixie-clock-kit/\" class=\"uri\">https://www.tindie.com/products/robg/msp430-nixie-clock-kit/</a></p>',36,0,0,'CC-BY-SA','DIY,nixie tube,LED,electronics ',0,0,1),
(2987,'2020-01-14','World of Commodore 2019 Episode 5: New games from Double Sided Games',2250,'A presentation by Jérémie Marsin of Double Sided games.','<p>Links of note:</p>\r\n<ul>\r\n<li><a href=\"https://doublesidedgames.com/\" class=\"uri\">https://doublesidedgames.com/</a></li>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>',383,0,0,'CC-BY-SA','Commodore 64,retro,computing,games,gamer,vintage',0,0,1),
(2992,'2020-01-21','World of Commodore 2019 Episode 6: Introduction to C64 OS',2159,'Greg Naçu presents to us his new operating system to the Commodore 64','<p>Links of note:</p>\r\n<ul>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>\r\n',383,103,0,'CC-BY-SA','Commodore,64,OS,World of Commodore',0,0,1),
(2983,'2020-01-08','my phone',497,'gnu-linuxy in my pocket','<ul>\r\n<li><p>lineageOS<br />\r\n<a href=\"https://lineageos.org/\" class=\"uri\">https://lineageos.org/</a></p></li>\r\n<li><p>termux<br />\r\n<a href=\"https://termux.com/\" class=\"uri\">https://termux.com/</a></p></li>\r\n<li><p>fdroid<br />\r\n<a href=\"https://f-droid.org/\" class=\"uri\">https://f-droid.org/</a></p></li>\r\n<li><p>satstat<br />\r\n<a href=\"https://f-droid.org/en/packages/com.vonglasow.michael.satstat/\" class=\"uri\">https://f-droid.org/en/packages/com.vonglasow.michael.satstat/</a></p></li>\r\n<li><p>skymap<br />\r\n<a href=\"https://f-droid.org/en/packages/com.google.android.stardroid/\" class=\"uri\">https://f-droid.org/en/packages/com.google.android.stardroid/</a></p></li>\r\n<li><p>web utilities<br />\r\n<a href=\"https://radio.jezra.net\" class=\"uri\">https://radio.jezra.net</a><br />\r\n<a href=\"https://twilock.jezra.net\" class=\"uri\">https://twilock.jezra.net</a></p></li>\r\n</ul>\r\n',243,0,0,'CC-BY-SA','phone, linux',0,0,1),
(2990,'2020-01-17','JDK14 - Wrap up edition',911,'We look into what is included in the next release of the JDK.','<p>305: <a href=\"https://openjdk.java.net/jeps/305\">Pattern Matching for instanceof (Preview)</a><br />\r\n343: <a href=\"https://openjdk.java.net/jeps/343\">Packaging Tool (Incubator)</a><br />\r\n345: <a href=\"https://openjdk.java.net/jeps/345\">NUMA-Aware Memory Allocation for G1</a><br />\r\n349: <a href=\"https://openjdk.java.net/jeps/349\">JFR Event Streaming</a><br />\r\n352: <a href=\"https://openjdk.java.net/jeps/352\">Non-Volatile Mapped Byte Buffers</a><br />\r\n358: <a href=\"https://openjdk.java.net/jeps/358\">Helpful NullPointerExceptions</a><br />\r\n359: <a href=\"https://openjdk.java.net/jeps/359\">Records (Preview)</a><br />\r\n361: <a href=\"https://openjdk.java.net/jeps/361\">Switch Expressions (Standard)</a><br />\r\n362: <a href=\"https://openjdk.java.net/jeps/362\">Deprecate the Solaris and SPARC Ports</a><br />\r\n363: <a href=\"https://openjdk.java.net/jeps/363\">Remove the Concurrent Mark Sweep (CMS) Garbage Collector</a><br />\r\n364: <a href=\"https://openjdk.java.net/jeps/364\">ZGC on macOS</a><br />\r\n365: <a href=\"https://openjdk.java.net/jeps/365\">ZGC on Windows</a><br />\r\n366: <a href=\"https://openjdk.java.net/jeps/366\">Deprecate the ParallelScavenge + SerialOld GC Combination</a><br />\r\n367: <a href=\"https://openjdk.java.net/jeps/367\">Remove the Pack200 Tools and API</a><br />\r\n368: <a href=\"https://openjdk.java.net/jeps/368\">Text Blocks (Second Preview)</a><br />\r\n370: <a href=\"https://openjdk.java.net/jeps/370\">Foreign-Memory Access API (Incubator)</a></p>\r\n',382,0,0,'CC-BY-SA','java, news',0,0,1),
(2979,'2020-01-02','Bicycle Freewheel Maintenance',450,'I explain how to lube a bicycle freewheel','<p>This is a short episode where I explain how to service your bicycle freewheel if it\'s misbehaving. My pedals were turning around when I walked the bike, and they ought to be stationary. A quick dose of chain oil in the freewheel fixed the problem. Click the image to see photos showing how to do this.</p>\r\n\r\n<p><a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/137675441@N05/albums/72157712277100862\" title=\"Bicycle Freewheel Lube\"><img src=\"https://live.staticflickr.com/65535/49243896423_d89e9185da.jpg\" width=\"500\" height=\"281\" alt=\"Bicycle Freewheel Lube\"></a></p>\r\n',238,115,0,'CC-BY-SA','bicycles, bicycle maintenance, DIY, bicycle repair',0,0,1),
(2984,'2020-01-09','RHEL 8 Workstation first looks ',543,'Runing RHEL 8 workstation on a HP Stream Laptop','<p>Hi Everyone a bit random ideas about RHEL 8 on a low end laptop.</p>\r\n<p>Interesting Git and flatpak are already installed out of the box.</p>\r\n<p>MS Teams works great.</p>',129,0,0,'CC-BY-SA','HP Stream, RHEL 8, MS Teams, flatpak',0,0,1),
(2988,'2020-01-15','A tale of two hackers in the same system',518,'AIX Hacking and modem stuff!!','<p>Hi, I’m sigflup. This is about that awesome time I found that there was another hacker in the same system that I was hacking. Fun stuff</p>\r\n',115,0,1,'CC-BY-SA','unix,aix,modem,lynx',0,0,1),
(2989,'2020-01-16','2019-2020 New Year Show Episode 1',8435,'Eighth Annual New Year Show - Sint brings toys','<h3>Hacker Public Radio 2019-20 New Year Show Episode 1</h3>\r\n<p>04:30 - 11:00 EST (09:30 - 16:00 UTC)</p>\r\n<ul>\r\n<li>Ken explains Sinterklaas\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Sinterklaas\">https://en.wikipedia.org/wiki/Sinterklaas</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=vTGDFhi7z4U\">https://www.youtube.com/watch?v=vTGDFhi7z4U</a></li>\r\n</ul></li>\r\n<li><a href=\"https://www.comptia.org/certifications/a\">https://www.comptia.org/certifications/a</a></li>\r\n<li>Ken &amp; Popey chat</li>\r\n<li>Netminer invites Popey &amp; Ken\'s daughter to be guests on LinuxLUGcast</li>\r\n<li>Raspberry Pi IV discussion</li>\r\n<li>Popey and TonyH chat about restoring model cars</li>\r\n<li>Popey and TonyH chat about: More model cars, 8-bit computing, ZX Spectrum, Commodore</li>\r\n<li><a href=\"https://8bitversus.com/\"> https://8bitversus.com/</a></li>\r\n<li>Sinclair calculator - <a href=\"https://en.wikipedia.org/wiki/List_of_Sinclair_calculators\">https://en.wikipedia.org/wiki/List_of_Sinclair_calculators</a></li>\r\n<li>Popey and TonyH speak about Lenovo laptops</li>\r\n<li>Mr Cholmondley Warner (<a href=\"https://www.youtube.com/watch?v=tQWPR9TM0Gk)\">https://www.youtube.com/watch?v=tQWPR9TM0Gk)</a></li>\r\n<li>DaveM and TonyH talk more about model cars, their restoration and history</li>\r\n<li>DaveM is working on a \"MagicMirror2\" system on a Pi 3A+ to show status information</li>\r\n<li>Dinky Toys - <a href=\"https://en.wikipedia.org/wiki/Dinky_Toys\">https://en.wikipedia.org/wiki/Dinky_Toys</a></li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show, NYS',0,0,1),
(3026,'2020-03-09','Hex Bug and Battle Bots',1120,'Review/mods of fun Hex Bug and Battle Bots','<p>Review/mods of fun Hex Bug and Battle Bots</p>\r\n',36,0,0,'CC-BY-SA','robots,hexbug,battlebots,RC,IR',0,0,1),
(2993,'2020-01-22','2019-2020 New Year Show Episode 2',9298,'Eighth Annual New Year Show with ThinkPads, Steam engines and Corporate America philosophy','<h3>Hacker Public Radio 2019-20 New Year Show Episode 2</h3>\r\n<p>11:00 - 16:30 EST (16:00 - 21:30 UTC)</p>\r\n<ul>\r\n<li>TonyH &amp; JoeB chat: ThinkPads, podcasts they are involved with</li>\r\n<li>KenF explains podcast download stats</li>\r\n<li>Commercial podcasts hurting the little guy?</li>\r\n<li>TonyH &amp; JoeB chat: Headphones</li>\r\n<li>TonyH &amp; Popey chat: Food, games, first computer experience</li>\r\n<li>Moss joins in</li>\r\n<li>Old data storage: cassette tapes, Zip &amp; Jazz drives</li>\r\n<li>Thaj joins Moss &amp; JoeB: Favorite books &amp; authors</li>\r\n<li>Netminer discusses Autism</li>\r\n<li>Automobile inspections</li>\r\n<li>Netminer &amp; TonyH chat: personal property boundary issues</li>\r\n<li>Handsome_pirate joins: steam engine chat</li>\r\n<li>HonkeyMagoo joins</li>\r\n<li>David Richards steam engine Youtube channel -<a href= \"https://www.youtube.com/channel/UCBdj-vOveiEFWe3vnGoJUag\">https://www.youtube.com/channel/UCBdj-vOveiEFWe3vnGoJUag</a></li>\r\n<li>Mass transit, city traffic</li>\r\n<li>Corporate America philosophy</li>\r\n<li>Worker unions</li>\r\n<li>Fireworks</li>\r\n<li>Wimpy joins</li>\r\n<li>Ubuntu Mate discussion</li>\r\n<li>Donating used PC\'s</li>\r\n<li><a href=\"https://8bitversus.com/\">https://8bitversus.com/</a></li>\r\n<li>Timezone confusion??</li>\r\n<li>Ubuntu podcast</li>\r\n<li>TonyH: how he discovered Linux</li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show, HPRNYS',0,0,1),
(2994,'2020-01-23','Wrestling As You Like It Episode 3',1327,'A podcast on why I like wrestling and how it works to draw in fans.','<p>In this episode I discuss what direction I’m taking the podcast in. Also more importantly I discuss what Supercards are and their purpose in Pro Wrestling.</p>',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1),
(2995,'2020-01-24','ActivityPub Conference 2019 - ActivityPub: past, present, future',961,'ActivityPub Conference 2019 Keynote','<p>The ActivityPub Conference of 2019 was held in Prague. This is about the opening keynote talk from Christopher Lemmer Webber. <a href=\"https://www.zwilnik.com/?page_id=1063\" class=\"uri\">https://www.zwilnik.com/?page_id=1063</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-chris\" class=\"uri\">https://archive.org/details/apconf-chris</a></li>\r\n<li><a href=\"https://dustycloud.org/\" class=\"uri\">https://dustycloud.org/</a></li>\r\n<li><a href=\"https://www.crockford.com/ec/\" class=\"uri\">https://www.crockford.com/ec/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1063\" class=\"uri\">https://www.zwilnik.com/?page_id=1063</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(2997,'2020-01-28','World of Commodore 2019 Episode 7: Video Playback with 1541 Ultimate',1161,'In this seventh episode, Greg returns to tell us how he got full video playback on a Commodore 64.','<h3 id=\"links\">Links</h3>\r\n<ul>\r\n<li><a href=\"https://www.youtube.com/user/TorontoPETUsersGroup/\" class=\"uri\">https://www.youtube.com/user/TorontoPETUsersGroup/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n<li><a href=\"https://www.c64-wiki.com/wiki/1541_Ultimate\" class=\"uri\">https://www.c64-wiki.com/wiki/1541_Ultimate</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/1541_Ultimate\" class=\"uri\">https://en.wikipedia.org/wiki/1541_Ultimate</a></li>\r\n</ul>\r\n',383,103,0,'CC-BY-SA','Commodore 64,retro,computing,games,gamer,vintage,video,World of Commodore,TPUG',0,0,1),
(2998,'2020-01-29','2019-2020 New Year Show Episode 3',9164,'Eighth Annual New Year Show: The US is awake','<h3>Hacker Public Radio 2019-20 New Year Show Episode 3</h3>\r\n<p>16:30 - 21:54 EST (21:30 - 02:54 UTC)</p>\r\n<ul>\r\n<li>KWisher joins: ponders the New Year show editing</li>\r\n<li>New PC discussion, used PC acquisitions</li>\r\n<li>Remote desktop solutions</li>\r\n<li>Raspberry Pi IV</li>\r\n<li>DannW joins: text editors, Pascal, Fortran &amp; other programming languages</li>\r\n<li>MS Windows licensing, software, operating systems</li>\r\n<li>More MS woes</li>\r\n<li>Asperger syndrome, some light political chat</li>\r\n<li>ClaudioM joins: talks about BSD</li>\r\n<li>Moss: Feren OS - <a href=\"https://ferenos.weebly.com/\">https://ferenos.weebly.com/</a></li>\r\n<li>ZFS discussion</li>\r\n<li>Urandom Podcast - <a href=\"https://urandom-podcast.info/\">https://urandom-podcast.info/</a></li>\r\n<li>SELF - <a href=\"https://southeastlinuxfest.org/\">https://southeastlinuxfest.org/</a></li>\r\n<li>Destination Linux Podcast - <a href=\"https://destinationlinux.org/\">https://destinationlinux.org/</a></li>\r\n<li>Mandriva, Sabayon, Slackware, Fedora discussion</li>\r\n<li>Softmaker Office, office suite discussion</li>\r\n<li>Pokey joins: automobiles, politics</li>\r\n<li>Mushrooms, farming, college</li>\r\n<li>HP EliteBooks</li>\r\n<li>Linux Mint, thermal paste</li>\r\n<li>Winter weather &amp; driving, tire socks</li>\r\n<li><a href=\"https://thermal-grizzly.com/en/products/16-kryonaut-en\">https://thermal-grizzly.com/en/products/16-kryonaut-en</a></li>\r\n<li>Netminer talks about his DOS days, ISO standards</li>\r\n<li>Spine/back issues, treatment</li>\r\n<li>Xoke joins in</li>\r\n<li>Pokey loves DuckDuckGo</li>\r\n<li>Gnome boxes virtualization - <a href=\"https://help.gnome.org/users/gnome-boxes/stable/\">https://help.gnome.org/users/gnome-boxes/stable/</a></li>\r\n<li>Android key mapper - <a href=\"https://f-droid.org/en/packages/io.github.sds100.keymapper/\">https://f-droid.org/en/packages/io.github.sds100.keymapper/</a></li>\r\n</ul>',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1),
(3002,'2020-02-04','World of Commodore 2019 Episode 8: Vote of thanks',1156,'This is the final episode of the World of Commodore 2019 mini series.','<h3 id=\"links\">Links</h3>\r\n<ul>\r\n<li><a href=\"https://www.tpug.ca/\" class=\"uri\">https://www.tpug.ca/</a></li>\r\n<li><a href=\"https://pquirk.com/\" class=\"uri\">https://pquirk.com/</a></li>\r\n</ul>',383,0,1,'CC-BY-SA','Commodore,64,PET, Vic 20, amiga,World of Commodore, TPUG',0,0,1),
(3003,'2020-02-05','2019-2020 New Year Show Episode 4',9707,'Eighth Annual New Year Show. From Star Wars to NASA','<h3 id=\"hacker-public-radio-2019-20-new-year-show-episode-4\">Hacker Public Radio 2019-20 New Year Show Episode 4</h3>\r\n<p>21:54 - 01:40 EST (02:54 - 06:40 UTC)</p>\r\n<ul>\r\n<li>Chat about music, Star Wars, The Mandalorian</li>\r\n<li>Current main distro</li>\r\n<li>X2go RDP, Teamviewer, Dark Reader Firefox theme</li>\r\n<li>Pokey sucks at uRandom promotion</li>\r\n<li>Advent - <a href=\"https://en.wikipedia.org/wiki/Advent\" class=\"uri\">https://en.wikipedia.org/wiki/Advent</a></li>\r\n<li>Pokey’s firestarters</li>\r\n<li>Thaj publicly shames Lyle </li>\r\n<li>Lyle joins in shame</li>\r\n<li>Brief history of the New Year show </li>\r\n<li>Thaj challenges everyone listening to find one HPR episode that doesn’t have tags and contribute them this year. Tags get sparse around episode 550 if you are trying to find a place to start. OH…and you also owe Ken a show too.</li>\r\n<li>Here are the instructions: <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a></li>\r\n<li>Discussion about exercise </li>\r\n<li>Pokey tries to help Mongo with Mumble </li>\r\n<li>Thaj describes his custom keyboard layout </li>\r\n<li>Pokey repairs his wife’s laptop</li>\r\n<li>Thaj publicly shames Klattu &amp; Pokey for no tags on their shows</li>\r\n<li>CladioM explains the Latin tradition “Twelve Grapes” </li>\r\n<li>Pokey talks about being a grandparent</li>\r\n<li>More HP &amp; laptop talk</li>\r\n<li>Urugami joins</li>\r\n<li>Mongo joins</li>\r\n<li>Texas geography</li>\r\n<li>Motorcycles</li>\r\n<li>War stories</li>\r\n<li>NASA</li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1),
(3008,'2020-02-12','2019-2020 New Year Show Episode 5',7013,'Eighth Annual New Year Show: war stories and more war stories','<h3 id=\"hacker-public-radio-2019-20-new-year-show-episode-5\">Hacker Public Radio 2019-20 New Year Show Episode 5</h3>\r\n<p>01:40 - 07:20 EST (09:40 - 12:20 UTC)</p>\r\n<ul>\r\n<li>More war stories, podcasts, lawn mowing</li>\r\n<li>Timezones, Daylight Savings Time</li>\r\n<li>Antique computers - PDP, VAX, distro talk</li>\r\n<li>NAS discussion, EU politics</li>\r\n<li>Urugami joins</li>\r\n<li>Mongo joins</li>\r\n<li>Texas geography</li>\r\n<li>Motorcycles</li>\r\n<li>War stories</li>\r\n<li>NASA</li>\r\n<li>More war stories, podcasts, lawn mowing</li>\r\n<li>Timezones, Daylight Savings Time</li>\r\n<li>Antique computers - PDP, VAX, distro talk</li>\r\n<li>NAS discussion, EU politics</li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1),
(3005,'2020-02-07','Is ActivityPub Paving The Way to Web 3.0?',735,'ActivityPub Conference 2019, a talk about whether ActivityPub is leading the way to Web 3.0','<p>The ActivityPub Conference of 2019 was held in Prague. This is about a talk raising a suggestion that ActivityPub might be a way to implement Web 3.0. <a href=\"https://www.zwilnik.com/?page_id=1081\" class=\"uri\">https://www.zwilnik.com/?page_id=1081</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk2_Maloki_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk2_Maloki_compressed.mov</a></li>\r\n<li><a href=\"https://medium.com/@maloki/does-mastodon-spark-joy-no-meet-florence-788bbc8b48c2\" class=\"uri\">https://medium.com/@maloki/does-mastodon-spark-joy-no-meet-florence-788bbc8b48c2</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1081\" class=\"uri\">https://www.zwilnik.com/?page_id=1081</a></li>\r\n</ul>',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(3015,'2020-02-21','ActivityPub Conference 2019 - The Semantic Social Network',438,'ActivityPub Conference 2019, building a Semantic Social Network','<p>The ActivityPub Conference of 2019 was held in Prague. This is about a talk using ActivityPub to create the Semantic Social Network. <a href=\"https://www.zwilnik.com/?page_id=1086\" class=\"uri\">https://www.zwilnik.com/?page_id=1086</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk3_Pukkamustard_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk3_Pukkamustard_compressed.mov</a></li>\r\n<li><a href=\"https://schema.org/\" class=\"uri\">https://schema.org/</a></li>\r\n<li><a href=\"https://schema.org/servesCuisine\" class=\"uri\">https://schema.org/servesCuisine</a></li>\r\n<li><a href=\"https://schema.org/areaServed\" class=\"uri\">https://schema.org/areaServed</a></li>\r\n<li><a href=\"https://5stardata.info/en/\" class=\"uri\">https://5stardata.info/en/</a></li>\r\n<li><a href=\"https://moz.com/blog/json-ld-for-beginners\" class=\"uri\">https://moz.com/blog/json-ld-for-beginners</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1086\" class=\"uri\">https://www.zwilnik.com/?page_id=1086</a></li>\r\n</ul>',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(3025,'2020-03-06','Keep unwanted messages off the Fediverse',881,'ActivityPub Conference 2019, techniques for fighting SPAM and unwanted messages in the Fediverse.','<p>The ActivityPub Conference of 2019 was held in Prague. This is about a talk about how we can keep SPAM and unwanted messages off of our platforms in the Fediverse. <a href=\"https://www.zwilnik.com/?page_id=1089\" class=\"uri\">https://www.zwilnik.com/?page_id=1089</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk4_Serge_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk4_Serge_compressed.mov</a></li>\r\n<li><a href=\"https://gitlab.com/spritely/ocappub\" class=\"uri\">https://gitlab.com/spritely/ocappub</a></li>\r\n<li><a href=\"https://www.zwilnik.com/spritely/ocappub/master/*How%20to%20build%20it\" class=\"uri\">https://www.zwilnik.com/spritely/ocappub/master/*How%20to%20build%20it</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1089\" class=\"uri\">https://www.zwilnik.com/?page_id=1089</a></li>\r\n</ul>',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, SPAM',0,0,1),
(3035,'2020-03-20','Decentralised Hashtag Search and Subscription in Federated Social Networks',669,'ActivityPub Conference 2019, a proposal for how we can use hashtags to find and subscribe to content','<p>The ActivityPub Conference of 2019 was held in Prague. This is about a talk a proposal for a method to allow searching for hashtags in a decentralized Fediverse environment so that we can find, and subscribe to, content of interest. <a href=\"https://www.zwilnik.com/?page_id=1091\" class=\"uri\">https://www.zwilnik.com/?page_id=1091</a></p>\r\n<h3 id=\"links\">Links:</h3>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk5_Schmittlauch_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk5_Schmittlauch_compressed.mov</a></li>\r\n<li><a href=\"https://relay.mastodon.host/\" class=\"uri\">https://relay.mastodon.host/</a></li>\r\n<li><a href=\"https://hacks.mozilla.org/2018/11/decentralizing-social-interactions-with-activitypub/\" class=\"uri\">https://hacks.mozilla.org/2018/11/decentralizing-social-interactions-with-activitypub/</a></li>\r\n<li><a href=\"https://source.joinmastodon.org/mastodon/pub-relay\" class=\"uri\">https://source.joinmastodon.org/mastodon/pub-relay</a></li>\r\n<li><a href=\"https://git.orlives.de/schmittlauch/paper_hashtag_federation/src/branch/master/paper_hashtag_federation.pdf\" class=\"uri\">https://git.orlives.de/schmittlauch/paper_hashtag_federation/src/branch/master/paper_hashtag_federation.pdf</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1091\" class=\"uri\">https://www.zwilnik.com/?page_id=1091</a></li>\r\n</ul>',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Hashtags',0,0,1),
(3045,'2020-04-03','OSS compliance with privacy by default and design',951,'How can Open Source Software manage the mandates of regulations like the GDPR?','<p>The GDPR (General Data Protection Regulation) was enacted by the European Community in 2016, and began to be enforced in 2018. Since this covers a large segment of the Internet users, and other jurisdictions are looking at similar legislation this talk is a timely look at what is required and how Open Source Software can meet the legal requirements. <a href=\"https://www.zwilnik.com/?page_id=1096\" class=\"uri\">https://www.zwilnik.com/?page_id=1096</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk6_Cristina_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk6_Cristina_compressed.mov</a></li>\r\n<li><a href=\"https://xwiki.com/en/company/who-we-are/\" class=\"uri\">https://xwiki.com/en/company/who-we-are/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/General_Data_Protection_Regulation\" class=\"uri\">https://en.wikipedia.org/wiki/General_Data_Protection_Regulation</a></li>\r\n<li><a href=\"https://developercertificate.org/\" class=\"uri\">https://developercertificate.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1096\" class=\"uri\">https://www.zwilnik.com/?page_id=1096</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Privacy',0,0,1),
(3007,'2020-02-11','Photography 101',1468,'I tell you everything I know about the basics of photography','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://musopen.org/music/43172-pleasant-moments/\" class=\"uri\">https://musopen.org/music/43172-pleasant-moments/</a></li>\r\n<li><a href=\"https://pquirk.com\" class=\"uri\">https://pquirk.com</a></li>\r\n</ul>\r\n',383,0,0,'CC-BY-SA','Photography 101,digital,film,camera',0,0,1),
(2999,'2020-01-30','SQRL - Secure Quick Reliable Login',1442,'In this podcast we talk about what SQRL is and how it works.','<p>In this podcast, we talk about what SQRL is, and how it works, why I feel that it’s an exciting new login method that is safe and easy to use.</p>\r\n<ul>\r\n<li><p>SQRL Documentation<br />\r\n<a href=\"https://www.grc.com/sqrl/sqrl.htm\" class=\"uri\">https://www.grc.com/sqrl/sqrl.htm</a></p></li>\r\n<li><p>SQRL Forums<br />\r\n<a href=\"https://sqrl.grc.com/\" class=\"uri\">https://sqrl.grc.com/</a></p></li>\r\n<li><p>SQRL Github organization<br />\r\n<a href=\"https://github.com/sqrldev\" class=\"uri\">https://github.com/sqrldev</a></p></li>\r\n<li><p>Android Application<br />\r\n<a href=\"https://play.google.com/store/apps/details?id=org.ea.sqrl\" class=\"uri\">https://play.google.com/store/apps/details?id=org.ea.sqrl</a></p></li>\r\n<li><p>Github repository for Android Application<br />\r\n<a href=\"https://github.com/kalaspuffar/secure-quick-reliable-login\" class=\"uri\">https://github.com/kalaspuffar/secure-quick-reliable-login</a></p></li>\r\n</ul>\r\n',382,0,1,'CC-BY-SA','security, login method',0,0,1),
(3281,'2021-03-01','HPR Community News for February 2021',4150,'HPR Volunteers talk about shows released and comments posted in February 2021','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new hosts: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0390.html\" target=\"_blank\">o9l</a>, \n    <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3261\" target=\"_blank\">3261</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-02-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3261\" target=\"_blank\">HPR Community News for January 2021</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3262\" target=\"_blank\">3262</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-02-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3262\" target=\"_blank\">My thoughts on diversity in Linux and open source</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3263\" target=\"_blank\">3263</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-02-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3263\" target=\"_blank\">My Beginnings in Tech</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0390.html\" target=\"_blank\">o9l</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3264\" target=\"_blank\">3264</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-02-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3264\" target=\"_blank\">Intro to Nagios</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3265\" target=\"_blank\">3265</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-02-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3265\" target=\"_blank\">My Chromebook Experience</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3266\" target=\"_blank\">3266</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-02-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3266\" target=\"_blank\">Upgrading Debian on my raspberry pi</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3267\" target=\"_blank\">3267</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-02-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3267\" target=\"_blank\">Ripping Media 2021</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3268\" target=\"_blank\">3268</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-02-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3268\" target=\"_blank\">Video Game Review - Ark Survival Evolved</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0039.html\" target=\"_blank\">Enigma</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3269\" target=\"_blank\">3269</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-02-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3269\" target=\"_blank\">Linux Inlaws S01E23: The first year of the five year plan</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3270\" target=\"_blank\">3270</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-02-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3270\" target=\"_blank\">An Example of Using Layers</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3271\" target=\"_blank\">3271</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-02-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3271\" target=\"_blank\">Interview with a 6yo child </a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3272\" target=\"_blank\">3272</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-02-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3272\" target=\"_blank\">In GNU/Linux, there is no \"diversity\", we\'re all just data.</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3273\" target=\"_blank\">3273</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-02-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3273\" target=\"_blank\">Embrace Firefox</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3274\" target=\"_blank\">3274</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-02-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3274\" target=\"_blank\">My Custom dwm Setup</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0138.html\" target=\"_blank\">arfab</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3275\" target=\"_blank\">3275</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-02-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3275\" target=\"_blank\">D1 Mini Close Lid to Scan</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3276\" target=\"_blank\">3276</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-02-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3276\" target=\"_blank\">Deepgeek\'s thoughts about HD Radio</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0073.html\" target=\"_blank\">deepgeek</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3277\" target=\"_blank\">3277</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-02-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3277\" target=\"_blank\">Microsoft in my Debian repo</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3278\" target=\"_blank\">3278</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-02-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3278\" target=\"_blank\">A Minor Victory Against Designed-In Obsolescence</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0246.html\" target=\"_blank\">Beeza</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3279\" target=\"_blank\">3279</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-02-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3279\" target=\"_blank\">Linux Inlaws S01E24: Legacy programming languages</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3280\" target=\"_blank\">3280</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-02-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3280\" target=\"_blank\">What We Need For the ActivityPub Network</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 16 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 7 comments on\n4 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2356#comments\" target=\"_blank\">hpr2356</a></strong>\n(2017-08-14) \"<em>Safely enabling ssh in the default Raspbian Image</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2356#4\" target=\"_blank\">Comment 4</a>:\nLeo_B on 2021-02-23:\n\"If you\'re watching this in 2021\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2356#5\" target=\"_blank\">Comment 5</a>:\nKen Fallon on 2021-02-25:\n\"Updated versions\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3187#comments\" target=\"_blank\">hpr3187</a></strong>\n(2020-10-20) \"<em>Ansible for Dynamic Host Configuration Protocol</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3187#2\" target=\"_blank\">Comment 2</a>:\nWindigo on 2021-02-10:\n\"Interesting approach\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3241#comments\" target=\"_blank\">hpr3241</a></strong>\n(2021-01-04) \"<em>HPR Community News for December 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3241#1\" target=\"_blank\">Comment 1</a>:\nclacke on 2021-02-16:\n\"NoSQL and Redis\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3241#2\" target=\"_blank\">Comment 2</a>:\nclacke on 2021-02-16:\n\"Redis pronunciation\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3241#3\" target=\"_blank\">Comment 3</a>:\nDave Morriss on 2021-02-17:\n\"Key/value storage\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3259#comments\" target=\"_blank\">hpr3259</a></strong>\n(2021-01-28) \"<em>Nextcloud - The easy way</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3259#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2021-02-01:\n\"Show name\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 9 comments on 5 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3262#comments\" target=\"_blank\">hpr3262</a></strong>\n(2021-02-02) \"<em>My thoughts on diversity in Linux and open source</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#1\" target=\"_blank\">Comment 1</a>:\nnorist on 2021-02-02:\n\"Storyteller\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#2\" target=\"_blank\">Comment 2</a>:\nBill n1vux on 2021-02-04:\n\"well said\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-02-04:\n\"Further discussion\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#4\" target=\"_blank\">Comment 4</a>:\nblizzack on 2021-02-15:\n\"Systematically kept out - part 1\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3262#5\" target=\"_blank\">Comment 5</a>:\nblizzack on 2021-02-15:\n\"Systematically kept out - part 2\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3269#comments\" target=\"_blank\">hpr3269</a></strong>\n(2021-02-11) \"<em>Linux Inlaws S01E23: The first year of the five year plan</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3269#1\" target=\"_blank\">Comment 1</a>:\nclaudiom on 2021-02-12:\n\"Thanks for the invite....\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3271#comments\" target=\"_blank\">hpr3271</a></strong>\n(2021-02-15) \"<em>Interview with a 6yo child </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3271#1\" target=\"_blank\">Comment 1</a>:\nthelovebug on 2021-02-16:\n\"Loved this!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3272#comments\" target=\"_blank\">hpr3272</a></strong>\n(2021-02-16) \"<em>In GNU/Linux, there is no \"diversity\", we\'re all just data.</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3272#1\" target=\"_blank\">Comment 1</a>:\nbookewyrmm on 2021-02-17:\n\"welcome\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3274#comments\" target=\"_blank\">hpr3274</a></strong>\n(2021-02-18) \"<em>My Custom dwm Setup</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0138.html\" target=\"_blank\">arfab</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3274#1\" target=\"_blank\">Comment 1</a>:\nmcnalu on 2021-02-19:\n\"Might return to dwm\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-February/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-February/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></b></p>\n<p>Over the period tags and/or summaries have been added to 10 shows which were without them.</p>\n<p>There are now 414 shows which need a summary and/or tags.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3306,'2021-04-05','HPR Community News for March 2021',2000,'HPR Volunteers talk about shows released and comments posted in March 2021','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new host: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0392.html\" target=\"_blank\">timttmy</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3281\" target=\"_blank\">3281</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3281\" target=\"_blank\">HPR Community News for February 2021</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3282\" target=\"_blank\">3282</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3282\" target=\"_blank\">HP Laptop with AMD Ryzen 3 Mobile with Radeon Graphics</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3283\" target=\"_blank\">3283</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3283\" target=\"_blank\">HPR RPG Club reviews Dead Earth</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3284\" target=\"_blank\">3284</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-03-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3284\" target=\"_blank\">Introduction to gdb</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3285\" target=\"_blank\">3285</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-03-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3285\" target=\"_blank\">Upgrading Lubuntu on my Samsung N150 Plus netbook</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3286\" target=\"_blank\">3286</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3286\" target=\"_blank\">Wireguard How To</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0392.html\" target=\"_blank\">timttmy</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3287\" target=\"_blank\">3287</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3287\" target=\"_blank\">Quick tip</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3288\" target=\"_blank\">3288</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3288\" target=\"_blank\">Linux Inlaws S01E25: The Grumpy Old Coders</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3289\" target=\"_blank\">3289</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-03-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3289\" target=\"_blank\">NextCloud the hard way</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3290\" target=\"_blank\">3290</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-03-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3290\" target=\"_blank\">GIMP: More on Layer Tools and Techniques</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3291\" target=\"_blank\">3291</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3291\" target=\"_blank\">The New Audacity and Batch Processing Macros</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3292\" target=\"_blank\">3292</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3292\" target=\"_blank\">Squirrel FSF blog</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3293\" target=\"_blank\">3293</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3293\" target=\"_blank\">HPR RPG Club reviews Dungeon Raiders</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3294\" target=\"_blank\">3294</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-03-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3294\" target=\"_blank\">Update to MakeMKV to back up media</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3295\" target=\"_blank\">3295</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-03-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3295\" target=\"_blank\">Renewing a Let\'s Encrypt cert for Home Network use</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3296\" target=\"_blank\">3296</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3296\" target=\"_blank\">Spam Bot Honey Pot</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0293.html\" target=\"_blank\">Rho`n</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3297\" target=\"_blank\">3297</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3297\" target=\"_blank\">Nextcloud Application Updating</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0273.html\" target=\"_blank\">ToeJet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3298\" target=\"_blank\">3298</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3298\" target=\"_blank\">Poisoning The Well</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3299\" target=\"_blank\">3299</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2021-03-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3299\" target=\"_blank\">Linux Inlaws S01E26: Make your Linux harder</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3300\" target=\"_blank\">3300</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2021-03-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3300\" target=\"_blank\">YouTube Channels for Learning Spanish, Part 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3301\" target=\"_blank\">3301</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2021-03-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3301\" target=\"_blank\">K S P Kerbal Space Program! (Game)</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3302\" target=\"_blank\">3302</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2021-03-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3302\" target=\"_blank\">Input Methods on Ubuntu</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0311.html\" target=\"_blank\">clacke</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3303\" target=\"_blank\">3303</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2021-03-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3303\" target=\"_blank\">Slackware on RaspberryPi</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0326.html\" target=\"_blank\">Brian in Ohio</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 15 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 3 comments on\n3 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3153#comments\" target=\"_blank\">hpr3153</a></strong>\n(2020-09-02) \"<em>Fixing eBooks with Calibre and pdfcrop</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3153#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2021-03-03:\n\"Thanks Again.\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3241#comments\" target=\"_blank\">hpr3241</a></strong>\n(2021-01-04) \"<em>HPR Community News for December 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3241#4\" target=\"_blank\">Comment 4</a>:\nclacke on 2021-03-03:\n\"OpenLDAP on BDB?\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3262#comments\" target=\"_blank\">hpr3262</a></strong>\n(2021-02-02) \"<em>My thoughts on diversity in Linux and open source</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0297.html\" target=\"_blank\">swift110</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3262#6\" target=\"_blank\">Comment 6</a>:\nbjhend on 2021-03-08:\n\"Get rid of bad terms in IT\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 12 comments on 7 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3282#comments\" target=\"_blank\">hpr3282</a></strong>\n(2021-03-02) \"<em>HP Laptop with AMD Ryzen 3 Mobile with Radeon Graphics</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3282#1\" target=\"_blank\">Comment 1</a>:\nfrank on 2021-03-18:\n\"Using your OEM Windows key in a VM\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3289#comments\" target=\"_blank\">hpr3289</a></strong>\n(2021-03-11) \"<em>NextCloud the hard way</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3289#1\" target=\"_blank\">Comment 1</a>:\nmonochromec on 2021-01-29:\n\"apachectl restart vs. systemctl restart apache2.service\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3291#comments\" target=\"_blank\">hpr3291</a></strong>\n(2021-03-15) \"<em>The New Audacity and Batch Processing Macros</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3291#1\" target=\"_blank\">Comment 1</a>:\nRmccurdyDOTcom on 2021-03-15:\n\"audio\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3291#2\" target=\"_blank\">Comment 2</a>:\nGumnos on 2021-03-26:\n\"Which hardware podcast player did you move to?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3291#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-03-27:\n\"Your answer\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3292#comments\" target=\"_blank\">hpr3292</a></strong>\n(2021-03-16) \"<em>Squirrel FSF blog</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3292#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2021-03-09:\n\"Good Question\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3292#2\" target=\"_blank\">Comment 2</a>:\nA listener on 2021-03-16:\n\"Enjoyed the podcast, but...\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3292#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2021-03-18:\n\"Thank you\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3292#4\" target=\"_blank\">Comment 4</a>:\nThaj on 2021-03-27:\n\"Well...\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3296#comments\" target=\"_blank\">hpr3296</a></strong>\n(2021-03-22) \"<em>Spam Bot Honey Pot</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0293.html\" target=\"_blank\">Rho`n</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3296#1\" target=\"_blank\">Comment 1</a>:\nKevin O&#39;Brien on 2021-03-25:\n\"Great show!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3298#comments\" target=\"_blank\">hpr3298</a></strong>\n(2021-03-24) \"<em>Poisoning The Well</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0391.html\" target=\"_blank\">Some Guy On The Internet</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3298#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2021-03-25:\n\"Agreed\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3299#comments\" target=\"_blank\">hpr3299</a></strong>\n(2021-03-25) \"<em>Linux Inlaws S01E26: Make your Linux harder</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3299#1\" target=\"_blank\">Comment 1</a>:\nnobody on 2021-03-25:\n\"Other MAC implementations\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-March/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-March/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></b></p>\n<p>Over the period tags and/or summaries have been added to 10 shows which were without them.</p>\n<p>There are now 404 shows which need a summary and/or tags.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3055,'2020-04-17','Advice to new Fediverse administrators and developers',754,'An experienced admin for a Mastodon Instance at a major Fediverse developer offers some tips','<p>Framasoft is a company that develops for PeerTube and Mobilizon, and also hosts a Mastodon instance. The speaker is the sysadmin for the Mastodon instance gives his tips based on his experience at this non-profit company. <a href=\"https://www.zwilnik.com/?page_id=1098\" class=\"uri\">https://www.zwilnik.com/?page_id=1098</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk1_Luc_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk1_Luc_compressed.mov</a></li>\r\n<li><a href=\"https://frama.link/ap-conf-2019\" class=\"uri\">https://frama.link/ap-conf-2019</a></li>\r\n<li><a href=\"https://joinpeertube.org/\" class=\"uri\">https://joinpeertube.org/</a></li>\r\n<li><a href=\"https://joinmobilizon.org/en/\" class=\"uri\">https://joinmobilizon.org/en/</a></li>\r\n<li><a href=\"https://soutenir.framasoft.org/en/\" class=\"uri\">https://soutenir.framasoft.org/en/</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1034\" class=\"uri\">https://www.zwilnik.com/?page_id=1034</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1098\" class=\"uri\">https://www.zwilnik.com/?page_id=1098</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1),
(3065,'2020-05-01','The case for the unattributed message',977,'Anonymity can cause problems (trolls) but also can be necessary.','<p>Anonymity has an unfortunate consequence of enabling trolls and abuse. But there are cases where it is important for people to communicate anonymously. In this talk some ideas are presented on how to enable a measure of anonymity without having all of the problems. <a href=\"https://www.zwilnik.com/?page_id=1103\" class=\"uri\">https://www.zwilnik.com/?page_id=1103</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk7_Caleb_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk7_Caleb_compressed.mov</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/EFnet\" class=\"uri\">https://en.wikipedia.org/wiki/EFnet</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Freenet\" class=\"uri\">https://en.wikipedia.org/wiki/Freenet</a></li>\r\n<li><a href=\"https://medium.com/@mhatta/easy-censorship-resistant-communication-with-syndie-e063a6c9cf35\" class=\"uri\">https://medium.com/@mhatta/easy-censorship-resistant-communication-with-syndie-e063a6c9cf35</a></li>\r\n<li><a href=\"https://www.zwilnik.com/wp-admin/post.php?post=1101&amp;action=edit\" class=\"uri\">https://www.zwilnik.com/wp-admin/post.php?post=1101&amp;action=edit</a></li>\r\n<li><a href=\"https://medium.com/@ameet/strong-opinions-weakly-held-a-framework-for-thinking-6530d417e364\" class=\"uri\">https://medium.com/@ameet/strong-opinions-weakly-held-a-framework-for-thinking-6530d417e364</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1034\" class=\"uri\">https://www.zwilnik.com/?page_id=1034</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1103\" class=\"uri\">https://www.zwilnik.com/?page_id=1103</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Privacy, Anonymity',0,0,1),
(3075,'2020-05-15','Federated Blogging with WriteFreely',740,'A look at a minimally social blogging app using ActivityPub.','<p>Many social media apps seem determined to put bells and whistles in every possible place, which is not always in the interest of the user. This talk presents an alternative view which is called “minimally social” which only puts in the features needed by the user. In this case, the main focus is on a simple blogging app. There is also a brief mention of a very technical talk about coding. <a href=\"https://www.zwilnik.com/?page_id=1103\" class=\"uri\">https://www.zwilnik.com/?page_id=1103</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk8_Matt_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk8_Matt_compressed.mov</a></li>\r\n<li><a href=\"https://read.as/\" class=\"uri\">https://read.as/</a></li>\r\n<li><a href=\"https://libresaas.org/\" class=\"uri\">https://libresaas.org/</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1105\" class=\"uri\">https://www.zwilnik.com/?page_id=1105</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-talks/Talk9_Michael_compressed.mov\" class=\"uri\">https://archive.org/details/apconf-talks/Talk9_Michael_compressed.mov</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1103\" class=\"uri\">https://www.zwilnik.com/?page_id=1103</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Blogging',0,0,1),
(3085,'2020-05-29','Architectures of Robust Openness',1142,'A look at how to secure social networks against attack while still being open to strangers.','<p>Social networks can be attacked by people who want to cause abuse and disruption, and one way to deal with that is to lock down the membership. But that goes against the idea of social, which should include being open to welcoming strangers. Mark Miller presents an analysis of how you can be both secure and welcoming which focuses on Object Capabilities. <a href=\"https://www.zwilnik.com/?page_id=1107\" class=\"uri\">https://www.zwilnik.com/?page_id=1107</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://redaktor.me/apconf/\" class=\"uri\">https://redaktor.me/apconf/</a></li>\r\n<li><a href=\"https://archive.org/details/apconf-mark\" class=\"uri\">https://archive.org/details/apconf-mark</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Project_Xanadu\" class=\"uri\">https://en.wikipedia.org/wiki/Project_Xanadu</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Miller_columns\" class=\"uri\">https://en.wikipedia.org/wiki/Miller_columns</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/E_(programming_language)\" class=\"uri\">https://en.wikipedia.org/wiki/E_(programming_language)</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Caja_programming_language\" class=\"uri\">https://en.wikipedia.org/wiki/Caja_programming_language</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Foresight_Institute\" class=\"uri\">https://en.wikipedia.org/wiki/Foresight_Institute</a></li>\r\n<li><a href=\"https://www.synopsys.com/blogs/software-security/polaris-software-integrity-platform/\" class=\"uri\">https://www.synopsys.com/blogs/software-security/polaris-software-integrity-platform/</a></li>\r\n<li><a href=\"https://www.cs.jhu.edu/~seaborn/plash/html/\" class=\"uri\">https://www.cs.jhu.edu/~seaborn/plash/html/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Bitfrost\" class=\"uri\">https://en.wikipedia.org/wiki/Bitfrost</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Security_Content_Automation_Protocol\" class=\"uri\">https://en.wikipedia.org/wiki/Security_Content_Automation_Protocol</a></li>\r\n<li><a href=\"https://alanhkarp.com/scoopfs/index.html\" class=\"uri\">https://alanhkarp.com/scoopfs/index.html</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Secure_Scuttlebutt\" class=\"uri\">https://en.wikipedia.org/wiki/Secure_Scuttlebutt</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Fediverse\" class=\"uri\">https://en.wikipedia.org/wiki/Fediverse</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1107\" class=\"uri\">https://www.zwilnik.com/?page_id=1107</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Security, OCaps',0,0,1),
(3000,'2020-01-31','Chopin Free project',1433,'An effort to produce royalty and copyright free versions of Frédéric Chopin work.','<p>\r\nThe <a href=\"https://musopen.org/about/\">Musopen</a> (www.musopen.org) is a 501(c)(3) non-profit focused on improving access and exposure to music by creating free resources and educational materials. We provide recordings, sheet music, and textbooks to the public for free, without copyright restrictions. Put simply, our mission is to set music free.\r\n</p>\r\n<p>\r\nTheir latest <a href=\"https://www.kickstarter.com/projects/Musopen/set-chopin-free\">Kickstarter</a> aims to open the works of <a href=\"https://en.wikipedia.org/wiki/Fr%C3%A9d%C3%A9ric_Chopin\">Frédéric Chopin</a> copyright free.\r\n</p>',383,0,0,'CC-BY-SA','musopen, Frédéric Chopin',0,0,1),
(3004,'2020-02-06','Fixing simple audio problems with Audacity',808,'Sharing a few experiences with Audacity that may be helpful to others','<h2 id=\"overview\">Overview</h2>\n<p>I recorded the audio for the show I did with <a href=\"https://hackerpublicradio.org/correspondents/0201.html\" title=\"MrX\">MrX</a> in late 2019: <a href=\"https://hackerpublicradio.org/eps.php?id=2972\">“hpr2972 :: The foot of the ski slope”</a>. I was using my Zoom H2n recorder in my car, on a small tripod placed on the dashboard. Something about this setup caused the result to be very <em>boomy</em> and (to me) unpleasant to listen to. This episode is about what I did for a cure, after some research.</p>\n<p>I have also been using the <a href=\"https://manual.audacityteam.org/man/truncate_silence.html\" title=\"Truncate Silence\">‘<em>Truncate Silence</em>’</a> effect in Audacity incorrectly in the past, and I used the opportunity to learn how to do a better job with it.</p>\n<p>Now, I am well aware that there are some skilled and experienced Audio Engineers out there in HPR-land. I am certainly not one of these, though I quite enjoy fiddling with audio to make it sound better. I’d like to make two requests:</p>\n<ol type=\"1\">\n<li>If I didn’t do a good job, please tell me what I did wrong here, and how I should have done it.</li>\n<li>Think about doing a show (or shows) on HPR about how to deal with common audio problems. For example: how to remove a mains hum, the use of compression and normalisation.</li>\n</ol>\n<h2 id=\"long-notes\">Long notes</h2>\n<p>A longer form of these notes may be <a href=\"hpr3004_full_shownotes.html\">found here (full_shownotes.html)</a>. These go into more detail on the steps I took to try and make the audio for show 2972 more tolerable.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li>Wikipedia page describing <a href=\"https://en.wikipedia.org/wiki/Audacity_%28audio_editor%29\">Audacity</a></li>\n<li>Audacity <a href=\"https://www.audacityteam.org/\">website</a></li>\n<li>Effects:\n<ul>\n<li><a href=\"https://manual.audacityteam.org/man/noise_reduction.html\">Noise Reduction</a></li>\n<li><a href=\"https://manual.audacityteam.org/man/high_pass_filter.html\">High-pass Filter</a></li>\n<li><a href=\"https://manual.audacityteam.org/man/amplify.html\">Amplify</a></li>\n<li><a href=\"https://manual.audacityteam.org/man/truncate_silence.html\">Truncate Silence</a></li>\n</ul></li>\n</ul>\n',225,0,1,'CC-BY-SA','audio,Audacity,effects,problem solving',0,0,1),
(3009,'2020-02-13','Linux Inlaws S01E01',3570,'Linux Inlaws - a podcast about on topics around free and open source software','<p><em>Linux Inlaws</em> - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.</p>\r\n<p>Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute t-rexes or other associated dinosaurs.</p>\r\n\r\n<p>\r\nIn this show the lads introduce themselves and discuss the technology they use and why they are putting on the show.\r\n</p>\r\n\r\n<h3>Links:</h3>\r\n<ul>\r\n<li><a href=\"https://linuxinlaws.eu/\">https://linuxinlaws.eu/</a></li>\r\n<li>email: feedback at linuxinlaws eu</li>\r\n<li><a href=\"https://traceroute-online.com/mtr/\">https://traceroute-online.com/mtr/</a></li>\r\n</ul>\r\n',384,111,1,'CC-BY','free open source software revolution',0,0,1),
(3095,'2020-06-12','Intro to GIMP',1064,'An introduction to GIMP to kick off a new series.','<p>GIMP is the open source alternative to the proprietary Photoshop, and can do most of the same things while respecting your freedom. This show will kick off a new series of tutorials. As a note of caution, I am not an expert, I am just learning GIMP as I go. But I thought there was no harm in sharing my experiences with the HPR community. <a href=\"https://www.ahuka.com/?page_id=1423\" class=\"uri\">https://www.ahuka.com/?page_id=1423</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.youtube.com/watch?v=Q8C0LJPpr64\" class=\"uri\">https://www.youtube.com/watch?v=Q8C0LJPpr64</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=SoP5LOFxPeY\" class=\"uri\">https://www.youtube.com/watch?v=SoP5LOFxPeY</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=_L_MMU22bAw\" class=\"uri\">https://www.youtube.com/watch?v=_L_MMU22bAw</a></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=TiavEWDVQGE\" class=\"uri\">https://www.youtube.com/watch?v=TiavEWDVQGE</a></li>\r\n<li><a href=\"https://www.gimp.org/tutorials/\" class=\"uri\">https://www.gimp.org/tutorials/</a></li>\r\n<li><a href=\"https://www.makeuseof.com/tag/gimp-photo-editing/\" class=\"uri\">https://www.makeuseof.com/tag/gimp-photo-editing/</a></li>\r\n<li><a href=\"https://www.wikihow.com/Use-GIMP\" class=\"uri\">https://www.wikihow.com/Use-GIMP</a></li>\r\n<li><a href=\"https://daviesmediadesign.com/20-gimp-2-10-tutorials-for-beginners/\" class=\"uri\">https://daviesmediadesign.com/20-gimp-2-10-tutorials-for-beginners/</a></li>\r\n<li><a href=\"https://www.pcworld.com/article/3451356/gimp-basics-tips-and-tricks-for-beginners.html\" class=\"uri\">https://www.pcworld.com/article/3451356/gimp-basics-tips-and-tricks-for-beginners.html</a></li>\r\n<li><a href=\"https://howtogimp.com/\" class=\"uri\">https://howtogimp.com/</a></li>\r\n<li><a href=\"https://issuu.com/gimpmagazine\" class=\"uri\">https://issuu.com/gimpmagazine</a></li>\r\n<li><a href=\"https://www.gimp.org/downloads/\" class=\"uri\">https://www.gimp.org/downloads/</a></li>\r\n<li><a href=\"https://whatis.techtarget.com/fileformat/XCF-GIMP-document\" class=\"uri\">https://whatis.techtarget.com/fileformat/XCF-GIMP-document</a></li>\r\n<li><a href=\"https://gist.github.com/rbrito/e57c87d5376fd56113df058abf71bdf3\" class=\"uri\">https://gist.github.com/rbrito/e57c87d5376fd56113df058abf71bdf3</a></li>\r\n<li><a href=\"https://www.ahuka.com/?page_id=1423\" class=\"uri\">https://www.ahuka.com/?page_id=1423</a></li>\r\n</ul>\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics',0,0,1),
(3010,'2020-02-14','FOSDEM first impressions',1638,'Impressions from my first attendance at FOSDEM.','<p><a href=\"https://fosdem.org\">FOSDEM</a> is the biggest Free and Open Source conference in the world and on its 20<sup>th</sup> anniversary I decided to attend for the first time. By a good turn of fate, and some well-judged pitching, Ken Fallon secured a stand for the <a href=\"https://freeculturepodcasts.org/\">Free Culture Podcasts project</a> which is an umbrella group that covers HPR, many of the shows on <a href=\"https://otherside.network/\">The Other Side Network</a> and many more excellent podcasts that are released under creative commons licenses.</p>\r\n\r\n<p>This audio is recorded in snippets in between manning the stand and gives some off-the-cuff observations from a FOSDEM noob. I was surprised to find that relatively few visitors to our stand had heard of HPR, which we quickly rectified of course, and I give a brief summary of the feedback we received. Also mentioned in this show, but not actually appearing, are my co-conspirators at FOSDEM, <a href=\"https://hackerpublicradio.org/correspondents/0030.html\">Ken</a>, <a href=\"https://hackerpublicradio.org/correspondents/0288.html\">Beni</a>, <a href=\"https://hackerpublicradio.org/correspondents/0129.html\">JWP</a> as well as <a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a> who unfortunately wasn\'t able to join us in person but was very much there in spirit.</p>\r\n\r\n',268,0,0,'CC-BY-SA','fosdem,conference,podcasts,creative commons',0,0,1),
(3012,'2020-02-18','Sample episode from Wikipediapodden',518,'An English microsode of their Swedish language podcast about Wikipedia.','<p>\r\nJan Ainali from the  <a href=\"https://wikipediapodden.se/\">https://wikipediapodden.se/</a> podcast came over to the <a href=\"https://freeculturepodcasts.org/\">https://freeculturepodcasts.org/</a> booth at <a href=\"https://fosdem.org/2020/\">FOSDEM</a> 2020.\r\n</p>\r\n<p>\r\nThey do a Swedish Language Podcast about wikipedia et al, and of course we added them to the <a href=\"https://freeculturepodcasts.org/\">https://freeculturepodcasts.org/</a> site. While their main shows are in Swedish, they also have summaries that they do in English which can be found at <a href=\"https://wikipediapodden.se/tag/english/\">https://wikipediapodden.se/tag/english/</a>, (<a href=\"https://wikipediapodden.se/tag/english/feed/\">RSS Feed</a>).\r\n</p>',30,75,1,'CC-BY-SA','fosdem, wikipediapodden, swedish, sweden',0,0,1),
(3036,'2020-03-23','WiiU is dead long live WiiU!',1439,'How to approach dea-ish mod communities','<ul>\r\n<li><p>lulz:<br />\r\n<a href=\"https://twitter.com/operat0r/status/1224025568334708737\" class=\"uri\">https://twitter.com/operat0r/status/1224025568334708737</a></p></li>\r\n<li><p>Discord:<br />\r\n<a href=\"https://discord.gg/nintendohomebrew\" class=\"uri\">https://discord.gg/nintendohomebrew</a></p></li>\r\n<li><p>Saves:<br />\r\n<a href=\"https://gbatemp.net/threads/wii-u-save-files-compilation.427761/#post-6374659\" class=\"uri\">https://gbatemp.net/threads/wii-u-save-files-compilation.427761/#post-6374659</a></p></li>\r\n<li><p>lego ntsc save<br />\r\n<a href=\"https://drive.google.com/open?id=1bTtXv1c8NkOkeHoKOkWHhP6RbiXv9ERo\" class=\"uri\">https://drive.google.com/open?id=1bTtXv1c8NkOkeHoKOkWHhP6RbiXv9ERo</a><br />\r\n<a href=\"https://www.youtube.com/user/BullyWiiPlaza/videos\" class=\"uri\">https://www.youtube.com/user/BullyWiiPlaza/videos</a></p></li>\r\n<li><p>old cheat engine files:<br />\r\n<a href=\"https://rmccurdy.com/.scripts/downloaded/CheatEngineTables-master/tables/\" class=\"uri\">https://rmccurdy.com/.scripts/downloaded/CheatEngineTables-master/tables/</a></p></li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','wiiu,modding,hacking,tcpgecko,android,ssl pinning,games',0,0,1),
(3014,'2020-02-20','A Headless Raspberry Pi Streaming Radio',1068,'I use a Raspberry Pi to make a streaming radio device for my pillow speaker.','<p>In this episode I talk about how I used a Raspberry Pi to create a streaming radio device to feed my pillow speaker. This is something I used to do with clock radios and later a satellite radio, but in an effort to decrease monthly subscription costs for services I did not use optimally, I discontinued my satellite radio subscription about a year ago. This new free solution is an excellent substitute for Satellite Radio so far, since I was mostly listening to this same channel on the Sat Radio but paying about $12 a month for the privilege. The device I’m using is a <a href=\"https://www.raspberrypi.org/products/raspberry-pi-2-model-b/\">Raspberry Pi 2 Model B</a> with <a href=\"https://ubuntu.com/download/raspberry-pi\">Ubuntu Server</a>. My barrier to this project in the past was not being able to find the URL for the stream I wanted but I discovered you can find it easily if you use Firefox with <a href=\"https://www.downloadhelper.net/\">Video Download Helper</a> to reveal the URL on a page with media playing (in this case it’s from TuneIn):</p>\r\n\r\n<pre><code>https://XX.XXX.XXX.XXX/radio-stationmp3-48?session-id=af1b271fefba04b650f8e253c6b253bd&source=TuneIn\r\n</code></pre>\r\n\r\n<p>Strip off everything after the <code>48</code> to get raw URL:</p>\r\n\r\n<pre><code>https://XX.XXX.XXX.XXX/radio-stationmp3-48\r\n</code></pre>\r\n\r\n<p>Command to play stream with <a href=\"https://www.mpg123.de/\">mpg123</a> on the Pi. Using the <code>-q</code> option to suppress output:</p>\r\n\r\n<pre><code>mpg123-pulse -q https://XX.XXX.XXX.XXX/radio-stationmp3-48 &\r\n</code></pre>\r\n\r\n<p>Once I figure out the command that plays the stream I want, I save the command as an executable script in <code>/home/$user/bin</code>.</p>\r\n\r\n<h3 id=\"usingtheradio\">Using the “Radio”</h3>\r\n\r\n<p>To start playing a stream you first have to SSH into the RasPi. This is easy from a laptop using any terminal emulator. I use pubkey auth so I don’t have to type a password every time. On my phone I use <a href=\"https://play.google.com/store/apps/details?id=org.connectbot&hl=en_US\">ConnectBot</a>. Once I’m into the Pi I run the radio commands from CLI like <code>espn</code> or <code>kmfa</code> or <code>krvs</code>. To stop playback I kill the process with <code>pkill mpg</code>. I have a 3.5mm audio splitter Plugged into the headphone jack of the USB audio interface. In one side of the splitter I’ve got an old pair of earbuds where one side didn’t work, with the working earbud under my pillow. That’s my pillow speaker. On the other side of the splitter I put the audio cable for an <a href=\"https://smile.amazon.com/gp/product/B005GUQ0FI/\">FM transmitter</a>, so that I can use an FM radio to listen to the stream while I’m walking around the house.</p>\r\n\r\n<p>Click the image below to see pictures of the setup.</p>\r\n\r\n<p><a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/137675441@N05/albums/72157712927722077\" title=\"Raspberry Pi Radio\"><img src=\"https://live.staticflickr.com/65535/49473218252_39195601ed.jpg\" width=\"500\" height=\"281\" alt=\"Raspberry Pi Radio\"></a></p>\r\n\r\n<h3 id=\"links\">Links</h3>\r\n\r\n<ul>\r\n<li><a href=\"https://www.raspberrypi.org/products/raspberry-pi-2-model-b/\">Raspberry Pi 2 Model B</a></li>\r\n<li><a href=\"https://ubuntu.com/download/raspberry-pi\">Ubuntu Server</a></li>\r\n<li><a href=\"https://www.downloadhelper.net/\">Video Download Helper</a> (Firefox extension)</li>\r\n<li>The <a href=\"https://smile.amazon.com/gp/product/B001MSS6CS/\">USB Audio interface</a> I use</li>\r\n<li>Panda Wireless <a href=\"https://smile.amazon.com/gp/product/B00762YNMG\">USB WiFi adapter</a></li>\r\n<li><a href=\"https://www.mpg123.de/\">mpg123</a> command-line audio player</li>\r\n<li><a href=\"https://play.google.com/store/apps/details?id=org.connectbot&hl=en_US\">ConnectBot</a></li>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B005GUQ0FI/\">C. Crane FM Transmitter</a></li>\r\n</ul>\r\n',238,0,0,'CC-BY-SA','Raspberry Pi, Internet Radio, Streaming Radio, Radio, Streaming Audio, Ubuntu, Ubuntu Server',0,0,1),
(3018,'2020-02-26','Encrypted edit',1234,'Klaatu talks about editing and viewing encrypted files in a tmpfs in RAM','<ul>\r\n<li><a href=\"https://www.passwordstore.org/\" target=\"_blank\">Password-store</a> and the <strong>pre</strong> command.</li>\r\n<li><a href=\"https://gitlab.com/notklaatu/credit/\" target=\"_blank\">Credit</a> command</li>\r\n</ul>\r\n',78,0,0,'CC-BY-SA','GPG, privacy',0,0,1),
(3017,'2020-02-25','Developing Black and White Film',2544,'Join me as I develop my first roll of black and white film since over 30 years ago.','<p>My photos will be available at: <a href=\"https://pquirk.com\" class=\"uri\">https://pquirk.com</a></p>\r\n',383,0,0,'CC-BY-SA','Photography,film,developing,black and white',0,0,1),
(3019,'2020-02-27','Linux Inlaws S01E02 FOSDEM shenanigans',3929,'Linux Inlaws - a podcast about on topics around free and open source software','<p>Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://linuxinlaws.eu\" class=\"uri\">https://linuxinlaws.eu</a></li>\r\n<li><a href=\"https://fosdem.org\" class=\"uri\">https://fosdem.org</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=3009\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=3009</a></li>\r\n</ul>',384,111,1,'CC-BY-SA','free open source software, revolution, FLOSS',0,0,1),
(3013,'2020-02-19','Bash Tips - 21',2497,'Environment variables','<h2 id=\"the-environment-more-collateral-bash-tips\">The Environment <small><small>(More collateral Bash tips)</small></small></h2>\n<h3 id=\"overview\">Overview</h3>\n<p>You will probably have seen references to <em>The Environment</em> in various contexts relating to shells, shell scripts, scripts in other languages and compiled programs.</p>\n<p>In Unix and Unix-like operating systems an environment is maintained by the shell, and we will be looking at how Bash deals with this in this episode. When a script, program or subprocess is invoked it is given an array of strings called the <em>environment</em>. This is a list of name-value pairs, of the form <code>name=value</code>.</p>\n<h4 id=\"using-the-environment\">Using the environment</h4>\n<p>The environment is used to convey various pieces of information to the executing script or program. For example, two standard variables provided by the shell are <code>\'HOME\'</code>, which is set to the current user’s home directory and <code>\'PWD</code>, set to the current working directory. The shell user can set, change, remove and view environment variables for their own purposes as we will see in this episode. The Bash shell itself creates and in some cases manages environment variables.</p>\n<p>The environment contains global data which is passed down to subprocesses (<em>child</em> processes) by copying. However, it is not possible for a subprocess to pass information <b>back</b> to the superior (<em>parent</em>) process.</p>\n<h4 id=\"viewing-the-environment\">Viewing the environment</h4>\n<p>You can view the environment in a number of ways.</p>\n<ul>\n<li><p>From the command line the command <code>printenv</code> can do this (this is usually but not always a stand-alone command: it’s <code>/usr/bin/printenv</code> on my Debian system). We will look at this command later.</p></li>\n<li><p>The command <code>env</code> without any arguments does the same thing as <code>printenv</code> without arguments. This is actually a tool to run a program in a modified environment which we will look at later. The environment printing capability can be regarded as more of a bonus feature.</p></li>\n<li><p>Scripting languages like <code>awk</code> (as well as Python and Perl, to name just a few) can view and manipulate the environment.</p></li>\n<li><p>Compiled languages such as <code>C</code> can do this too of course.</p></li>\n<li><p>There are other commands that will show the environment, and we will look at some of these briefly.</p></li>\n</ul>\n<h4 id=\"changing-variables-in-the-environment\">Changing variables in the environment</h4>\n<p>The variables in the environment are not significantly different from the <em>shell parameters</em> we have seen throughout this Bash Tips series. The only difference is that they are marked for <em>export</em> to commands and sub-shells. You will often see variables (or parameters) in the environment referred to as <em>environment variables</em>. The Bash manual makes a distinction between ordinary parameters (variables) and environment variables, but many other sources are less precise about this in my experience.</p>\n<p>The standard variables in the environment have upper-case names (<code>HOME</code>, <code>SHELL</code>, <code>PWD</code>, etc), but there is no reason why a variable you create should not be in lower or mixed case. In fact, the Bash manual suggests that you should avoid using all upper-case names so as not to clash with Bash’s variables.</p>\n<p>Variables can be created and changed a number of ways.</p>\n<ul>\n<li>They can be set up at login time (globally or locally) through various standard configuration files. It is intended to look at this subject in an upcoming episode so we will leave discussing the subject until then.</li>\n<li>By preceding the command or script invocation with <em>name=value</em> expressions which will temporarily place these variables into the environment for the command</li>\n<li>Using the <code>export</code> command</li>\n<li>Using the <code>declare</code> command with the <code>-x</code> option</li>\n<li>The value of an environment variable (once established) can be changed at any time in the sub-shell with a command like <code>myvar=42</code>, just as for a normal variable</li>\n<li>The <code>export</code> command can also be used to turn off the <em>export</em> marker on a variable</li>\n<li>Deletion is performed with the <code>unset</code> command (as seen earlier in the series)</li>\n</ul>\n<p>We will look at all of these features in more detail later in the episode.</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=\"hpr3013_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#Command-Execution-Environment\">“3.7.3 Command Execution Environment”</a></li>\n<li>Section <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Environment\">“3.7.4 Environment”</a></li>\n</ul></li>\n<li><a href=\"https://www.gnu.org/software/coreutils/manual/\"><em>GNU Coreutils Manual</em></a>\n<ul>\n<li>Section <a href=\"https://www.gnu.org/software/coreutils/manual/html_node/env-invocation.html\">23.2 env: Run a command in a modified environment</a></li>\n</ul></li>\n<li><p><a href=\"https://en.wikipedia.org/wiki/Env\">Wikipedia page on the <code>env</code> command</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>:<br />\n<small><strong>Episode number</strong></small>\n<ol>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1648\">HPR episode 1648 <code>\"</code><em>Bash parameter manipulation</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1843\">HPR episode 1843 <code>\"</code><em>Some Bash tips</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1884\">HPR episode 1884 <code>\"</code><em>Some more Bash tips</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1903\">HPR episode 1903 <code>\"</code><em>Some further Bash tips</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr1951\">HPR episode 1951 <code>\"</code><em>Some additional Bash tips</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2045\">HPR episode 2045 <code>\"</code><em>Some other Bash tips</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2278\">HPR episode 2278 <code>\"</code><em>Some supplementary Bash tips</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2293\">HPR episode 2293 <code>\"</code><em>More supplementary Bash tips</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2639\">HPR episode 2639 <code>\"</code><em>Some ancillary Bash tips - 9</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2649\">HPR episode 2649 <code>\"</code><em>More ancillary Bash tips - 10</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2659\">HPR episode 2659 <code>\"</code><em>Further ancillary Bash tips - 11</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2669\">HPR episode 2669 <code>\"</code><em>Additional ancillary Bash tips - 12</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2679\">HPR episode 2679 <code>\"</code><em>Extra ancillary Bash tips - 13</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2689\">HPR episode 2689 <code>\"</code><em>Bash Tips - 14 (Some auxiliary Bash tips)</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2699\">HPR episode 2699 <code>\"</code><em>Bash Tips - 15 (More auxiliary Bash tips)</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2709\">HPR episode 2709 <code>\"</code><em>Bash Tips - 16 (Further auxiliary Bash tips)</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2719\">HPR episode 2719 <code>\"</code><em>Bash Tips - 17 (Additional auxiliary Bash tips)</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2729\">HPR episode 2729 <code>\"</code><em>Bash Tips - 18 (Extra auxiliary Bash tips)</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2739\">HPR episode 2739 <code>\"</code><em>Bash Tips - 19 (Supplemental auxiliary Bash tips)</em><code>\"</code></a></li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2756\">HPR episode 2756 <code>\"</code><em>Bash Tips - 20 (Some collateral Bash tips)</em><code>\"</code></a></li>\n</ol></li>\n</ul>\n<ul>\n<li>Resources:\n<ul>\n<li>Examples:\n<ul>\n<li><a href=\"hpr3013_bash21_ex1.sh\">bash21_ex1.sh</a></li>\n<li><a href=\"hpr3013_bash21_ex2.sh\">bash21_ex2.sh</a></li>\n<li><a href=\"hpr3013_bash21_ex3.awk\">bash21_ex3.awk</a></li>\n<li><a href=\"hpr3013_bash21_ex4.sh\">bash21_ex4.sh</a></li>\n<li><a href=\"hpr3013_bash21_ex5.sh\">bash21_ex5.sh</a></li>\n<li><a href=\"hpr3013_bash21_ex6.sh\">bash21_ex6.sh</a></li>\n<li><a href=\"hpr3013_bash21_ex6_1.cfg\">bash21_ex6_1.cfg</a></li>\n<li><a href=\"hpr3013_bash21_ex6_2.cfg\">bash21_ex6_2.cfg</a></li>\n</ul></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','Bash,variable,environment,environment variable',0,0,1),
(4406,'2025-06-23','SVG Files: Cyber Threat Hidden in Images',505,'Out of nowhere, my Firefox browser on my Mac mini started automatically adding every page I visited ','    <title></title>\n    <p> Out of nowhere, my Firefox browser on my Mac mini started\n      automatically adding every page I visited to my bookmarks. At\n      first, I thought it was a bug after recent update —maybe a\n      misconfigured setting or similar. But when I searched for a fix,\n      Google suggested something alarming: Scan for malware. And guess\n      what? The source of my trouble turned out to be an 4 SVG files\n      hiding malicious code.</p>\n    <p> That’s right—those innocent-looking vector graphics files we use\n      every day for logos, icons, and web design? They can secretly\n      carry malware. In my case those were the files, a logos of\n      reputable delivery companies like deliveroo and JustEat which I\n      have downloaded while I was updating a website for my client.\n      Today, we’re breaking down how SVG files are being weaponized, why\n      they’re so effective, and how to protect yourself. </p>\n    <p> <br>\n    </p>\n    example of svg file\n<pre>\n<code>\n&lt;?xml version=&quot;1.0&quot;?&gt;\n&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;120&quot; height=&quot;160&quot; viewBox=&quot;0 0 120 160&quot;&gt;\n  &lt;!-- Animated Bodhi Leaf --&gt;\n  &lt;path id=&quot;bodhi-leaf&quot; d=&quot;M60 10 Q30 40 20 80 Q15 120 60 150     Q105 120 100 80 Q90 40 60 10 Z&quot; stroke=&quot;#1E5631&quot; stroke-width=&quot;2&quot;&gt;\n    &lt;animate attributeName=&quot;fill&quot; values=&quot;white;#FFD700;#2E8B57;#4682B4;#FF0000;#800080;#808080;black;white&quot; dur=&quot;8s&quot; repeatCount=&quot;indefinite&quot;/&gt;\n  &lt;/path&gt;\n  &lt;!-- Static veins (contrast with leaf) --&gt;\n  &lt;path d=&quot;M60 10 L60 150&quot; stroke=&quot;#1E5631&quot; stroke-width=&quot;1.5&quot;/&gt;\n  &lt;g stroke=&quot;#1E5631&quot; stroke-width=&quot;1&quot;&gt;\n    &lt;path d=&quot;M60 30 Q45 35 40 50&quot;/&gt;\n    &lt;path d=&quot;M60 30 Q75 35 80 50&quot;/&gt;\n    &lt;path d=&quot;M60 60 Q40 70 35 90&quot;/&gt;\n    &lt;path d=&quot;M60 60 Q80 70 85 90&quot;/&gt;\n    &lt;path d=&quot;M60 90 Q50 100 45 120&quot;/&gt;\n    &lt;path d=&quot;M60 90 Q70 100 75 120&quot;/&gt;\n  &lt;/g&gt;\n&lt;/svg&gt;\n</path>\n</code>\n</pre>',447,0,0,'CC-BY-SA','svh',0,0,1),
(3020,'2020-02-28','Validating data in Haskell',1500,'Tuula talks about wow to validate incoming http request before acting on them','<h1 id=\"background\">Background</h1>\r\n<p>The space game I working on needs a admin interface that can by used by game masters to view and modify the simulation.</p>\r\n<p>For start, I added interface for viewing, modifying and creating new people. It has three HTTP endpoints that are defined below. In this episode, I’ll concentrate on creating a new person and especially making sure that parameters used are valid.</p>\r\n<pre><code>/api/admin/people              AdminApiPeopleR     GET\r\n/api/admin/people/#PersonId    AdminApiPersonR     GET PUT\r\n/api/admin/addPerson           AdminApiAddPersonR  POST</code></pre>\r\n<h1 id=\"types-and-parsing\">Types and parsing</h1>\r\n<p>There are two important approaches on making sure that data is valid. Making illegal state unpresentable and parsing instead of validation.</p>\r\n<p>If it’s impossible to create invalid data, you don’t have to validate it. Instead of using <code>Integer</code> and checking that given parameter is 0 or more, you should use <code>Natural</code>. Since <code>Natural</code> can’t have negative values, you don’t have to validate it. Similarly, instead of using a list, you could use <code>NonEmpty</code> to make sure that there’s at least one element present in the collection.</p>\r\n<p>Parse, don’t validate is similar approach. Instead of having a lax parser and then validating the result, parser should reject data that doesn’t make sense. By selecting suitable datatypes to represent data in the system, simply parsing incoming message is sometimes enough to validate it at the same time.</p>\r\n<h1 id=\"person-creation\">Person creation</h1>\r\n<p>Function in charge of generating a new person has signature of <code>generatePersonM :: RandomGen g =&gt; StarDate -&gt; PersonOptions -&gt; Rand g Person</code>. Given a current <code>StarDate</code> and <code>PersonOptions</code> describing what kind of person is needed, it will return a computation that can be executed to generate a random person.</p>\r\n<p><code>PersonOptions</code> is very barebones. There’s only one field to tell what kind of age the person should have and even that is an optional field.</p>\r\n<pre><code>data PersonOptions = PersonOptions\r\n    { personOptionsAge :: Maybe AgeOptions\r\n    } deriving (Show, Read, Eq)</code></pre>\r\n<p><code>AgeOptions</code> has two possibilities. <code>AgeBracket</code> describes case where age should be inside of given range. <code>ExactAge</code> specifies exactly what age should be.</p>\r\n<pre><code>data AgeOptions =\r\n    AgeBracket Age Age\r\n    | ExactAge Age\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p><code>Age</code> is newtype wrapping <code>Natural</code>, thus <code>Age</code> can never be less than zero.</p>\r\n<pre><code>newtype Age = Age { unAge :: Natural }\r\n    deriving (Show, Read, Eq, Num, Ord)</code></pre>\r\n<p>Hand written <code>FromJSON</code> instance takes care of rejecting numbers that aren’t integers and at least zero. One could skip the checks here and parsed <code>Age</code> still couldn’t be negative. Advantage of explicit checks is that we get much nicer error message instead of just annoying runtime exception.</p>\r\n<pre><code>instance FromJSON Age where\r\n    parseJSON =\r\n        withScientific &quot;age&quot;\r\n            (\\x -&gt; case toBoundedInteger x of\r\n                Nothing -&gt;\r\n                    mempty\r\n\r\n                Just n -&gt;\r\n                    if n &gt;= 0 then\r\n                        return $ Age $ fromIntegral (n :: Int)\r\n\r\n                    else\r\n                        mempty)</code></pre>\r\n<p>So, when creating a new person, you can have:</p>\r\n<ul>\r\n<li>no age options at all, computer can pick something</li>\r\n<li>specific age, computer calculates date of birth based on current date</li>\r\n<li>age bracket, computer calculates date of birth based on current date and bracket</li>\r\n<li>age is always integer that is 0 or more</li>\r\n</ul>\r\n<p>There’s still possibility of error. Nothing ensure that age bracket makes sense. It could be <code>AgeBracket (Age 10) (Age 5)</code> (bracket from 10 to 5). We need to add a bit of validation.</p>\r\n<p><code>Data.Validation</code> is “a data-type like Either but with an accumulating Applicative”. What this means to me is that I can validate multiple aspects and collect errors in a list. It’s handy for getting all the problems at once, instead of having to fix them one by one and retry after each fix.</p>\r\n<p>Our validation function has signature <code>validateAddPerson :: PersonOptions -&gt; Validation [ErrorCode] PersonOptions</code>. Given <code>PersonOptions</code>, it will give list of <code>ErrorCode</code> and original <code>PersonOptions</code>. Multiple validation functions can be combined for more complex validations.</p>\r\n<p>In our example <code>validateAgeOptions</code> validates only age related options of the data. <code>validateAddPerson</code> is supposed to validate whole data, but currently it just delegates to <code>validateAgeOptions</code>. In the future, we can add more validations by adding more functions and chaining them with <code>&lt;*</code> operator.</p>\r\n<pre><code>validateAddPerson :: PersonOptions -&gt; Validation [ErrorCode] PersonOptions\r\nvalidateAddPerson opt =\r\n        pure opt\r\n            &lt;* validateAgeOptions opt\r\n\r\nvalidateAgeOptions :: PersonOptions -&gt; Validation [ErrorCode] PersonOptions\r\nvalidateAgeOptions opt =\r\n    case personOptionsAge opt of\r\n        Nothing -&gt;\r\n            _Success # opt\r\n\r\n        Just (AgeBracket a b) -&gt;\r\n            if a &lt;= b\r\n                then _Success # opt\r\n                else _Failure # [ AgeBracketStartIsGreaterThanEnd ]\r\n\r\n        Just (ExactAge _) -&gt;\r\n            _Success # opt</code></pre>\r\n<h1 id=\"putting-it-all-together\">Putting it all together</h1>\r\n<p>Function that handles <code>POST</code> message and creates a new person is shown below:</p>\r\n<pre><code>postAdminApiAddPersonR :: Handler Value\r\npostAdminApiAddPersonR = do\r\n    _ &lt;- apiRequireAdmin\r\n    msg &lt;- requireJsonBody\r\n    date &lt;- runDB $ starDate\r\n    _ &lt;- raiseIfFailure $ validateAddPerson msg\r\n    g &lt;- liftIO newStdGen\r\n    let person = evalRand (generatePersonM date msg) g\r\n    pId &lt;- runDB $ insert person\r\n    returnJson (Entity pId person)</code></pre>\r\n<p>It does several things: - check that current user is admin - get json content and parse it to <code>PersonOptions</code> - get current star date from database - validate <code>PersonOptions</code> and return error if validation fails - get new random number generator - generate new person - insert it into database - return tuple of <code>(PersonId, Person)</code></p>\r\n<h1 id=\"closing\">Closing</h1>\r\n<p>Types should represent only valid states. By having invalid state unpresentable, we can avoid many errors. Likewise, parsing should reject invalid data. This usually follows from having invalid states being unpresentable (you can’t parse invalid message to invalid data if you don’t have way to represent that invalid data).</p>\r\n<p>Questions, comments and feedback welcome. Best way to reach me is either by email or in mastodon, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','validation, algebraic data types, json',0,0,1),
(3022,'2020-03-03','FOSDEM 2020 Stand Interviews',5578,'Interviews with some of the stands at FOSDEM 2020','<h1>Table of Contents</h1>\r\n\r\n<ul>\r\n  <li><a href=\"#previous\">Previously Interviewed Projects</a></li>\r\n  <li><a href=\"#missed\">Projects we did not get to Interview (yet)</a></li>\r\n  <li><a href=\"#0_A.D\">0 A.D.</a></li>\r\n  <li><a href=\"#AdoptOpenJDK\">AdoptOpenJDK</a></li>\r\n  <li><a href=\"#Apache_Camel\">Apache Camel</a></li>\r\n  <li><a href=\"#Checkmk\">Checkmk</a></li>\r\n  <li><a href=\"#Coderdojo\">Coderdojo</a></li>\r\n  <li><a href=\"#Eclipse_Foundation\">Eclipse Foundation</a></li>\r\n  <li><a href=\"#GitLab\">GitLab</a></li>\r\n  <li><a href=\"#GNU_Health\">GNU Health</a></li>\r\n  <li><a href=\"#Javascript\">Javascript</a></li>\r\n  <li><a href=\"#Jenkins-x\">Jenkins-x</a></li>\r\n  <li><a href=\"#Kopano\">Kopano</a></li>\r\n  <li><a href=\"#KubeVirt_Metal3\">KubeVirt and Metal3</a></li>\r\n  <li><a href=\"#Micropython_Espruino\">Micropython and Espruino</a></li>\r\n  <li><a href=\"#Nuspell\">Nuspell</a></li>\r\n  <li><a href=\"#openHAB\">openHAB</a></li>\r\n  <li><a href=\"#OpenStack_Foundation\">OpenStack Foundation</a></li>\r\n  <li><a href=\"#OpenTAP\">OpenTAP</a></li>\r\n  <li><a href=\"#OpenUK\">OpenUK</a></li>\r\n  <li><a href=\"#openWifi\">openWifi</a></li>\r\n  <li><a href=\"#OWASP\">OWASP</a></li>\r\n  <li><a href=\"#Percona\">Percona</a></li>\r\n  <li><a href=\"#PineTime\">PineTime</a></li>\r\n  <li><a href=\"#PostGraphile\">PostGraphile</a></li>\r\n  <li><a href=\"#Skolelinux_AlekSIS_Teckids\">Skolelinux / AlekSIS / Teckids</a></li>\r\n  <li><a href=\"#Technoethical\">Technoethical</a></li>\r\n  <li><a href=\"#TinyGo\">Tiny Go</a></li>\r\n  <li><a href=\"#XCP-ng\">XCP-ng</a></li>\r\n  <li><a href=\"#Zenroom\">Zenroom</a></li>\r\n  <li><a href=\"#fenster-full\">Fenster</a></li>\r\n</ul>\r\n\r\n<h2 id=\"previous\">Previously Interviewed Projects</h2>\r\n<ul>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2224#K2.3\">Apache Software Foundation</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2226#AW.4\">Automotive Grade Linux</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.10\">CentOS</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.5\">CiviCRM</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2226#AW.1\">Coreboot</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.4\">Debian</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1702\">Flashrom</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1C.7b\">Foreman</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.7\">FreeBSD Project</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1C.1\">Free Software Foundation Europe</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.2\">Gentoo Linux</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.2\">GNOME</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2227#H.1\">Godot Engine</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2225#K2.15b\">Google Summer of Code</a> (Saturday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1932\">Grafana</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.1b\">Haiku</a> (Saturday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.8\">illumos</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2226#AW.5\">Infobooth on amateur radio</a> (HAM Radio)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2224#K2.5\">Jenkins</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.1\">KDE</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.3\">LibreOffice</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1746\">Linux Professional Institute</a> (Saturday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2225#K2.19\">Matrix</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2224#K2.1\">Mozilla</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2225#K2.18\">Musescore</a> (Saturday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.6\">Nextcloud</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2226#AW.7\">OpenEmbedded</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1957#OpenMandriva\">OpenMandriva</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.9\">openSUSE Project</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1C.7a\">oVirt</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2224#K2.4\">OW2 Open Source Community</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2225#K2.11\">Perl</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.5\">PostgreSQL</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2223#K1B.1a\">ReactOS</a> (Sunday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=1697\">Software Freedom Conservancy</a> (Sunday)</li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2222#K1A.11\">The Fedora Project</a></li>\r\n  <li><a href=\"https://hackerpublicradio.org/eps.php?id=2227#H.5\">wolfSSL</a></li>\r\n</ul>\r\n\r\n<h2 id=\"missed\">Projects we did not get to Interview (yet)</h2>\r\n<ul>\r\n  <li><a href=\"https://3box.io/\">3Box</a> (Sunday)</li>\r\n  <li><a href=\"https://www.davx5.com/\">Davx</a></li>\r\n  <li><a href=\"https://fossasia.org/\">FOSSASIA</a> (Sunday)</li>\r\n  <li><a href=\"https://freeculturepodcasts.org/\">Free Culture Podcasts</a> (Sunday)</li>\r\n  <li><a href=\"https://www.linphone.org/\">Linphone</a></li>\r\n  <li><a href=\"https://www.linuxboot.org/\">LinuxBoot</a></li>\r\n  <li><a href=\"https://mattermost.com/\">Mattermost</a></li>\r\n  <li><a href=\"https://www.mautic.org\">Mautic</a> (Saturday)</li>\r\n  <li><a href=\"https://appinventor.mit.edu/\">MIT App Inventor</a> (Sunday)</li>\r\n  <li><a href=\"https://www.ntop.org/\">ntopng</a> (Sunday)</li>\r\n  <li><a href=\"https://www.onlyoffice.com/\">ONLYOFFICE</a></li>\r\n  <li><a href=\"https://opensourcedesign.net\">Open Source Design</a> (Sunday)</li>\r\n  <li><a href=\"https://kiwitcms.org/\">Open Source Test Management</a> (Sunday)</li>\r\n  <li><a href=\"https://pharo.org/\">Pharo</a> (Sunday)</li>\r\n  <li><a href=\"https://pine64.org/\">PINE64</a> (Sunday)</li>\r\n  <li><a href=\"https://raku.org/\">Raku</a></li>\r\n  <li><a href=\"https://sugarlabs.org/\">Sugar Labs</a> (Saturday)</li>\r\n  <li><a href=\"https://syndesis.io/\">Syndesis</a></li>\r\n  <li><a href=\"https://github.com/tine20/tine20\">Tine 2.0</a> (Saturday)</li>\r\n  <li><a href=\"https://www.algoo.fr/fr/tracim\">Tracim</a> (Sunday)</li>\r\n  <li><a href=\"https://yottadb.com/\">YottaDB</a></li>\r\n</ul>\r\n\r\n<h2 id=\"0_A.D\">0 A.D.</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/0_A.D.png\"/></p>\r\n<blockquote cite=\"https://en.wikipedia.org/wiki/0_A.D._(video_game)\">\r\n0 A.D. is a free and open-source, real-time strategy game under development by Wildfire Games. It is a historical war and economy game focusing on the years between 500 BC and 1 BC for the first part, and a planned second part for the years 1 AD to 500 AD. The game is cross-platform, playable on Windows, macOS, FreeBSD, Linux, and OpenBSD. It aims to be entirely free and open-source, using the GPLv2+ license for the game engine and CC BY-SA for the game art. \r\n</blockquote>\r\n\r\n<blockquote cite=\"https://wildfiregames.com/\">\r\nWildfire Games is a global group of volunteer game developers. We create open source games and mods.\r\n</blockquote>\r\n<h3>Listen to the interview with Stanislas Dolcini from 0 A.D.</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/0_A.D-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=94.000000,211.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=94.000000,211.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://play0ad.com\">https://play0ad.com</a></li>\r\n<li>Source Code: <a href=\"https://github.com/StanleySweet?tab=repositories\">https://github.com/StanleySweet?tab=repositories</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/0_A.D._(video_game)\">https://en.wikipedia.org/wiki/0_A.D._(video_game)</a></li>\r\n<li><a href=\"https://wildfiregames.com/\">https://wildfiregames.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"AdoptOpenJDK\">AdoptOpenJDK</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/AdoptOpenJDK.png\"/></p>\r\n<blockquote cite=\"https://adoptopenjdk.net/\">\r\nPrebuilt OpenJDK Binaries for Free!<br />\r\nJava&#153; is the world\'s leading programming language and platform. AdoptOpenJDK uses infrastructure, build and test scripts to produce prebuilt binaries from OpenJDK&#153; class libraries and a choice of either the OpenJDK HotSpot or Eclipse OpenJ9 VM. All AdoptOpenJDK binaries and scripts are open source licensed and available for free.\r\n</blockquote>\r\n<h3>Listen to the interview with Stewart X Addison AdoptOpenJDK</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/AdoptOpenJDK-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=209.000000,294.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=209.000000,294.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://adoptopenjdk.net/\">https://adoptopenjdk.net/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/AdoptOpenJDK\">https://github.com/AdoptOpenJDK</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/OpenJDK#OpenJDK_builds\">https://en.wikipedia.org/wiki/OpenJDK#OpenJDK_builds</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Apache_Camel\">Apache Camel</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Apache_Camel.png\"/></p>\r\n<blockquote cite=\"https://camel.apache.org/\">\r\nApache Camel is an open source framework for message-oriented middleware with a rule-based routing and mediation engine that provides a Java object-based implementation of the Enterprise Integration Patterns using an application programming interface (or declarative Java domain-specific language) to configure routing and mediation rules. The domain-specific language means that Apache Camel can support type-safe smart completion of routing rules in an integrated development environment using regular Java code without large amounts of XML configuration files, though XML configuration inside Spring Framework is also supported. Camel is often used with Apache ServiceMix, Apache ActiveMQ and Apache CXF in service-oriented architecture projects. \r\n</blockquote>\r\n<h3>Listen to the interview with Rachel Yord&#225;n from Apache Camel</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Apache_Camel-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=304.000000,420.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=304.000000,420.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://camel.apache.org/\">https://camel.apache.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/apache/camel/\">https://github.com/apache/camel/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Apache_Camel\">https://en.wikipedia.org/wiki/Apache_Camel</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Checkmk\">Checkmk</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Checkmk.png\"/></p>\r\n<blockquote cite=\"https://checkmk.com/\">\r\nBest-in-class infrastructure and application monitoring. Helping you stay up and running from simple to the most complex environments.\r\n</blockquote>\r\n<h3>Listen to the interview with Marcel Arentz from Checkmk</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=409.000000,529.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=409.000000,529.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://checkmk.com/\">https://checkmk.com/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/tribe29/checkmk\">https://github.com/tribe29/checkmk</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Check_MK\">https://en.wikipedia.org/wiki/Check_MK</a></li>\r\n<li><a href=\"https://tribe29.com/\">https://tribe29.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Coderdojo\">Coderdojo</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Coderdojo.png\"/></p>\r\n<blockquote cite=\"https://coderdojobelgium.be/en\">\r\nCoderDojo organizes free coding workshops (called Dojo&#146;s) for girls and boys from 7 to 18 years old. A Dojo is entirely prepared and led by volunteers. If you are older, then you can help out at an existing Dojo or start your very own CoderDojo!      \r\n</blockquote>\r\n<h3>Listen to the interview with Coderdojo</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=536.000000,708.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=536.000000,708.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://coderdojobelgium.be/en\">https://coderdojobelgium.be/en</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/CoderDojo\">https://en.wikipedia.org/wiki/CoderDojo</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Eclipse_Foundation\">Eclipse Foundation</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Eclipse_Foundation.png\"/></p>\r\n<blockquote cite=\"https://www.eclipse.org/org/\">\r\nThe Eclipse Foundation provides our global community of individuals and organizations with a mature, scalable, and business-friendly environment for open source software collaboration and innovation. The Foundation is home to the Eclipse IDE, Jakarta EE, and over 350 open source projects, including runtimes, tools, and frameworks for a wide range of technology domains such as the Internet of Things, automotive, geospatial, systems engineering, and many others.\r\n</blockquote>\r\n<h3>Listen to the interview with Mika&#235;l Barbero, Release Engineer, Eclipse Foundation</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Eclipse_Foundation-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=717.000000,801.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=717.000000,801.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.eclipse.org/org/\">https://www.eclipse.org/org/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Eclipse_Foundation\">https://en.wikipedia.org/wiki/Eclipse_Foundation</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"GitLab\">GitLab</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/GitLab.png\"/></p>\r\n<blockquote cite=\"https://en.wikipedia.org/wiki/GitLab\">\r\nGitLab is a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and CI/CD pipeline features, using an open-source license, developed by GitLab Inc.\r\n</blockquote>\r\n<h3>Listen to the interview with David Planella Director Of Community Relations at GitLab</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/GitLab-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=807.000000,917.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=807.000000,917.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://about.gitlab.com/\">https://about.gitlab.com/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/GitLab\">https://en.wikipedia.org/wiki/GitLab</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"GNU_Health\">GNU Health</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/GNU_Health.png\"/></p>\r\n<blockquote cite=\"https://www.gnuhealth.org/#/about\">\r\nGNU Health combines the socioeconomic determinants of health with state-of-the-art technology in bioinformatics and clinical genetics. It manages the internal processes of a health institution, such as financial management, stock and pharmacies or laboratories (LIMS)\r\n</blockquote>\r\n<h3>Listen to the interview with Axel K. Braun about GNU Health</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/GNU_Health-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=926.000000,1113.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=926.000000,1113.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.gnuhealth.org/\">https://www.gnuhealth.org/</a></li>\r\n<li>Source Code: <a href=\"https://savannah.gnu.org/projects/health\">https://savannah.gnu.org/projects/health</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/GNU_Health\">https://en.wikipedia.org/wiki/GNU_Health</a></li>\r\n<li><a href=\"https://www.gnusolidario.org/\">https://www.gnusolidario.org/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Javascript\">Javascript</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Javascript.png\"/></p>\r\n<blockquote cite=\"https://hackages.io/\">\r\nHackages is a community-based tech company with education at its core. We help you boost your skills and realise your projects through our expertise in training, product development, consultancy and community building.\r\n</blockquote>\r\n<h3>Listen to the interview with Marta Moliz about Javascript</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Javascript-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1122.000000,1246.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1122.000000,1246.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/JavaScript\">https://en.wikipedia.org/wiki/JavaScript</a></li>\r\n<li><a href=\"https://hackages.io/\">https://hackages.io/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Jenkins-x\">Jenkins-x</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Jenkins-x.png\"/></p>\r\n<blockquote cite=\"https://jenkins-x.io/\">\r\nJenkins X provides pipeline automation, built-in GitOps, and preview environments to help teams collaborate and accelerate their software delivery at any scale.\r\n</blockquote>\r\n<h3>Listen to the interview with Kara de la Marck, Open Source Community Manager at CloudBees, about Jenkins-x</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Jenkins-x-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1254.000000,1413.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1254.000000,1413.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://jenkins-x.io/\">https://jenkins-x.io/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/jenkins-x\">https://github.com/jenkins-x</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Jenkins_(software)\">https://en.wikipedia.org/wiki/Jenkins_(software)</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Kopano\">Kopano</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Kopano.png\"/></p>\r\n<blockquote cite=\"https://kopano.io/\">\r\n100% Open source collaboration tools: email, calendaring, Mattermost chat, webRTC video meetings, document collaboration with LibreOffice Online, integration with file storage services and more.\r\n</blockquote>\r\n<h3>Listen to the interview with Brian Joseph about Kopano</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Kopano-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1421.000000,1740.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1421.000000,1740.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://kopano.io/\">https://kopano.io/</a></li>\r\n<li>Source Code: <a href=\"https://stash.kopano.io/repos?visibility=public\">https://stash.kopano.io/repos?visibility=public</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Kopano_(software)\">https://en.wikipedia.org/wiki/Kopano_(software)</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"KubeVirt_Metal3\">KubeVirt and Metal3</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/KubeVirt.png\"/></p>\r\n<blockquote cite=\"https://kubevirt.io/\">\r\nVirtual Machine Management on Kubernetes. Building a virtualization API for Kubernetes. KubeVirt technology addresses the needs of development teams that have adopted or want to adopt Kubernetes but possess existing Virtual Machine-based workloads that cannot be easily containerized. More specifically, the technology provides a unified development platform where developers can build, modify, and deploy applications residing in both Application Containers as well as Virtual \r\n</blockquote>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Metal3.png\"/></p>\r\n<blockquote cite=\"https://metal3.io/\">\r\nThere are a number of great open source tools for bare metal host provisioning, including Ironic. Metal3.io aims to build on these technologies to provide a Kubernetes native API for managing bare metal hosts via a provisioning stack that is also running on Kubernetes. We believe that Kubernetes Native Infrastructure, or managing your infrastructure just like your applications, is a powerful next step in the evolution of infrastructure management.\r\n</blockquote>\r\n<h3>Listen to the interview with KubeVirt and Metal3</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1742.000000,1902.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1742.000000,1902.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://kubevirt.io/\">https://kubevirt.io/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/kubevirt\">https://github.com/kubevirt</a></li>\r\n<li>Project Website: <a href=\"https://metal3.io/\">https://metal3.io/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/metal3-io/metal3-docs\">https://github.com/metal3-io/metal3-docs</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Micropython_Espruino\">Micropython and Espruino</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Micropython.png\"/></p>\r\n<blockquote cite=\"https://micropython.org/\">\r\nMicroPython is a lean and efficient implementation of the Python 3 programming language that includes a small subset of the Python standard library and is optimised to run on microcontrollers and in constrained environments. \r\n</blockquote>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Espruino.png\"/></p>\r\n<blockquote cite=\"\">\r\nEspruino is an open-source JavaScript interpreter for microcontrollers. It is designed for devices with small amounts of RAM (as low as 8kB). Espruino was created by Gordon Williams in 2012 as an attempt to make microcontroller development truly multiplatform. It was made open-source in 2013 after a successful Kickstarter campaign for a development board running the software.\r\n</blockquote>\r\n<h3>Listen to the interview with Christine Spindler from Micropython and Gordon Williams from Espruino</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Micropython_Espruino-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=1910.000000,2248.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=1910.000000,2248.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://micropython.org/\">https://micropython.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/micropython\">https://github.com/micropython</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/MicroPython\">https://en.wikipedia.org/wiki/MicroPython</a></li>\r\n<li>Project Website: <a href=\"https://www.espruino.com/\">https://www.espruino.com/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/espruino\">https://github.com/espruino</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Espruino\">https://en.wikipedia.org/wiki/Espruino</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Nuspell\">Nuspell</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Nuspell.png\"/></p>\r\n<blockquote cite=\"\">\r\n</blockquote>\r\n<h3>Listen to the interview with Sander van Geloven from Nuspell</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Nuspell-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2244.000000,2460.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2244.000000,2460.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://nuspell.github.io\">https://nuspell.github.io</a></li>\r\n<li>Source Code: <a href=\"https://github.com/nuspell/nuspell\">https://github.com/nuspell/nuspell</a></li>\r\n<li><a href=\"https://hellebaard.nl\">https://hellebaard.nl</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"openHAB\">openHAB</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/openHAB.png\"/></p>\r\n<blockquote cite=\"\">\r\nEmpowering the smart home. A vendor and technology agnostic open source automation software for your home.\r\n</blockquote>\r\n<h3>Listen to the interview with Thomas Bail about openHAB</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2465.000000,2625.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2465.000000,2625.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.openhab.org/\">https://www.openhab.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/openhab\">https://github.com/openhab</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/OpenHAB\">https://en.wikipedia.org/wiki/OpenHAB</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"OpenStack_Foundation\">OpenStack Foundation</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/OpenStack_Foundation.png\"/></p>\r\n<blockquote cite=\"\">\r\nThe OpenStack Foundation promotes the global development, distribution and adoption of open infrastructure with more than 105,000 community members from 187 countries around the world. The OpenStack Foundation was founded in September 2012 to provide an independent home for the OpenStack cloud operating system, which has since become one of the largest and most diverse open source projects in history.\r\n</blockquote>\r\n<h3>Listen to the interview with Jeremy Stanley about OpenStack Foundation</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2634.000000,2734.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2634.000000,2734.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.openstack.org/foundation/\">https://www.openstack.org/foundation/</a></li>\r\n<li>Source Code: <a href=\"https://opendev.org/openstack\">https://opendev.org/openstack</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/OpenStack\">https://en.wikipedia.org/wiki/OpenStack</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"OpenTAP\">OpenTAP</h2>\r\n<p><img alt=\"Logo\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/OpenTAP.png\"/></p>\r\n<blockquote cite=\"https://www.opentap.io/\">\r\nOpenTAP is an open source project for test automation. An open source test sequencing engine. The project is available online at \r\nhttps://Gitlab.com/OpenTAP/OpenTAP\r\n</blockquote>\r\n<h3>Listen to the interview with Michael Dieudonn&#233; about OpenTAP</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2743.000000,2817.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2743.000000,2817.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.opentap.io/\">https://www.opentap.io/</a></li>\r\n<li>Source Code: <a href=\"https://gitlab.com/OpenTAP/opentap\">https://gitlab.com/OpenTAP/opentap</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"OpenUK\">OpenUK</h2>\r\n<p><img alt=\"Logo\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/OpenUK.png\"/></p>\r\n<blockquote cite=\"\">\r\nWe are a UK organisation committed to develop and sustain UK leadership in Open Technology. We promote businesses, projects and people, who use Open. We strive to collaborate across all existing organisations for Open.\r\n</blockquote>\r\n<h3>Listen to the interview with Amanda Brock about OpenUK</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/OpenUK-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=2826.000000,3000.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=2826.000000,3000.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://openuk.uk\">https://openuk.uk</a></li>\r\n<li><a href=\"https://openuk.uk/profiles/amanda-brock/\">https://openuk.uk/profiles/amanda-brock/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"openWifi\">openWifi</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/openWifi.png\"/></p>\r\n<blockquote cite=\"\">\r\nopenwifi: Linux mac80211 compatible full-stack IEEE802.11/Wi-Fi design based on SDR (Software Defined Radio).\r\n</blockquote>\r\n<h3>Listen to the interview with XianJun Jiao about openWifi</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/openWifi-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3007.000000,3432.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3007.000000,3432.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Source Code: <a href=\"https://github.com/open-sdr/openwifi\">https://github.com/open-sdr/openwifi</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"OWASP\">OWASP</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/OWASP.png\"/></p>\r\n<blockquote cite=\"\">\r\nThe Open Web Application Security Project (OWASP) is a nonprofit foundation that works to improve the security of software. Through community-led open source software projects, hundreds of local chapters worldwide, tens of thousands of members, and leading educational and training conferences, the OWASP Foundation is the source for developers and technologists to secure the web.\r\n</blockquote>\r\n<h3>Listen to the interview with Antonis Manaras about OWASP</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/OWASP-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3422.000000,3547.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3422.000000,3547.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://owasp.org/\">https://owasp.org/</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/OWASP\">https://en.wikipedia.org/wiki/OWASP</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Percona\">Percona</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Percona.png\"/></p>\r\n<blockquote cite=\"\">\r\nPercona is a leading provider of unbiased open source database solutions that allow organizations to easily, securely and affordably maintain business agility, minimize risks, and stay competitive.\r\n</blockquote>\r\n<h3>Listen to the interview with Evgeniy Patlan about Percona</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3554.000000,3598.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3554.000000,3598.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.percona.com/\">https://www.percona.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"PineTime\">PineTime</h2>\r\n<p><img alt=\"Logo\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/PineTime.png\"/></p>\r\n<blockquote cite=\"https://wiki.pine64.org/index.php/PineTime\">\r\nAn Open Source Smartwatch For Your Favorite Devices. Low Cost, High Fidelity.\r\n<br />\r\nThe PineTime is a free and open source smartwatch capable of running custom-built open operating systems. Some of the notable features include a heart rate monitor, a week-long battery as well as a capacitive touch IPS display that is legible in direct sunlight. It is a fully community driven side-project, which means that it will ultimately be up to the developers and end-users to determine when they deem the PineTime ready to ship. \r\n</blockquote>\r\n<h3>Listen to the interview with Koen Zandberg about PineTime</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/PineTime-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3607.000000,3855.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3607.000000,3855.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.pine64.org/pinetime/\">https://www.pine64.org/pinetime/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/bergzand\">https://github.com/bergzand</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Pine_Microsystems\">https://en.wikipedia.org/wiki/Pine_Microsystems</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"PostGraphile\">PostGraphile</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/PostGraphile.png\"/></p>\r\n<blockquote cite=\"https://www.graphile.org/\">\r\nExtensible high-performance automatic GraphQL API for PostgreSQL\r\n</blockquote>\r\n<h3>Listen to the interview with Benjie Gillam, OSS Maintainer PostGraphile</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/PostGraphile-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=3865.000000,4085.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=3865.000000,4085.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.graphile.org/\">https://www.graphile.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/graphile\">https://github.com/graphile</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Skolelinux_AlekSIS_Teckids\">Skolelinux / AlekSIS / Teckids</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Skolelinux_AlekSIS_Teckids.png\"/></p>\r\n<blockquote cite=\"https://www.teckids.org/en/\">\r\nAt Teckids, all children and adolescents become part of the Free Software community - as users and contributors. Our young tutors aged between 9 and 16 regularly work together on their workshops, which they then lead for children and adolescents of the same age.\r\n</blockquote>\r\n<h3>Listen to the interview with Niels Bradek from Skolelinux / AlekSIS / Teckids</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=4010.000000,4215.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=4010.000000,4215.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://www.teckids.org/en/\">https://www.teckids.org/en/</a></li>\r\n<li><a href=\"https://wiki.debian.org/DebianEdu/\">https://wiki.debian.org/DebianEdu/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Technoethical\">Technoethical</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Technoethical.png\"/></p>\r\n<blockquote cite=\"\">\r\nTechnoethical is an online shop that sells hardware compatible with operating systems that fully respect users\' freedom as defined by the GNU Project. We are based in Bucharest, Romania (European Union) and we ship worldwide.\r\n</blockquote>\r\n<h3>Listen to the interview with Tiberiu Turbureanu about Technoethical</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=4224.000000,4720.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=4224.000000,4720.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://tehnoetic.com/\">https://tehnoetic.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"TinyGo\">Tiny Go</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/TinyGo.png\"/></p>\r\n<blockquote cite=\"\">\r\nTinyGo is a project to bring the Go programming language to microcontrollers and modern web browsers by creating a new compiler based on LLVM. You can compile and run TinyGo programs on several different microcontroller boards such as the BBC micro:bit and the Arduino Uno. TinyGo can also be used to produce WebAssembly (WASM) code which is very compact in size.\r\n</blockquote>\r\n<h3>Listen to the interview with Ron \"Dead Program\" Evans about Tiny Go</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=4729.000000,5086.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=4729.000000,5086.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://tinygo.org/\">https://tinygo.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/tinygo-org/tinygo\">https://github.com/tinygo-org/tinygo</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Go_(programming_language)\">https://en.wikipedia.org/wiki/Go_(programming_language)</a></li>\r\n<li><a href=\"https://hybridgroup.com/\">https://hybridgroup.com/</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"XCP-ng\">XCP-ng</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/XCP-ng.png\"/></p>\r\n<blockquote cite=\"https://xcp-ng.org/\">\r\nTurnkey Open Source Hypervisor. Based on XenServer, XCP-ng is the result of massive cooperation between individuals and companies, to deliver a product without limits. No restrictions on features and every bit available on GitHub! \r\n</blockquote>\r\n<h3>Listen to the interview with Olivier Lambert about XCP-ng</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/XCP-ng-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=5086.000000,5206.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=5086.000000,5206.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://xcp-ng.org/\">https://xcp-ng.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/xcp-ng\">https://github.com/xcp-ng</a></li>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Hypervisor\">https://en.wikipedia.org/wiki/Hypervisor</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"Zenroom\">Zenroom</h2>\r\n<p><img alt=\"Logo\" height=\"80\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Zenroom.png\"/></p>\r\n<blockquote cite=\"https://zenroom.org/\">\r\nZenroom: easy cryptography to the people. Zenroom is a tiny and portable virtual machine that authenticates and manages access to data using human-readable smart contracts. Zenroom is easy to program to performs fast cryptographic operations for end-to-end encryption and runs on: desktop, embedded, mobile phones, clouds and web browsers.\r\n</blockquote>\r\n<h3>Listen to the interview with Denis \"Jaromil\" Roio from Zenroom</h3>\r\n<p><img alt=\"headshot\" height=\"300\" src=\"https://hackerpublicradio.org/eps/hpr3022/hpr3022/Zenroom-headshot.png\"/></p>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=5214.000000,5496.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=5214.000000,5496.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n<ul>\r\n<li>Project Website: <a href=\"https://zenroom.org/\">https://zenroom.org/</a></li>\r\n<li>Source Code: <a href=\"https://github.com/DECODEproject/zenroom/\">https://github.com/DECODEproject/zenroom/</a></li>\r\n<li><a href=\"https://dyne.org\">https://dyne.org</a></li>\r\n</ul>\r\n\r\n\r\n<h2 id=\"fenster-full\">Fenster</h2>\r\n<h3>Fenster - Free Software Song</h3>\r\n<p><audio controls preload=\"none\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.ogg#t=5492.000000,5666.000000\" type=\"audio/ogg\">\r\n<source src=\"https://hackerpublicradio.org/local/hpr3022.mp3#t=5492.000000,5666.000000\" type=\"audio/mpeg\">\r\n</audio></p>\r\n<h3>Links</h3>\r\n\r\n<ul>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Free_Software_Song\">https://en.wikipedia.org/wiki/Free_Software_Song</a></li>\r\n<li>Official: <a href=\"https://www.gnu.org/music/free-software-song.html\">https://www.gnu.org/music/free-software-song.html</a></li>\r\n<li>Remix: <a href=\"https://freesoft.potlatch20.net/\">https://freesoft.potlatch20.net/</a></li>\r\n<li>RMS sings: <a href=\"https://www.youtube.com/watch?v=1BH7poMtPVU\">https://www.youtube.com/watch?v=1BH7poMtPVU</a></li>\r\n<li>GNU: <a href=\"https://audio-video.gnu.org/audio\">https://audio-video.gnu.org/audio</a></li>\r\n</ul>\r\n<pre>Track name : Free Software Song\r\nPerformer : Fenster\r\nRecorded date : 2002\r\nCopyright : Copyright (C) 2002, \r\nFenster LLC. Verbatim copying of this entire recording is permitted in any medium, \r\nprovided this notice is preserved. \r\nPerformers: \r\nPaul Robinson (vocals), \r\nRoman Kravec (guitar), \r\nEd D\'Angelo (bass), \r\nDave Newman (drums), \r\nBrian Yarbrough (trumpet), \r\nTony Moore (trumpet). \r\n</pre>\r\n\r\n',30,78,0,'CC-BY-SA','FOSDEM 2020',0,0,1),
(3023,'2020-03-04','Critique My Script, Episode 1 - Qots-Crew-Gen',782,'Discussion of using a shell script to randomly generate a ten man aircrew.','<p>This is my second HPR episode and the first in what could be a series about shell scripts I have written. This episode goes through a short script which randomly generates first and last names for a ten man aircrew to use with the Avalon Hill game B-17 Queen of the Skies.</p>\r\n<p>You can see the basic script in action here:<br />\r\n<a href=\"https://www.sodface.com/misc/qots-crew-gen\" class=\"uri\">https://www.sodface.com/misc/qots-crew-gen</a></p>\r\n<p>and a more complicated version here, though based on the same underlying methodolgy:<br />\r\n<a href=\"https://www.sodface.com/misc/qots-crew-gen2\" class=\"uri\">https://www.sodface.com/misc/qots-crew-gen2</a></p>\r\n<p>Here’s the script:</p>\r\n<pre><code>#!/bin/sh\r\n\r\nfirst_names=&#39;./firstnames.txt&#39;\r\nlast_names=&#39;./surnames.txt&#39;\r\ncrew_positions=&#39;./positions.txt&#39;\r\ncrew_ranks=&#39;./ranks.txt&#39;\r\n\r\nlen_first_names=$(wc -l &lt; ${first_names})\r\nlen_last_names=$(wc -l &lt; ${last_names})\r\n\r\nnum_pairs=$(printf &quot;10 ${len_first_names} ${len_last_names}&quot; | \\\r\n    awk &#39;BEGIN { srand() }\r\n    { for (i=1; i&lt;=$1; i++) {\r\n        for(f = 2; f &lt;= NF; f++) {\r\n        num=int(rand() * $f + 1); printf num&quot;,&quot; } printf &quot;\\n&quot;\r\n    }\r\n    }&#39;)\r\n\r\ni=1\r\n\r\nfor crew_member in ${num_pairs}\r\ndo\r\n  line_num=$(printf &quot;${crew_member}&quot; | cut -d&#39;,&#39; -f1)\r\n  first_name=$(sed -n ${line_num}p ${first_names})\r\n\r\n  line_num=$(printf &quot;${crew_member}&quot; | cut -d&#39;,&#39; -f2)\r\n  last_name=$(sed -n ${line_num}p ${last_names})\r\n\r\n  crew_position=$(sed -n ${i}p ${crew_positions})\r\n  crew_rank=$(sed -n ${i}p ${crew_ranks})\r\n\r\n  #\r\n  # Use the variables above to generate HTML.\r\n  # Omitted here to simplify this example.\r\n  #\r\n\r\n  i=$((( ${i} +1 )))\r\ndone</code></pre>\r\n',380,0,0,'CC-BY-SA','Shell Script,Random Numbers,Awk',0,0,1),
(3024,'2020-03-05','A funny thing happened the other day',259,'Describing a funny thing that happened the other day.','<p>Equipment used</p>\r\n<ul>\r\n<li><p><a href=\"https://en.wikipedia.org/wiki/Nexus_7_(2013)\">Nexus 7 tablet</a></p></li>\r\n<li><p><a href=\"https://www.amazon.co.uk/HccToo-Multifunctional-Rechargeable-Dictaphone-Conversation/dp/B015H9JP6S/ref=sr_1_1?ie=UTF8&amp;qid=1502381150&amp;sr=8-1&amp;keywords=dictation+machines\">My faithful Dictaphone</a></p></li>\r\n<li><p>Noise source<br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr3024/hpr3024/hpr3024_noise-source.JPG\" alt=\"Noise source\" width=\"400\" height=\"400\" /></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','story, audio, sound',0,0,1),
(3027,'2020-03-10','What is quantum computing and why should we care?',1515,'What is all the quantum computing hype about & what is it that quantum computers will be able to do?','<h3 id=\"what-are-quantum-computers-anyway\">What are quantum computers anyway?</h3>\r\n<p>Physical computing systems that take advantage of quantum effects.</p>\r\n<h3 id=\"what-kind-of-quantum-effects-and-why-does-that-matter\">What kind of quantum effects, and why does that matter?</h3>\r\n<p>Entanglement and superposition: Entanglement lets us do unusual, head-scratching kinds of things like teleportation. Superposition lets us harness the almost unimaginable potential of quantum mechanics to do things that conventional computers can never do.</p>\r\n<h3 id=\"how-can-you-ever-explain-that-in-a-podcast\">How can you ever explain that in a podcast?</h3>\r\n<p>To really understand the details, you must have math, but math and audio formats are not so compatible. So I use analogies, and throw in some pithy quotes from Einstein and hope that does the trick.</p>\r\n<h3 id=\"big-picture\">Big picture?</h3>\r\n<p>Lots of work going on to build quantum processors (QPUs) that use quantum memory and, get this, will at some point actually do error correction. There are programming frameworks and rudimentary compilers to compile down python code all the way down to microwave pulses and laser pulses and there is control machinery to gather back the signals and interpret them to ones and zeros. Quantum computers will be securely networked using quantum protocols and we’ll all live happily ever after in a quantum computing world.</p>\r\n<p><b>Questions?</b> Please leave suggestions if you want to dive a bit deeper in some topic areas - it’ll encourage me to do more episodes.</p>\r\n',379,0,0,'CC-BY-SA','quantum computing',0,0,1),
(3028,'2020-03-11','Monads and Haskell',1275,'A hopefully not too rambly \"introduction\" to  functors and monads in and out of haskell','<p>This is basically a transcript of the post I wrote on the subject which I host <a href=\"https://www.crvs.xyz/posts_haskeljoin.html\">here</a> It has a bit more than what I talked about</p>\r\n<h1 id=\"join-in-haskell\">Join in Haskell</h1>\r\n<p><code>join</code> is a monadic operation, instead of working only on lists, it works on monads and has the signature:</p>\r\n<pre><code>   join :: Monad m =&gt; m ( m a ) -&gt; (m a)\r\n</code></pre>\r\n<p>In effect it <code>joins</code> or <code>merges</code> two successive monad applications into a single monad application. But join is not part of the canonical monad definition, which is given by:</p>\r\n<pre><code>   return ::  Monad m =&gt; a -&gt; m a` ; and`\r\n   (&gt;&gt;=) :: Monad m =&gt; m a -&gt; ( a -&gt; m b ) -&gt; m b\r\n</code></pre>\r\n<p>A good or rather trivial way to think of the relationship between <code>return</code> <code>join</code> and <code>(&gt;&gt;=)</code> is that in essence, since each monad is a functor, then what <code>(&gt;&gt;=)</code> does is that it maps the second argument over the first argument, and then uses <code>join</code> to merge the two applications of the monad constructor, i.e.:</p>\r\n<pre><code>  (x &gt;&gt;= f) = join $ fmap f x\r\n</code></pre>\r\n<p>However, join needs to be constructed from <code>return</code> and <code>(&gt;&gt;=)</code>. The naive solution is that we want to <code>trick</code> <code>(&gt;&gt;=)</code> to let us apply a function that does not pile up yet another <code>m</code> onto our initial type <code>m (m a)</code> and surprisingly, this will actually work if we let</p>\r\n<pre><code>   join x = (x &gt;&gt;= id)\r\n</code></pre>\r\n<p>Initially this is surprising since <code>id</code> has the signature <code>(c -&gt; c)</code> instead of the necessary <code>a -&gt; m b</code>! However, when <code>c</code> is not an atomic type, but rather of the form <code>m d</code> for some (maybe atomic) type <code>d</code>, then we actually have the signature <code>m d -&gt; m d</code>, and if we bind type <code>a</code> to <code>m d</code> and type <code>b</code> to <code>d</code>, we obtain <code>id</code> with actual type signatuare <code>a -&gt; m b</code>, and it can indeed be used as the second argument of <code>(&gt;&gt;=)</code>, and everything actually makes sense.</p>\r\n<p>Now style is important and so we can do an eta reduction on this, to get a point-free implementation by simply binding the second argument of <code>&gt;&gt;=</code>:</p>\r\n<pre><code>   join = (&gt;&gt;= id)\r\n</code></pre>\r\n<p>This is all fine and well for the type number, and it <em>does</em> work, but it\'s also important to understand how it works, so let\'s see it in a simple example, using the <code>Maybe</code> monad. So let\'s start by refreshing the implementation of the monad instance:</p>\r\n<pre><code>instance Monad Maybe where\r\n\r\n   (&gt;&gt;=) :: Maybe a -&gt; (a -&gt; Maybe b) -&gt; Maybe b\r\n   (&gt;&gt;=) Nothing _ = Nothing\r\n   (&gt;&gt;=) (Just x) f = f x\r\n\r\n   return :: a -&gt; Maybe a\r\n   return = Just\r\n</code></pre>\r\n<p>So let\'s now go through the successive bindings when performing <code>(&gt;&gt;=id)</code>:</p>\r\n<pre><code>   Just x = Just (Just 2) =&gt; x = Just 2\r\n   Just x &gt;&gt;= id = id x = x\r\n   x = Just 2\r\n</code></pre>\r\n<p>This example is pretty much verbatim the same thing for the <code>Either</code> monad and many other monads that follow a similar principle, so let\'s look at a bit more of a complex example. Let\'s look at the <code>List</code> monad:</p>\r\n<p>instance Monad List where</p>\r\n<pre><code>   (&gt;&gt;=) :: [a] -&gt; (a -&gt; [b]) -&gt; [b]\r\n   (&gt;&gt;=) [] _ = []\r\n   (&gt;&gt;=) (x:xs) f = f x ++ (xs &gt;&gt;= f)\r\n\r\n   return :: a -&gt; [a]\r\n   return = (:[])\r\n</code></pre>\r\n<p>Following the bindings again we have</p>\r\n<pre><code>   [[2,3],[4]] = (x:xs) =&gt; x = [2,3] ; xs = [[4]]\r\n   (x:xs) &gt;&gt;= id = (id x) ++ (xs &gt;&gt;= id) = x ++ (xs &gt;&gt;= id)\r\n   [[4]] = (y:ys) =&gt; y = [4] ; ys = []\r\n   (y:ys) &gt;&gt;= id = y ++ (ys &gt;&gt;= id)\r\n   ys = [] =&gt; (ys &gt;&gt;= id) = []\r\n   =&gt; (y:ys) &gt;&gt;= id  =  [4] ++ [] = [4]\r\n   =&gt; xs &gt;&gt;= id = [4]\r\n   =&gt; (x:xs) &gt;&gt;= id = x ++ [4] = [2,3] ++ [4] = [2,3,4]\r\n</code></pre>\r\n<p>So all of this is to say that <code>join</code> actually does what one expects it to do on a list of lists. It joins them one by one into a single list.</p>\r\n<h1 id=\"the-associativity-law\">The Associativity Law</h1>\r\n<p>The associativity law of a monad can be quite confusing, after all it takes the form:</p>\r\n<pre><code>   (m &gt;&gt;= f) &gt;&gt;= g == m &gt;&gt;= ( x -&gt; f x &gt;&gt;= g )\r\n</code></pre>\r\n<p>While not too complicated to understand it is difficult to see how it relates to a usual associativity law, which follows the form <code>a * (b * c) = (a * b) * c</code>. To recover the associativity the usual explanation is that one has to see it in terms of the monadic function composition <code>(&gt;=&gt;)</code> and while this is a valid way of doing so, I like to decompose things in terms of <code>fmap</code>, <code>(&gt;&gt;=)</code> and <code>join</code>.</p>\r\n<p>So let\'s use what we did previously on the associativity law, starting on the left side, and replacing the atomic-looking type <code>m</code> with the dependent type <code>M z</code>:</p>\r\n<pre><code>   (M z &gt;&gt;= f) &gt;&gt;= g\r\n   = join (fmap f (M z)) &gt;&gt;= g\r\n   = join (fmap g $ join ( fmap f (M z)))\r\n   = join (fmap g $ join ( M (f z) )\r\n</code></pre>\r\n<p>and the right-hand side:</p>\r\n<pre><code>   M z &gt;&gt;= ( x -&gt; f x &gt;&gt;= g )\r\n   = M z &gt;&gt;= ( x -&gt; join $ fmap g (f x))\r\n   = join $ fmap ( x -&gt; join $ fmap g (f x)) (M z)\r\n   = join $ M ( x -&gt; join $ fmap g (f x)) z\r\n   = join $ M (join $ fmap g (f z))\r\n</code></pre>\r\n<p>And essentially what it says is that if I have two functions <code>f</code> and <code>g</code> I can either do it in an orderly fashion where I apply them sequentially with <code>join . fmap f</code> followed by <code>join . fmap g</code>, or I can apply them both within the constructor and then join once within the constructor and one outside the constructor, and I should get the same thing. In fact if you replace <code>f</code> and <code>g</code> with <code>id</code>; this is the associativity law for monads as usually presented in a standard category theory textbook such as Mac Lane\'s Categories for the Working Mathematician (and recovering this was the whole point of this exercise in the first place).</p>\r\n',385,107,1,'CC-BY-SA','Haskell, Programming, Math',0,0,1),
(3029,'2020-03-12','At Union Station with a train delay',347,'This is a soundscape while waiting for a train at Union Station.','<p>I was waiting for the Metra train, when there was an announcement that the train would be late due to a server failure.</p>',318,101,0,'CC-BY-SA','soundscape, trains',0,0,1),
(3030,'2020-03-13','My new Samsung tablet',1686,'A general discussion about my new 10.5 inch Samsung Galaxy tablet','<ul>\r\n<li><p>Samsung Galaxy Tab A 10.5 inch 2018 Tablet at 3:30<br />\r\n<a href=\"https://www.amazon.co.uk/Samsung-Galaxy-10-5-WiFi-Black/dp/B07GG5DSTW/ref=asc_df_B07GG5DSTW/?tag=googshopuk-21&amp;linkCode=df0&amp;hvadid=310819184817&amp;hvpos=1o1&amp;hvnetw=g&amp;hvrand=16845709935342815174&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=9046893&amp;hvtargid=aud-858395717453:pla-667424753514&amp;psc=1&amp;th=1&amp;psc=1\">Amazon link</a></p></li>\r\n<li><p>Nexus 7 at 3:50<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nexus_7_(2013)\" class=\"uri\">https://en.wikipedia.org/wiki/Nexus_7_(2013)</a></p></li>\r\n<li><p>New tablet Battery at 5:20<br />\r\nLithium Polymer batteries, 7300 mAh capacity with claimed 15 hours of video playback on one charge. It seems to charge surprisingly quickly.</p></li>\r\n<li><p>Wikipedia entry for Edinburgh City Bypass at 9:30<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Edinburgh_City_Bypass\" class=\"uri\">https://en.wikipedia.org/wiki/Edinburgh_City_Bypass</a></p></li>\r\n<li><p>Eye strain at 14:07</p></li>\r\n<li><p>Bluetooth Ear buds at 15:15<br />\r\nSimilar to these: <a href=\"https://www.amazon.co.uk/Bluetooth-Wireless-Headphones-Canceling-Compatible-white/dp/B084ST42CL/ref=sr_1_13?keywords=bluetooth+earbuds&amp;qid=1582899080&amp;sr=8-13\">Amazon link</a></p></li>\r\n<li><p>Bluetooth speaker at 16:52<br />\r\n<a href=\"https://www.amazon.co.uk/EasyAcc-Portable-Rechargeable-Bluetooth-Microphone/dp/B00JK6MQEI/ref=sr_1_2?crid=1X95EE1DRL6DI&amp;keywords=bluetooth+speaker+easyacc&amp;qid=1582899239&amp;sprefix=bluetooth+speaker+easy+%2Caps%2C161&amp;sr=8-2\">Amazon link</a></p></li>\r\n<li><p>Bluetooth keyboard at 22:35<br />\r\n<a href=\"https://www.amazon.co.uk/Universal-Adjustable-Brightness-Smartphone-Rechargeable/dp/B00X5P8BJO/ref=sr_1_1?crid=1K2NT7A80IVPK&amp;keywords=arteck+universal+backlit+7-colors&amp;qid=1582899392&amp;sprefix=Artec+Uni%2Caps%2C160&amp;sr=8-1\">Amazon link</a></p></li>\r\n<li><p>Additional thoughts after recording this episode</p>\r\n<ul>\r\n<li><p>Closing one eye seems to solve the problem though not very practical. It doesn’t seem to matter which eye I close.</p></li>\r\n<li><p>Doesn’t seem to bother me with the other 8” Samsung tablet or any other tablet / phone.</p></li>\r\n<li><p>Counter intuitively increasing the brightness makes things better</p></li>\r\n<li><p>Searching for eye strain and Samsung brought up one or two results of people saying a similar thing to myself; one person commenting that they were fed up of people telling them to get an eye test and like myself they do not have this problem with any other device.</p></li>\r\n</ul></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Android, Tablet',0,0,1),
(3031,'2020-03-16','Daniel Persson - Me? Me!',1131,'I talk about who I am and where I come from and what my interests are.','<p>Talking about my history, forgot to talk about my open-source interests and different projects I’m a part of.</p>\r\n<p>If you want to know more about me you could follow any of the links below.</p>\r\n<ul>\r\n<li><p><a href=\"https://danielpersson.dev/\" class=\"uri\">https://danielpersson.dev/</a></p></li>\r\n<li><p><a href=\"https://youtube.com/c/DanielPersson\" class=\"uri\">https://youtube.com/c/DanielPersson</a></p></li>\r\n<li><p><a href=\"https://github.com/kalaspuffar\" class=\"uri\">https://github.com/kalaspuffar</a></p></li>\r\n<li><p><a href=\"https://github.com/sqrldev/wordpress-sqrl-login\" class=\"uri\">https://github.com/sqrldev/wordpress-sqrl-login</a></p></li>\r\n</ul>\r\n',382,0,0,'CC-BY-SA','biography',0,0,1),
(3032,'2020-03-17','piCore on a Raspberry Pi 1 Model B',651,'How I revived my Raspberry Pi Model 1 B with piCore and a tiny SD card.','<p>In this episode, I discuss how I revived my Raspberry Pi 1 Model B using piCore, a specialized version of Tiny Core Linux for the Raspberry Pi, on a 128 MB SD card that I had laying around. I also mention nanoBSD and Alpine Linux as possible alternatives to try out.</p>\r\n<ul>\r\n<li><p>Tiny Core Linux<br />\r\n<a href=\"https://tinycorelinux.net/\" class=\"uri\">https://tinycorelinux.net/</a></p></li>\r\n<li><p>piCore Releases<br />\r\n<a href=\"https://www.tinycorelinux.net/9.x/armv6/\" class=\"uri\">https://www.tinycorelinux.net/9.x/armv6/</a></p></li>\r\n<li><p>nanoBSD<br />\r\n<a href=\"https://www.freebsd.org/doc/en_US.ISO8859-1/articles/nanobsd/index.html\" class=\"uri\">https://www.freebsd.org/doc/en_US.ISO8859-1/articles/nanobsd/index.html</a><br />\r\n<a href=\"https://www.freebsd.org/doc/en_US.ISO8859-1/articles/nanobsd/howto.html\" class=\"uri\">https://www.freebsd.org/doc/en_US.ISO8859-1/articles/nanobsd/howto.html</a></p></li>\r\n<li><p>Alpine Linux<br />\r\n<a href=\"https://alpinelinux.org/\" class=\"uri\">https://alpinelinux.org/</a><br />\r\n<a href=\"https://wiki.alpinelinux.org/wiki/Raspberry_Pi\" class=\"uri\">https://wiki.alpinelinux.org/wiki/Raspberry_Pi</a></p></li>\r\n</ul>\r\n',152,0,0,'CC-BY-SA','raspberrypi,rpi,linux,bsd',0,0,1),
(3033,'2020-03-18','Linux Inlaws S01E03 32 Bit Time Travel',3543,'Linux Inlaws - a podcast on topics around free and open source software','<p>For show notes, please visit <a href=\"https://linuxinlaws.eu\" class=\"uri\">https://linuxinlaws.eu</a></p>',384,111,1,'CC-BY-SA','Linux Inlaws, free open source software, revolution, FLOSS',0,0,1),
(3034,'2020-03-19','How to bridge Freenode IRC rooms to Matrix.org',786,'Thaj builds upon a previous episode by Clacke to deep dive into bridging IRC to Matrix.org','<ul>\r\n<li><p>Attribution</p>\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0311.html\">Clacke</a> - <a href=\"https://hackerpublicradio.org/eps.php?id=2169\">HPR Episode 2169 on Matrix</a></li>\r\n<li><a href=\"https://thelovebug.org/\">Dave Lee</a> - Helped a great deal in getting me on board with Matrix bridging. Check out his other podcasts at <a href=\"https://otherside.network/\">The Other Side Podcast Network</a></li>\r\n</ul></li>\r\n<li><p><a href=\"matrix.org\">Matrix.org</a> is a Free, open source, and decentralized messaging system. One of the strong points of this system is its ability to <a href=\"https://matrix.org/bridges\">bridge</a> multiple protocols together into one interface.</p></li>\r\n<li><p><a href=\"https://about.riot.im/\">Riot.im</a></p></li>\r\n<li><p>Bridging to Freenode\'s IRC server is built into Matrix.org. If you already have a registered Nick on Freenode it is a simple process to associate your Matrix and Freenode accounts.</p></li>\r\n<li><p>Steps to bridge to a Freenode IRC room</p>\r\n<ol>\r\n<li>Start a direct message with @freenode_NickServ:matrix.org and send the command <code>identify nick pass</code> (replacing nick and pass with your credentials).</li>\r\n<li>Direct message @appservice-irc:matrix.org with the command <code>!storepass nick:pass</code></li>\r\n<li>Join the room #freenode_#oggcastplanet:matrix.org. <em>You can really join any room on freenode with #freenode_#CHANNAME:matrix.org</em></li>\r\n<li>PROFIT!!!!</li>\r\n</ol></li>\r\n</ul>\r\n',270,108,0,'CC-BY-SA','Freenode, IRC, Matrix.org, Riot.im, Social Media',0,0,1),
(3037,'2020-03-24','Ambient recording at Union Station',205,'Ambient recording in the main hall at Union Station, Chicago','<p>This was recorded in the main hall at Union Station in Chicago, Illinois.<br />\r\nThere was a brief security announcement about watching for bags or package left unattended.</p>',318,101,0,'CC-BY-SA','soundscape, train station',0,0,1),
(3038,'2020-03-25','Solo Magic',2244,'All the magic without the gathering','<p>This episode outlines my single-player mod for the <strong>Magic: The Gathering</strong> card game.</p>',78,95,0,'CC-BY-SA','magic, mtg',0,0,1),
(3040,'2020-03-27','Why use GNU Autotools',1766,'6 good reasons you should be using a build system','<p>GNU Autotools is a build system that helps you distribute your code in a predictable and reliable way.\r\nBuild systems offer many benefits, including:\r\n</p>\r\n\r\n<ol>\r\n<li>Standard and automate-able build process</li>\r\n<li>hooks into packaging systems (RPM, DEB, Slackbuilds, Flatpak, Snap, and so on)</li>\r\n<li>version reporting</li>\r\n<li>build for various OSes</li>\r\n<li>you get lots of  code to handle every possible corner case, for free</li>\r\n<li>with a single configuration, you can build your project as the developer, build it for packagers, and enable users to build it for themselves</li>\r\n</ol>\r\n\r\n<p>Next up: how to use GNU Autotools</p>',78,0,0,'CC-BY-SA','autotools,build,make',0,0,1),
(3041,'2020-03-30','How to use GNU Autotools',2337,'How to use GNU Autotools','<p>I found a great article on this topic here: <a href=\"\" target=\"_blank\">https://opensource.com/article/19/7/introduction-gnu-autotools</a>, so please refer to that as show notes.</p>\r\n<p>\r\n<small>\r\nPage included by Ken, as permitted by cc-by-sa\r\n</small>\r\n</p>\r\n<h1>Introduction to GNU Autotools</h1>\r\n\r\n<p id=\"introduction-to-gnu-autotools\">Have you ever downloaded the source code for a popular software project that required you to type the almost ritualistic <strong>./configure; make &amp;&amp; make install</strong> command sequence to build and install it? If so, you’ve used <a href=\"https://www.gnu.org/software/automake/faq/autotools-faq.html\" target=\"_blank\">GNU Autotools</a>. If you’ve ever looked into some of the files accompanying such a project, you’ve likely also been terrified at the apparent complexity of such a build system.</p>\r\n\r\n<p>Good news! GNU Autotools is a lot simpler to set up than you think, and it’s GNU Autotools itself that generates those 1,000-line configuration files for you. Yes, you can write 20 or 30 lines of installation code and get the other 4,000 for free.</p>\r\n\r\n<h2 id=\"autotools-at-work\">Autotools at work</h2>\r\n\r\n<p>If you’re a user new to Linux looking for information on how to install applications, you do not have to read this article! You’re welcome to read it if you want to research how software is built, but if you’re just installing a new application, go read my article about <a href=\"https://opensource.com/article/18/1/how-install-apps-linux\">installing apps on Linux</a>.</p>\r\n\r\n<p>For developers, Autotools is a quick and easy way to manage and package source code so users can compile and install software. Autotools is also well-supported by major packaging formats, like DEB and RPM, so maintainers of software repositories can easily prepare a project built with Autotools.</p>\r\n\r\n<p>Autotools works in stages:</p>\r\n\r\n<ol>\r\n<li>First, during the <strong>./configure</strong> step, Autotools scans the host system (the computer it’s being run on) to discover the default settings. Default settings include where support libraries are located, and where new software should be placed on the system.</li>\r\n<li>Next, during the <strong>make</strong> step, Autotools builds the application, usually by converting human-readable source code into machine language.</li>\r\n<li>Finally, during the <strong>make install</strong> step, Autotools copies the files&nbsp;it built to the appropriate locations (as detected during the configure stage) on your computer.</li>\r\n</ol><p>This process seems simple, and it is, as long as you use Autotools.</p>\r\n\r\n<h2 id=\"the-autotools-advantage\">The Autotools advantage</h2>\r\n\r\n<p>GNU Autotools is a big and important piece of software that most of us take for granted. Along with <a href=\"https://en.wikipedia.org/wiki/GNU_Compiler_Collection\" target=\"_blank\">GCC (the GNU Compiler Collection)</a>, Autotools is the scaffolding that allows Free Software to be constructed and installed to a running system. If you’re running a <a href=\"https://en.wikipedia.org/wiki/POSIX\" target=\"_blank\">POSIX</a> system, it’s not an understatement to say that most of your operating system exists as runnable software on your computer because of these projects.</p>\r\n\r\n<p>In the likely event that your pet project isn’t an operating system, you might assume that Autotools is overkill for your needs. But, despite its reputation, Autotools has lots of little features that may benefit you, even if your project is a relatively simple application or series of scripts.</p>\r\n\r\n<h3 id=\"portability\">Portability</h3>\r\n\r\n<p>First of all, Autotools comes with portability in mind. While it can’t make your project work across all POSIX platforms (that’s up to you, as the coder), Autotools can ensure that the files you’ve marked for installation get installed to the most sensible locations on a known platform. And because of Autotools, it’s trivial for a power user to customize and override any non-optimal value, according to their own system.</p>\r\n\r\n<p>With Autotools, all you need to know is what files need to be installed to what general location. It takes care of everything else. No more custom install scripts that break on any untested OS.</p>\r\n\r\n<h3 id=\"packaging\">Packaging</h3>\r\n\r\n<p>Autotools is also well-supported. Hand a project with Autotools over to a distro packager, whether they’re packaging an RPM, DEB, TGZ, or anything else, and their job is simple. Packaging tools know Autotools, so there’s likely to be no patching, hacking, or adjustments necessary. In many cases, incorporating an Autotools project into a pipeline can even be automated.</p>\r\n\r\n<h2 id=\"how-to-use-autotools\">How to use Autotools</h2>\r\n\r\n<p>To use Autotools, you must first have Autotools installed. Your distribution may provide one package meant to help developers build projects, or it may provide separate packages for each component, so you may have to do some research on your platform to discover what packages you need to install.</p>\r\n\r\n<p>The primary components of Autotools are:</p>\r\n\r\n<ul>\r\n<li><strong>automake</strong></li>\r\n<li><strong>autoconf</strong></li>\r\n<li><strong>make</strong></li>\r\n</ul>\r\n\r\n<p>While you likely need to install the compiler (GCC, for instance) required by your project, Autotools works just fine with scripts or binary assets that don’t need to be compiled. In fact, Autotools can be useful for such projects because it provides a <strong>make uninstall</strong> script for easy removal.</p>\r\n\r\n<p>Once you have all of the components installed, it’s time to look at the structure of your project’s files.</p>\r\n\r\n<h3 id=\"autotools-project-structure\">Autotools project structure</h3>\r\n\r\n<p>GNU Autotools has very specific expectations, and most of them are probably familiar if you download and build source code often. First, the source code itself is expected to be in a subdirectory called <strong>src</strong>.</p>\r\n\r\n<p>Your project doesn’t have to follow all of these expectations, but if you put files in non-standard locations (from the perspective of Autotools), then you’ll have to make adjustments for that in your Makefile later.</p>\r\n\r\n<p>Additionally, these files are required:</p>\r\n\r\n<ul>\r\n<li><strong>NEWS</strong></li>\r\n<li><strong>README</strong></li>\r\n<li><strong>AUTHORS</strong></li>\r\n<li><strong>ChangeLog</strong></li>\r\n</ul>\r\n\r\n<p>You don’t have to actively use the files, and they can be symlinks to a monolithic document (like <strong>README.md</strong>) that encompasses all of that information, but they must be present.</p>\r\n\r\n<h3 id=\"autotools-configuration\">Autotools configuration</h3>\r\n\r\n<p>Create a file called <strong>configure.ac</strong> at your project’s root directory. This file is used by <strong>autoconf</strong> to create the <strong>configure</strong> shell script that users run before building. The file must contain, at the very least, the <strong>AC_INIT</strong> and <strong>AC_OUTPUT</strong> <a href=\"https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Initializing-configure.html\" target=\"_blank\">M4 macros</a>. You don’t need to know anything about the M4 language to use these macros; they’re already written for you, and all of the ones relevant to Autotools are defined in the documentation.</p>\r\n\r\n<p>Open the file in your favorite text editor. The <strong>AC_INIT</strong> macro may consist of the package name, version, an email address for bug reports, the project URL, and optionally the name of the source TAR file.</p>\r\n\r\n<p>The <strong><a href=\"https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Output.html#Output\" target=\"_blank\">AC_OUTPUT</a></strong> macro is much simpler and accepts no arguments.</p>\r\n\r\n<pre>AC_INIT([penguin], [2019.3.6], [seth@example.com])<br>\r\nAC_OUTPUT</pre>\r\n\r\n<p>If you were to run <strong>autoconf</strong> at this point, a <strong>configure</strong> script would be generated from your <strong>configure.ac</strong> file, and it would run successfully. That’s all it would do, though, because all you have done so far is define your project’s metadata and called for a configuration script to be created.</p>\r\n\r\n<p>The next macros you must invoke in your <strong>configure.ac</strong> file are functions to create a <a href=\"https://www.gnu.org/software/make/manual/html_node/Introduction.html\" target=\"_blank\">Makefile</a>. A Makefile tells the <strong>make</strong> command what to do (usually, how to compile and link a program).</p>\r\n\r\n<p>The macros to create a Makefile are <strong>AM_INIT_AUTOMAKE</strong>, which accepts no arguments, and <strong>AC_CONFIG_FILES</strong>, which accepts the name you want to call your output file.</p>\r\n\r\n<p>Finally, you must add a macro to account for the compiler your project needs. The macro you use obviously depends on your project. If your project is written in C++, the appropriate macro is <strong>AC_PROG_CXX</strong>, while a project written in C requires <strong>AC_PROG_CC</strong>, and so on, as detailed in the <a href=\"https://www.gnu.org/software/automake/manual/html_node/Programs.html#Programs\" target=\"_blank\">Building Programs and Libraries</a> section in the Autoconf documentation.</p>\r\n\r\n<p>For example, I might add the following for my C++ program:</p>\r\n\r\n<pre>AC_INIT([penguin], [2019.3.6], [seth@example.com])<br>\r\nAC_OUTPUT<br>\r\nAM_INIT_AUTOMAKE<br>\r\nAC_CONFIG_FILES([Makefile])<br>\r\nAC_PROG_CXX</pre>\r\n\r\n<p>Save the file. It’s time to move on to the Makefile.</p>\r\n\r\n<h3 id=\"autotools-makefile-generation\">Autotools Makefile generation</h3>\r\n\r\n<p>Makefiles aren’t difficult to <a href=\"https://opensource.com/article/18/8/what-how-makefile\" target=\"_blank\">write manually</a>, but Autotools can write one for you, and the one it generates will use the configuration options detected during the <code>./configure</code> step, and it will contain far more options than you would think to include or want to write yourself. However, Autotools can’t detect everything your project requires to build, so you have to add some details in the file <strong>Makefile.am</strong>, which in turn is used by <strong>automake</strong> when constructing a Makefile.</p>\r\n\r\n<p><strong>Makefile.am</strong> uses the same syntax as a Makefile, so if you’ve ever written a Makefile from scratch, then this process will be familiar and simple. Often, a <strong>Makefile.am</strong> file needs only a few variable definitions to indicate what files are to be built, and where they are to be installed.</p>\r\n\r\n<p>Variables ending in <strong>_PROGRAMS</strong> identify code that is to be built (this is usually considered the <em>primary</em> target; it’s the main reason the Makefile exists). Automake recognizes other primaries, like <strong>_SCRIPTS</strong>, <strong>_DATA</strong>, <strong>_LIBRARIES</strong>, and other common parts that make up a software project.</p>\r\n\r\n<p>If your application is literally compiled during the build process, then you identify it as a binary program with the <strong>bin_PROGRAMS</strong> variable, and then reference any part of the source code required to build it (these parts may be one or more files to be compiled and linked together) using the program name as the variable prefix:</p>\r\n\r\n<pre>bin_PROGRAMS = penguin<br>\r\npenguin_SOURCES = penguin.cpp</pre>\r\n\r\n<p>The target of <strong>bin_PROGRAMS</strong> is installed into the <strong>bindir</strong>, which is user-configurable during compilation.</p>\r\n\r\n<p>If your application isn’t actually compiled, then your project doesn’t need a <strong>bin_PROGRAMS</strong> variable at all. For instance, if your project is a script written in Bash, Perl, or a similar interpreted language, then define a <strong>_SCRIPTS</strong> variable instead:</p>\r\n\r\n<pre>bin_SCRIPTS = bin/penguin</pre>\r\n\r\n<p>Automake expects sources to be located in a directory called <strong>src</strong>, so if your project uses an alternative directory structure for its layout, you must tell Automake to accept code from outside sources:</p>\r\n\r\n<pre>AUTOMAKE_OPTIONS = foreign subdir-objects</pre>\r\n\r\n<p>Finally, you can create any custom Makefile rules in <strong>Makefile.am</strong> and they’ll be copied verbatim into the generated Makefile. For instance, if you know that a temporary value needs to be replaced in your source code before the installation proceeds, you could make a custom rule for that process:</p>\r\n\r\n<pre>all-am: penguin<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; touch bin/penguin.sh<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; <br>\r\npenguin: bin/penguin.sh<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @sed \"s|__datadir__|@datadir@|\" $&lt; &gt;bin/$@</pre>\r\n\r\n<p>A particularly useful trick is to extend the existing <strong>clean</strong> target, at least during development. The <strong>make clean</strong> command generally removes all generated build files with the exception of the Automake infrastructure. It’s designed this way because most users rarely want <strong>make clean</strong> to obliterate the files that make it easy to build their code.</p>\r\n\r\n<p>However, during development, you might want a method to reliably return your project to a state relatively unaffected by Autotools. In that case, you may want to add this:</p>\r\n\r\n<pre>clean-local:<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm config.status configure config.log<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm Makefile <br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm -r autom4te.cache/<br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm aclocal.m4 <br>\r\n&nbsp; &nbsp; &nbsp; &nbsp; @rm compile install-sh missing Makefile.in</pre>\r\n\r\n<p>There’s a lot of flexibility here, and if you’re not already familiar with Makefiles, it can be difficult to know what your <strong>Makefile.am</strong> needs. The barest necessity is a primary target, whether that’s a binary program or a script, and an indication of where the source code is located (whether that’s through a <strong>_SOURCES</strong> variable or by using <strong>AUTOMAKE_OPTIONS</strong> to tell Automake where to look for source code).</p>\r\n\r\n<p>Once you have those variables and settings defined, you can try generating your build scripts as you see in the next section, and adjust for anything that’s missing.</p>\r\n\r\n<h3 id=\"autotools-build-script-generation\">Autotools build script generation</h3>\r\n\r\n<p>You’ve built the infrastructure, now it’s time to let Autotools do what it does best: automate your project tooling. The way the developer (you) interfaces with Autotools is different from how users building your code do.</p>\r\n\r\n<p>Builders generally use this well-known sequence:</p>\r\n\r\n<pre>$ ./configure<br>\r\n$ make<br>\r\n$ sudo make install</pre>\r\n\r\n<p>For that incantation to work, though, you as the developer must bootstrap the build infrastructure. First, run <strong>autoreconf</strong> to generate the configure script that users invoke before running <strong>make</strong>. Use the <strong>–install</strong> option to bring in auxiliary files, such as a symlink to <strong>depcomp</strong>, a script to generate dependencies during the compiling process, and a copy of the <strong>compile</strong> script, a wrapper for compilers to account for syntax variance, and so on.</p>\r\n\r\n<pre>$ autoreconf --install<br>\r\nconfigure.ac:3: installing \'./compile\'<br>\r\nconfigure.ac:2: installing \'./install-sh\'<br>\r\nconfigure.ac:2: installing \'./missing\'</pre>\r\n\r\n<p>With this development build environment, you can then create a package for source code distribution:</p>\r\n\r\n<pre>$ make dist</pre>\r\n\r\n<p>The <strong>dist</strong> target is a rule you get for \"free\"&nbsp;from Autotools.<br>\r\nIt’s a feature that gets built into the Makefile generated from your humble <strong>Makefile.am</strong> configuration. This target produces a <strong>tar.gz</strong> archive containing all of your source code and all of the essential Autotools infrastructure so that people downloading the package can build the project.</p>\r\n\r\n<p>At this point, you should review the contents of the archive carefully to ensure that it contains everything you intend to ship to your users. You should also, of course, try building from it yourself:</p>\r\n\r\n<pre>$ tar --extract --file penguin-0.0.1.tar.gz<br>\r\n$ cd penguin-0.0.1<br>\r\n$ ./configure <br>\r\n$ make <br>\r\n$ DESTDIR=/tmp/penguin-test-build make install</pre>\r\n\r\n<p>If your build is successful, you find a local copy of your compiled application specified by <strong>DESTDIR</strong> (in the case of this example, <strong>/tmp/penguin-test-build</strong>).</p>\r\n\r\n<pre>$ /tmp/example-test-build/usr/local/bin/example <br>\r\nhello world from GNU Autotools</pre>\r\n\r\n<h2 id=\"time-to-use-autotools\">Time to use Autotools</h2>\r\n\r\n<p>Autotools is a great collection of scripts for a predictable and automated release process. This toolset may be new to you if you’re used to Python or Bash builders, but it’s likely worth learning for the structure and adaptability it provides to your project.</p>\r\n\r\n<p>And Autotools is not just for code, either. Autotools can be used to build <a href=\"https://opensource.com/article/17/9/docbook\">Docbook</a> projects, to keep media organized (I use Autotools for my music releases), documentation projects, and anything else that could benefit from customizable install targets.</p>\r\n',78,25,0,'CC-BY-SA','autotools,build,make',0,0,1),
