(2762,'2019-03-05','What You Really Are',996,'Lostnbronx looks back at his early gaming days.','<p>I got into Dungeons &amp; Dragons back in the 1970s. This is my memory of that time and that gaming group, and especially, of the guy who taught me how to play.</p>',107,95,0,'CC-BY-SA','gaming, D&D, lostnbronx',0,0,1),
(2763,'2019-03-06','Deepgeek explains SPF records',849,'Confused about SPF? Klaatu was. Here\'s Deepgeek\'s explanation.','<p>\r\nKlaatu reads a <a href=\"https://gopher.info-underground.net:70/scottphlog/9997-SPF-Intro.txt\" target=\"_blog\">phlog &#40;gopher&#41; post</a> by Deepgeek explaining the practical uses of SPF records.\r\n</p>',78,99,0,'CC-BY-SA','email,spf,mx,postfix,smtp',0,0,1),
(2770,'2019-03-15','Navigating the maze of RPG books',1873,'There are so many kinds of RPG books out there, where do you start? Klaatu tells all!','<p>\r\nTaxonomy of RPG-related books:\r\n</p>\r\n\r\n<ol>\r\n<li><p>\r\nRulebooks tell you how to play the game.\r\n</p></li>\r\n<li><p>\r\nOptional books of rules add modular components to the base game. They add nuance to specific actions (for example, a book might add rules on owning and managing a castle in a fantasy world, or it might add rules on hacking in a sci fi game; these are things you can do without rules in the game, but if you want added stakes, then these books are ones you would want to obtain).\r\n</p></li>\r\n<li><p>\r\nAdventures (formerly called \"modules\") provide game plots and locations, in the event that you have no interest in designing your own.\r\n</p></li>\r\n<li><p>\r\nSource books or \"settings\" provide additional information on the setting of a game, sometimes even providing an alternate game universe with additional rules.\r\n</p></li>\r\n<li><p>\r\nExtra media, like novels, comics, movies, and video games, provide more information (sometimes in canon, sometimes not) about the game universe in which you are playing. Rarely do these have impact on the rules of the game, but they may provide a common language and shared experience for the players.\r\n</p></li>\r\n</ol>\r\n\r\n<p>\r\nThe only essential purchase is the rulebook. Everything else can be generated by gamers. Purchasing additional material is optional, and can either be seen as a great way to support a company providing your entertainment, or as an insidious plot by greedy corporations to rope you into a perpetual cycle of capitalism.  However, RPG is a pretty healthy (and often open) system, so free and open content abounds.\r\n</p>\r\n\r\n\r\n',78,95,0,'CC-BY-SA','book,rpg,game',0,0,1),
(2782,'2019-04-02','Never stop gaming',1277,'Ways to feed the gaming impulse, even when you can\'t game','<p>\r\nShownotes are on <a href=\"https://mixedsignals.ml/games/blog/blog/blog_lifestyle-gamer\" target=\"_blank\">mixedsignals.ml</a>\r\n</p>',78,95,0,'CC-BY-SA','rpg,dm,gm,game master,dungeon master,dnd',0,0,1),
(2795,'2019-04-19','Dead Earth',2210,'A review of a 20-year old, GNU Free Documentation Licensed, RPG about post-apocalyptic turmoil','<p>\r\nFull shownotes are on <a href=\"https://mixedsignals.ml/games/blog/blog/blog_dead-earth\" target=\"_blank\">mixedsignals.ml</a>\r\n</p>\r\n\r\n<p>\r\nYou can download Klaatu\'s update revision of the game materials here: <a href=\"https://mixedsignals.ml/download/deadearth-bundle-gfdl.7z\">https://mixedsignals.ml/download/deadearth-bundle-gfdl.7z</a>\r\n</p>',78,95,0,'CC-BY-SA','RPG,Tabletop Game,Dead Earth',0,0,1),
(2768,'2019-03-13','Writing Web Game in Haskell - Planetary statuses',1122,'Tuula describes system for recording planetary statuses in their game','<h2 id=\"intro\">Intro</h2>\r\n<p>In episode hpr2748 Writing Web Game in Haskell - Special events, I talked about how to add special events in the game. One drawback with the system presented there was that the kragii worms might attack planet that already had kragii worms present. This time we’ll look into how to prevent this. As a nice bonus, we also come up with system that can be used to record when a planet has particularly good harvest season.</p>\r\n<h2 id=\"data-types-and-database\">Data types and Database</h2>\r\n<p>We need a way to represent different kinds of statuses that a planet might have. These will include things like on going kragii attack or a particularly good harvest season. And since these are will be stored in database, we are also going to use derivePersistField to generate code needed for that.</p>\r\n<pre><code>data PlanetaryStatus =\r\n    GoodHarvest\r\n    | PoorHarvest\r\n    | GoodMechanicals\r\n    | PoorMechanicals\r\n    | GoodChemicals\r\n    | PoorChemicals\r\n    | KragiiAttack\r\n\r\nderivePersistField &quot;PlanetaryStatus&quot;</code></pre>\r\n<p>We could have recorded statuses as strings, but declaring a separate data type means that compiler can catch typos for us. It also makes code easier to read as <code>PlanetaryStatus</code> is much more informative than <code>String</code> or <code>Text</code>.</p>\r\n<p>For database, we use following definition shown below in models file. It creates database table <code>planet_status</code> and respective Haskell data type <code>PlanetStatus</code>. There will be one row in database for each status that a planet has. I could have stored all statuses in a list and store that in database, effectively having one row for any planet. Now there’s one row for any planet + status combination. Choice wasn’t really based on any deep analysis, but merely a gut feeling that this feels like a good idea.</p>\r\n<pre><code>PlanetStatus json\r\n    planetId PlanetId\r\n    status PlanetaryStatus\r\n    expiration Int Maybe\r\n    deriving Show Read Eq</code></pre>\r\n<p><code>expiration</code> column doesn’t have <code>NOT NULL</code> constraint like all other columns in the table. This is reflected in <code>PlanetStatus</code> record where data type of <code>planetStatusExpiration</code> is <code>Maybe Int</code> instead of <code>Int</code>. So some statuses will have expiration time, while others might not. I originally chose to represent time as <code>Int</code> instead of own data type, but I have been recently wondering if that was really a good decision.</p>\r\n<h2 id=\"kragii-attack-redux\">Kragii attack, redux</h2>\r\n<p>Code that does actual database query looks pretty scary on a first glance and it’s rather long. First part of the code is there to query database and join several tables into the query. Second part of the code deals with counting and grouping data and eventually returning <code>[Entity Planet]</code> data that contains all planets that match the criteria.</p>\r\n<pre><code>-- | Load planets that are kragii attack candidates\r\nkragiiTargetPlanets :: (MonadIO m, BackendCompatible SqlBackend backend\r\n                           , PersistQueryRead backend, PersistUniqueRead backend) =&gt;\r\n                           Int -&gt; Int -&gt; Key Faction -&gt; ReaderT backend m [Entity Planet]\r\nkragiiTargetPlanets pop farms fId = do\r\n    planets &lt;- E.select $\r\n        E.from $ (planet `E.LeftOuterJoin` population `E.LeftOuterJoin` building `E.LeftOuterJoin` status) -&gt; do\r\n            E.on (status E.?. PlanetStatusPlanetId E.==. E.just (planet E.^. PlanetId)\r\n                  E.&amp;&amp;. status E.?. PlanetStatusStatus E.==. E.val (Just KragiiAttack))\r\n            E.on (building E.?. BuildingPlanetId E.==. E.just (planet E.^. PlanetId))\r\n            E.on (population E.?. PlanetPopulationPlanetId E.==. E.just (planet E.^. PlanetId))\r\n            E.where_ (planet E.^. PlanetOwnerId E.==. E.val (Just fId)\r\n                      E.&amp;&amp;. building E.?. BuildingType E.==. E.val (Just Farm)\r\n                      E.&amp;&amp;. E.isNothing (status E.?. PlanetStatusStatus))\r\n            E.orderBy [ E.asc (planet E.^. PlanetId) ]\r\n            return (planet, population, building)\r\n    let grouped = groupBy ((a, _, _) (b, _, _) -&gt; entityKey a == entityKey b) planets\r\n    let counted = catMaybes $ fmap farmAndPopCount grouped\r\n    let filtered = filter ((_, p, f) -&gt;\r\n                                p &gt;= pop\r\n                                || f &gt;= farms) counted\r\n    let mapped = fmap ((ent, _, _) -&gt; ent) filtered\r\n    return mapped</code></pre>\r\n<p>In any case, when we’re querying for possible kragii attack candidates, the query selects all planets that are owned by a given faction and have population of at least 10 (left outer join to <code>planet_population</code> table), have at least 5 farming complex (left outer join to <code>building</code> table) and don’t have on going kragii attack (left outer join to <code>planet_status</code> table). This is encapsulated in <code>kragiiTargetPlanets 10 5</code> function in the <code>kragiiAttack</code> function shown below.</p>\r\n<p>Rest of the code deals with selecting a random planet from candidates, inserting a new <code>planet_status</code> row to record that kragii are attacking the planet and creating special event so player is informed about the situation and can react accordingly.</p>\r\n<pre><code>kragiiAttack date faction = do\r\n    planets &lt;- kragiiTargetPlanets 10 5 $ entityKey faction\r\n    if length planets == 0\r\n        then return Nothing\r\n        else do\r\n            n &lt;- liftIO $ randomRIO (0, length planets - 1)\r\n            let planet = maybeGet n planets\r\n            let statusRec = PlanetStatus &lt;$&gt; fmap entityKey planet\r\n                                         &lt;*&gt; Just KragiiAttack\r\n                                         &lt;*&gt; Just Nothing\r\n            _ &lt;- mapM insert statusRec\r\n            starSystem &lt;- mapM (getEntity . planetStarSystemId . entityVal) planet\r\n            let event = join $ kragiiWormsEvent &lt;$&gt; planet &lt;*&gt; join starSystem &lt;*&gt; Just date\r\n            mapM insert event</code></pre>\r\n<p>Second piece to the puzzle is status removal. In can happen manually or automatically when the prerecorded date has passed. Former method is useful for special events and latter for kind of seasonal things (good harvest for example).</p>\r\n<p>For example, in case of removing kragii attack status, code below serves as an example. The interesting part is <code>deleteWhere</code> that does actual database activity and removes all <code>KragiiAttack</code> statuses from given planet.</p>\r\n<pre><code>removeNews event odds = MaybeT $ do\r\n    res &lt;- liftIO $ roll odds\r\n    case res of\r\n        Success -&gt; do\r\n            _ &lt;- lift $ deleteWhere [ PlanetStatusPlanetId ==. kragiiWormsPlanetId event\r\n                                    , PlanetStatusStatus ==. KragiiAttack\r\n                                    ]\r\n            _ &lt;- tell [ WormsRemoved ]\r\n            return $ Just RemoveOriginalEvent\r\n        Failure -&gt; do\r\n            _ &lt;- tell [ WormsStillPresent ]\r\n    return $ Just KeepOriginalEvent</code></pre>\r\n<p>Removal of expired statuses is done based on the date, by using <code>&lt;=.</code> operator to compare <code>expiration</code> column to given date.</p>\r\n<pre><code>_ &lt;- deleteWhere [ PlanetStatusExpiration &lt;=. Just date]</code></pre>\r\n<h2 id=\"other-uses-and-further-plans\">Other uses and further plans</h2>\r\n<p>Like mentioned before, planet statuses can be used for variety of things. One such application is recording particularly good (or poor) harvest season. When such thing occurs, new <code>planet_status</code> record is inserted into database with <code>expiration</code> to set some suitable point in future. System will then automatically remove the status after that date is reached.</p>\r\n<p>In the meantime, every time food production is calculated, we have to check for possible statuses that might affect it and take them into account (as form of small bonus or malus).</p>\r\n<p>While this system is for planet statuses only, similar systems can be build for other uses (like statuses that affect a single ship or whole star system).</p>\r\n<p>Easiest way to catch me nowadays is either via email or on fediverse where I’m Tuula@mastodon.social</p>\r\n',364,107,0,'CC-BY-SA','haskell',0,0,1),
(2764,'2019-03-07','Personal password algorithms',2444,'Is it possible to generate a unique password for every site? Klaatu tries.','<p>\r\nHere is a bash script to generate an org-mode word list matrix.\r\nIt requires at least one file ending in <code>.list</code> to be used as a source of words or strings.\r\n</p>\r\n\r\n<pre><code>\r\n#!/bin/bash\r\n\r\nif [ -z $1 ]; then\r\n    DEST=matrix.org\r\nelse\r\n    DEST=$1\r\nfi\r\n\r\ncat &gt;&gt; \"${DEST}\" &lt;&lt;EOF\r\n| | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | ? |\r\n|-+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\r\nEOF\r\n\r\nVERT=(a b c d e f g h i j k l m n o p q r s t u v w x y z ?)\r\n\r\ncat *list &gt; tmp || exit\r\n\r\nBIG=`wc -l tmp | cut -f1 -d\' \'`\r\n\r\nc=\"0\"\r\n\r\nwhile [ \"$c\" -lt \"27\" ]; do\r\n    # horizontal row across\r\n    n=\"0\"\r\n    v=`echo ${VERT[$c]}`\r\n    printf \"| $v |\" &gt;&gt; \"${DEST}\"\r\n    while [ \"$n\" -lt \"27\" ]; do\r\n	i=`echo $((1 + RANDOM % $BIG))`\r\n	w=`awk \"FNR==$i\" tmp`\r\n	#reduce chance of empty cell\r\n	if [[ -z $w ]]; then\r\n	    i=`echo $((1 + RANDOM % $BIG))`\r\n	    w=`awk \"FNR==$i\" tmp`\r\n	    echo \"blank cell found\"\r\n	fi\r\n	printf \"$w | \" &gt;&gt; \"${DEST}\"\r\n	n=$[$n+1]\r\n    done\r\n    echo \" \" &gt;&gt; \"${DEST}\"\r\n    c=$[$c+1]\r\ndone\r\n\r\n/usr/bin/rm tmp\r\n</code></pre>\r\n\r\n<p>\r\nWhen you open the resulting file (matrix.org by default) in emacs, use the fill-paragraph (m-x fill-paragraph) function to align the cells into a pretty table.\r\n</p>\r\n\r\n<p>\r\nInvent your own key, and generate some test passwords.\r\nDo this 6 or 8 times, and then try to reverse the key using the passwords and the table.\r\nIf the logic to reverse the key is too simple, then try using values relying on the metadata, rather than data, of the table (for instance, the number of letters in the first word in the table starting with the same letter as the site name, or whatever).\r\n</p>\r\n\r\n<p>\r\nDo you have analogue methods of generating passwords?\r\nPost ideas to either the comments or, better yet, as an HPR episode!\r\n</p>\r\n\r\n<p>\r\n    Here is a word list for testing:<br/>\r\n    <a href=\"https://hackerpublicradio.org/eps/hpr2764/hpr2764/hpr2764_wordlist.html\">https://hackerpublicradio.org/eps/hpr2764/hpr2764/hpr2764_wordlist.html</a>\r\n</p>\r\n',78,99,0,'CC-BY-SA','password,security,algorithm,puzzle,cipher',0,0,1),
(2766,'2019-03-11','Disk enumeration on Linux',1443,'Klaatu reviews the various commands used to enumerate drives on Linux','<p>\r\nThe old way:\r\n</p>\r\n\r\n<pre><code>\r\n$ ls /dev/sd*\r\n</code></pre>\r\n\r\n<p>\r\nAnother old way:\r\n</p>\r\n\r\n<pre><code>\r\n$ fdisk --list\r\n</code></pre>\r\n\r\n<p>\r\nAn old way to see what you just plugged in:\r\n</p>\r\n\r\n<pre><code>\r\n$ sudo dmesg | tail\r\n</code></pre>\r\n\r\n<p>\r\nSome new tricks:\r\n</p>\r\n<pre><code>\r\n$ lsblk\r\nNAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT\r\nsda      8:0    0   2.7T  0 disk \r\n├─sda1   8:1    0  23.3G  0 part \r\n└─sda2   8:2    0   2.7T  0 part \r\nsdb      8:16   0   3.9G  0 disk \r\nsdc      8:32   0 111.8G  0 disk \r\n├─sdc1   8:33   0   100M  0 part /boot/efi\r\n└─sdc2   8:34   0 111.7G  0 part /\r\nsdd      8:48   0   1.8T  0 disk \r\n├─sdd1   8:49   0   120G  0 part /var\r\n├─sdd2   8:50   0   120G  0 part /tmp\r\n├─sdd3   8:51   0    60G  0 part /opt\r\n└─sdd4   8:52   0   1.5T  0 part /home\r\nsde      8:64   0 298.1G  0 disk \r\n├─sde1   8:65   0   500M  0 part \r\n├─sde2   8:66   0 296.8G  0 part \r\n└─sde3   8:67   0   826M  0 part \r\nsdf      8:80   0 931.5G  0 disk \r\n└─sdf1   8:81   0 931.5G  0 part \r\nsdg      8:96   1   7.5G  0 disk \r\n└─sdg1   8:97   1   7.5G  0 part \r\n</code></pre>\r\n\r\n<p>\r\nUser-friendly udisks:\r\n</p>\r\n\r\n<pre><code>\r\n$ udisks --monitor /dev\r\nCtrl-c\r\n$ udisk --enumerate | sort\r\n/org/freedesktop/UDisks/devices/sda\r\n/org/freedesktop/UDisks/devices/sda1\r\n/org/freedesktop/UDisks/devices/sda2\r\n/org/freedesktop/UDisks/devices/sdb\r\n/org/freedesktop/UDisks/devices/sdc\r\n/org/freedesktop/UDisks/devices/sdc1\r\n[...]\r\n$ udisks --mount /dev/sdc1\r\nMounted /dev/sdc1 on /media/mythumbdrive\r\n$ udisks --unmount /dev/sdc1\r\n</code></pre>\r\n',78,0,0,'CC-BY-SA','fdisk,dmesg,lsblk,udisks',0,0,1),
(2767,'2019-03-12','Djvu and other paperless document formats',1935,'A tutorial on how to read and generate djvu files','<p>\r\nDjVu is a digital document format with advanced compression technology. \r\nDjVu allows for the distribution of very high resolution images of scanned documents, digital documents, and photographs. \r\nDjVu viewers are available for the <a href=\"https://github.com/RussCoder/djvujs\" target=\"_blank\">web browser</a> (search for djvujs in Firefox for an extension), the desktop ( <a href=\"https://wiki.gnome.org/Apps/Evince\" target=\"_blank\">Evince</a>,  <a href=\"https://okular.kde.org/\" target=\"_blank\">Okular</a> an BSD/Linux, and <a href=\"https://djvu.sourceforge.net/djview4.html\" target=\"_blank\">djview</a> on BSD/Linux/Windows/Mac), and <a href=\"https://f-droid.org/en/packages/org.sufficientlysecure.viewer/\" target=\"_blank\">mobile</a> devices.\r\n</p>\r\n\r\n<p>\r\nThe toolchain for encoding and decoding DjVu is \r\n<a href=\"https://djvu.sourceforge.net/\" target=\"_blank\">djvulibre</a>\r\n</p>\r\n<p>\r\n<a href=\"https://djvu.js.org/\" target=\"_blank\">djvu.js</a> is a Javascript library useful for online viewing.\r\n</p>\r\n\r\n<p>\r\n<a href=\"https://djvu.org/\" target=\"_blank\">djvu.org</a> contains sample documents and specification documents.</p>\r\n\r\n<h2>Creating a djvu file</h2>\r\n\r\n<p>\r\nThe tool you use to convert something to the .djvu format depends on your requirements. If you\'re converting a basic, black-and-white document, then <code>cjb2</code> (part of the djvulibre distribution) works:\r\n</p>\r\n\r\n<pre><code>\r\n$ cjb2 -dpi 300 foo.tiff\r\n$ ls\r\nfoo.tiff\r\nfoo.djvu\r\n</code></pre>\r\n\r\n<p>\r\nIf you want to convert something more complex, then use <code>c44</code> (also a part of the djvulibre distribution):\r\n</p>\r\n\r\n<pre><code>\r\n$ c44 -dpi 300 bar.jpg bar.djvu\r\n$ ls\r\nbar.jpg\r\nbar.djvu\r\n</code></pre>\r\n\r\n<p>\r\nTo put both of these files in a single DjVu container:\r\n</p>\r\n\r\n<pre><code>\r\n$ djvm -c baz.djvu foo.djvu bar.djvu\r\n$ ls\r\nbar.djvu\r\nbaz.djvu\r\nfoo.djvu\r\n</code></pre>\r\n\r\n<p>\r\nYou can add bookmarks, too.\r\nOpen a text file called <code>book.marks</code> (or any name you prefer) and enter:\r\n<p/>\r\n\r\n<pre><code>\r\n(bookmarks\r\n(\"Foo\" \"#1\")\r\n(\"Bar\" \"#2\")\r\n)\r\n</code></pre>\r\n\r\n<p>\r\nAnd then apply it to your DjVu file:\r\n</p>\r\n\r\n<pre><code>\r\n$ djvused -e \'set-outline book.marks\' -s baz.djvu\r\n</code></pre>\r\n\r\n<p>\r\nThere\'s more you can do with DjVu, but this has been an overview of how I use it.\r\n</p>\r\n',78,0,0,'CC-BY-SA','pdf, ebook, bloat, djvu',0,0,1),
(2773,'2019-03-20','Lead/Acid Battery Maintenance and Calcium Charge Voltage',1869,'Discussion on installing new Calcium battery into older vehicle and resulting maintenance issues.','<p>Although Lead/Acid batteries are old tech, the use of Calcium as an alloy metal has been a more modern development. Unfortunately many people do not realize this causes an incompatibility with older vehicles due to charging voltage. This episode discusses the use of smart chargers for long term battery maintenance.</p>',373,0,0,'CC-BY-SA','automotive, battery, maintenance, charger',0,0,1),
(2769,'2019-03-14','Quick Review of the AstroAI WH5000A Multimeter',1455,'NYbill reviews, yet another, inexpensive multimeter.','<p>NYbill does <b>yet another</b> inexpensive multimeter review. This time the AstroAI WH5000A. (Its time for a multimeter intervention!)</p>\r\n<p>The meter:</p>\r\n<ul>\r\n<li><a href=\"https://www.astroai.com/portfolio-items/astroai-digital-multimeter-trms-6000-counts-multimeters/\" class=\"uri\">https://www.astroai.com/portfolio-items/astroai-digital-multimeter-trms-6000-counts-multimeters/</a></li>\r\n</ul>\r\n<p>Pics for the episode:</p>\r\n<ul>\r\n<li><a href=\"https://media.gunmonkeynet.net/u/nybill/collection/astroai-wh5000a-dmm/\" class=\"uri\">https://media.gunmonkeynet.net/u/nybill/collection/astroai-wh5000a-dmm/</a></li>\r\n</ul>',235,0,0,'CC-BY-SA','multimeter, electronics, test equipment, hardware review',0,0,1),
(2771,'2019-03-18','Embedding hidden text in Djvu files',2476,'Part 2 of Klaatu\'s Djvu mini series','<p>\r\nTo embed text into a Djvu file, you must create a <code>djvused</code> script detailing the page and bitmap location of one of: character, word, line, paragraph, or region.\r\n</p>\r\n\r\n<p>\r\nFor good measure, you should first list the contents of your Djvu bundle:\r\n</p>\r\n\r\n<pre><code>$ djvused -e \'select; ls\' test.djvu\r\n   1 P   177062  p0001.djvu\r\n   2 P   199144  p0002.djvu\r\n   3 P    12323  p0003.djvu\r\n   4 P    57059  p0004.djvu\r\n   5 P    96725  p0005.djvu\r\n   6 P    53868  p0006.djvu\r\n</code></pre>\r\n\r\n<p>\r\nThen define the location of text in a file called, for instance, <code>content.dsed</code>. Assume that my page is 1000 px by 1000 px&#58;\r\n</p>\r\n\r\n<pre><code>select; remove-ant; remove-txt\r\n\r\nselect \"p0004.djvu\" # page 4\r\nset-txt\r\n(page 0 0 1000 1000\r\n (word 100 600 450 800 \"Hello\" )\r\n (word 100 600 450 800 \"world\" ))\r\n\r\n.\r\n\r\nselect \"p0005.djvu\"\r\nset-txt\r\n(page 0 0 1000 1000\r\n (line 100 400 900 600 \"Hacker Puppy Radio\"))\r\n</code></pre>\r\n\r\n<p>\r\nApply this script to your Djvu file with <code>dvjused</code>&#58;\r\n</p>\r\n\r\n<pre><code>djvused -f ./content.dsed -s test.djvu\r\n</code></pre>\r\n\r\n<h2>Converting from PDF to Djvu</h2>\r\n\r\n<p>\r\nYou can convert PDF files to Djvu with the <code>djvudigital</code> command. Due to license incompatibility, it does require you to compile a Ghostscript plugin, but it\'s an easy build. Get the <a href=\"https://sourceforge.net/projects/djvu/files/GSDjVu/1.10\" target=\"_blank\">gsdjvu</a> code, and then follow its README instructions.\r\n</p>\r\n\r\n<p>\r\nOnce you\'ve built the Ghostscript driver, you can convert PDF to Djvu:\r\n</p>\r\n\r\n<pre><code>djvudigital --words foo.pdf foo.djvu\r\n</code></pre>\r\n',78,0,0,'CC-BY-SA','pdf, ebook, bloat, djvu',0,0,1),
(2772,'2019-03-19','My applications and software part 3',585,'A short show about the software I use in Linux Mint','<p>Hallo HPR listeners – in my recent episodes hpr2738 and hpr2746 I talked about some of the applications and software I regularly use as part of my day to day use of Linux Mint. This follow up show will continue with a few more of the same.</p>\r\n<ul>\r\n<li><p>CUPS – Common Unix Printing Software; printing in Linux with this utility is fairly well supported, if you don’t have a very recent printer it’s a good chance that CUPS will be able to find a driver for your printer if a Linux one has not been supplied when you bought it or through the manufacturers support site. In the menu just search for print and it will bring up the application for adding a new printer.</p></li>\r\n<li><p>Gparted – fully featured disc management tool for formatting and partitioning discs</p></li>\r\n<li><p>Document viewer – generic pdf viewer</p></li>\r\n<li><p>Software manager</p>\r\n<ul>\r\n<li>Synaptic package manager</li>\r\n</ul></li>\r\n<li><p>Terminal – apt command for updating the system and installing new software</p></li>\r\n<li><p>get_iplayer</p></li>\r\n</ul>\r\n',338,0,0,'CC-BY-SA','Software, applications, utilities',0,0,1),
(2774,'2019-03-21','CJDNS and Yggdrasil',629,'A summary of the things I like about CJDNS and Yggdrasil, and the places I think they could improve.','<p>This is my first time doing this sort of thing, so I’m sorry if it’s not very good.</p>\r\n<ul>\r\n<li><a href=\"https://github.com/cjdelisle/cjdns/\">https://github.com/cjdelisle/cjdns/</a></li>\r\n<li><a href=\"https://yggdrasil-network.github.io/\">https://yggdrasil-network.github.io/</a></li>\r\n</ul>',374,0,0,'CC-BY-SA','CJDNS,Yggdrasil',0,0,1),
(2776,'2019-03-25','Sub-Plots In Storytelling',1093,'Lostnbronx looks at the importance of tightly-structured subplots in storytelling.','<p>What makes for strong subplots? Why can some subplots be chopped out of a tale without harming it? Why can some be chopped out, and it actually makes the tale stronger? Is this modular approach the best way to bring in subplots, or is there another method that might be better?</p>\r\n<p>Story construction is a complicated topic; Lostnbronx tries (and largely fails) to make sense of this small part of it.</p>\r\n',107,105,0,'CC-BY-SA','stories, storytelling, sub-plots, lostnbronx',0,0,1),
(2777,'2019-03-26','The quest for the perfect laptop.',1867,'Knightwise is out looking for a new laptop and describes what he is looking for and why.','<p>Looking for a new laptop.</p>\r\n<p>Candidates</p>\r\n<ul>\r\n<li>HP Envy x360</li>\r\n<li>Lenovo X280</li>\r\n<li>Lenovo X380</li>\r\n<li>Lenovo X380 Yoga</li>\r\n<li>Lenovo X1</li>\r\n<li>Lenovo X1 Yoga</li>\r\n</ul>\r\n',111,0,0,'CC-BY-SA','computer, hardware, geek, buy',0,0,1),
(2786,'2019-04-08','My YouTube Channels',423,'A short show about some of my YouTube channels inspired by Ahuka','<p>Hallo HPR listeners this is Tony Hughes again coming from Blackpool in the UK.</p>\r\n<p>Recently Ahuka started a series on the YouTube channels that he subscribes to and this seems like a good topic to share some of my favourite YouTube channels. This time I’ll share some of the tech and Linux based channels I watch.</p>\r\n<ul>\r\n<li><p>bigclive.com – Clive strips down and tests equipment particularly cheap Chinese electronics - <a href=\"https://www.youtube.com/user/bigclivedotcom/videos\" class=\"uri\">https://www.youtube.com/user/bigclivedotcom/videos</a></p></li>\r\n<li><p>Category5 Technology TV – A general technology based show with a large focus on Linux and open source software. <a href=\"https://www.youtube.com/user/category5tv\" class=\"uri\">https://www.youtube.com/user/category5tv</a></p></li>\r\n<li><p>Explaining Computers – Exactly what it says on the tin, they review new computer hardware and computer related tech, including single board Computers such as the Raspberry Pi and Pine 64. <a href=\"https://www.youtube.com/user/explainingcomputers\" class=\"uri\">https://www.youtube.com/user/explainingcomputers</a></p></li>\r\n<li><p>DASGeek – Ryan is a fairly new person to Linux and is part of the Destination Linux podcast crew - <a href=\"https://destinationlinux.org/\" class=\"uri\">https://destinationlinux.org/</a> Ryan is an avid gamer and as well as reviewing Linux he will often look at the latest games and how well they will work on a Linux PC. <a href=\"https://www.youtube.com/channel/UCIme1suHyN7cAGrTy8RBdhQ\" class=\"uri\">https://www.youtube.com/channel/UCIme1suHyN7cAGrTy8RBdhQ</a></p></li>\r\n<li><p>Big Daddy Linux – A new video LUG which have a new episode every week at 8pm EST or you can watch a recording of the show later. <a href=\"https://www.youtube.com/channel/UCtZRKfyvx7GUEi-Lr7f4Nxg/videos\" class=\"uri\">https://www.youtube.com/channel/UCtZRKfyvx7GUEi-Lr7f4Nxg/videos</a></p></li>\r\n<li><p>Raspberry Pi – Videos from the Foundation and community contributors. <a href=\"https://www.youtube.com/channel/UCFIjVWFZ__KhtTXHDJ7vgng/videos\" class=\"uri\">https://www.youtube.com/channel/UCFIjVWFZ__KhtTXHDJ7vgng/videos</a></p></li>\r\n<li><p>Free Audacity Tutorials – Very handy for those of us that regularly record and edit audio with Audacity, for learning more about how to do various things with this software. <a href=\"https://www.youtube.com/user/FreeAudacityTutorial/videos\" class=\"uri\">https://www.youtube.com/user/FreeAudacityTutorial/videos</a></p></li>\r\n</ul>\r\n<p>And finally for this episode</p>\r\n<ul>\r\n<li>Linus Tech Tips – Another Computer review show all about tips and tricks relating to all stuff geeky. Be aware that this show is heavily sponsored although Linus does seem to be very fair with both praise and criticism for what he is reviewing. <a href=\"https://www.youtube.com/user/LinusTechTips/videos\" class=\"uri\">https://www.youtube.com/user/LinusTechTips/videos</a></li>\r\n</ul>\r\n',338,106,0,'CC-BY-SA','Linux, Computers, YouTube, Gaming, Electronics, Audacity',0,0,1),
(2778,'2019-03-27','Functor and applicative in Haskell',1841,'Brief introduction on functor and applicative patterns in Haskell and where they can be used','<p>Two common patterns that I seem to run all the time while working on my 4x space game are functor and applicative. This episode explains them briefly.</p>\r\n<h2 id=\"functor\">Functor</h2>\r\n<p>Functor is a way to apply function over a structure we don’t want to alter. Type of the structure stays same, but values inside of it can change. One of the most common one is list, but there are many others.</p>\r\n<p>Functor type class is defined below. There’s one function <code>fmap</code> that takes two parameters: a function from <code>a</code> to <code>b</code> and structure <code>f a</code>. Result will be structure <code>f b</code>.</p>\r\n<pre><code>class Functor f where\r\n    fmap :: (a -&gt; b) -&gt; f a -&gt; f b</code></pre>\r\n<p>This is fairly abstract, so couple example might help. First we define a little helper function that raises it’s argument to 2nd power (in the episode I talk about doubling the value, my mistake there).</p>\r\n<pre><code>-- | this really raises x to 2nd power and doesn&#39;t double it\r\ndouble x = x * x</code></pre>\r\n<p>Given a list of <code>Int</code> we can raise them to power of two by using <code>fmap</code>:</p>\r\n<pre><code>&gt; fmap double [1, 2, 3, 4, 5]\r\n[1, 4, 9, 16, 25]</code></pre>\r\n<p>Since function being applied to structure is type of <code>(a -&gt; b)</code>, we can change type of the value inside of the structure. Below is example of turning list of <code>Int</code> to list of <code>Text</code>.</p>\r\n<pre><code>&gt; fmap show [1, 2, 3, 4, 5]\r\n[&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;]</code></pre>\r\n<p>This pattern isn’t limited to list and there are many others. You can even define your own ones, if you’re so inclined. The pattern stays the same. One function, <code>fmap</code>, that takes function of type <code>(a -&gt; b)</code> and structure <code>f a</code> and turns it into structure of <code>f b</code>. Details how this is actually done depend on the specific functor.</p>\r\n<p>Other common functor is <code>Maybe</code> that is often used in cases where data might or might not be present. <code>Maybe a</code> has two possible values <code>Just a</code> indicating that value <code>a</code> is present and <code>Nothing</code> indicating that there is no value present. When <code>fmap</code> is used in this context, <code>Just a</code> will turn to <code>Just b</code> and <code>Nothing</code> will stay as <code>Nothing</code>.</p>\r\n<pre><code>&gt; fmap (x -&gt; x * x) $ Just 2\r\nJust 4\r\n&gt; fmap (x -&gt; x * x) Nothing\r\nNothing</code></pre>\r\n<p><code>Either a b</code> is sometimes used for value that can be correct or an error. It has two value constructors <code>Right b</code> indicates that value is correct, <code>Left a</code> indicates an error case. <code>a</code> and <code>b</code> don’t have to be of same type (and usually aren’t). For example, if we have <code>Either Text Int</code>, then we have value where error case is <code>Text</code> and correct value is <code>Int</code>.</p>\r\n<pre><code>&gt; fmap double $ Right 5\r\nRight 25\r\n&gt; fmap double $ Left &quot;distance calculation failed because of flux-capacitor malfunction&quot;\r\nLeft &quot;distance calculation failed because of flux-capacitor malfunction&quot;</code></pre>\r\n<p>Functors can be placed inside of functors. The only difference is that you have to reach through multiple layers. Simplest way of doing that is to compose multiple <code>fmap</code> functions together like in the example below. Pay attention to in which order nested functors are defined as <code>Maybe [Int]</code> and <code>[Maybe Int]</code> are different things. Former is for case where list of <code>Int</code> might or might not be present. Latter is for case where there’s always list, but single element inside of the list might or might not be present.</p>\r\n<pre><code>&gt; (fmap . fmap) double (Just [1, 2, 3, 4])\r\nJust [1, 4, 9, 16]\r\n&gt; (fmap . fmap) double Nothing :: Maybe Int\r\nNothing\r\n&gt; (fmap . fmap) double [Just 1, Just 2, Nothing, Just 3]\r\n[Just 1, Just 4, Nothing, Just 9]</code></pre>\r\n<p>There’s also infix operator, that does exactly same thing as <code>fmap</code>, called <code>&lt;$&gt;</code>. The choice which one to use is often either personal or depends on the surrounding code (because Haskell doesn’t use parenthesis in function application, so sometimes it’s easier to use <code>fmap</code> and sometimes <code>&lt;$&gt;</code>).</p>\r\n<pre><code>&gt; fmap show [1, 2, 3, 4, 5]\r\n[&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;]\r\n\r\n&gt; show &lt;$&gt; [1, 2, 3, 4, 5]\r\n[&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;]</code></pre>\r\n<p>There are many more functors, one place to check them is: <a href=\"https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor.html\" class=\"uri\">https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor.html</a></p>\r\n<h2 id=\"applicative\">Applicative</h2>\r\n<p>While functor works fine when function applied has only one parameter, we need applicative in cases of multiparameter functions. Calling <code>fmap (+) [1, 2]</code> will produce list of functions waiting for second parameter. While it would be possible to handle these cases manually, we like to abstract it to more general solution.</p>\r\n<pre><code>class Functor f =&gt; Applicative f where\r\n    pure :: a -&gt; f a\r\n    (&lt;*&gt;) :: f (a -&gt; b) -&gt; f a -&gt; f b</code></pre>\r\n<p>Applicative is similar to functor. The big difference is that function being applied is now embedded inside of same type of structure. While functor has <code>(a -&gt; b)</code>, applicative has <code>f (a -&gt; b)</code>.</p>\r\n<p>Below is an example of using list applicative to calculate all possible ways of summing two lists of <code>Int</code>.</p>\r\n<pre><code>&gt; (+) &lt;$&gt; [1, 2, 3] &lt;*&gt; [4, 5, 6]\r\n[5,6,7,6,7,8,7,8,9]</code></pre>\r\n<p><code>Maybe Int</code> works with the same pattern. First we use <code>&lt;$&gt;</code> to get started, this results <code>Maybe</code> containing a function that is waiting for second parameter. Then we use <code>&lt;*&gt;</code> to apply the second parameter so we get the result.</p>\r\n<pre><code>&gt; (+) &lt;$&gt; Just 2 &lt;*&gt; Just 5\r\nJust 7\r\n&gt; (+) &lt;$&gt; Just 2 &lt;*&gt; Nothing\r\nNothing</code></pre>\r\n<p>As long as there’s only <code>Just a</code> in play, result is <code>Just</code>, but as soon as there’s even single <code>Nothing</code> the end result will be nothing.</p>\r\n<p>If you have questions or comments, I would be delighted to hear about them. You can catch me on fediverse, where I’m <code>Tuula@mastodon.social</code>. Even better, you could record your own HPR episode.</p>\r\n<p>Ad astra!</p>\r\n',364,107,0,'CC-BY-SA','haskell, functor, applicative',0,0,1),
(2779,'2019-03-28','HTTP, IPFS, and torrents',711,'Replacing the web with new, decentralized protocols','<p>Some ramblings about how we might replace HTTP with more robust, decentralized protocols.</p>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/InterPlanetary_File_System\">https://en.wikipedia.org/wiki/InterPlanetary_File_System</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol\">https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol</a></li>\r\n</ul>',374,0,0,'CC-BY-SA','HTTP, IPFS, torrents',0,0,1),
(2780,'2019-03-29','My SBC Nextcloud Install Pt. 1 - Hardware',1375,'How I built my self-enclosed Nextcloud server using a single board computer and a RAID enclosure','<p>I explain the build process for my home Nextcloud server using a single board computer and a 4 bay RAID enclosure. This is part 1 of a 3 part series.</p>\r\n<p>My parts list for the server build:</p>\r\n<ul>\r\n<li><p>Rockpro64<br />\r\n<a href=\"https://www.pine64.org/?product=rockpro64-4gb-single-board-computer\" class=\"uri\">https://www.pine64.org/?product=rockpro64-4gb-single-board-computer</a></p></li>\r\n<li><p>eMMC module<br />\r\n<a href=\"https://www.pine64.org/?product=16gb-emmc\" class=\"uri\">https://www.pine64.org/?product=16gb-emmc</a></p></li>\r\n<li><p>USB Adapter for eMMC module<br />\r\n<a href=\"https://www.pine64.org/?product=usb-adapter-for-emmc-module\" class=\"uri\">https://www.pine64.org/?product=usb-adapter-for-emmc-module</a></p></li>\r\n<li><p>Power supply<br />\r\n<a href=\"https://www.pine64.org/?product=rockpro64-12v-5a-us-power-supply\" class=\"uri\">https://www.pine64.org/?product=rockpro64-12v-5a-us-power-supply</a></p></li>\r\n<li><p>Heatsink<br />\r\n<a href=\"https://www.pine64.org/?product=rockpro64-20mm-mid-profile-heatsink\" class=\"uri\">https://www.pine64.org/?product=rockpro64-20mm-mid-profile-heatsink</a></p></li>\r\n<li><p>90˚ male to female USB extension<br />\r\n<a href=\"https://www.amazon.com/wawpi-Cable-Extension-Degree-Female/dp/B01EDOGO4E\" class=\"uri\">https://www.amazon.com/wawpi-Cable-Extension-Degree-Female/dp/B01EDOGO4E</a></p></li>\r\n<li><p>4 bay RAID enclosure<br />\r\n<a href=\"https://www.mediasonic.ca/product.php?id=1358153144\" class=\"uri\">https://www.mediasonic.ca/product.php?id=1358153144</a></p></li>\r\n<li><p>HDDs<br />\r\nThe 4TB HDDs were ones I already had but you can use any ones, just make sure they are the same brand/model/size/etc to minimize any complications.</p></li>\r\n</ul>\r\n<p>minnix at uymail dot com for help, questions, or just general chatter</p>\r\n',375,0,0,'CC-BY-SA','nextcloud,single board computer,home server,sbc,arm',0,0,1),
(2783,'2019-04-03','The Windows \"Shutdown.exe\" Command Explained',923,'A rundown of the Windows \"shutdown.exe\" command.','<h3>Shutdown.exe</h3>\r\n<ul>\r\n<li>Introduced in Windows 2000 as a way to shutdown the PC via the command prompt.</li>\r\n<li>Included in all versions since Windows 2000 all the way to Windows 10 and Windows Server 2019.</li>\r\n<li>ReactOS, the open source binary-compatible clone of Windows, also includes the shutdown.exe command and the commands are the same.</li>\r\n<li>Located in %windir%\\System32. The variable %windir% is usually c:\\windows. In ReactOS, the variable is usually c:\\reactos (failed to mention this in the recording).\r\n</li>\r\n</ul>\r\n<p>Links: </p>\r\n<ul>\r\n<li><a href=\"https://ipfs.io/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Shutdown.exe.html\">https://ipfs.io/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Shutdown.exe.html</a></li>\r\n<li><a href=\"https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/shutdown\">https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/shutdown</a></li>\r\n<li><a href=\"https://ss64.com/nt/shutdown.html\">https://ss64.com/nt/shutdown.html</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Shutdown_(computing)#Windows_and_ReactOS\">https://en.wikipedia.org/wiki/Shutdown_(computing)#Windows_and_ReactOS</a></li>\r\n</li>\r\n</ul>\r\n',152,0,0,'CC-BY-SA','shutdown, windows, commandprompt, cmd',0,0,1),
(2805,'2019-05-03','My 50th Show',1064,'This is a review of the other 49 shows I\'ve posted in the last 3 years','<p>Hallo this is again Tony Hughes for HPR. This is an auspicious show for me as it’s my 50th show that I have recorded and released on HPR in my own right. However prior to my 1st show in my own right I did guest on 2 shows.</p>\r\n<p>The first of these was:</p>\r\n<ul>\r\n<li>hpr0844 :: The Flying Handbag hosted by HPR Volunteers<br />\r\nReleased: 2011-10-26</li>\r\n</ul>\r\n<p>Which was a show that was recorded at Barcamp Blackpool in 2011, when a group of us got together to record a podcast, the hilarious thing was that the only place we could find to record was a stairwell which happened to be next to the toilets, definitely not family friendly but if you want a laugh have a listen.</p>\r\n<p>The next show I appeared on was an interview I did with Ken Fallon at my first OggCamp in the same year.</p>\r\n<ul>\r\n<li>hpr0863 :: Tony Hughes Free Cycle hosted by Ken Fallon<br />\r\nReleased: 2011-11-22.</li>\r\n</ul>\r\n<p>Ken was as usual trying to recruit new hosts and interviewed me with the hope that I would become one. Well I did but it took another 5 years before I finally recorded my first show in my own right.</p>\r\n<p>First just to say the idea for this show comes from hpr2700 in which Ken created a script to automate the bot voice reading a list of every show that has been released on HPR, so to celebrate my 50th Show I thought I would list my shows but with me running through them and do a brief summary of the show where appropriate.</p>\r\n<ol type=\"1\">\r\n<li><p>hpr2051 :: My Linux Journey<br />\r\nReleased on 2016-06-13<br />\r\nin this episode I talked about my journey in computing and starting to use Linux</p></li>\r\n<li><p>hpr2056 :: Interview with a young hacker<br />\r\nReleased on 2016-06-20<br />\r\nThis was my first of several interviews with <span class=\"citation\" data-cites=\"All_about_Code\">@All_about_Code</span> at my local Raspberry Jam</p></li>\r\n<li><p>hpr2065 :: Whats in My Bag<br />\r\nReleased on 2016-07-01<br />\r\nLooking at this show so tells me I have to redo this show as my bag is very different these days</p></li>\r\n<li><p>hpr2076 :: What Magazines I read Part 1<br />\r\nReleased on 2016-07-18<br />\r\njust what the title said, I talked about the magazines I was reading at that point in time.</p></li>\r\n<li><p>hpr2087 :: Magazines I read Part 2<br />\r\nReleased on 2016-08-02<br />\r\nThis was a follow up of the last show</p></li>\r\n<li><p>hpr2097 :: New Toys<br />\r\nReleased on 2016-08-16<br />\r\nI talked about my hardware journey over the last 30 odd years and talked about the i7 system I had just bought 2nd hand</p></li>\r\n<li><p>hpr2101 :: What’s on my podcatcher<br />\r\nReleased on 2016-08-22<br />\r\nA show about the podcasts I listen to.</p></li>\r\n<li><p>hpr2144 :: An Interview with All About Code at Manchester BarCamp<br />\r\nReleased on 2016-10-20<br />\r\na follow up interview with Josh</p></li>\r\n<li><p>hpr2151 :: BarCamp Manchester part 2<br />\r\nReleased on 2016-10-31<br />\r\nAn interview with Claire, the organiser of BarCamp Manchester.</p></li>\r\n<li><p>hpr2157 :: BarCamp Manchester part 3<br />\r\nReleased on 2016-11-08<br />\r\nThis was an interview with Alan O’Donohoe who had started the Raspberry Jam movement</p></li>\r\n<li><p>hpr2257 :: Watt OS<br />\r\nReleased on 2017-03-28<br />\r\nAcer Aspire One Netbook – Review</p></li>\r\n<li><p>hpr2265 :: WattOS on Lenovo X61s<br />\r\nReleased on 2017<br />\r\nLenovo X61s – Review</p></li>\r\n<li><p>hpr2271 :: Raspberry Pi Zero W<br />\r\nReleased on 2017-04-17<br />\r\nReview Episode on the then New Pi Zero W</p></li>\r\n<li><p>hpr2280 :: Lenovo X61s Part 2<br />\r\nReleased on 2017-04-28<br />\r\nFollow up review after a SSD upgrade and using Linux Lite</p></li>\r\n<li><p>hpr2286 :: Surviving a Stroke<br />\r\nReleased on 2017-05-08<br />\r\nA very personal episode about my surviving a Stroke in February 2017</p></li>\r\n<li><p>hpr2295 :: MX Linux<br />\r\nReleased on 2017-05-19<br />\r\nA review episode using this OS on a Lenovo X230i after a hardware boot issue with Linux Mint and an SSD</p></li>\r\n<li><p>hpr2331 :: Liverpool Makefest 2017 Show 1<br />\r\nReleased on 2017-07-10<br />\r\nThe first of a number of interview shows from the 2017 Liverpool Makefest</p></li>\r\n<li><p>hpr2336 :: Liverpool Makefest 2017 Show 2<br />\r\nReleased on 2017-07-17</p></li>\r\n<li><p>hpr2341 :: Liverpool Makefest 2017 Show 3<br />\r\nReleased on 2017-07-24</p></li>\r\n<li><p>hpr2346 :: Liverpool Makefest 2017 Show 4<br />\r\nReleased on 2017-07-31</p></li>\r\n<li><p>hpr2352 :: Liverpool Makefest 2017 Show 5<br />\r\nReleased on 2017-08-08</p></li>\r\n<li><p>hpr2362 :: Raspbian X86 on Lenovo x61s<br />\r\nReleased on 2017-08-22<br />\r\nReview of Raspbian X86 on a Lenovo X61s</p></li>\r\n<li><p>hpr2366 :: Making Bramble Jelly<br />\r\nReleased on 2017-08-28<br />\r\nJust what it says on the tin I talk about making Bramble jelly,</p></li>\r\n<li><p>hpr2374 :: How to Make Sauerkraut<br />\r\nReleased on 2017-09-07<br />\r\nAnother food show on how to make Sauerkraut</p></li>\r\n<li><p>hpr2380 :: Raspbian X86 on P4 Tower<br />\r\nReleased on 2017-09-15<br />\r\nFollow up this time running Raspbian X86 on an old P4 Tower</p></li>\r\n<li><p>hpr2405 :: Nokia 6 Review<br />\r\nReleased on 2017-10-20<br />\r\nI reviewed my new phone</p></li>\r\n<li><p>hpr2432 :: Living with the Nokia 6 – an update to HPR 2405<br />\r\nReleased on 2017-11-28<br />\r\nFollow up update show having lived with the phone for a couple of months.</p></li>\r\n<li><p>hpr2442 :: The sound of Woodbrooke Quaker Study centre in the Spring<br />\r\nReleased on 2017-12-12<br />\r\nThis was a soundscape recording I made at Woodbrooke Quaker Study Centre in Birmingham UK while I was there in April 2017.</p></li>\r\n<li><p>hpr2579 :: Ubuntu 18.04 Mate<br />\r\nReleased on 2018-06-21<br />\r\nA review of the recently released Ubuntu 18.04 Mate</p></li>\r\n<li><p>hpr2590 :: Blowing a PC Power Supply<br />\r\nReleased on 2018-07-06<br />\r\nA show about how not to blow your PC power supply</p></li>\r\n<li><p>hpr2595 :: New laptop bargain?<br />\r\nReleased on 2018-07-13<br />\r\nA review on my recently purchased secondhand Toshiba Z30 laptop</p></li>\r\n<li><p>hpr2601 :: Liverpool Makerfest 2018<br />\r\nReleased on 2018-07-23<br />\r\nChris Dell</p></li>\r\n<li><p>hpr2606 :: Liverpool Makefest 2018 - interview with Dan Lynch<br />\r\nReleased on 2018-07-30<br />\r\nA podcast Legend</p></li>\r\n<li><p>hpr2612 :: Liverpool Makefest 2018 - interview with Joe aka Concrete Dog<br />\r\nReleased on 2018-08-07<br />\r\nAbout Rocketry</p></li>\r\n<li><p>hpr2616 :: Liverpool Makefest 2018 - interview with Josh - A.K.A - All About Code<br />\r\nReleased on 2018-08-13.<br />\r\nThis is another short interview recorded at Liverpool Makefest, with Josh talking about EduBlocks.</p></li>\r\n<li><p>hpr2621 :: Liverpool Makefest 2018 - Chan’nel Thomas a.k.a little pink maker<br />\r\nReleased on 2018-08-20<br />\r\nI talk to Chan’nel Thomas aka little pink maker.</p></li>\r\n<li><p>hpr2626 :: Liverpool Makefest 2018 - interviews with Helen and Chris<br />\r\nReleased on 2018-08-27<br />\r\nIn this episode I talk to Helen from Manchester Hackspace and Chris from Wirral Code Club</p></li>\r\n<li><p>hpr2632 :: Liverpool Makefest 2018 - interviews with Robert and Carl<br />\r\nReleased on 2018-09-04<br />\r\nIn this episode I talk to Robert from Roberts Workshop and Carl from Edgehill University</p></li>\r\n<li><p>hpr2636 :: Liverpool Makefest 2018 - interviews with Noel from JMU FabLab<br />\r\nReleased on 2018-09-10</p></li>\r\n<li><p>hpr2641 :: Liverpool Makefest 2018 - interview with Rachel from the MicroBit Foundation<br />\r\nReleased on 2018-09-17</p></li>\r\n<li><p>hpr2646 :: Liverpool Makefest 2018 - Interview with Steve and Gerrard from the Liverpool Astronomical society.<br />\r\nReleased on 2018-09-24</p></li>\r\n<li><p>hpr2652 :: Liverpool Makefest 2018 - Interview with Caroline and John<br />\r\nReleased on 2018-10-02 under a CC-BY-SA license.<br />\r\nThis was the final interview from Makefest 2018 in Liverpool. In this interview I interview one of the founder members of Makefest, Caroline Keep, and the Head Teacher of the school where she works, John Carling.</p></li>\r\n<li><p>hpr2663 :: Short review on a 2.5 inch SSD/HDD caddy<br />\r\nReleased on 2018-10-17<br />\r\nQuick hardware review</p></li>\r\n<li><p>hpr2702 :: Audacity set up and response to episode 2658<br />\r\nReleased on 2018-12-11<br />\r\nI post my response to show 2658 by Dave and Al</p></li>\r\n<li><p>hpr2735 :: Soffritto<br />\r\nReleased on 2019-01-25<br />\r\nAnother food show</p></li>\r\n<li><p>hpr2738 :: My Applications<br />\r\nReleased on 2019-01-30<br />\r\nThis and my 47th episode were about the applications I use in Linux</p></li>\r\n<li><p>hpr2746 :: My software part 2<br />\r\nReleased on 2019-02-11</p></li>\r\n<li><p>hpr2772 :: My applications and software part 3<br />\r\nA short show about the software I use in Linux Mint</p></li>\r\n<li><p>hpr2786 :: My YouTube Channels<br />\r\nA short show about some of my YouTube channels inspired by Ahuka</p></li>\r\n</ol>\r\n<p><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" class=\"uri\">https://hackerpublicradio.org/correspondents/0338.html</a></p>\r\n',338,0,0,'CC-BY-SA','HPR, Linacityux, podcasting, Audacity',0,0,1),
(2784,'2019-04-04','The Yamaha Disklavier',1440,'I talk about the Yamaha Disklavier DKC500RW that\'s in my office at work','<p>In this episode I talk about the <a href=\"https://en.wikipedia.org/wiki/Disklavier\" target=\"_blank\">Yamaha Disklavier</a> DKC500RW that\'s in my office at work. This is a very high-tech player piano and one of the coolest pieces of music gear I\'ve ever seen.</p>\r\n\r\n<h3>Photo Album (click image)</h3>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157707383776874\" title=\"Yamaha Disklavier\" target=\"_blank\"><img src=\"https://farm8.staticflickr.com/7862/33424303208_c9f831fce7.jpg\" width=\"500\" height=\"375\" alt=\"Yamaha Disklavier\"></a></p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n<li>Website showing how to determine which model disklavier you have: <a href=\"https://yamahaden.com/news/disklavier-tips/item/276-how-to-determine-your-disklavier-model/276-how-to-determine-your-disklavier-model\" target=\"_blank\">Yamahaden</a></li>\r\n<li><a href=\"https://www.kuhmann.com/Yamaha.htm\" target=\"_blank\">DisklavierTM  World</a>: This is a privately operated, Public Service (non-profit) webpage. 10,781 piano-music files in \'FIL\' (e-SEQ) & MIDI format & Software for the Yamaha Disklavier. PUBLIC-DOMAIN / \'Live\' MIDI-Performances / FREE Sequences</li>\r\n<li>Video: Jonathan Kulp, <em>Three Easy Pieces for Piano Four-Hands</em>: <a href=\"https://www.youtube.com/watch?v=y4loSIApjPA\" target=\"_blank\">Video of premiere performance</a></li>\r\n<li>Video: <a href=\"https://youtu.be/_hNzz_DubCo\" target=\"_blank\">Disklavier in action</a></li>\r\n</ul>',238,0,1,'CC-BY-SA','Music, Piano, Keyboard, Musical Instruments, Player Pianos, Recording Devices',0,0,1),
(2810,'2019-05-10','Wi-Fi on Android',462,'Ken fixes an Android Firewalled Wi-Fi connection that reports no Internet and won’t connect','<h3>Background</h3>\r\n<p>\r\nYou\'re running a firewall on your work and home networks right, so of course you\'re running one on your Smart Phone. Given this device holds more information about you than you probably know yourself, it would be only prudent to make sure that you are protecting what gets in but also what gets out.\r\n</p>\r\n<p>\r\nI run <a href=\"https://f-droid.org/en/packages/dev.ukanth.ufirewall/\">AFWall+</a> which is available from the <a href=\"https://f-droid.org/\">F-Droid</a> app store. It runs fine on <a href=\"https://www.lineageos.org/\">LineageOS</a>.\r\n</p>\r\n<p>\r\nI then set it on the children\'s phone so that no application is allowed to use mobile data, and then only applications that need Internet get Internet Access. This works well as it\'s a normal use case for mobile applications to have intermittent access to the Internet.\r\n</p>\r\n<p>\r\nI see no reason why the Linux Kernel should need unfettered access to the Internet, so it\'s not allowed out. One issue you may come across is that even though you know that there is a Connection your phone doesn\'t, and so it will display the <em>Wi-Fi Connected, no Internet</em> message. \r\n</p>\r\n<p>\r\n<img alt=\"Wi-Fii Connected, no Internet\" src=\"https://hackerpublicradio.org/eps/hpr2810/hpr2810/hpr2810_1.png\" />\r\n</p>\r\n<p>\r\nI\'m not sure how this check is done but <a href=\"https://android.stackexchange.com/users/53535/abqnm\">abqnm</a> suggests at in the StackExchange question <a href=\"https://android.stackexchange.com/questions/63481/how-does-android-determine-if-it-has-an-internet-connection\">How does Android determine if it has an Internet connection?</a> that it may be related to Google Cloud Messaging.\r\n</p>\r\n\r\n<blockquote>\r\n... this means that the device is unable to receive a response from GCM (Google Cloud Messaging, the framework that handles push notifications). This traffic is sent through ports 5228, 5229, and 5230. If the AP is blocking or interfering with traffic on those ports, push notifications won\'t work ... \r\n</blockquote>\r\n<p>\r\nI do indeed see blocked attempts by Google Play Services on my own phone, but not on the other phones that have no google services installed. The only entry I see in the logs is an ICMP attempt to \"Comcast Cable Communications, Inc\". If you know more please record a show for <a href=\"https://hackerpublicradio.org\">Hacker Public Radio</a> about it.\r\n</p>\r\n\r\n<h3>Giving Access</h3>\r\n<p>\r\nNormally you will get a message saying that the Wi-Fi has no Internet access. \r\n</p>\r\n<p>\r\n<img alt=\"Android System. Wi-Fi has no Internet access. Tap for options\" src=\"https://hackerpublicradio.org/eps/hpr2810/hpr2810/hpr2810_2.png\" />\r\n</p>\r\n<p>\r\nIf you tap the message a popup will allow you to stay connected and will let you remember the choice.\r\n</p>\r\n<p>\r\n<img alt=\"OpenWireless.Org. This network has no Internet access. Stay connected? [] Don\'t ask again for this network NO YES\" src=\"https://hackerpublicradio.org/eps/hpr2810/hpr2810/hpr2810_3.png\" />\r\n</p>\r\n<p>\r\nIn some cases the router helpfully resets the connection before you can reply to the message meaning it goes into a loop continually popping up the message but not reacting to it.\r\n</p>\r\n<p>\r\nIn this case we can use <a href=\"https://f-droid.org/en/packages/com.termux/\">Termux</a> a Android Terminal emulator, to drop to a shell and fix the problem.\r\n</p>\r\n<p>\r\n<img alt=\"Termux\" src=\"https://hackerpublicradio.org/eps/hpr2810/hpr2810/hpr2810_4.png\" />\r\n</p>\r\n\r\n<p>\r\nI used <em>su</em> to get root access but you could also change to the user <em>wifi</em>.\r\n</p>\r\n<p>\r\nThe file you need to edit is <strong>/data/misc/wifi/wpa_supplicant.conf</strong>. It\'s probably best to edit this file with the wifi off.\r\n</p>\r\n<pre>\r\nnetwork={\r\n	ssid=\"OpenWireless.Org\"\r\n	key_mgmt=NONE\r\n	priority=15\r\n	id_str=\"{snip}\"\r\n}\r\n</pre>\r\n<p>\r\nScroll down to the network that is giving you trouble and add <strong>disabled=1</strong>\r\n</p>\r\n<pre>\r\nnetwork={\r\n	ssid=\"OpenWireless.Org\"\r\n	key_mgmt=NONE\r\n	priority=15\r\n	disabled=1\r\n	id_str=\"{snip}\"\r\n}\r\n</pre>\r\n<p>\r\nI ended up copying the file to the sdcard, and editing it there. I then copied it back as su and used <strong>chown wifi:wifi /data/misc/wifi/wpa_supplicant.conf</strong> to fix the permissions.\r\n</p>\r\n\r\n<p>\r\nOnce that\'s done you can reboot the phone and connect to the network without a problem. You should also consider putting up an <a href=\"https://openwireless.org/\">Open Wireless</a> access point yourself.\r\n</p>\r\n',30,0,1,'CC-BY-SA','Android, fdroid, lineageos, AFWall+, Wi-Fi, wpa_supplicant.conf, termux',0,0,1),
(2787,'2019-04-09','NodeJS Part 1',613,'I don\'t know Javascript do ?','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://github.com/crazy-max/nodejs-portable\" class=\"uri\">https://github.com/crazy-max/nodejs-portable</a></li>\r\n<li><a href=\"https://github.com/GoogleChrome/puppeteer\" class=\"uri\">https://github.com/GoogleChrome/puppeteer</a></li>\r\n</ul>\r\n',36,0,0,'CC-BY-SA','NodeJS,puppeteer,programming,Javascript',0,0,1),
(2796,'2019-04-22','IRS,Credit Freezes and Junk Mail Ohh My!',746,'IRS Credit Freezes and Junk Mail','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><p><a href=\"https://darknetdiaries.com/episode/26/\" class=\"uri\">https://darknetdiaries.com/episode/26/</a></p></li>\r\n<li><a href=\"https://clark.com/personal-finance-credit/credit-freeze-and-thaw-guide/\" class=\"uri\">https://clark.com/personal-finance-credit/credit-freeze-and-thaw-guide/</a></li>\r\n<li><a href=\"https://clark.com/personal-finance-credit/free-credit-freezes/\" class=\"uri\">https://clark.com/personal-finance-credit/free-credit-freezes/</a></li>\r\n<li><p><a href=\"https://clark.com/consumer-issues-id-theft/opting-out-of-assorted-junk-mailings/\" class=\"uri\">https://clark.com/consumer-issues-id-theft/opting-out-of-assorted-junk-mailings/</a></p></li>\r\n<li><p><a href=\"https://www.youtube.com/watch?v=zWVoyrzqRbU\" class=\"uri\">https://www.youtube.com/watch?v=zWVoyrzqRbU</a> DROP HOE!</p></li>\r\n</ul>\r\n',36,0,0,'CC-BY-SA','IRS,Credit Freeze,Junk Mail,hacking',0,0,1),
(2788,'2019-04-10','Looping in Haskell',2848,'Tuula describes some loop-like constructs in Haskell','<p>Haskell is functional language where data is immutable. This means that regular for-loops don’t really exist. Looping however is very common pattern in programs in general. Here are some patterns how to do that in Haskell.</p>\r\n<h2 id=\"recursion\">Recursion</h2>\r\n<p>Calculating Fibonacci numbers is common example (sort of like hello world in Haskell). There’s many different implementations at https://wiki.haskell.org/The_Fibonacci_sequence if you’re interested on having a look.</p>\r\n<p>Simple recursive definition:</p>\r\n<pre><code>fibs :: Integer -&gt; Integer\r\nfibs 0 = 0\r\nfibs 1 = 1\r\nfibs n = fibs (n-1) + fibs (n-2)</code></pre>\r\n<p>When called with <code>0</code> result is <code>0</code>. When called with <code>1</code> result is <code>1</code>. For all other cases, <code>fibs</code> is called with values <code>n-1</code> and <code>n-1</code> and the results are summed together. This works fine when <code>n</code> is small, but calculation gets slow really quickly with bigger values.</p>\r\n<p>Another way is to define list of all Fibonacci numbers recursively:</p>\r\n<pre><code>allFibs :: [Integer]\r\nallFibs = 0 : 1 : zipWith (+) allFibs (tail allFibs)</code></pre>\r\n<p>Here a list is constructed. First element is <code>0</code>, second element is <code>1</code> and rest of the list is obtained by summing the list with its tail (everything but the first element of the list). Definition is recursive and defines all Fibonacci numbers. However, Haskell doesn’t evaluate whole list, but only as much of it as is required.</p>\r\n<p>Common pattern of processing elements in a list, producing a new list:</p>\r\n<pre><code>addOne :: [Integer] -&gt; [Integer]\r\naddOne [] = []\r\naddOne (x:xs) = x + 1 : addOne xs</code></pre>\r\n<p>Two cases, when called with an empty list <code>[]</code>, result is empty list. For all other cases, list is taken apart <code>(x:xs)</code>, <code>x</code> contains first element of the list and <code>xs</code> is rest of the list. Body of the function creates a new list where head is <code>x + 1</code> and tail is <code>addOne xs</code>. This processes whole list of <code>Integer</code> by adding one to each value. It also reverses the list.</p>\r\n<p>Second common pattern is processing a list and reducing it to a single value:</p>\r\n<pre><code>sumAll :: Integer -&gt; [Integer] -&gt; Integer\r\nsumAll n [] = n\r\nsumAll n (x:xs) = sumAll (n + x) xs</code></pre>\r\n<p>If given list is empty (the terminal case), result is <code>n</code>. Second case again takes list apart <code>(x:xs)</code>, adds <code>x</code> and <code>n</code> together and recursive call <code>sumAll</code> with tail of the list.</p>\r\n<p>This common pattern is discarding some elements of a list:</p>\r\n<pre><code>evenOnly :: [Integer] -&gt; [Integer]\r\nevenOnly [] = []\r\nevenOnly (x:xs) = \r\n    if even x\r\n        then x : evenOnly xs\r\n        else evenOnly xs</code></pre>\r\n<p>Again, result of empty list is just empty list. In all other cases we first check if <code>x</code> is even. If so, new list is constructed where head is <code>x</code> and tail is <code>evenOnly xs</code>. If <code>x</code> isn’t even, it’s discarded and <code>evenOnly</code> is called recursively with tail of the list.</p>\r\n<h2 id=\"more-tools\">More tools</h2>\r\n<p>Writing recursion by hand gets tedious and sometimes confusing (if you listened to the show, you probably noticed how I got confused and had to check that <code>evenOnly</code> actually works as I thought it would). For that reason, there are tools that abstract these common patterns and given them names.</p>\r\n<p>First is <code>map</code>. It applies given function to each element of a list, thus producing a new list:</p>\r\n<pre><code>&gt; map (+1) [1..10]\r\n[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\r\n&gt; map odd [1..10]\r\n[True, False, True, False, True, False, True, False, True, False]</code></pre>\r\n<p>Second is <code>fold</code>. There is good article at https://wiki.haskell.org/Foldr_Foldl_Foldl%27 that talks about differences between different folds.</p>\r\n<p>The basic idea behind each fold is the same, they take a function and initial value and then apply them to first element of list, producing a value. This value is then applied with the function to the second element of the list and so on, until whole list has been reduced to a single value. Calculating a sum of list is so common operation that there’s specific function for that: <code>sum</code>.</p>\r\n<pre><code>&gt; foldr (+) 0 [1..10]\r\n55\r\n&gt; foldl (+) 0 [1..10]\r\n55\r\n&gt; sum [1..10]\r\n55</code></pre>\r\n<p><code>scan</code> is similar to <code>fold</code>, except for returning only the final value, it also returns intermediate ones. Here it’s easier to observe how <code>scanr</code> and <code>scanl</code> differ from each other:</p>\r\n<pre><code>&gt; scanr (+) 0 [1..10]\r\n[55,54,52,49,45,40,34,27,19,10,0]\r\n&gt; scanl (+) 0 [1..10]\r\n[0,1,3,6,10,15,21,28,36,45,55]</code></pre>\r\n<p>Last of the trifecta is <code>filter</code> that is used to select some of the elements in a list based on a supplied function.</p>\r\n<pre><code>&gt; filter odd [1..10]\r\n[1, 3, 5, 7, 9]\r\n&gt; filter even [1..]\r\n[2, 4, 6, 8, 10, 12, 14, 16...]\r\n&gt; take 5 $ filter even [1..] \r\n[2, 4, 6, 8, 10]</code></pre>\r\n<h2 id=\"even-more-tools\">Even more tools</h2>\r\n<p>There are even more tools at our disposal. Prelude is basic library of Haskell and browsing online documentation at https://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html might yield interesting information.</p>\r\n<p>For example, constructing some lists:</p>\r\n<ul>\r\n<li><code>iterate :: (a -&gt; a) -&gt; a -&gt; [a]</code> For list where function is applied repeatedly.</li>\r\n<li><code>repeat :: a -&gt; [a]</code> for a list that contains infinite amount of <code>a</code>.</li>\r\n<li><code>replicate :: Int -&gt; a -&gt; [a]</code> For a list that contains finite amount of <code>a</code>.</li>\r\n<li><code>cycle :: [a] -&gt; [a]</code> For a infinite list that repeats same list over and over again.</li>\r\n</ul>\r\n<h2 id=\"finding-tools\">Finding tools</h2>\r\n<p>It’s all about knowing the right tools and finding them when needed. Luckily, you don’t have to memorize big stack of notes, but can turn to https://hoogle.haskell.org/ which is Haskell API search engine. It can search based on name or type signature. I often use it to find out if somebody has already written a function that I’m thinking of writing myself.</p>\r\n<p>If you want to send questions or comments, I can be reached with email or at fediverse where I’m Tuula@mastodon.social. This episode is direct result of feedback that I got from previous one. If there’s Haskell topic you would love to hear more, drop me line or even better, research it by yourself and make a cool Hacker Public Radio episode.</p>\r\n',364,107,0,'CC-BY-SA','haskell, programming',0,0,1),
(2789,'2019-04-11','Pacing In Storytelling',998,'Lostnbronx takes a stab at explaining why the pace of your story matters.','<p>Some stories, that are otherwise cookie-cutter in form, possessing familiar situations and clichéd characters, seem to nonetheless stand out. Other tales that might have great ideas, intriguing plots, and vivid characters, seem to hit the ground with a thud. The determining value here may lie with the pacing of the story.</p>\r\n<p>How does pacing (that is, timing) affect your story? Why does it matter? Can you make improvements in the pace by moving things around? What’s the best approach for creating it to begin with?</p>\r\n<p>Lostnbronx meanders for a while, often losing his way, and rarely making a coherent point regarding this complicated topic.</p>',107,105,0,'CC-0','stories, storytelling, pacing, lostnbronx',0,0,1),
(2791,'2019-04-15','LUKS like truecrypt',1523,'Klaatu demonstrates how to use LVM and cryptsetup to create and use portable encrypted filesystems','<p>\r\nCreate an empty file of a predetermined size:\r\n</p>\r\n\r\n<pre><code>$ fallocate --length 512M foo.img\r\n</code></pre>\r\n<p>Create a LUKS container on it:</p>\r\n<pre><code>$ cryptsetup --verify-passphrase luksFormat foo.img\r\n</code></pre>\r\n<p>Set it up:</p>\r\n<pre><code>$ sudo cryptsetup luksOpen foo.img foo\r\n$ ls /dev/mapper\r\nfoo\r\n$\r\n</code></pre>\r\n<p>Make a file system on it:</p>\r\n<pre><code>$ sudo mkfs.ext2 /dev/mapper/foo\r\n</code></pre>\r\n<p>If you don\'t need it for anything now, you can close it:\r\n</p>\r\n<pre><code>$ sudo cryptsetup luksClose foo\r\n$ ls /dev/mapper\r\n$\r\n</code></pre>\r\n<p>Mount it as a usable filesystem:</p>\r\n<pre><code>$ sudo mkdir /crypt\r\n$ sudo mount /dev/mapper/foo /crypt\r\n</code></pre>\r\n<p>\r\nDepending on your system configuration, you may need to set up reasonable permissions:\r\n</p>\r\n<pre><code>$ sudo mkdir /crypt/mystuff\r\n$ sudo chown klaatu:users /crypt/mystuff\r\n$ sudo chmod 770 /crypt/mystuff\r\n$ echo \"hello world\" &gt;&gt; /crypt/mystuff/file.txt\r\n</code></pre>\r\n<p>\r\nWhen you\'re finished using your encrypted vault, unmount and close it:\r\n</p>\r\n<pre><code>$ sudo umount /crypt\r\n$ sudo cryptsetup luksClose foo\r\n</code></pre>\r\n\r\n',78,74,0,'CC-BY-SA','encryption',0,0,1),
(2793,'2019-04-17','bash coproc: the future (2009) is here',1276,'clacke discovers bash\'s coproc keyword and explains some toy examples','<p>If you want the full manuscript, that’s at <a href=\"https://gitlab.com/clacke/hpr/blob/master/hpr2793_bash_coproc_manuscript.adoc\">gitlab: hpr2793_bash_coproc_manuscript.adoc</a>. It’s almost a transcript, but I added spontaneous commentary while reading the examples, so that’s not in the manuscript.</p>\r\n<p>Episode errata:</p>\r\n<ul>\r\n<li><p>Command substitution with <code>$()</code> is perfectly valid according to POSIX, and is accepted both by <code>dash</code> and by <code>bash --posix</code>. It’s not to be considered a bashism.</p></li>\r\n<li><p>I fumbled the pronunciation of the <code>printf</code> format string in one place and said &quot;parenthesis&quot; instead of &quot;percentage sign&quot;.</p></li>\r\n<li><p>I tried to say &quot;space&quot; every time there’s a space, but I know I forgot it in a few places. But you probably need to look at the show notes to really make sense of the commands anyway.</p></li>\r\n</ul>\r\n<p>Example #1:</p>\r\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><a class=\"sourceLine\" id=\"cb1-1\" data-line-number=\"1\">$ <span class=\"bu\">echo</span> <span class=\"va\">$(</span><span class=\"bu\">echo</span> hacker public radio<span class=\"va\">)</span></a>\r\n<a class=\"sourceLine\" id=\"cb1-2\" data-line-number=\"2\"><span class=\"ex\">hacker</span> public radio</a>\r\n<a class=\"sourceLine\" id=\"cb1-3\" data-line-number=\"3\">$ <span class=\"va\">$(</span><span class=\"bu\">echo</span> echo hacker public radio<span class=\"va\">)</span>  # <span class=\"ex\">It</span> can even supply the command itself, not just parameters. Note the word splitting.</a>\r\n<a class=\"sourceLine\" id=\"cb1-4\" data-line-number=\"4\"><span class=\"ex\">hacker</span> public radio</a>\r\n<a class=\"sourceLine\" id=\"cb1-5\" data-line-number=\"5\">$ <span class=\"st\">&quot;</span><span class=\"va\">$(</span><span class=\"bu\">echo</span> echo hacker public radio<span class=\"va\">)</span><span class=\"st\">&quot;</span>  # <span class=\"ex\">Counteract</span> word splitting by putting the command substitution in quotes.</a>\r\n<a class=\"sourceLine\" id=\"cb1-6\" data-line-number=\"6\"><span class=\"ex\">bash</span>: echo hacker public radio: command not found</a>\r\n<a class=\"sourceLine\" id=\"cb1-7\" data-line-number=\"7\">$ <span class=\"kw\">`</span><span class=\"bu\">echo</span> echo hacker public radio<span class=\"kw\">`</span>  # <span class=\"ex\">Old-style</span> command substitution</a>\r\n<a class=\"sourceLine\" id=\"cb1-8\" data-line-number=\"8\"><span class=\"ex\">hacker</span> public radio</a></code></pre></div>\r\n<p>More on command substitution in Dave’s <a href=\"https://hackerpublicradio.org/eps.php?id=1903\">hpr1903: Some further Bash tips</a>.</p>\r\n<p>Example #2:</p>\r\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><a class=\"sourceLine\" id=\"cb2-1\" data-line-number=\"1\">$ <span class=\"bu\">echo</span> <span class=\"op\">&lt;(</span><span class=\"bu\">echo</span> hacker public radio<span class=\"op\">)</span></a>\r\n<a class=\"sourceLine\" id=\"cb2-2\" data-line-number=\"2\"><span class=\"ex\">/dev/fd/63</span></a>\r\n<a class=\"sourceLine\" id=\"cb2-3\" data-line-number=\"3\">$ <span class=\"fu\">cat</span> <span class=\"op\">&lt;(</span><span class=\"bu\">echo</span> hacker public radio<span class=\"op\">)</span></a>\r\n<a class=\"sourceLine\" id=\"cb2-4\" data-line-number=\"4\"><span class=\"ex\">hacker</span> public radio</a></code></pre></div>\r\n<p>You can also combine process substitution with redirection.</p>\r\n<p>Example #3:</p>\r\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><a class=\"sourceLine\" id=\"cb3-1\" data-line-number=\"1\">$ <span class=\"bu\">echo</span> hacker public radio <span class=\"op\">&gt;</span> <span class=\"op\">&gt;(</span><span class=\"fu\">sed</span> -e <span class=\"st\">&#39;s/$/!/&#39;</span><span class=\"op\">)</span>  # You need the space between the greater-thans here!</a>\r\n<a class=\"sourceLine\" id=\"cb3-2\" data-line-number=\"2\"><span class=\"ex\">hacker</span> public radio!</a></code></pre></div>\r\n<p>More on process substitution in Dave’s <a href=\"https://hackerpublicradio.org/eps.php?id=2045\">hpr2045: Some other Bash tips</a>.</p>\r\n<p>For a description of a hack for creating bidirectional anonymous pipes in bash, see <a href=\"https://libranet.de/display/0b6b25a8-135c-83e5-1f4b-82a136800329\">my Fediverse post on this</a>, and I owe you a show.</p>\r\n<p>A coprocess in bash is a subshell to which you have access to two file descriptors: Its stdin and its stdout.</p>\r\n<p>The two file descriptors will be put in a bash array. To learn more about arrays, check out Dave’s series within the bash series, a whopping five-part quadrology including <a href=\"https://hackerpublicradio.org/eps.php?id=2709\">hpr2709</a>, <a href=\"https://hackerpublicradio.org/eps.php?id=2719\">hpr2719</a>, <a href=\"https://hackerpublicradio.org/eps.php?id=2729\">hpr2729</a>, <a href=\"https://hackerpublicradio.org/eps.php?id=2739\">hpr2739</a> and <a href=\"https://hackerpublicradio.org/eps.php?id=2756\">hpr2756</a>.</p>\r\n<p>You create a coprocess using the <code>coproc</code> keyword, brand spanking new since bash 4 from 2009. I am filing issues to <a href=\"https://bitbucket.org/birkenfeld/pygments-main/issues\">pygments</a> and <a href=\"https://savannah.gnu.org/bugs/?group=src-highlite\">GNU src-highlite</a> to support it.</p>\r\n<p>There are two ways to call coproc. The first way is to give <code>coproc</code> a <em>simple command</em>.</p>\r\n<p>Example #4:</p>\r\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><a class=\"sourceLine\" id=\"cb4-1\" data-line-number=\"1\">$ <span class=\"ex\">coproc</span> :<span class=\"kw\">;</span> <span class=\"bu\">declare</span> -p <span class=\"va\">COPROC</span></a>\r\n<a class=\"sourceLine\" id=\"cb4-2\" data-line-number=\"2\">[<span class=\"ex\">1</span>] 25155</a>\r\n<a class=\"sourceLine\" id=\"cb4-3\" data-line-number=\"3\"><span class=\"bu\">declare</span> -a <span class=\"va\">COPROC=([0]=</span><span class=\"st\">&quot;63&quot;</span> <span class=\"va\">[1]=</span><span class=\"st\">&quot;60&quot;</span><span class=\"va\">)</span></a>\r\n<a class=\"sourceLine\" id=\"cb4-4\" data-line-number=\"4\">[<span class=\"ex\">1</span>]+  Done                    coproc COPROC :</a></code></pre></div>\r\n<p>The other way is to give <code>coproc</code> an explicit name and a <a href=\"https://www.gnu.org/software/bash/manual/bash.html#Command-Grouping\">Command Grouping</a>.</p>\r\n<p>Example #5:</p>\r\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><a class=\"sourceLine\" id=\"cb5-1\" data-line-number=\"1\">$ <span class=\"ex\">coproc</span> HPR (:); <span class=\"bu\">declare</span> -p <span class=\"va\">HPR</span></a>\r\n<a class=\"sourceLine\" id=\"cb5-2\" data-line-number=\"2\">[<span class=\"ex\">1</span>] 25469</a>\r\n<a class=\"sourceLine\" id=\"cb5-3\" data-line-number=\"3\"><span class=\"bu\">declare</span> -a <span class=\"va\">HPR=([0]=</span><span class=\"st\">&quot;63&quot;</span> <span class=\"va\">[1]=</span><span class=\"st\">&quot;60&quot;</span><span class=\"va\">)</span></a>\r\n<a class=\"sourceLine\" id=\"cb5-4\" data-line-number=\"4\">[<span class=\"ex\">1</span>]+  Done                    coproc HPR ( : )</a></code></pre></div>\r\n<p>Slightly less contrived example #6:</p>\r\n<pre><code>$ coproc GREP (grep --line-buffered pub); printf &#39;%s\\n&#39; hacker public radio &gt;&amp;${GREP[1]}; cat &lt;&amp;${GREP[0]}\r\n[1] 25627\r\npublic\r\n^C\r\n$ kill %1\r\n[1]+  Terminated              coproc GREP ( grep --color=auto --line-buffered pub )</code></pre>\r\n<p>Here grep and cat wait forever for more input, so we have to kill them to continue our lesson.</p>\r\n<p>But we know that <code>GREP</code> will only return one line, so we can just read that one line. And when we are done feeding it lines, we can close our side of its stdin, and it will notice this and exit gracefully.</p>\r\n<p>I’m glad I stumbled over that <code>{YOURVARIABLE}&gt;&amp;-</code> syntax for having a dereferenced variable as the left FD of a redirection. Originally I used an ugly <code>eval</code>.</p>\r\n<p>Example #7:</p>\r\n<pre><code>$ coproc GREP (grep --line-buffered pub); printf &#39;%s\\n&#39; hacker public radio &gt;&amp;${GREP[1]}; head -n1 &lt;&amp;${GREP[0]}; exec {GREP[1]}&gt;&amp;-\r\n[1] 25706\r\npublic\r\n[1]+  Done                    coproc GREP ( grep --color=auto --line-buffered pub )</code></pre>\r\n<p>There we go! Not the most brilliant example, but it shows all the relevant moving parts, and we covered a couple of caveats.</p>\r\n<p>Now go out and play with this and come back with an example on how this is actually useful in the real world, and submit a show!</p>\r\n\r\n',311,42,0,'CC-BY-SA','bash, coproc, subshell',0,0,1),
(2797,'2019-04-23','Writing Web Game in Haskell - Simulation at high level',1547,'Tuula gives overview of simulation in their 4x game','<p>So far we have been concentrating on separate pieces of the game. Now it’s time to put some of them together as a simulation.</p>\n<h2 id=\"overview-of-simulation\">Overview of simulation</h2>\n<p>Simulation is done in discrete steps. Each step is roughly 1 earth month (completely arbitrary decision). Shorter than that and there might not be enough happening during turns to keep things interesting. Much longer than that and player might not have enough control on how to react things.</p>\n<p>In any case, current time is stored in database in table <code>time</code>. There should be only one row in that table at any given time. And that row has only one value, current time. Time is stored as integer as I didn’t want to deal with problems that you get when adding fractions to a float time after time. So current time (March 2019) would be <code>2019.3</code> in game terms and stored as <code>20193</code> in database.</p>\n<p>Main processing is done in function called <code>processTurn</code> that is shown below. It advances time for one decimal month, removes all expired statuses as explained in <a href=\"https://hackerpublicradio.org/eps.php?id=2768\">episode 2768</a> and then loads all factions.</p>\n<p>After that, various steps of the simulation are carried out for all loaded factions. These include handling special events as explained in <a href=\"https://hackerpublicradio.org/eps.php?id=2748\">episode 2748</a> and doing observations and report writing in manner described <a href=\"https://hackerpublicradio.org/eps.php?id=2703\">episode 2703</a>.</p>\n<pre><code>processTurn :: (BaseBackend backend ~ SqlBackend,\n    BackendCompatible SqlBackend backend, PersistUniqueRead backend,\n    PersistQueryWrite backend,\n    PersistQueryRead backend, PersistStoreWrite backend, MonadIO m) =&gt;\n    ReaderT backend m Time\nprocessTurn = do\n    newTime &lt;- advanceTime\n    _ &lt;- removeExpiredStatuses newTime\n    factions &lt;- selectList [] [ Asc FactionId ]\n    _ &lt;- mapM (handleFactionEvents newTime) factions\n    mapM_ handleFactionFood factions\n    mapM_ (handleFactionConstruction newTime) factions\n    _ &lt;- mapM (addSpecialEvents newTime) factions\n    -- Doing observations should always be done last to ensure players have\n    -- recent reports of property they have full control, ie. planets.\n    -- Otherwise it&#39;s possible that they&#39;ll receive reports that are one\n    -- turn out of sync.\n    mapM_ (handleFactionObservations newTime) factions\n    return newTime</code></pre>\n<h2 id=\"more-mapping\">More mapping</h2>\n<p>Remember <code>map</code> and <code>fmap</code> that are used to run a function to each element in a list or general structure? <code>mapM</code> works in a similar way, but is used in monadic context. In <code>processTurn</code> function, we’re dealing with input and output and have IO monad present to allow us to do that (<code>MonadIO m</code> part of the type signature).</p>\n<p>If you step back a bit and squint a bit, then <code>map :: (a -&gt; b) -&gt; [a] -&gt; [b]</code> and <code>fmap :: (a -&gt; b) -&gt; f a -&gt; f b</code> and <code>mapM :: Monad m =&gt; (a -&gt; m b) -&gt; t a -&gt; m (t b)</code> look pretty similar. Each take a function, structure and produce a new structure which values were created by running the given function for each element of the original structure.</p>\n<p>The difference is that <code>map</code> works only for lists, <code>fmap</code> works for functors (that were covered in <a href=\"https://hackerpublicradio.org/eps.php?id=2778\">episode 2778</a>) and <code>mapM</code> works for structures in monadic context.</p>\n<p>Best way to contact me nowadays is either by email or through fediverse where I’m Tuula@mastodon.social.</p>\n',364,107,0,'CC-BY-SA','haskell, persistent',0,0,1),
(2798,'2019-04-24','Should Podcasters be Pirates ?',725,'Knightwise waxes nostalgically on the early days of podcasting and wonders if we all sold out?','<p>In a car rant I think back to the early days of podcasting and how the ambience and vision of podcasting was far from the mainstream media approach from today. Have we all sold out ?</p>\r\n',111,0,1,'CC-BY-SA','podcast,pirate radio,decentralisation',0,0,1),
(2802,'2019-04-30','Mid-life (?) assessment',991,'It seems life goes faster and faster and then turns around and goes slower and slower','<p>At 40, I’m at the middle of the mean life expectancy in most parts of the world. What’s happened so far, and where do I go from here?</p>\r\n<p>I look at my life’s past in increasingly smaller chunks of years, and then at my life’s future in increasingly larger chunks of years, and speculate about those 80 years — or perhaps many more? — of expected lifetime.</p>\r\n<p>I’m saying mostly the things I wrote at <a href=\"https://loadaverage.org/conversation/10689347\" class=\"uri\">https://loadaverage.org/conversation/10689347</a> but with some small updates from the last 9 months.</p>\r\n',311,0,0,'CC-BY-SA','life, kids, work, medicine, future',0,0,1),
(2792,'2019-04-16','Playing around with text to speech synthesis on Linux',1203,'Playing around with different text to speech programs to see what is possible.','<p>Below the script I used to generate a bunch of wav files with different text to speech applications.</p>\r\n<pre><code>#!/bin/bash\r\n\r\nstring=&quot;This is HPR episode 2792 entitled \\&quot;Playing around with text to speech synthesis on Linux\\&quot; and is part of the series \\&quot;Sound Scapes\\&quot;. It is hosted by Yeroon Bahten and is about 20 minutes long and carries a clean flag.&quot;\r\necho &quot;${string}&quot; &gt; text.txt\r\n\r\nespeak -w espeak.wav &quot;${string}&quot; \r\nespeak -w espeak-ng-v-mb-us1.wav -v mb-us1 &quot;${string}&quot;\r\nespeak -w espeak-ng-v-mb-us2.wav -v mb-us2 &quot;${string}&quot;\r\nespeak -w espeak-ng-v-mb-us3.wav  -v mb-us3 &quot;${string}&quot;\r\nespeak-ng &quot;${string}&quot;\r\nespeak-ng -v en-gb &quot;${string}&quot;\r\nespeak-ng -w espeak-ng-en-gb-scotland.wav -v en-gb-scotland &quot;${string}&quot;\r\nespeak-ng -w espeak-ng-en-us.wav  -v en-us &quot;${string}&quot;\r\n\r\nflite -o flite-voice-cmu_us_slt.wav -voice cmu_us_slt  &quot;${string}&quot;\r\n\r\necho &quot;${string}&quot;| festival --language english --tts # same as next line\r\necho &quot;${string}&quot;| text2wave --language british_english --tts -o festival_british_english.wav\r\ntext2wave -o festival_british_english.wav  text.txt\r\n\r\nfor voice in don_diphone kal_diphone ked_diphone rab_diphone\r\ndo\r\n  text2wave -o festival_voice_${voice}.wav -eval &quot;(voice_${voice} )&quot;  text.txt\r\ndone\r\n\r\n# Gnustep say, recorded with audio recorder.\r\nsay &quot;${string}&quot;\r\n\r\ntext2wave -o festival_voice_cmu_us_slt_arctic_hts.wav -eval &quot;(voice_cmu_us_slt_arctic_hts )&quot; text.txt\r\n\r\n# merlin https://github.com/CSTR-Edinburgh/merlin\r\n\r\n# marytts: https://github.com/marytts</code></pre>\r\n',369,101,0,'CC-BY-SA','speech synthesis linux',0,0,1),
(2794,'2019-04-18','Interview with Martin Wimpress',2412,'In this episode, Yannick talks with Martin Wimpress about the Ubuntu MATE project','<p>Ubuntu, MATE.</p>\r\n<p>Two words which, taken separately, refer to great products.</p>\r\n<p>On one side, Ubuntu, one of the most popular, if not <em>the</em> most popular, linux distribution.</p>\r\n<p>On the other side, the MATE desktop environment, also very popular.</p>\r\n<p>One person took those two elements and combined them together to make Ubuntu MATE. That person is Martin Wimpress, and he joined me on the 21st of March to talk about the past, present, and future of the project.</p>\r\n',370,78,0,'CC-BY-SA','ubuntu, mate, ubuntu mate, martin wimpress, raspberry pi, desktop environment, linux',0,0,1),
(2808,'2019-05-08','Haskell function types',1469,'Tuula gives overview of function types in Haskell','<p>Haskell is statically typed language, meaning that during compilation, programs are checked for type correctness. This means that you won’t accidentally mix for example text and numbers. Haskell does type inference. The compiler will try and figure out what kind of types would make your program to be valid in terms of types. Programmer could completely omit types, but it’s often helpful to write type signatures for at least top level definitions. These will be helpful for both the programmers and compilers.</p>\r\n<h2 id=\"concrete-types\">concrete types</h2>\r\n<p>Simplest case is where types are spelled out definitely. Function <code>add</code> below takes two <code>Integer</code> parameters and produces <code>Integer</code> value. Note that types are written in upper case.</p>\r\n<p><code>add :: Integer -&gt; Integer -&gt; Integer</code></p>\r\n<p>It’s possible to not use concrete types. In following example <code>a</code> (note the lower case) can be anything. So function takes two values of <code>a</code>, a <code>Boolea</code> and produces <code>a</code>. This is useful technique for writing very general functions.</p>\r\n<p><code>choose :: a -&gt; a -&gt; Boolean -&gt; a</code></p>\r\n<h2 id=\"ad-hoc-polymorphism\">ad hoc polymorphism</h2>\r\n<p>In previous example, we wouldn’t be able to do much at all with <code>a</code> as we don’t know its type. Sometimes we need to know a bit more about type, without specifically declaring its type. For those cases type constraints are useful.</p>\r\n<p><code>add :: (Num a) =&gt; a -&gt; a -&gt; a</code></p>\r\n<p>This version of <code>add</code> again takes two parameters, both being type <code>a</code> and produces value <code>a</code>. But <code>(Num a) =&gt;</code> part in the signature constraints <code>a</code> to be instance of <code>Num</code>. This type class (I’ll talk about these some other time) defines that each instance of it will have set of functions: <code>+</code>, <code>-</code>, <code>*</code>, <code>negate</code>, <code>abs</code>, <code>signum</code> and <code>fromInteger</code>. So now our <code>add</code> function can use those functions, regardless of what specific type <code>a</code> is.</p>\r\n<h2 id=\"parametrized-functions\">parametrized functions</h2>\r\n<p>Types used in function signature can be parametrized. If we wanted a function that returns a first element of any list, we could have following signature: <code>first :: [a] -&gt; Maybe a</code></p>\r\n<p><code>first</code> takes single parameter, list of <code>a</code> and returns <code>Maybe a</code>. <code>Maybe</code> is a type that is used to signify a value that might or might not be present and has following definition:</p>\r\n<pre><code>data Maybe a =\r\n     Nothing\r\n     | Just a</code></pre>\r\n<p>So our function would return <code>Nothing</code> when given an empty list and <code>Just a</code> when given a list of at least one element.</p>\r\n<h2 id=\"using-functions\">using functions</h2>\r\n<p>Function application in Haskell doesn’t require parentheses around arguments. Calling our <code>add</code> function is just <code>add 1 2</code>. If one of the values is result of another function call, we need to tell which parameters belong to which function. Using <code>$</code> is one option: <code>add 1 $ add 2 3</code>, another option is to use parentheses: <code>add 1 (add 2 3)</code>.</p>\r\n<p>When function is called with less parameters than it expect, instead of run time error you’ll going to receive a function. In following example <code>addLots 5</code> will produce same value as <code>add 1000 5</code>:</p>\r\n<pre><code>addLots = add 1000\r\naddLots 5</code></pre>\r\n<p>Another contrived example of partial application:</p>\r\n<pre><code>findPodcasts :: [Podcast] -&gt; Text -&gt; [Podcast]\r\nsearch = findPodcasts loadedPodcasts\r\nmyPodcasts = search &quot;Tuula&quot;</code></pre>\r\n<h2 id=\"functions-as-types\">functions as types</h2>\r\n<p>Functions have type (that’s what the signature is for after all) and functions can be used as values. You can return function from another function or you can pass in a function as a parameter.</p>\r\n<p>Common example is <code>filter</code>, which has following signature: <code>filter :: (a -&gt; Bool) -&gt; [a] -&gt; [a]</code></p>\r\n<p>It takes two parameters, first one is function that has type <code>a -&gt; Bool</code> and second one is list of <code>a</code>. Return value is list of <code>a</code>. You can produce a list of odd numbers between 1 and 10 with <code>filter odd [1..10]</code>.</p>\r\n<h2 id=\"anonymous-functions\">anonymous functions</h2>\r\n<p>Sometimes you need a function to pass in as a parameter, but the function is so small that you don’t want to give it a name. For those cases, anonymous function are good. If you wanted to produce a list of odd numbers that are greater that 5 in range from 1 10, you could write it as: <code>filter (\\x -&gt; odd x &amp;&amp; x &gt; 5) [1..10]</code>. If you squint hard enough <code>\\</code> looks almost like a lowercase greek letter λ.</p>\r\n<p>Easiest way to catch me is either email or fediverse where I’m Tuula@mastodon.social</p>\r\n',364,107,0,'CC-BY-SA','haskell',0,0,1);
INSERT INTO `eps` (`id`, `date`, `title`, `duration`, `summary`, `notes`, `hostid`, `series`, `explicit`, `license`, `tags`, `version`, `downloads`, `valid`) VALUES (2799,'2019-04-25','building an arduino programmer',1212,'turn an arduino nano into a programmer','<ol type=\"1\">\r\n<li>intro</li>\r\n</ol>\r\n<p>1.1 brian in ohio</p>\r\n<p>1.2 out from under my rock</p>\r\n<ol start=\"2\" type=\"1\">\r\n<li>motivation</li>\r\n</ol>\r\n<p>2.1 ken fallon bootloader episode</p>\r\n<ul>\r\n<li>hpr 2660</li>\r\n<li>burned many bootloaders</li>\r\n<li>used usbtiny programmer</li>\r\n<li>putting together a programmer would be a good learning experience</li>\r\n</ul>\r\n<p>2.2 still use arduino</p>\r\n<ul>\r\n<li>easy to check out a new piece of hardware</li>\r\n<li>boards are cheap and easy to find</li>\r\n<li>boards are robust</li>\r\n</ul>\r\n<p>2.3 need to run an arduino board at lower frequency</p>\r\n<ul>\r\n<li>developing a data logger</li>\r\n<li>write code in c using the avr open source tool chain</li>\r\n<li>prototype on arduino board</li>\r\n</ul>\r\n<ol start=\"3\" type=\"1\">\r\n<li>needed supplies</li>\r\n</ol>\r\n<p>3.1 arduino ide</p>\r\n<ul>\r\n<li>get from your distro’s repository</li>\r\n<li>slackbuilds i used the version that repackages the binaries, the little a arduino</li>\r\n<li>read this good information<br />\r\n<a href=\"https://www.arduino.cc/en/Tutorial/ArduinoISP\" class=\"uri\">https://www.arduino.cc/en/Tutorial/ArduinoISP</a></li>\r\n</ul>\r\n<p>3.2 avrdude</p>\r\n<ul>\r\n<li>use it to test the programmer outside of the arduino environment</li>\r\n<li>part of the gnu avr toolchain</li>\r\n</ul>\r\n<p>3.3 arduino nano clone - un assembled</p>\r\n<p><img src=\"https://www.hackerpublicradio.org/eps/hpr2799/hpr2799/hpr2799-bare-nano.jpg\" alt=\"hpr2799-bare-nano.jpg\" /></p>\r\n<ul>\r\n<li>look for the boards that have the unpoplated icsp header</li>\r\n<li>make sure its a nano and not a pro-mini</li>\r\n</ul>\r\n<p>3.4 3 leds 3mm or smaller</p>\r\n<p><img src=\"https://www.hackerpublicradio.org/eps/hpr2799/hpr2799/hpr2799-led.jpg\" alt=\"hpr2799-led.jpg\" /></p>\r\n<ul>\r\n<li>optional but are useful, especially the heartbeat led</li>\r\n</ul>\r\n<p>3.5 3 resistors 200 ohm - small</p>\r\n<ul>\r\n<li>if you install the led’s</li>\r\n</ul>\r\n<p>3.6 1 5-10 uF electrolytic capacitor</p>\r\n<p>3.7 3-4 inch long jumper wire</p>\r\n<p>3.8 2x3 female header</p>\r\n<p><img src=\"https://www.hackerpublicradio.org/eps/hpr2799/hpr2799/hpr2799-2x3header.jpg\" alt=\"hpr2799-2x3header.jpg\" /></p>\r\n<p>3.9 some way to cut wire</p>\r\n<p>3.10 soldering supplies</p>\r\n<ol start=\"4\" type=\"1\">\r\n<li>howto</li>\r\n</ol>\r\n<p>4.1 upload arduino isp sketch to nano</p>\r\n<p>File→Examples→11.ArduinoISP→ArduinoISP</p>\r\n<ul>\r\n<li>i modified the sketch changing where the led’s are placed</li>\r\n<li><p>i put the led’s at digital 9, 7, and 5 for spacing</p>\r\n<pre><code>#define RESET 10 // Use pin 10 to reset the target rather than SS\r\n#define LED_HB 9 // No change define LED_ERR 7 // changed define\r\n#LED_PMODE 5 // changed</code></pre></li>\r\n<li><p>upload the sketch</p></li>\r\n</ul>\r\n<p>4.2 solder on led’s</p>\r\n<p><img src=\"https://www.hackerpublicradio.org/eps/hpr2799/hpr2799/hpr2799-led-on-board.jpg\" alt=\"hpr2799-led-on-board.jpg\" /></p>\r\n<ul>\r\n<li>solder the anode leg to the apropriate digital pin on the board</li>\r\n<li>add a resistor to the cathode leg of the led (usually the shorter leg)</li>\r\n<li>solder the resistor attached to the cathode to ground pin of the board</li>\r\n<li>i started with pin 9</li>\r\n<li>you can test each led before moving on to the next led</li>\r\n<li>my soldering ended up messy but it gets the job done</li>\r\n</ul>\r\n<p><img src=\"https://www.hackerpublicradio.org/eps/hpr2799/hpr2799/hpr2799-leds-done.jpg\" alt=\"hpr2799-leds-done.jpg\" /></p>\r\n<p>4.3 modify sketch and test leds</p>\r\n<ul>\r\n<li>you can modify the sketch</li>\r\n<li>change the heartbeat pin to whatever led you just soldered</li>\r\n<li>upload the modified sketch</li>\r\n<li>the led you just soldered should pulse</li>\r\n</ul>\r\n<p>4.4 clip jumper wire and attach</p>\r\n<p><img src=\"https://www.hackerpublicradio.org/eps/hpr2799/hpr2799/hpr2799-reset-wire.jpg\" alt=\"hpr2799-reset-wire.jpg\" /></p>\r\n<ul>\r\n<li>pin 10</li>\r\n<li>used the hole on the end of the board as strain relief</li>\r\n</ul>\r\n<p>4.5 add capacitor</p>\r\n<ul>\r\n<li>watch polarity</li>\r\n<li>no more auto reset</li>\r\n<li>if you want to program with arduino ide, you need to push the reset button</li>\r\n</ul>\r\n<p>4.6 2x3 header</p>\r\n<pre class=\"___\"><code>                         MISO -|o o|-+Vcc\r\n                          SCK -|o o|-MOSI\r\n Do not attach-Reset-|o o|-Gnd\r\n                                     -----</code></pre>\r\n<p><img src=\"https://www.hackerpublicradio.org/eps/hpr2799/hpr2799/hpr2799-header-mod.jpg\" alt=\"hpr2799-header-mod.jpg\" /></p>\r\n<ul>\r\n<li>remove reset connecter south-west connector</li>\r\n<li>solder the remaining 5 pins</li>\r\n<li>the header is soldered on the bottom of the board</li>\r\n</ul>\r\n<p><img src=\"https://www.hackerpublicradio.org/eps/hpr2799/hpr2799/hpr2799-header-soldered.jpg\" alt=\"hpr2799-header-soldered.jpg\" /></p>\r\n<ol start=\"5\" type=\"1\">\r\n<li>how to use</li>\r\n</ol>\r\n<p>5.1 plug usb cable into programmer and your computer</p>\r\n<p>5.2 start the arduino ide</p>\r\n<p>5.3 plug programmer onto target board remember to plug the wire into the reset pin of the target</p>\r\n<p>5.4 in the tools folder of the ide make sure your usb port is selected</p>\r\n<p>Tools→Port<code>&quot;/dev/ttyUSBx&quot;</code>→<code>/dev/ttyUSBx</code></p>\r\n<p>5.5 and that in the programmer section you select arduino as isp not arduinoisp</p>\r\n<p>Tools→Programmer→Arduino as ISP</p>\r\n<p>5.6 at this point you can burn a bootloader as Ken described</p>\r\n<p>5.7 upload a program</p>\r\n<p>5.7.1 bring up the blink example sketch</p>\r\n<p>5.7.2 under tools make sure your target board type is selected</p>\r\n<p>Tools→Boards</p>\r\n<p>5.7.3 under the sketch menu you’ll see upload using a programmer</p>\r\n<p>Sketch→Upload Using Programer</p>\r\n<p>5.7.4 when you select that the blink sketch will be compiled and uploaded</p>\r\n<ol start=\"6\" type=\"1\">\r\n<li>at the command line</li>\r\n</ol>\r\n<p>6.1 check functionallity</p>\r\n<pre><code>bash-4.3$ avrdude -p m328p -c arduino -P /dev/ttyUSB0 -b 19200</code></pre>\r\n<p>6.2 output</p>\r\n<pre><code>  avrdude: AVR device initialized and ready to accept instructions\r\n\r\n  Reading | ################################################## | 100%\r\n  0.01s\r\n\r\n  avrdude: Device signature = 0x1e950f (probably m328p)\r\n\r\n  avrdude: safemode: Fuses OK (E:FD, H:DE, L:FF)\r\n\r\n  avrdude done.  Thank you.</code></pre>\r\n<ol start=\"7\" type=\"1\">\r\n<li>things to look out for</li>\r\n</ol>\r\n<p>7.1 permissions issues - arch wiki gentoo</p>\r\n<p>7.2 when you upload this way you overwrite bootloader</p>\r\n<p>7.3 arduino ide boards.txt has some fuse errors</p>\r\n<p>7.4 avrdude version 6.2 will not work</p>\r\n<p>7.5 baud rate using avrdude command line</p>\r\n<p>7.6 capacitor is non-optional, but makes uploading to that board non-trivial</p>\r\n<ol start=\"8\" type=\"1\">\r\n<li>conclusion</li>\r\n</ol>\r\n<p>8.1 upload via icsp vs usb serial</p>\r\n<p>8.2 do you need a bootloader?</p>\r\n<p>8.3 challenge to max out any 8bit microcontroller</p>\r\n<ul>\r\n<li>if you need to do one or two things use a microcontroller i.e. arduino</li>\r\n<li>if you need to do many things use a linux single board computer i.e. raspberry pi</li>\r\n</ul>\r\n',326,91,0,'CC-BY-SA','Arduino,ArduinoISP',0,0,1),
(2801,'2019-04-29','Guitar Set Up Part 1.',1724,'NYbill talks about setting up a guitar.','<p>NYbill talks about setting up a guitar.</p>\r\n<p>Pics for the episode:</p>\r\n<p><a href=\"https://media.gunmonkeynet.net/u/nybill/collection/guitar-set-up/\" class=\"uri\">https://media.gunmonkeynet.net/u/nybill/collection/guitar-set-up/</a></p>\r\n',235,0,0,'CC-BY-SA','Guitar, DIY',0,0,1),
(2804,'2019-05-02','Awk Part 13: Fix-Width Field Processing',381,'In this episode, I discuss how to deal with fix-width field text files using Awk','<h1 id=\"basic-usage\">Basic usage</h1>\r\n<p>Use the <code>FIELDWIDTHS = &quot;n1 n2 n3 ...&quot;</code> annotation in the <code>BEGIN</code> section of an awk command to specify the widths of the fields.</p>\r\n<p>For instance, the following file has widths of 20, 10, and 12 characters.</p>\r\n<pre><code>NAME                STATE     TELEPHONE\r\nJohn Smith          WA        418-311-4111\r\nMary Hartford       CA        319-219-4341\r\nEvan Nolan          IL        219-532-5301\r\nBoris Ratinski      NC        201-553-5555\r\n</code></pre>\r\n<p>Below is an example of processing such a file:</p>\r\n<pre><code>BEGIN  { FIELDWIDTHS = &quot;20 10 12&quot; }\r\nNR &gt; 1 {\r\n    name = $1\r\n    state = $2\r\n    phone = $3\r\n    sub(/ +$/, &quot;&quot;, name)\r\n    sub(/ +$/, &quot;&quot;, state)\r\n    sub(/ +$/, &quot;&quot;, phone)\r\n    printf(&quot;%s lives in %s. The phone number is %s.\\n&quot;, name, state, phone)\r\n}\r\n</code></pre>\r\n<p>Then you can run the command:</p>\r\n<pre><code>awk -f process_fixed_width.awk fixed_width.txt\r\n</code></pre>\r\n',300,94,1,'CC-BY-SA','bash,linux,cli,command-line,awk',0,0,1),
(2807,'2019-05-07','Are bash local variables local?',661,'A lesson on dynamic scope vs lexical scope','<p><a href=\"https://en.wikipedia.org/wiki/Scope_%28computer_science%29\">https://en.wikipedia.org/wiki/Scope_%28computer_science%29</a></p>\r\n<p>In <a href=\"https://hackerpublicradio.org/eps.php?id=2739\">hpr2739</a>, Dave talked briefly about local variables. But what are they?</p>\r\n<p>In most modern languages, especially in compiled languages, &quot;local&quot; means that the value of a variable cannot be directly known, by looking up the name, outside the bounds of that function, but that’s not how it works in bash.</p>\r\n<p>Languages like C and Python have <em>lexical scope</em>. Lexical scope means local variables are local in the <em>text</em>. The names are local.</p>\r\n<p>If I’m writing code that is textually located outside the function, I cannot even describe how to access the variables within the function, because <code>myvariable</code> in my function is not the same variable, not the same place, as <code>myvariable</code> in your function.</p>\r\n<p>Languages like Bash and Elisp have <em>dynamic scope</em>. That means local variables are local in <em>time</em>. The names are global.</p>\r\n<p>What happens when you declare a variable <code>local</code> in bash is that the existing value of that variable is stowed away, to be brought back when your function exits.</p>\r\n<pre><code>#!/usr/bin/env bash\r\nfunction sayscope() {\r\n    echo The scope is $whatsmyscope\r\n}\r\n\r\nfunction globalscope() {\r\n    whatsmyscope=global\r\n}\r\n\r\nfunction dynamicscope() {\r\n    whatsmyscope=dynamic\r\n}\r\n\r\nfunction localscope() {\r\n    local whatsmyscope=local\r\n    sayscope\r\n    dynamicscope\r\n    sayscope\r\n}\r\n\r\nglobalscope\r\nsayscope\r\nlocalscope\r\nsayscope</code></pre>\r\n<pre><code>The scope is global\r\nThe scope is local\r\nThe scope is dynamic\r\nThe scope is global</code></pre>\r\n<p>Perl has both, and it calls them <code>local</code> (dynamic scope, like bash) and <code>my</code> (lexical scope):</p>\r\n<pre><code>#!/usr/bin/env perl\r\nuse v5.10;\r\n\r\nsub sayscope {\r\n    say &quot;Dynamic scope is $whatsmyscope&quot;;\r\n}\r\n\r\nsub globalscope {\r\n    $whatsmyscope=&quot;global&quot;;\r\n}\r\n\r\nsub dynamicscope {\r\n    $whatsmyscope=&quot;dynamic&quot;;\r\n}\r\n\r\nsub lexicalscope {\r\n    my $whatsmyscope=&quot;lexical&quot;;\r\n    say &quot;Lexical scope is $whatsmyscope&quot;;\r\n    sayscope;\r\n}\r\n\r\nsub localscope {\r\n    local $whatsmyscope=&quot;local&quot;;\r\n    sayscope;\r\n    dynamicscope;\r\n    sayscope;\r\n    lexicalscope;\r\n}\r\n\r\nglobalscope;\r\nsayscope;\r\nlocalscope;\r\nsayscope;</code></pre>\r\n<pre><code>Dynamic scope is global\r\nDynamic scope is local\r\nDynamic scope is dynamic\r\nLexical scope is lexical\r\nDynamic scope is dynamic\r\nDynamic scope is global</code></pre>\r\n<p>You almost never want to use <code>local</code> in Perl, it’s mostly there for historical reasons — lexical scope is a Perl 5 feature. <a href=\"https://perl.plover.com/local.html\" class=\"uri\">https://perl.plover.com/local.html</a> covers well the remaining few and narrow exceptions where <code>local</code> might be useful.</p>\r\n<p>As dynamic scope has <em>some</em> valid use, it’s available in some otherwise lexically scoped languages. For example, Common LISP has the <em>special</em> form, and several Schemes and Racket have <em>parameter objects</em>:</p>\r\n<ul>\r\n<li><p><a href=\"https://www.lispworks.com/documentation/HyperSpec/Body/d_specia.htm\" class=\"uri\">https://www.lispworks.com/documentation/HyperSpec/Body/d_specia.htm</a></p></li>\r\n<li><p><a href=\"https://srfi.schemers.org/srfi-39/srfi-39.html\" class=\"uri\">https://srfi.schemers.org/srfi-39/srfi-39.html</a></p></li>\r\n<li><p><a href=\"https://docs.racket-lang.org/reference/parameters.html\" class=\"uri\">https://docs.racket-lang.org/reference/parameters.html</a></p></li>\r\n</ul>\r\n<p>To dig fully into the history and flora of dynamic and lexical scope merits another episode.</p>\r\n\r\n\r\n',311,42,0,'CC-BY-SA','bash, perl, scope, dynamic scope, lexical scope',0,0,1),
(2822,'2019-05-28','What\'s in the Box! Part 1',1265,'NYbill opens a mystery box he found in the mail box.','<p>NYbill opens a mystery box that arrived in the mail.</p>\r\n<p>No spoilers. But, it involves soldering…</p>\r\n<p>Pics for the episode:</p>\r\n<p><a href=\"https://media.gunmonkeynet.net/u/nybill/collection/what-s-in-the-box/\" class=\"uri\">https://media.gunmonkeynet.net/u/nybill/collection/what-s-in-the-box/</a></p>',235,103,0,'CC-BY-SA','DIY, Soldering, Guitar, electronics',0,0,1),
(2823,'2019-05-29','Gentoo and why I use it',748,'I talk about what Gentoo is, and why I love it so much.','<p>Thanks to <a href=\"https://hackerpublicradio.org/correspondents/0342.html\">norrist</a> for suggesting I do this episode!</p>\r\n<ul>\r\n<li><a href=\"https://gentoo.org/\" class=\"uri\">https://gentoo.org/</a></li>\r\n</ul>\r\n',374,0,0,'CC-BY-SA','Gentoo',0,0,1),
(2824,'2019-05-30','Gnu Awk - Part 15',1916,'Redirection of input and output - part 2','<h2 id=\"introduction\">Introduction</h2>\n<p>This is the fifteenth episode of the “<a href=\"https://hackerpublicradio.org/series/0094.html\" title=\"Learning Awk\">Learning Awk</a>” series which is being produced by <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" title=\"Mr. Young\">Mr. Young</a> and myself.</p>\n<p>This is the second of a pair of episodes looking at <em>redirection</em> in Awk scripts.</p>\n<p>In this episode I will spend some time looking at the <code>getline</code> command used for <em>explicit input</em> (as opposed to the usual <em>implicit</em> sort), often with redirection. The <code>getline</code> command is a complex subject which I will cover only relatively briefly. You are directed to the <a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Getline\" title=\"Explicit Input with getline\"><code>getline</code> section</a> of the GNU Awk User’s Guide for the full details.</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=\"hpr2824_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/html_node/index.html\"><em>GNU Awk User’s Guide</em></a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Getline\">Explicit Input with <code>getline</code></a></li>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Plain-Getline\">Using <code>getline</code> with No Arguments</a></li>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Getline_002fCoprocess\">Using <code>getline</code> with a <em>coprocess</em></a></li>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Getline-Notes\">Getline notes</a></li>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Two_002dway-I_002fO\">Two-way I/O</a></li>\n</ul></li>\n</ul>\n<ul>\n<li>Previous shows in this series on HPR:\n<ul>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2114\">“<em>Gnu Awk - Part 1</em>”</a> - episode 2114</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2129\">“<em>Gnu Awk - Part 2</em>”</a> - episode 2129</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2143\">“<em>Gnu Awk - Part 3</em>”</a> - episode 2143</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2163\">“<em>Gnu Awk - Part 4</em>”</a> - episode 2163</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2184\">“<em>Gnu Awk - Part 5</em>”</a> - episode 2184</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2238\">“<em>Gnu Awk - Part 6</em>”</a> - episode 2238</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2330\">“<em>Gnu Awk - Part 7</em>”</a> - episode 2330</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2438\">“<em>Gnu Awk - Part 8</em>”</a> - episode 2438</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2476\">“<em>Gnu Awk - Part 9</em>”</a> - episode 2476</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2526\">“<em>Gnu Awk - Part 10</em>”</a> - episode 2526</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2554\">“<em>Gnu Awk - Part 11</em>”</a> - episode 2554</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2610\">“<em>Gnu Awk - Part 12</em>”</a> - episode 2610</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2804\">“<em>Gnu Awk - Part 13</em>”</a> - episode 2804</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2816\">“<em>Gnu Awk - Part 14</em>”</a> - episode 2816</li>\n</ul></li>\n<li>Resources:\n<ul>\n<li><a href=\"hpr2824_full_shownotes.epub\">ePub version of these notes</a></li>\n<li>Examples: <a href=\"hpr2824_awk15_testdata1\">awk15_testdata1</a>, <a href=\"hpr2824_awk15_ex1.awk\">awk15_ex1.awk</a>, <a href=\"hpr2824_awk15_ex2.awk\">awk15_ex2.awk</a>, <a href=\"hpr2824_awk15_testdata2\">awk15_testdata2</a>, <a href=\"hpr2824_awk15_ex3.awk\">awk15_ex3.awk</a>, <a href=\"hpr2824_awk15_ex4.awk\">awk15_ex4.awk</a>, <a href=\"hpr2824_awk15_ex5.awk\">awk15_ex5.awk</a>, <a href=\"hpr2824_awk15_ex6.awk\">awk15_ex6.awk</a>, <a href=\"hpr2824_awk15_ex7.awk\">awk15_ex7.awk</a></li>\n</ul></li>\n</ul>\n',225,94,1,'CC-BY-SA','Awk utility, Awk Language, gawk, redirection',0,0,1),
(4329,'2025-03-06','Maintaining The Remote System',1016,'How to maintain a remote system that is behind a firewall, has no port forwarding, and unknown ip.','\n<p>\nMaintaining The Remote System</p>\n<p>\n<br>\n</p>\n<p>\nI have renamed the project Libre Indie Archive because the name theindiearchive is already someone else\'s domain. I never would have renamed The Indie Archive but I do think that Libre Indie Archive is more descriptive, hence, better.</p>\n<p>\n<br>\n</p>\n<p>\nI am getting close to a pre beta push up to codeberg. Anyone following along who wants to help test, you can do this with two or three old systems. Let me know. Email hairylarry@gmail.com or on Mastodon I am @hairylarry@gamerplus.org.</p>\n<p>\n<br>\n</p>\n<p>\nI have decided to develop and document for Xubuntu first and here\'s the reasons why.</p>\n<p>\n<br>\n</p>\n<p>\nI bought an older HP small form factor office system with 4 Gigabytes of ram.</p>\n<p>\n<br>\n</p>\n<p>\nHP Compaq 4000 Pro Pentium Dual-Core E6600 3.06GHz 4GB RAM </p>\n<p>\n<br>\n</p>\n<p>\nThirty dollars on ebay with shipping and taxes.</p>\n<p>\n<br>\n</p>\n<p>\nI was testing Libre Indie Archive on it. Because of the age of the system Ubuntu wouldn\'t install. I tested it with some BSD systems and installed Indie Archive without a GUI. Ghost BSD didn\'t install but Midnight BSD did install so I used the Midnight BSD GUI and installed Indie Archive. None of this was easy for me because I\'m a BSD newb and unless you already use BSD I can\'t recommend it for Libre Indie Archive. Remember, not all indie producers are computer programmers, and I want Indie Archive to work for those producers as well as for the computer savvy.</p>\n<p>\n<br>\n</p>\n<p>\nThen on a whim I thought I would try the Xubuntu 24.04 distro and it installed no problems. Thanks XFCE for keeping it light.</p>\n<p>\n<br>\n</p>\n<p>\nThe other reason I am developing and documenting for Xubuntu is that I can use the Xubuntu install document and install on Ubuntu or Debian with only minor differences. I know because I tried it. This is probably also true for other Debian and Ubuntu derived distributions.</p>\n<p>\n<br>\n</p>\n<p>\nSo, if you want to help, you could take the Xubuntu install document and see if it works on other distributions. Write down what you had to change and let me know. I plan on making an install checklist out of the install document and it would be great to have a checklist with the actual commands for several distributions.</p>\n<p>\n<br>\n</p>\n<p>\nSo, that was the intro. Now on to the topic. </p>\n<p>\n<br>\n</p>\n<p>\nI am planning on installing remotenear and remotefar systems, remotenear being a short drive away (or maybe in your home if your studio is not in your home, like mine) and the remotefar further away to avoid losing data in the case of a regional catastrophe like flood, fire, tornado, or hurricane.</p>\n<p>\n<br>\n</p>\n<p>\nStill even a short drive is not what I want to do any time there might be something I need to check on a remote system so I have devised a way to manage it from the secondary system.</p>\n<p>\n<br>\n</p>\n<p>\nWhen a remote system is delivered to a new location it will be headless. No monitor, no keyboard, and no mouse. At the remote location it is plugged into a UPS and attached to the network with an ethernet cable and attached to the UPS with a usb cable. Then it is turned on.</p>\n<p>\n<br>\n</p>\n<p>\nEven without a keyboard or a mouse there is still some local control of the system available. As part of the remote system install we go into the power management settings and next to \"when power button is pressed\" we select shutdown.</p>\n<p>\n<br>\n</p>\n<p>\nSo, a short press on the power button initiates a Xubuntu shutdown just like the shutdown that you get from the menu or Alt F4.</p>\n<p>\n<br>\n</p>\n<p>\nIf that doesn\'t work a long press of the power button will turn the system off. This is like unplugging the system or losing power and is not recommended but Xubuntu will rebuild the file structure when the system is restarted.</p>\n<p>\n<br>\n</p>\n<p>\nAnd if you do lose power the UPS will send a signal to the computer shutting it down with a controlled shutdown, just like a short press of the power button or a shutdown from the menu.</p>\n<p>\n<br>\n</p>\n<p>\nI would like to carry this one step further and enable automatic power up for the computer. A quick search shows cyberpower PowerPanel software for linux. Also you can set a power restore function in the BIOS to restart the system when the power is restored. I just checked and this worked on my little HP.</p>\n<p>\n<br>\n</p>\n<p>\nSo ... with just the power button and an attached UPS you can get both manual and automatic control of shutting the remote system down and restarting it.</p>\n<p>\n<br>\n</p>\n<p>\nPretty cool for a rather sparse interface.</p>\n<p>\n<br>\n</p>\n<p>\nIf you know more about how to set this up please let me know. There\'s a big jump between doing a search to see if something is possible and actually implementing it.</p>\n<p>\n<br>\n</p>\n<p>\nOkay, that was the easy part. Now for the fun part.</p>\n<p>\n<br>\n</p>\n<p>\nFirst off, the remote system is probably not going to be at your place but at the home or business of friends or family. And they probably don\'t have a static IP, and they may not be able to implement port forwarding in their router, and they may not be able to control their firewall.</p>\n<p>\n<br>\n</p>\n<p>\nSo we can\'t go, \"I\'ll just ssh in when I need to fix a problem\". And you don\'t really want to change their setup anyway because all of the above add to their security risk.</p>\n<p>\n<br>\n</p>\n<p>\nAlso their router undoubtedly gives dynamic IP addresses so we want the remote system to use that because when we are setting it up we might not even know what subnet their LAN uses.</p>\n<p>\n<br>\n</p>\n<p>\nBut, at the same time it doesn\'t make any sense at all to try to maintain a remote system that you can\'t log into.</p>\n<p>\n<br>\n</p>\n<p>\nSo, the tool for setting up a terminal session on the remote system is called a remote tunnel reverse shell. The remote system is already connecting to the secondary system with rsync ssh when the cron job fires off every day to update the files. So, the secondary system is running an ssh server and the remote system has the public key that allows access without entering a password.</p>\n<p>\n<br>\n</p>\n<p>\nThere are two parts to setting up a remote tunnel reverse shell. The secondary system has to be listening for the remote system on a port, I use port 7070. And then the remote system runs a bash command with the -i parameter that means reverse shell, and with the port, 7070.</p>\n<p>\n<br>\n</p>\n<p>\nI\'m using nc to set up the listener.</p>\n<p>\n<br>\n</p>\n<p>\nnc -lvnp 7070</p>\n<p>\n<br>\n</p>\n<p>\n-l is --listen</p>\n<p>\n<br>\n</p>\n<p>\n-v is --verbose</p>\n<p>\n<br>\n</p>\n<p>\n-n means the port is restricted to numeric values.</p>\n<p>\n<br>\n</p>\n<p>\n-p is --port</p>\n<p>\n<br>\n</p>\n<p>\n7070 is the port</p>\n<p>\n<br>\n</p>\n<p>\nI chose the port number, 7070. You can use any available port but the listener has to use the same port as the remote system uses in the bash call.</p>\n<p>\n<br>\n</p>\n<p>\nWhich is this.</p>\n<p>\n<br>\n</p>\n<p>\nbash -i &gt;&amp; /dev/tcp/your-static-ip-from-your-isp/7070 0&gt;&amp;1</p>\n<p>\n<br>\n</p>\n<p>\nThis is the order of events.</p>\n<p>\n<br>\n</p>\n<p>\nOn the secondary system I start listening.</p>\n<p>\n<br>\n</p>\n<p>\nnc -lvnp 7070</p>\n<p>\n<br>\n</p>\n<p>\nThen a script runs on the remote system.</p>\n<p>\n<br>\n</p>\n<p>\nbash -i &gt;&amp; /dev/tcp/your-static-ip-from-your-isp/7070 0&gt;&amp;1</p>\n<p>\n<br>\n</p>\n<p>\nAnd then a command prompt opens up in the terminal on the secondary system that\'s listening. And you are logged into the remote system and you can look around and check things out and even move or delete files until you exit.</p>\n<p>\n<br>\n</p>\n<p>\nExcept it didn\'t work.</p>\n<p>\n<br>\n</p>\n<p>\nOf course not, nothing ever works the first time.</p>\n<p>\n<br>\n</p>\n<p>\nTwo other things have to be changed that we\'re going to talk about now, the firewall and port forwarding.</p>\n<p>\n<br>\n</p>\n<p>\nThese things are already discussed in install.txt because we had to fix the firewall and port forwarding for the remote system to log into the secondary system to pick up the new files.</p>\n<p>\n<br>\n</p>\n<p>\nTo set up port forwarding, log into your router from a browser attached to the router. Like, for instance, a browser on your secondary system.</p>\n<p>\n<br>\n</p>\n<p>\nYou open the browser and type into the address bar, 192.168.1.1</p>\n<p>\n<br>\n</p>\n<p>\nWhich is right most of the time. On my setup I type 192.168.2.1 because the isp\'s router uses the 192.168.1 subnet.</p>\n<p>\n<br>\n</p>\n<p>\nHow do I know which to use???</p>\n<p>\n<br>\n</p>\n<p>\nThis also is covered in install.txt because to connect from the primary system to the secondary system I have to connect to the static ip that I assigned to the secondary system.</p>\n<p>\n<br>\n</p>\n<p>\nSo my primary system has the static ip 192.168.2.11 and my secondary system has the static ip 192.168.2.12 which allows me to ssh into the secondary system from the primary system.</p>\n<p>\n<br>\n</p>\n<p>\nAnd this means my router is at 192.168.2.1</p>\n<p>\n<br>\n</p>\n<p>\nYour router is likely at 192.168.1.1 because that\'s the most common LAN subnet.</p>\n<p>\n<br>\n</p>\n<p>\nAnyway, in the browser I open the router\'s control console and then I have to enter the password. If you don\'t know what it is you have to find out and write it down.</p>\n<p>\n<br>\n</p>\n<p>\nCheck what the defaults are for your router by searching on the internet. The defaults might work.</p>\n<p>\n<br>\n</p>\n<p>\nIf they do change your login and password and write them down! Do not leave your router defaults in place. That\'s a big security risk.</p>\n<p>\n<br>\n</p>\n<p>\nAfter you\'re logged into the control console check around in the menus for Port Forwarding.</p>\n<p>\n<br>\n</p>\n<p>\nI already had to do this to make ssh work from the remote system to the secondary system. In that case I had to forward port 22 (the ssh port) from the internet to the secondary system. Here\'s how that works.</p>\n<p>\n<br>\n</p>\n<p>\nOn the remote system I type.</p>\n<p>\n<br>\n</p>\n<p>\nssh indiearchive@your-static-ip-from-your-isp</p>\n<p>\n<br>\n</p>\n<p>\nSince it\'s coming in as ssh that means the router sees port 22.</p>\n<p>\n<br>\n</p>\n<p>\nThe router checks the port forwarding table and sees that incoming traffic using port 22 should go to the secondary system, in my case 192.168.2.12</p>\n<p>\n<br>\n</p>\n<p>\nSo the incoming ssh goes to the secondary system which is my ssh server. What a coincidence.</p>\n<p>\n<br>\n</p>\n<p>\nSo in order to use port 7070 to open a tunnel from the remote system to the secondary system I have to add a row to the port forwarding table with 7070 as the port and 192.168.2.12 as the ip. Except on your LAN the ip address may be different.</p>\n<p>\n<br>\n</p>\n<p>\nExcept it doesn\'t work.</p>\n<p>\n<br>\n</p>\n<p>\nI bet you guessed why. It\'s the firewall.</p>\n<p>\n<br>\n</p>\n<p>\nOn the secondary system type.</p>\n<p>\n<br>\n</p>\n<p>\nsudo ufw status</p>\n<p>\n<br>\n</p>\n<p>\nIt should show you that port 22 is allowed because otherwise you wouldn\'t be getting ssh traffic.</p>\n<p>\n<br>\n</p>\n<p>\nIt probably won\'t show you that port 7070 is allowed. So type.</p>\n<p>\n<br>\n</p>\n<p>\nsudo ufw allow 7070</p>\n<p>\n<br>\n</p>\n<p>\nThen check the status again and see if it shows 7070.</p>\n<p>\n<br>\n</p>\n<p>\nHere\'s a nice firewall link with instructions.</p>\n<p>\n<br>\n</p>\n<p>\nhttps://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands</p>\n<p>\n<br>\n</p>\n<p>\nIt still might not work even though it should. Why? Operator error. You may have typed 7000 instead of 7070. (I did that.) Or any other little typo in any of the commands.</p>\n<p>\n<br>\n</p>\n<p>\nWhen this works you are ready to test the reverse shell. The remote system can ssh into the secondary system and we have added port 7070 to the port forwarding table on the router and to the firewall on the secondary system.</p>\n<p>\n<br>\n</p>\n<p>\nThis is great!</p>\n<p>\n<br>\n</p>\n<p>\nBut how do I know when to listen and how do I get the remote system to issue the bash command that sets up the reverse shell? Remember, in the future the remote system is going to be sitting somewhere with no monitor, keyboard, or mouse.</p>\n<p>\n<br>\n</p>\n<p>\nOnly computer programmers are required to remember the future.</p>\n<p>\n<br>\n</p>\n<p>\nAfter all that setup, here\'s the clever bit.</p>\n<p>\n<br>\n</p>\n<p>\nI have a text file on the secondary system named letmein.txt and it\'s a flag with two values. The text file either reads yes or no.</p>\n<p>\n<br>\n</p>\n<p>\nIf it reads yes it means I\'m here at the secondary system and I want to log into the remote system. If it reads no. Not so much. I\'m not really trying to log in to the remote system at all.</p>\n<p>\n<br>\n</p>\n<p>\nThe remote system has ssh access to the secondary system since that\'s the way it picks up the new files, with rsync ssh. So the remote system can use rsync to copy the letmein.txt file over to it\'s hard drive. And it does this every five minutes, with a cron job.</p>\n<p>\n<br>\n</p>\n<p>\nOn the remote system type sudo -s to become root.</p>\n<p>\n<br>\n</p>\n<p>\ncrontab -e to edit the root crontab.</p>\n<p>\n<br>\n</p>\n<p>\nAdd this line</p>\n<p>\n<br>\n</p>\n<p>\n*/5 * * * * /home/indiearchive/check.sh</p>\n<p>\n<br>\n</p>\n<p>\nEvery 5 minutes the remote system runs check.sh which grabs the letmein.txt file and checks to see if it says yes or no. If it says yes it starts the reverse shell, assuming I remembered to start listening to port 7070 on the secondary system.</p>\n<p>\n<br>\n</p>\n<p>\nAfter I\'m done working on the remote system while sitting at the secondary system I type exit to close the remote terminal and come back to the terminal on the secondary system. If I forgot to do something I can start listening again but if I\'m done I edit letmein.txt to say no and the remote system will quit trying to set up a reverse shell every 5 minutes.</p>\n<p>\n<br>\n</p>\n<p>\nBut wait! There\'s more.</p>\n<p>\n<br>\n</p>\n<p>\nEmail notifications.</p>\n<p>\n<br>\n</p>\n<p>\nI set up email notifications with mailersend for file integrity reports using curl.</p>\n<p>\n<br>\n</p>\n<p>\nTo do that I wrote a script called send.sh that takes a file name as an argument and then sends me an email with the contents of the file in the body of the email. So when I run my file integrity program if the log files are larger than they should be, it means there is a discrepancy and that log file gets emailed to me so I can check things out. (Maybe with my remote tunnel reverse shell.)</p>\n<p>\n<br>\n</p>\n<p>\nI also check diskspace with df and send a disk space report.</p>\n<p>\n<br>\n</p>\n<p>\nUsing send.sh when I run check.sh and detect a yes in letmein.txt I call send.sh with letmein.txt as the parameter and I get an email that says yes, meaning the remote system is trying to set up a reverse shell.</p>\n<p>\n<br>\n</p>\n<p>\nSo if I change letmein.txt to yes on the secondary system and I wait five or ten minutes without getting notified I may just have to make a call.</p>\n<p>\n<br>\n</p>\n<p>\nMaybe the nice people who are hosting my remote system have lost power. Or internet. Or maybe they will have to push a button. If that doesn\'t work I may have to make a trip. I hope it\'s remotenear and not remotefar.</p>\n<p>\n<br>\n</p>\n<p>\nSo when I was testing the email notifications part of check.sh and fiddling around with the code all of a sudden I quit getting notifications at all. I learned a lot about bash scripting trying to figure out what I did wrong and it turned out it wasn\'t me.</p>\n<p>\n<br>\n</p>\n<p>\nAfter I sent myself numerous emails saying yes from a weird email address gmail decided they were spam. So I went into my spam folder and marked the notification email as not spam. That fixed it for me but if you are setting up email notifications for Libre Indie Archive or for anything be sure you white list the email address so that the email powers that be don\'t suddenly decide that your notifications are spam and you quit getting important notifications.</p>\n<p>\n<br>\n</p>\n<p>\nIn gmail you set up a filter entry with the notifier\'s email address and set the action to be \"Never send it to Spam\".</p>\n<p>\n<br>\n</p>\n<p>\nBecause getting these emails is important. First they remind me to have the secondary system listen. Then they remind me to change letmein.txt from yes to no after I\'m done with the remote terminal. And while you\'re changing letmein.txt to no make sure the listener is off. Leaving it listening for an extended period of time is a security risk.</p>\n<p>\n<br>\n</p>\n<p>\nSo there\'s a lot of little moving parts involved in this. Kind of complicated but still fascinating.</p>\n<p>\n<br>\n</p>\n<p>\nAlmost done.</p>\n<p>\n<br>\n</p>\n<p>\nI didn\'t think this would be so long and now I\'m exhausted. I am including slightly redacted and well commented copies of check.sh and send.sh in the show notes which will be on Hacker Public Radio and on my Delta Boogie Network-Gamer+ blog at home.gamerplus.org.</p>\n<p>\n<br>\n</p>\n<p>\nAs always, I appreciate your comments.</p>\n<p>\n<br>\n</p>\n<p>\nThanks</p>\n<p>\n<br>\n</p>\n\n\n',436,25,0,'CC-BY-SA','remote, tunnel, reverse, shell, bash, rsync, ssh, archival, libre, indie, archive',0,0,1),
(2809,'2019-05-09','The Blue Oak Model License and Its One Big Gotcha',1268,'Introducing and examining a new and elegant permissive software license.','<p>The Blue Oak Model License 1.0.0 was just released this month. In this episode I read the license, explain where it sits in among other software licenses, and enumerate some of the problems it purports to solve.</p>\r\n<p>I’m no legal expert, so take all of this as sort of a rough introduction to the license.</p>\r\n<p>Overall, if you are looking at permissive (vs copyleft) licenses, I would strongly suggest you consider this license! It’s concise, robust, it was developed by credible people, and gives your users future-proof safety from a number of common legal traps.</p>\r\n<p>However: just note that it has a feature, some would say bug, that <em>might</em> be a big deciding factor in whether you feel comfortable with it (listen for details)</p>\r\n<p>Nevertheless, I believe this license, or at least its style of language, will soon become extremely common.</p>\r\n<p>Further links:</p>\r\n<ul>\r\n<li><a href=\"https://blueoakcouncil.org/license/1.0.0\">The Blue Oak Model License 1.0.0</a> — the license itself. You may also wish to read <a href=\"https://blueoakcouncil.org/2019/03/06/model.html\">the group’s statement</a> about their methodology and how the license came to be.</li>\r\n<li><a href=\"https://writing.kemitchell.com/2019/03/09/Deprecation-Notice.html\"><em>Deprecation Notice: MIT and BSD</em></a> — the blog post I mention in the recording, by Blue Oak council member, developer and IP lawyer Kyle Mitchell. He explains some problems he sees with the MIT and BSD licenses and how the BOML addresses them.</li>\r\n<li><a href=\"https://news.ycombinator.com/item?id=19347797\">Discussion on Hacker News</a> — This was a pretty good discussion. Kyle Mitchell also chimed in here to respond to some criticisms and tire-kicking of this license (you can recognize him by his handle <code>kemitchell</code>).</li>\r\n</ul>\r\n<p>Not mentioned in the recording: One thing that caused me a bit of confusion at first was the term “attribution”. Kyle and the Blue Oak folks use this term mainly to talk about <em>license terms</em>, not <em>authorship</em> or <em>credit</em>. So for them an attribution requirement is a requirement to include the <em>license terms</em> with any distributed copies, not a requirement to give authorship credit to people.</p>\r\n<p>If you want to use this license as a starting point for your own “bespoke” license, you can! As I mention in the recording, I created my own variant of the Blue Oak license for one of my own projects. My main change was a strong requirement for downstream users to give credit to upstream contributors—not just when redistributing source code, but in all published software, books and websites created with the software!</p>\r\n<ul>\r\n<li><a href=\"https://thelocalyarn.com/cgi-bin/yarncode/doc/licensing/LICENSE.md\">The Local Yarn License 1.0.0</a> — This is the license as it currently sits in an experimental branch in my project’s Fossil repository</li>\r\n<li><a href=\"https://thelocalyarn.com/cgi-bin/yarncode/technote/8dfa234a1779782be090b36a6b1bcccfabd95b20\">Notes about my customizations</a> — Another tech note from the Fossil repo.</li>\r\n</ul>\r\n<p>Of course, when you make your own changes, you had better think hard about them, and if possible, get the advice of an Actual Lawyer who can discuss your particular situation.</p>\r\n',376,0,0,'CC-BY-SA','legal, licensing',0,0,1),
(2812,'2019-05-14','Is 5G mobile data a danger to your health?',484,'Apply Betteridge’s Law of Headlines to find out the answer','<p>This is mostly verbatim from my Fediverse post <a href=\"https://libranet.de/display/0b6b25a8-165c-9c7f-b55d-c7a077813050\" class=\"uri\">https://libranet.de/display/0b6b25a8-165c-9c7f-b55d-c7a077813050</a>, with a few minor edits.</p>\r\n<p>The anti-5G campaign has been cooking for many years now, and at the epicenter of it all are two men, Lennart Hardell and Rainer Nyberg. It’s a Swedish-Finnish phenomenon that is now really making the rounds and spreading internationally, as actual commercial deployment of 5G networks draws nearer.</p>\r\n<p>As a Swede, I apologize. These two do not represent the Swedish or Finnish cancer or radiation research community, and our media have given them far more space in the public discourse than their work merits.</p>\r\n<p>They are heavily quoted in networks of pseudoscience, including anti-vaccine sites, right-wing &quot;alternative facts&quot; sites and Strålskyddsstiftelsen (&quot;Swedish Radiation Protection Foundation&quot;), a private foundation created in 2012 with a deceptive name meant to invoke authority, which has had to be corrected on multiple occasions by the actual Swedish Radiation Safety Authority, Strålskyddsmyndigheten.</p>\r\n<p>Strålskyddsstiftelsen received the 2013 &quot;Misleader of the Year&quot; award from the main Swedish scientific skeptics\' society, Vetenskap och Folkbildning (&quot;Science and Public Education&quot;) for &quot;[their fearmongering propaganda and biased reporting on the health effects of mobile telephony use and wireless networks]&quot;.</p>\r\n<p><a href=\"https://www.vof.se/utmarkelser/tidigare-utmarkelser/aretas-forvillare-2013/\" class=\"uri\">https://www.vof.se/utmarkelser/tidigare-utmarkelser/aretas-forvillare-2013/</a> (in Swedish)</p>\r\n<p>These networks are part of a feedback loop where they get media attention, politicians pick up on their claims and use them to invoke the precautionary principle and get precautionary regulation in place, or judges rule based on the claims, which then gets quoted by these entities as evidence that they were right all along.</p>\r\n<p>They make it very hard to find factual information on whether millimeter-wavelength radiation actually has any different effect from the centimeter-wavelength radiation that we have been using for over two decades without any documented harmful effects, because wherever you look you just find these sites claiming that we have definitely had adverse health effects for the last two decades and the new frequency bands will definitely be far worse.</p>\r\n<p>When you dig deeper into the claims on these sites you find a handful of cherry-picked articles, leading back to the two men mentioned at the top, to studies with flawed methodology like self-reported surveys on mobile telephony use among cancer patients, or to the pseudoscience/media/politics/law feedback loop. And it’s all about centimeter waves, which simply have shown no conclusive sign of increasing brain cancers or any other adverse health effect related to the radiation. For every positive report made you can find one that reports brain cancer fell as we introduced mobile phones. There is a massive body of data, and if the signal were there, we would have seen it by now.</p>\r\n<p>I’m no cancer researcher, but neither is Rainer Nyberg, he’s a retired professor in pedagogy. He’s a concerned citizen. <a href=\"https://en.wikipedia.org/wiki/Lennart_Hardell\" class=\"uri\">https://en.wikipedia.org/wiki/Lennart_Hardell</a> is an actual oncologist and professor who has studied carcinogens, but his research results on the wireless/cancer connection have been dismissed as &quot;non-informative&quot;, &quot;post hoc&quot;, &quot;barely statistically significant&quot; and &quot;flawed&quot; by his peers. There is nothing there.</p>\r\n<p>We know that high-voltage 16.7 Hz fields increase the risk for leukemia in train drivers, but we don’t know why. I am open to the possibility that 20-50 GHz waves have different consequences from 2 GHz waves, but I’d have to hear it from a credible source.</p>\r\n<p>Straight up DNA mutation is out the window, and that’s one of the centerpoints of these campaigns. This is still frequencies below visual light, it’s not ionizing radiation. No plausible mechanism has been suggested, and there is no clear data on any adverse effects.</p>\r\n<p>We use millimeter waves for the full body scans in US airports. Surely the effects of those have been studied? The top search results go to truthaboutcancer and infowars and similar names I won’t even bother to click. I don’t want to read another article about how all cancer research after 1950 has been wrong, we should all just eat chalk to balance our acidity, and cancer is a fungus.</p>\r\n<p>Apart from the pseudoscience sites I found one paper on the first search results page, concluding that X-ray backscatter scanners have well-known risks, but radiation levels are far below safety standards, both for passengers and for security staff, and also below the background radiation exposure while flying, and millimeter-wave scanners, while an &quot;alarmingly small amount of information about its potential health effects&quot; is available, &quot;The established health effects associated with non-ionizing radiation are limited to thermal effects&quot; and &quot;these scanners operate at outputs well below those required to produce tissue heating&quot;, that is, we currently don’t know of a way millimeter waves might be harmful: <a href=\"https://www.sciencedirect.com/science/article/pii/S1687850714000168\" class=\"uri\">https://www.sciencedirect.com/science/article/pii/S1687850714000168</a> (<a href=\"https://doi.org/10.1016/j.jrras.2014.02.005\" class=\"uri\">https://doi.org/10.1016/j.jrras.2014.02.005</a>)</p>\r\n<p>For a guide on how to spot pseudoscience and how to read scientific papers, see ahuka’s excellent <a href=\"https://hackerpublicradio.org/eps.php?id=2695\">hpr2695: Problems with Studies</a>.</p>\r\n<p><a href=\"https://en.wikipedia.org/wiki/Betteridge%27s_Law_of_Headlines\">https://en.wikipedia.org/wiki/Betteridge%27s_Law_of_Headlines</a></p>',311,0,0,'CC-BY-SA','5g, health, radiation, pseudoscience',0,0,1),
(2818,'2019-05-22','Writing Web Game in Haskell - Science, part 1',2606,'Tuula explains types and data they used to model science in their Haskell game','<h2 id=\"background\">Background</h2>\r\n<p>This is rather large topic, so I split it in two episodes. Next one should follow in two weeks if everything goes as planned. First part is about modeling research, while second part concentrates on how things change over time.</p>\r\n<p>There’s three types of research: engineering, natural sciences and social sciences. Research costs points that are produced by various buildings.</p>\r\n<h2 id=\"implementation\">Implementation</h2>\r\n<p>There’s three database tables, which are defined below:</p>\r\n<pre><code>CurrentResearch\r\n    type Technology\r\n    progress Int\r\n    factionId FactionId\r\n\r\nAvailableResearch\r\n    type Technology\r\n    category TopResearchCategory\r\n    factionId FactionId\r\n\r\nCompletedResearch\r\n    type Technology\r\n    level Int\r\n    factionId FactionId\r\n    date Int</code></pre>\r\n<h2 id=\"data-types\">Data types</h2>\r\n<p><code>Technology</code> is enumeration of all possible technologies. Knowing these enable player to build specific buildings and space ships, enact various laws and so on. In the end this will be (hopefully) large list of technologies.</p>\r\n<pre><code>data Technology =\r\n    HighSensitivitySensors\r\n    | SideChannelSensors\r\n    | HighTensileMaterials\r\n    | SatelliteTechnology\r\n    | BawleyHulls\r\n    | SchoonerHulls\r\n    | CaravelHulls\r\n    ...\r\n    deriving (Show, Read, Eq, Enum, Bounded, Ord)</code></pre>\r\n<p>All research belong to one of the top categories that are shown below:</p>\r\n<pre><code>data TopResearchCategory =\r\n    Eng\r\n    | NatSci\r\n    | SocSci\r\n    deriving (Show, Read, Eq, Ord)</code></pre>\r\n<p><code>ResearchCategory</code> is more fine grained division of research. Each of the categories is further divided into sub-categories. Only <code>EngineeringSubField</code> is shown below, but other two are similarly divided.</p>\r\n<pre><code>data ResearchCategory =\r\n    Engineering EngineeringSubField\r\n    | NaturalScience NaturalScienceSubField\r\n    | SocialScience SocialScienceSubField\r\n    deriving (Show, Read, Eq)\r\n\r\ndata EngineeringSubField =\r\n    Industry\r\n    | Materials\r\n    | Propulsion\r\n    | FieldManipulation\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p><code>ResearchScore</code> is measure of how big some research is. It has type parameter <code>a</code> that is used to further quantify what kind of <code>ResearchScore</code> we’re talking about.</p>\r\n<pre><code>newtype ResearchScore a = ResearchScore { unResearchScore :: Int }\r\n    deriving (Show, Read, Eq, Ord, Num)</code></pre>\r\n<p><code>TotalResearchScore</code> is record of three different types of researches. I’m not sure if I should keep it as a record of three fields or if I should change it so that only one of those values can be present at any given time.</p>\r\n<pre><code>data TotalResearchScore a = TotalResearchScore\r\n    { totalResearchScoreEngineering :: ResearchScore EngineeringCost\r\n    , totalResearchScoreNatural :: ResearchScore NaturalScienceCost\r\n    , totalResearchScoreSocial :: ResearchScore SocialScienceCost\r\n    }\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>Following singleton values are used with <code>ResearchScore</code> and <code>TotalResearchScore</code> to quantify what kind of value we’re talking about.</p>\r\n<pre><code>data EngineeringCost = EngineeringCost\r\n    deriving (Show, Read, Eq)\r\n\r\ndata NaturalScienceCost = NaturalScienceCost\r\n    deriving (Show, Read, Eq)\r\n\r\ndata SocialScienceCost = SocialScienceCost\r\n    deriving (Show, Read, Eq)\r\n\r\ndata ResearchCost = ResearchCost\r\n    deriving (Show, Read, Eq)\r\n\r\ndata ResearchProduction = ResearchProduction\r\n    deriving (Show, Read, Eq)\r\n\r\ndata ResearchLeft = ResearchLeft\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>Finally there’s <code>Research</code>, which is a record that uses many of the types introduced earlier. It describes what <code>Technology</code> is unlocked upon completion, what’s the cost is and if there are any technologies that have to have been researched before this research can start. The tier of research isn’t currently used for anything, but I have vague plans what to do about it in the future.</p>\r\n<pre><code>data Research = Research\r\n    { researchName :: Text\r\n    , researchType :: Technology\r\n    , researchCategory :: ResearchCategory\r\n    , researchAntecedents :: [Technology]\r\n    , researchCost :: TotalResearchScore ResearchCost\r\n    , researchTier :: ResearchTier\r\n    }\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<h2 id=\"tech-tree\">Tech tree</h2>\r\n<p>Putting all this together, we can define a list of <code>Research</code>. Since finding an entry from this list based on research type of it is such a common operation, we also define another data structure for this specific purpose. <code>Map</code> in other programming languages is often known as dictionary, associative array or hash map. It stores key-value - pairs. In our case <code>Technology</code> is used as key and <code>Research</code> as value. We define it based on the list previously defined:</p>\r\n<pre><code>techMap :: Map.Map Technology Research\r\ntechMap = Map.fromList $ (\\x -&gt; (researchType x, x)) &lt;$&gt; unTechTree techTree</code></pre>\r\n<p>Next time we’ll look into how to actually use all these types and data that were defined.</p>\r\n',364,107,0,'CC-BY-SA','Haskell',0,0,1),
(2811,'2019-05-13','Interview with Alan Pope',5387,'In this episode, Yannick talks with Alan Pope about snaps, snapcraft and all things related','<p>A few years ago, when you wanted to install a package on your Linux system, you had to grab the source code, and the nightmare began. But nowadays, this is over. You have deb files, and snaps, and flatpacks, and many other package formats available. On this episode, I was joined by Alan Pope, from Canonical, to talk about one of them in particular : snaps.</p>',370,78,0,'CC-BY-SA','ubuntu, snap, snapcraft, flatpack, linux, appimage, alan pope, popey',0,0,1),
(3066,'2020-05-04','HPR Community News for April 2020',2508,'Dave talks about shows released and comments posted in April 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/0386.html\" target=\"_blank\">DanNixon</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=3043\" target=\"_blank\">3043</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-04-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3043\" target=\"_blank\">How I record for HPR</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=3044\" target=\"_blank\">3044</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-04-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3044\" target=\"_blank\">mocp snooze tip</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=3045\" target=\"_blank\">3045</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-04-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3045\" target=\"_blank\">OSS compliance with privacy by default and design</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=3046\" target=\"_blank\">3046</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-04-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3046\" target=\"_blank\">HPR Community News for March 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=3047\" target=\"_blank\">3047</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-04-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3047\" target=\"_blank\">The COVID-19 Work From Home Stream - Day 1</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=3048\" target=\"_blank\">3048</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-04-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3048\" target=\"_blank\">Alternatives to toilet paper</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=3049\" target=\"_blank\">3049</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-04-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3049\" target=\"_blank\">What computers taught me about reality</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=3050\" target=\"_blank\">3050</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-04-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3050\" target=\"_blank\">Linux Inlaws S01E04 What\'s in a name</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=3051\" target=\"_blank\">3051</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-04-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3051\" target=\"_blank\">The COVID-19 Work From Home Stream - Day 2</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=3052\" target=\"_blank\">3052</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-04-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3052\" target=\"_blank\">Locating computers on a network</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=3053\" target=\"_blank\">3053</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-04-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3053\" target=\"_blank\">AudioBookClub 17 - Blood Witness</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0157.html\" target=\"_blank\">HPR_AudioBookClub</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3054\" target=\"_blank\">3054</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-04-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3054\" target=\"_blank\">Coronavirus Thoughts</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=3055\" target=\"_blank\">3055</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-04-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3055\" target=\"_blank\">Advice to new Fediverse administrators and developers</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=3056\" target=\"_blank\">3056</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-04-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3056\" target=\"_blank\">Jitsi</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=3057\" target=\"_blank\">3057</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-04-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3057\" target=\"_blank\">Formal verification with Coq</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3058\" target=\"_blank\">3058</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-04-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3058\" target=\"_blank\">The COVID-19 Work From Home Stream - Day 3</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=3059\" target=\"_blank\">3059</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-04-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3059\" target=\"_blank\">A quick intro to Snapcast</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0386.html\" target=\"_blank\">DanNixon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3060\" target=\"_blank\">3060</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-04-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3060\" target=\"_blank\">Running a local imap server</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=3061\" target=\"_blank\">3061</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-04-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3061\" target=\"_blank\">Parental Controls With Mike Ivy</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=3062\" target=\"_blank\">3062</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-04-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3062\" target=\"_blank\">Vassal: How to play board games while remote</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=3063\" target=\"_blank\">3063</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-04-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3063\" target=\"_blank\">Pens, pencils, paper and ink - 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3064\" target=\"_blank\">3064</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-04-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3064\" target=\"_blank\">How I got started in Electronics</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 24 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 4 comments on\n3 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3027#comments\" target=\"_blank\">hpr3027</a></strong>\n(2020-03-10) \"<em>What is quantum computing and why should we care?</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0379.html\" target=\"_blank\">mightbemike</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3027#1\" target=\"_blank\">Comment 1</a>:\nMongo on 2020-04-04:\n\"very interesting talk\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3032#comments\" target=\"_blank\">hpr3032</a></strong>\n(2020-03-17) \"<em>piCore on a Raspberry Pi 1 Model B</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0152.html\" target=\"_blank\">Claudio Miranda</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3032#2\" target=\"_blank\">Comment 2</a>:\nclacke on 2020-04-15:\n\"Re: Tiny Core maintainer name\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3032#3\" target=\"_blank\">Comment 3</a>:\nclacke on 2020-04-18:\n\"Ridiculously tiny really\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3034#comments\" target=\"_blank\">hpr3034</a></strong>\n(2020-03-19) \"<em>How to bridge Freenode IRC rooms to Matrix.org</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3034#2\" target=\"_blank\">Comment 2</a>:\nclacke on 2020-04-12:\n\"appservice-irc\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 20 comments on 9 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3043#comments\" target=\"_blank\">hpr3043</a></strong>\n(2020-04-01) \"<em>How I record for HPR</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=3043#1\" target=\"_blank\">Comment 1</a>:\nthelovebug on 2020-04-02:\n\"Bass and Treble\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3046#comments\" target=\"_blank\">hpr3046</a></strong>\n(2020-04-06) \"<em>HPR Community News for March 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=3046#1\" target=\"_blank\">Comment 1</a>:\nclacke on 2020-04-17:\n\"First-class ranting\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3048#comments\" target=\"_blank\">hpr3048</a></strong>\n(2020-04-08) \"<em>Alternatives to toilet paper</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=3048#1\" target=\"_blank\">Comment 1</a>:\nmcnalu on 2020-04-08:\n\"The affected episode\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3048#2\" target=\"_blank\">Comment 2</a>:\nBookewyrmm on 2020-04-09:\n\"A word of caution\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3048#3\" target=\"_blank\">Comment 3</a>:\nTuula on 2020-04-21:\n\"Speaking of romans\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3050#comments\" target=\"_blank\">hpr3050</a></strong>\n(2020-04-10) \"<em>Linux Inlaws S01E04 What\'s in a name</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=3050#1\" target=\"_blank\">Comment 1</a>:\nAhuka on 2020-04-10:\n\"Great sketch!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3051#comments\" target=\"_blank\">hpr3051</a></strong>\n(2020-04-13) \"<em>The COVID-19 Work From Home Stream - Day 2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3051#1\" target=\"_blank\">Comment 1</a>:\nbrian in ohio on 2020-04-14:\n\"electoral college\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3052#comments\" target=\"_blank\">hpr3052</a></strong>\n(2020-04-14) \"<em>Locating computers on a network</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=3052#1\" target=\"_blank\">Comment 1</a>:\nDave Morriss on 2020-04-22:\n\"Very useful, thanks\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3053#comments\" target=\"_blank\">hpr3053</a></strong>\n(2020-04-15) \"<em>AudioBookClub 17 - Blood Witness</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0157.html\" target=\"_blank\">HPR_AudioBookClub</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3053#1\" target=\"_blank\">Comment 1</a>:\nlostnbronx on 2020-04-08:\n\"Welcom back to the Audio Book Club!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3054#comments\" target=\"_blank\">hpr3054</a></strong>\n(2020-04-16) \"<em>Coronavirus Thoughts</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=3054#1\" target=\"_blank\">Comment 1</a>:\nbrian in ohio on 2020-04-18:\n\"politics\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3054#2\" target=\"_blank\">Comment 2</a>:\nTelford Tendys on 2020-04-23:\n\"Freedom, Governance and Pandemic\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3054#3\" target=\"_blank\">Comment 3</a>:\nbrian in ohio on 2020-04-24:\n\"clarification\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3054#4\" target=\"_blank\">Comment 4</a>:\nAhuka on 2020-04-24:\n\"Herd immunity\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3056#comments\" target=\"_blank\">hpr3056</a></strong>\n(2020-04-20) \"<em>Jitsi</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=3056#1\" target=\"_blank\">Comment 1</a>:\nAhuka on 2020-04-20:\n\"Very timely\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3056#2\" target=\"_blank\">Comment 2</a>:\nharvhat on 2020-04-21:\n\"Why talk about Jitsi\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3056#3\" target=\"_blank\">Comment 3</a>:\njustme on 2020-04-21:\n\"I really enjoyed this episode\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3056#4\" target=\"_blank\">Comment 4</a>:\nMike Ray on 2020-04-21:\n\"Re: Why talk about jitsi?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3056#5\" target=\"_blank\">Comment 5</a>:\nAhuka on 2020-04-23:\n\"Why listen?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3056#6\" target=\"_blank\">Comment 6</a>:\nMike Ray on 2020-04-23:\n\"Re: Why listen?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3056#7\" target=\"_blank\">Comment 7</a>:\ncrvs on 2020-04-30:\n\"Re: Why listen?\"</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-April/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-April/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributors for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a>, <a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a></b></p>\n<p>Over the period tags and/or summaries have been added to 17 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),
(3086,'2020-06-01','HPR Community News for May 2020',3253,'Dave and Ken talk about shows released and comments posted in May 2020','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nThere were no new hosts this month.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3065\" target=\"_blank\">3065</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-05-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3065\" target=\"_blank\">The case for the unattributed message</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=3066\" target=\"_blank\">3066</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-05-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3066\" target=\"_blank\">HPR Community News for April 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=3067\" target=\"_blank\">3067</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-05-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3067\" target=\"_blank\">Getting my Python3 code working in Python2</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=3068\" target=\"_blank\">3068</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-05-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3068\" target=\"_blank\">Keeping track of downloads in Elm</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3069\" target=\"_blank\">3069</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-05-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3069\" target=\"_blank\">Linux Inlaws S01E05 Porn and Skynet</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=3070\" target=\"_blank\">3070</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-05-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3070\" target=\"_blank\">making vim xdg compatible</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=3071\" target=\"_blank\">3071</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-05-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3071\" target=\"_blank\">Bash snippet - quotes inside quoted strings</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=3072\" target=\"_blank\">3072</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-05-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3072\" target=\"_blank\">The joy of pip-tools and pyenv-virtualenv</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=3073\" target=\"_blank\">3073</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-05-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3073\" target=\"_blank\">Matchbox and Diecast Restoration</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3074\" target=\"_blank\">3074</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-05-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3074\" target=\"_blank\">For your consideration - Escape Pod</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=3075\" target=\"_blank\">3075</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-05-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3075\" target=\"_blank\">Federated Blogging with WriteFreely</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=3076\" target=\"_blank\">3076</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-05-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3076\" target=\"_blank\">Keep calm and Virion</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=3077\" target=\"_blank\">3077</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-05-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3077\" target=\"_blank\">Video conference Push to Talk</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0386.html\" target=\"_blank\">DanNixon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3078\" target=\"_blank\">3078</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-05-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3078\" target=\"_blank\">Coronavirus Update 2020-05-07</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=3079\" target=\"_blank\">3079</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-05-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3079\" target=\"_blank\">Linux Inlaws S01E06 Porn and Trump</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=3080\" target=\"_blank\">3080</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-05-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3080\" target=\"_blank\">Ansible ping</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=3081\" target=\"_blank\">3081</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-05-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3081\" target=\"_blank\">Why do formal verification?</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0364.html\" target=\"_blank\">Tuula</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3082\" target=\"_blank\">3082</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-05-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3082\" target=\"_blank\">RFC 5005 Part 1 – Paged and archived feeds? Who cares?</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=3083\" target=\"_blank\">3083</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-05-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3083\" target=\"_blank\">Mumbling while on lockdown</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=3084\" target=\"_blank\">3084</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-05-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3084\" target=\"_blank\">AudioBookClub 18 - Star Trek: The Continuing Mission</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=3085\" target=\"_blank\">3085</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-05-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3085\" target=\"_blank\">Architectures of Robust Openness</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 29 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 8 comments on\n4 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3013#comments\" target=\"_blank\">hpr3013</a></strong>\n(2020-02-19) \"<em>Bash Tips - 21</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3013#3\" target=\"_blank\">Comment 3</a>:\nnobody on 2020-05-22:\n\"awk\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3013#4\" target=\"_blank\">Comment 4</a>:\nDave Morriss on 2020-05-22:\n\"Response to \'nobody\' re awk\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3053#comments\" target=\"_blank\">hpr3053</a></strong>\n(2020-04-15) \"<em>AudioBookClub 17 - Blood Witness</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0157.html\" target=\"_blank\">HPR_AudioBookClub</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3053#2\" target=\"_blank\">Comment 2</a>:\nmordancy on 2020-05-28:\n\"Blood Witness\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3059#comments\" target=\"_blank\">hpr3059</a></strong>\n(2020-04-23) \"<em>A quick intro to Snapcast</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0386.html\" target=\"_blank\">DanNixon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3059#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2020-05-01:\n\"Thanks for the introduction\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3063#comments\" target=\"_blank\">hpr3063</a></strong>\n(2020-04-29) \"<em>Pens, pencils, paper and ink - 1</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3063#1\" target=\"_blank\">Comment 1</a>:\nArcher72 on 2020-05-05:\n\"Fountain pens\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3063#2\" target=\"_blank\">Comment 2</a>:\nBookewyrmm on 2020-05-07:\n\"Pens, ink and paper\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3063#3\" target=\"_blank\">Comment 3</a>:\nDave Morriss on 2020-05-07:\n\"To Archer72\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3063#4\" target=\"_blank\">Comment 4</a>:\nDave Morriss on 2020-05-07:\n\"To Bookewyrmm\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 21 comments on 11 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3065#comments\" target=\"_blank\">hpr3065</a></strong>\n(2020-05-01) \"<em>The case for the unattributed message</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=3065#1\" target=\"_blank\">Comment 1</a>:\nbrian in ohio on 2020-05-01:\n\"enemies\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3066#comments\" target=\"_blank\">hpr3066</a></strong>\n(2020-05-04) \"<em>HPR Community News for April 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=3066#1\" target=\"_blank\">Comment 1</a>:\nTuula on 2020-05-04:\n\"Thanks\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3066#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-05-05:\n\"No problem\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3066#3\" target=\"_blank\">Comment 3</a>:\nclacke on 2020-05-06:\n\"Blood type distribution\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3066#4\" target=\"_blank\">Comment 4</a>:\nAhuka on 2020-05-06:\n\"I loved the show\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3066#5\" target=\"_blank\">Comment 5</a>:\nDave Morriss on 2020-05-06:\n\"Re: Blood type distribution\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3066#6\" target=\"_blank\">Comment 6</a>:\nDave Morriss on 2020-05-06:\n\"Thanks Ahuka\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3069#comments\" target=\"_blank\">hpr3069</a></strong>\n(2020-05-07) \"<em>Linux Inlaws S01E05 Porn and Skynet</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=3069#1\" target=\"_blank\">Comment 1</a>:\nBendy on 2020-05-12:\n\"skynet\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3071#comments\" target=\"_blank\">hpr3071</a></strong>\n(2020-05-11) \"<em>Bash snippet - quotes inside quoted strings</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3071#1\" target=\"_blank\">Comment 1</a>:\nnobody on 2020-05-22:\n\"Further simplifying\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3071#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-05-22:\n\"To \'nobody\' re ANSI-C quoting\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3072#comments\" target=\"_blank\">hpr3072</a></strong>\n(2020-05-12) \"<em>The joy of pip-tools and pyenv-virtualenv</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0311.html\" target=\"_blank\">clacke</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3072#1\" target=\"_blank\">Comment 1</a>:\nclacke on 2020-04-30:\n\"Errata: Ubuntu Python virtualenv works just fine\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3072#2\" target=\"_blank\">Comment 2</a>:\nTuula on 2020-05-12:\n\"Interesting and insightful\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3073#comments\" target=\"_blank\">hpr3073</a></strong>\n(2020-05-13) \"<em>Matchbox and Diecast Restoration</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3073#1\" target=\"_blank\">Comment 1</a>:\nTuula on 2020-05-13:\n\"sounds good\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3073#2\" target=\"_blank\">Comment 2</a>:\nTony Hughes on 2020-05-14:\n\"Feedback from Tuula\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3075#comments\" target=\"_blank\">hpr3075</a></strong>\n(2020-05-15) \"<em>Federated Blogging with WriteFreely</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=3075#1\" target=\"_blank\">Comment 1</a>:\nclacke on 2020-05-01:\n\"Federated link for talk on federated things\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3077#comments\" target=\"_blank\">hpr3077</a></strong>\n(2020-05-19) \"<em>Video conference Push to Talk</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0386.html\" target=\"_blank\">DanNixon</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3077#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-05-19:\n\"Brilliant Idea\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3077#2\" target=\"_blank\">Comment 2</a>:\njezra on 2020-05-19:\n\"an amazing mix of custom hardware and software\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3078#comments\" target=\"_blank\">hpr3078</a></strong>\n(2020-05-20) \"<em>Coronavirus Update 2020-05-07</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=3078#1\" target=\"_blank\">Comment 1</a>:\nZen_floater2 on 2020-05-22:\n\"my magical forrest Atheist comments.\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3083#comments\" target=\"_blank\">hpr3083</a></strong>\n(2020-05-27) \"<em>Mumbling while on lockdown</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3083#1\" target=\"_blank\">Comment 1</a>:\nDanNixon on 2020-05-29:\n\"Groove based tape format\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3083#2\" target=\"_blank\">Comment 2</a>:\nMrX on 2020-05-31:\n\"Re Groove based tape format\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3084#comments\" target=\"_blank\">hpr3084</a></strong>\n(2020-05-28) \"<em>AudioBookClub 18 - Star Trek: The Continuing Mission</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0270.html\" target=\"_blank\">Thaj Sara</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3084#1\" target=\"_blank\">Comment 1</a>:\nAhuka on 2020-05-28:\n\"Missing Fifty\"</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-May/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-May/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"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 9 shows which were without them.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(2813,'2019-05-15','Should we dump the linux Desktop.',1229,'Knightwise wonders if we should let go of the linux desktop environments and focus on cross-platform','<p>Knightwise wonders if we should let go of the linux desktop environments and focus on cross-platform applications instead. Please bring your torches and pitchforks.</p>',111,0,1,'CC-BY-SA','linux, desktop, rant',0,0,1),
(2814,'2019-05-16','Spectre and Meltdown and OpenBSD and our future',1251,'A discussion about CPU\'s and our future with them, where are we going?','<p>I discuss the entire Spectre and Meltdown issues and where we might go post an Intel world. My objective is to encourage others to leave Speculative processing backed by management engine based chips. SCATTER HUMANS!!! WE MUST LEAVE!!!!</p>\r\n',377,0,0,'CC-BY-SA','SCATTER HUMANS!!!',0,0,1),
(2815,'2019-05-17','Copy pasta',2300,'Copying and pasting on Linux: X selections, xsel, clipboard managers, GPM, screen, and more','<p>\r\nYou can copy and paste on Linux the same way you do on any other OS: Ctrl+C to copy and Ctrl+V to paste (or use the Edit menu, or a right-click menu).\r\n</p>\r\n\r\n<p>\r\nHowever, Linux doesn\'t limit you to just that.\r\nThe primary GUI environment of Linux (at the time of this recording) is X, and the <a href=\"https://www.x.org/releases/X11R7.7/doc/xorg-docs/icccm/icccm.html\">Inter-Client Communication Conventions Manual</a> defines three <strong>X Selection</strong> states&#58; Primary, Secondary, and Clipboard.\r\nThe Secondary is rarely (if ever?) used, so I don\'t cover it here.\r\n</p>\r\n\r\n<h2>Primary</h2>\r\n\r\n<p>\r\nThe primary X Selection is anything literally selected at any given moment.\r\nIf you highlight a word in Firefox with your mouse, for instance, then it becomes the Primary Selection, and it is owned by Firefox.\r\nIf you press the Middle Mouse Button in any application, then that application asks the owner (Firefox, in this example) for the data contained in the Primary Selection.\r\nFirefox sends the data to that application so that it can paste it for you.\r\n</p>\r\n\r\n<p>\r\nA Primary selection remains the Primary Selection until it is overwritten by a new Primary Selection.\r\nIn other words, text needn\'t be highlighted to be retained in the Primary Selection slot.\r\n</p>\r\n\r\n\r\n<h2>Clipboard</h2>\r\n\r\n<p>\r\nThe Clipboard Selection is data that has explicitly been sent to the clipboard by a copy action.\r\nThis is usually a right-click &#62; Copy or a selection of Edit &#62; Copy.\r\nWhen another application is told to paste from the clipboard, it pastes data from the Clipboard Selection.\r\n</p>\r\n\r\n<h2>Both</h2>\r\n\r\n<p>\r\nYou can (and often do) have both a Primary Selection and a Clipboard selection.\r\nIf you press Ctrl+V, you get the contents of the Clipboard Selection.\r\nIf you press the middle mouse button, then you get the contents of the Primary Selection.\r\n</p>\r\n\r\n<h2>xsel</h2>\r\n\r\n<p>\r\nThe <code>xsel</code> command allows you to retrieve the contents of an X Selection.\r\n</p>\r\n\r\n<pre><code>\r\n$ xsel --primary\r\ndungeons\r\n$ xsel --clipboard\r\ndragons\r\n</code></pre>\r\n\r\n<h2>Clipboard managers</h2>\r\n\r\nClipboard managers such as Klipper, CopyQ, <a href=\"https://parcellite.sourceforge.net/\" target=\"_blank\">Parcellite</a>, and so on, provide a history for your clipboard.\r\nThey track the latest 10 (or so) items you have copied or selected.\r\nThey can be a little confusing, because they do tend to blur the line between the Primary Selection and the Clipboard Selection, but now that you know the technical difference, it shouldn\'t confuse you to see them both listed by a clipboard manager designed to conflate them.\r\n</p>\r\n\r\n<h2>GPM</h2>\r\n\r\n<p>\r\nGPM is a daemon allowing you to use your mouse without a GUI.\r\nAmong its features, it permits you to select text in a text console (TTY) and then paste it with the middle mouse button.\r\n</p>\r\n\r\n<h2>GNU Screen and Tmux</h2>\r\n\r\n<p>\r\nScreen and tmux are &#34;window managers for text consoles&#34;.\r\nI don\'t tend to use tmux as often as I should, having learnt GNU Screen long ago, so I\'m not familiar with the process of copying and pasting with tmux.\r\nFor Screen, you can copy text in this way:\r\n</p>\r\n\r\n<ol>\r\n<li><p>\r\nPress Ctrl+A to get out of insert mode.\r\n</p></li>\r\n<li><p>\r\nPress left-square_bracket to enter copy-mode\r\n</p></li>\r\n<li><p>\r\nMove your text to the position you want to start selecting and press Enter or Return\r\n</p></li>\r\n<li><p>\r\nArrow to the position at which you want to end your selection and press Enter or Return again\r\n</p></li>\r\n</ol>\r\n\r\n<p>\r\nTo paste your selection:\r\n</p>\r\n\r\n<ol>\r\n<li><p>\r\nPress Ctrl+A to get out of insert mode.\r\n</p></li>\r\n<li><p>\r\nPress right-square_bracket to paste\r\n</p></li>\r\n</ol>\r\n\r\n\r\n\r\n',78,0,0,'CC-BY-SA','copy,paste,xsel',0,0,1),
(2816,'2019-05-20','Gnu Awk - Part 14',1357,'Redirection of input and output - part 1','<h2 id=\"introduction\">Introduction</h2>\n<p>This is the fourteenth episode of the \"<a href=\"https://hackerpublicradio.org/series/0094.html\" title=\"Learning Awk\">Learning Awk</a>\" series which is being produced by <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" title=\"Mr. Young\">Mr. Young</a> and myself.</p>\n<p>In this episode and the next I want to start looking at <em>redirection</em> within Awk programs. I had originally intended to cover the subject in one episode, but there is just too much.</p>\n<p>So, in the first episode I will be starting with <a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Redirection\" title=\"Redirecting output of `print` and `printf`\">output redirection</a> and then in the next episode will spend some time looking at the <code>getline</code> command used for <em>explicit input</em>, often with redirection.</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=\"hpr2816_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/html_node/index.html\"><em>GNU Awk User’s Guide</em></a>\n<ul>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Redirection\">Redirecting output of <code>print</code> and <code>printf</code></a></li>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Special-FD\">Special Files for Standard Preopened Data Streams</a></li>\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Special-Files\">Special File names in gawk</a></li>\n</ul></li>\n</ul>\n<ul>\n<li>Previous shows in this series on HPR:\n<ul>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2114\">\"<em>Gnu Awk - Part 1</em>\"</a> - episode 2114</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2129\">\"<em>Gnu Awk - Part 2</em>\"</a> - episode 2129</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2143\">\"<em>Gnu Awk - Part 3</em>\"</a> - episode 2143</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2163\">\"<em>Gnu Awk - Part 4</em>\"</a> - episode 2163</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2184\">\"<em>Gnu Awk - Part 5</em>\"</a> - episode 2184</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2238\">\"<em>Gnu Awk - Part 6</em>\"</a> - episode 2238</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2330\">\"<em>Gnu Awk - Part 7</em>\"</a> - episode 2330</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2438\">\"<em>Gnu Awk - Part 8</em>\"</a> - episode 2438</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2476\">\"<em>Gnu Awk - Part 9</em>\"</a> - episode 2476</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2526\">\"<em>Gnu Awk - Part 10</em>\"</a> - episode 2526</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2554\">\"<em>Gnu Awk - Part 11</em>\"</a> - episode 2554</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2610\">\"<em>Gnu Awk - Part 12</em>\"</a> - episode 2610</li>\n<li><a href=\"http://hackerpublicradio.org/eps/hpr2804\">\"<em>Gnu Awk - Part 13</em>\"</a> - episode 2804</li>\n</ul></li>\n<li>Resources:\n<ul>\n<li><a href=\"hpr2816_full_shownotes.epub\">ePub version of these notes</a></li>\n<li>Examples: <a href=\"hpr2816_awk14_fruit_data.txt\">awk14_fruit_data.txt</a>, <a href=\"hpr2816_awk14_ex1.awk\">awk14_ex1.awk</a>, <a href=\"hpr2816_awk14_ex2.awk\">awk14_ex2.awk</a>, <a href=\"hpr2816_awk14_ex3.awk\">awk14_ex3.awk</a></li>\n</ul></li>\n</ul>\n',225,94,1,'CC-BY-SA','Awk utility, Awk Language, gawk,redirection',0,0,1),
(2830,'2019-06-07','2018-2019 New Years Eve show part 1',12194,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 1</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio show. It is December the 31st 2018 and the time is 10 hundred hours UTC.</p>\r\n<ul>\r\n<li>Ken introduces the New year show, gives some history and thanks Kevin Wisher and HonkeyMagoo for organising this.</li>\r\n<li>Wondering where Klaatu is,</li>\r\n<li>Fifty one fifty talks about his new isp<br /><a href=\"https://www.blazinghog.com\">https://www.blazinghog.com</a></li>\r\n<li>Ken GETS STUCK IN CAPS LOCK<br /> <a href=\"https://wiki.archlinux.org/index.php/Xorg/Keyboard_configuration\">https://wiki.archlinux.org/index.php/Xorg/Keyboard_configuration</a></li>\r\n<li>ISO8601 YYYY-MM-DD <a href=\"https://en.wikipedia.org/wiki/ISO_8601\">https://en.wikipedia.org/wiki/ISO_8601</a></li>\r\n<li><a href=\"https://www.hostelworld.com/hosteldetails.php/STF-IYHF-af-Chapman/Stockholm/32555\">https://www.hostelworld.com/hosteldetails.php/STF-IYHF-af-Chapman/Stockholm/32555</a></li>\r\n<li>Honkey is on his way to work</li>\r\n<li><pre>$ alias utc=\'/bin/date -u +%Y-%m-%d_%H-%M-%S%Z_%A\'</pre></li>\r\n<li><a href=\"https://www.youtube.com/watch?v=9PfdQod8HTw\">https://www.youtube.com/watch?v=9PfdQod8HTw</a> History Buffs: Tora! Tora! Tora!</li>\r\n<li>klaatu joins us, career at Red Hat, IBM takeover, teaching Linux to non-tech people<br /><a href=\"https://en.wikipedia.org/wiki/Dalton_Plan\">https://en.wikipedia.org/wiki/Dalton_Plan</a></li>\r\n<li>Computer musems<br /><a href=\"https://vonhagen.org/collection.html\">https://vonhagen.org/collection.html</a></li>\r\n<li>barcamp (yes related to foo)<br /><a href=\"https://en.wikipedia.org/wiki/BarCamp\">https://en.wikipedia.org/wiki/BarCamp</a></li>\r\n<li>Oggcamp<br /><a href=\"https://oggcamp.org/\">https://oggcamp.org/</a></li>\r\n<li>Mint Cast Podcast<br /><a href=\"https://mintcast.org/\">https://mintcast.org/</a></li>\r\n<li>Brexit<br /><a href=\"https://en.wikipedia.org/wiki/Brexit\">https://en.wikipedia.org/wiki/Brexit</a></li>\r\n</ul>\r\n<p>\"we should have bought stock\"</p>\r\n\r\n',159,121,1,'CC-BY-SA','hpr nye, new years eve, community',0,0,1),
(2817,'2019-05-21','Are you successful? Click to find out more!',281,'The answer may surprise you!','<p>Based on <a href=\"https://libranet.de/display/0b6b25a8-125c-a71f-c7ae-f1a686792961\" class=\"uri\">https://libranet.de/display/0b6b25a8-125c-a71f-c7ae-f1a686792961</a>.</p>\r\n<p>It’s pretty short, less than 4 minutes, but I think it’s important.</p>\r\n<p>Who defines whether you are successful, or whether your project is successful, and does it matter?</p>',311,0,0,'CC-BY-SA','success, self-care',0,0,1),
(2828,'2019-06-05','Writing Web Game in Haskell - Science, part 2',2734,'Tuula continues their explanation on simulating science in a game written in Haskell','<h2 id=\"intro\">Intro</h2>\r\n<p>Last time we looked how to model technology and research. This time we’ll do some actual research. I’m skipping over some of the details as the episode is long enough as it is. Hopefully it’s still possible to follow with the show notes.</p>\r\n<p>Main concepts that I’m mentioning: Technology allows usage of specific buildings, ship components and such. Research unlock technologies and may have antecedents that has to be completed before the research can be started. Research cost is measure of how expensive a research is in terms of research points, which are produced by different buildings.</p>\r\n<p>Earlier I modeled tech tree as Map that had Technology as keys and Research as values. I realized that this is suboptimal and will replace it at some point in the future.</p>\r\n<h2 id=\"server-api\">Server API</h2>\r\n<p>There’s three resources that client can connect to. First one is for retrieving list of available research, second one for manipulating current research and last one for retrieving info on how much research points is being produced.</p>\r\n<pre><code>/api/research/available     ApiAvailableResearchR       GET\r\n/api/research/current       ApiCurrentResearchR         GET POST DELETE\r\n/api/research/production    ApiResearchProductionR      GET</code></pre>\r\n<h2 id=\"simulation\">Simulation</h2>\r\n<p>Simulation of research is done by <code>handleFactionResearch</code>, which does simulation for one faction for a given date. After calculating current research point production and retrieving list of current research, function calculates progress of current researches. Unfinished ones are written back to database, while completed are moved into <code>completed_research</code> table. Final step is updating what research will be available in the next turn.</p>\r\n<pre><code>handleFactionResearch date faction = do\r\n    production &lt;- totalProduction $ entityKey faction\r\n    current &lt;- selectList [ CurrentResearchFactionId ==. entityKey faction ] []\r\n    let updated = updateProgress production &lt;$&gt; current\r\n    _ &lt;- updateUnfinished updated\r\n    _ &lt;- handleCompleted date updated $ entityKey faction\r\n    _ &lt;- updateAvailableResearch $ entityKey faction\r\n    return ()</code></pre>\r\n<h2 id=\"research-point-production\">Research point production</h2>\r\n<p>Research points are produced by buildings. So first step is to load all planets owned by the faction and buildings on those planets. Applying <code>researchOutput</code> function to each building yields a list of <code>TotalResearchScore</code>, which is then summed up by <code>mconcat</code>. We can use <code>mconcat</code> as <code>TotalResearchScore</code> is a monoid (I talked about these couple episodes ago).</p>\r\n<pre><code>totalProduction fId = do\r\n    pnbs &lt;- factionBuildings fId\r\n    let buildings = join $ fmap snd pnbs\r\n    return $ mconcat $ researchOutput . entityVal &lt;$&gt; buildings</code></pre>\r\n<p><code>researchOutput</code> function below uses pattern matching. Instead of writing one function definition and case expression inside of it, we’re writing multiple definitions. Each of them matches building of different type. First example is definition that is used for <code>ResearchComplex</code>, while second one is for <code>ParticleAccelerator</code>. Final case uses underscore to match anything and indicate that we’re not even interested on the particular value being matched. <code>mempty</code> is again from our monoid definition. It is empty or unit value of monoid, which in case of <code>TotalResearchScore</code> is zero points in all research categories.</p>\r\n<pre><code>researchOutput Building { buildingType = ResearchComplex } =\r\n    TotalResearchScore\r\n    { totalResearchScoreEngineering = ResearchScore 10\r\n    , totalResearchScoreNatural = ResearchScore 10\r\n    , totalResearchScoreSocial = ResearchScore 10\r\n    }\r\n\r\nresearchOutput Building { buildingType = ParticleAccelerator } =\r\n    TotalResearchScore\r\n    { totalResearchScoreEngineering = ResearchScore 15\r\n    , totalResearchScoreNatural = ResearchScore 15\r\n    , totalResearchScoreSocial = ResearchScore 0\r\n    }\r\n\r\nresearchOutput _ = mempty</code></pre>\r\n<h2 id=\"updating-progress\">Updating progress</h2>\r\n<p>Moving research forward is more complex looking function. There’s bunch of filtering and case expressions going on, but the idea is hopefully clear after a bit of explanation.</p>\r\n<p><code>updateProgress</code> takes two parameters, total production of research points and current research that is being modified. This assumes that there are only one of each categories of research going on at any given time. If there were more, we would have to divide research points between them by some logic. Function calculates effect of research points on current research and produces a new current research that is the end result.</p>\r\n<p>Perhaps the most interesting part is use of lenses. For example, line <code>entityValL . currentResearchProgressL +~ engResearch $ curr</code> means that <code>curr</code> (which is <code>Entity CurrentResearch</code>) is used as starting point. First we reach to data part of <code>Entity</code> and then we focus on <code>currentResearchProgress</code> and add <code>engResearch</code> to it. This results a completely new <code>Entity CurrentResearch</code> being constructed, which is otherwise identical with the original, but the <code>currentResearchProgress</code> has been modified. Without lenses we would have to do this destructuring and restructuring manually.</p>\r\n<pre><code>updateProgress :: TotalResearchScore ResearchProduction -&gt; Entity CurrentResearch -&gt; Entity CurrentResearch\r\nupdateProgress prod curr =\r\n    case researchCategory &lt;$&gt; research of\r\n        Just (Engineering _) -&gt;\r\n            entityValL . currentResearchProgressL +~ engResearch $ curr\r\n\r\n        Just (NaturalScience _) -&gt;\r\n            entityValL . currentResearchProgressL +~ natResearch $ curr\r\n\r\n        Just (SocialScience _) -&gt;\r\n            entityValL . currentResearchProgressL +~ socResearch $ curr\r\n\r\n        Nothing -&gt;\r\n            curr\r\n    where\r\n        research = Map.lookup (currentResearchType . entityVal $ curr) techMap\r\n        engResearch = unResearchScore $ totalResearchScoreEngineering prod\r\n        natResearch = unResearchScore $ totalResearchScoreNatural prod\r\n        socResearch = unResearchScore $ totalResearchScoreSocial prod</code></pre>\r\n<p>Writing unfinished research back to database is short function. First we find ones that hasn’t been finished by filtering with <code>(not . researchReady . entityVal)</code> and then we apply <code>replace</code> to write them back one by one.</p>\r\n<pre><code>updateUnfinished updated = do\r\n    let unfinished = filter (not . researchReady . entityVal) updated\r\n    mapM (\\x -&gt; replace (entityKey x) (entityVal x)) unfinished</code></pre>\r\n<p>Handling finished research starts by finding out which ones were actually completed by filtering with <code>(researchReady . entityVal)</code> and their research type with <code>currentResearchType . entityVal</code>. Rest of the function is all about database actions: creating entries into <code>completed_research</code> and adding news entries for each completed research, then removing entries from <code>current_research</code> and <code>available_research</code>.</p>\r\n<pre><code>handleCompleted date updated fId = do\r\n    let finished = filter (researchReady . entityVal) updated\r\n    let finishedTech = currentResearchType . entityVal &lt;$&gt; finished\r\n    insertMany_ $ currentToCompleted date . entityVal &lt;$&gt; finished\r\n    insertMany_ $ researchCompleted date fId . (currentResearchType . entityVal) &lt;$&gt; finished\r\n    deleteWhere [ CurrentResearchId &lt;-. fmap entityKey finished ]\r\n    deleteWhere [ AvailableResearchType &lt;-. finishedTech\r\n                , AvailableResearchFactionId ==. fId ]</code></pre>\r\n<h2 id=\"available-research\">Available research</h2>\r\n<p>Figuring out what researches will be available for the next turn takes several steps. I won’t be covering random numbers in detail, they’re interesting enough for an episode on their own. It’s enough to know that <code>g &lt;- liftIO getStdGen</code> gets us a new random number generator that is seeded by current time.</p>\r\n<p><code>updateAvailableResearch</code> starts by loading available research and current research for the faction and initializing a new random number generator. <code>g</code> can be used multiple times, but it’ll always return same sequence of numbers. Here it doesn’t matter, but in some cases it might. <code>getR</code> is helper function I wrote that uses random number generator to pick <code>n</code> entries from a given list. <code>n</code> in our case is hard coded to 3, but later on I’ll add possibility for player to research technologies that raise this limit. <code>newAvailableResearch</code> (we’ll look into its implementation closer just in a bit) produces a list of available research for specific research category. These lists are combined with <code>&lt;&gt;</code> operator and written into database with <code>rewriteAvailableResearch</code>.</p>\r\n<pre><code>updateAvailableResearch fId = do\r\n    available &lt;- selectList [ AvailableResearchFactionId ==. fId ] []\r\n    completed &lt;- selectList [ CompletedResearchFactionId ==. fId ] []\r\n    g &lt;- liftIO getStdGen\r\n    let maxAvailable = ResearchLimit 3\r\n    -- reusing same g should not have adverse effect here\r\n    let engCand = getR g (unResearchLimit maxAvailable) $ newAvailableResearch isEngineering maxAvailable available completed\r\n    let natCand = getR g (unResearchLimit maxAvailable) $ newAvailableResearch isNaturalScience maxAvailable available completed\r\n    let socCand = getR g (unResearchLimit maxAvailable) $ newAvailableResearch isSocialScience maxAvailable available completed\r\n    rewriteAvailableResearch fId $ engCand &lt;&gt; natCand &lt;&gt; socCand</code></pre>\r\n<p><code>newAvailableResearch</code> is in charge of figuring out what, if any, new research should be available in the next turn. In case where amount of currently available research is same or greater than research limit, empty list is returned, otherwise function calculates candidates and returns them. Logic for that is following:</p>\r\n<ul>\r\n<li>candidates are research of specific category of those that has been unlock and unresearched</li>\r\n<li>unlocked and unresearched are unlocked ones that are in list of known technology</li>\r\n<li>unlocked research are ones with antecedents available in tech tree</li>\r\n<li>known technology are ones in list of completed research</li>\r\n</ul>\r\n<p>and complete definition of the function is shown below:</p>\r\n<pre><code>newAvailableResearch selector limit available completed =\r\n    if ResearchLimit (length specificCategory) &gt;= limit\r\n        then []\r\n        else candidates\r\n    where\r\n        specificCategory = filter (availableResearchFilter selector) available\r\n        candidates = filter (selector . researchCategory) unlockedAndUnresearched\r\n        unlockedAndUnresearched = filter (\\x -&gt; researchType x `notElem` knownTech) unlockedResearch\r\n        unlockedResearch = filter (antecedentsAvailable knownTech) $ unTechTree techTree\r\n        knownTech = completedResearchType . entityVal &lt;$&gt; completed\r\n\r\n\r\navailableResearchFilter f x =\r\n    maybe False (f . researchCategory) res\r\n    where\r\n        res = Map.lookup (availableResearchType $ entityVal x) techMap</code></pre>\r\n<p>Final step of the simulation of research is to update database with new available research. <code>mkUniq</code> is helper function that removes duplicate elements from a list. It’s used in <code>rewriteAvailableResearch</code> function to make a list that contains all unique top research categories (engineering, natural sciences and social sciences). If the resulting list isn’t empty, we’ll use it to remove all available research for those top categories and insert new available research.</p>\r\n<pre><code>rewriteAvailableResearch fId res = do\r\n    let cats = mkUniq $ fmap (topCategory . researchCategory) res\r\n    unless (null cats) $ do\r\n        deleteWhere [ AvailableResearchFactionId ==. fId\r\n                    , AvailableResearchCategory &lt;-. cats ]\r\n        insertMany_ $ researchToAvailable fId &lt;$&gt; res</code></pre>\r\n<p>Now everything is ready for next round of simulation.</p>\r\n',364,107,0,'CC-BY-SA','haskell',0,0,1),
(2838,'2019-06-19','Why Haskell?',1900,'Tuula tries to answer Beeza\'s question on why would someone want to use Haskell','<p>I got really good comment on episode <a href=\"https://hackerpublicradio.org/eps.php?id=2778\">2778 - Functor and applicative in Haskell</a> from Beeza that I’m including below:</p>\r\n<blockquote>\r\n<p>I’ve been writing software for over 30 years but I find the syntax of Haskell anything but intuitive - in fact less so than any other programming language I have looked at. Thanks to your excellent show notes I can make sense of it but I have to say I would not like to have to develop a project using this language.</p>\r\n</blockquote>\r\n<blockquote>\r\n<p>Obviously I am missing the point as nobody would design a language with the intention of its being difficult to use. Perhaps you could produce another episode addressing the question “Why Haskell?”</p>\r\n</blockquote>\r\n<p>In this episode, I’m trying to answer to that from my point of view.</p>\r\n',364,107,0,'CC-BY-SA','haskell, response',0,0,1),
(2835,'2019-06-14','2018-2019 New Years Eve show part 2',9088,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 2</h2>\r\n<ul>\r\n<li>Claudio talks about doing IT for a school</li>\r\n<li>Pinebook discussion - complaints about keyboard, speakers, trackpad<br />\r\n<a href=\"https://www.pine64.org\">https://www.pine64.org</a></li>\r\n<li>Scanning photo negatives</li>\r\n<li>Camera discussion</li>\r\n<li>Firefly<br />\r\n<a href=\"https://www.imdb.com/title/tt0303461\">https://www.imdb.com/title/tt0303461</a></li>\r\n<li>Serenity<br />\r\n<a href=\"https://www.imdb.com/title/tt0379786\">https://www.imdb.com/title/tt0379786</a></li>\r\n<li>Babylon 5<br />\r\n<a href=\"https://www.imdb.com/title/tt0105946\">https://www.imdb.com/title/tt0105946</a></li>\r\n<li>POLYBIUS - The Video Game That Doesn\'t Exist<br />\r\n<a href=\"https://www.youtube.com/watch?v=_7X6Yeydgyg\">https://www.youtube.com/watch?v=_7X6Yeydgyg</a><br />\r\n<a href=\"https://en.wikipedia.org/wiki/Polybius\">https://en.wikipedia.org/wiki/Polybius</a></li>\r\n<li>Cicada 3301<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Cicada_3301\">https://en.wikipedia.org/wiki/Cicada_3301</a></li>\r\n<li>Ahoy you channel<br />\r\n<a href=\"https://www.youtube.com/channel/UCE1jXbVAGJQEORz9nZqb5bQ\">https://www.youtube.com/channel/UCE1jXbVAGJQEORz9nZqb5bQ</a></li>\r\n<li>Resilo Sync<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Resilio_Sync\">https://en.wikipedia.org/wiki/Resilio_Sync</a></li>\r\n<li>Mintcast<br />\r\n<a href=\"https://mintcast.org/\">https://mintcast.org/</a></li>\r\n<li>Zoom H2<br />\r\n<a href=\"https://www.zoom-na.com/products/field-video-recording/field-recording/h2-handy-recorder\">https://www.zoom-na.com/products/field-video-recording/field-recording/h2-handy-recorder</a></li>\r\n<li>LG Tone headsets<br />\r\n<a href=\"https://www.lg.com/us/bluetooth-headsets-headphones\">https://www.lg.com/us/bluetooth-headsets-headphones</a></li>\r\n<li>Urbanite XL<br />\r\n<a href=\"https://en-us.sennheiser.com/urbanite-xl\">https://en-us.sennheiser.com/urbanite-xl</a></li>\r\n<li>cmhobbs joins and asks for episode input.  will record winter field day 2019 from northwest arkansas.</li>\r\n\r\n<li>Book & audiobook</li>\r\n<li>Recommendations for books:<br />\r\n<ol>\r\n<li>Daemon by Daniel Suarez, <a href=\"https://daniel-suarez.com/\">https://daniel-suarez.com/</a></li>\r\n<li>Skyward by Brandon Sanderson, <a href=\"https://brandonsanderson.com/books/skyward/skyward/\">https://brandonsanderson.com/books/skyward/skyward/</a></li>\r\n</ol>\r\n</li>\r\n<li>Audiobook reading tips:<br />\r\n<ol>\r\n<li>To get into audiobooks, try listening to a book you\'ve read before</li>\r\n<li>Try increasing or decreasing the speed of the book</li>\r\n<li>Use the TTS feature of your eBook reader to create your own audiobooks</li>\r\n<li>Oddity of TTS mispronouncing words can be fun or frustrating</li>\r\n</ol>\r\n<li>Linux desktop upgrade fun</li>\r\n<li>MX Linux<br />\r\n<a href=\"https://mxlinux.org/\">https://mxlinux.org/</a></li>\r\n<li>AntiX Linux<br />\r\n<a href=\"https://antixlinux.com/\">https://antixlinux.com/</a></li>\r\n<li>exwm<br />\r\n<a href=\"https://github.com/ch11ng/exwm\">https://github.com/ch11ng/exwm</a></li>\r\n<li>ZFS on Linux<br />\r\n<a href=\"https://zfsonlinux.org/\">https://zfsonlinux.org/</a></li>\r\n<li>Dell venue 11 pro<br />\r\n<a href=-\"https://www.dell.com/en-us/work/shop/cty/venue-11-pro/spd/dell-venue-11-pro\">https://www.dell.com/en-us/work/shop/cty/venue-11-pro/spd/dell-venue-11-pro</a></li>\r\n<li>Acer aspire 1<br />\r\n<a href=\"https://www.acer.com/ac/en/US/content/series/aspire1\">https://www.acer.com/ac/en/US/content/series/aspire1</a></li>\r\n</ul>\r\n',159,121,0,'CC-BY-SA','HPR new years show, new years, community',0,0,1),
(2840,'2019-06-21','2018-2019 New Years Eve show part 3',7293,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 3</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019</p>\r\n<ul>\r\n<li>Gaming PC vs Console</li>\r\n<li>Steam<br />\r\n<a href=\"https://store.steampowered.com/\">https://store.steampowered.com/</a></li>\r\n<li>Gaming on Linux with Proton<br />\r\n<a href=\"https://steamcommunity.com/games/221410/announcements/detail/1696055855739350561\">https://steamcommunity.com/games/221410/announcements/detail/1696055855739350561</a></li>\r\n<li>Good ol Games<br />\r\n<a href=\"https://www.gog.com/\">https://www.gog.com/</a></li>\r\n<li>Humble Bundle<br />\r\n<a href=\"https://www.humblebundle.com/\">https://www.humblebundle.com/</a></li>\r\n<li>God of War<br />\r\n<a href=\"https://godofwar.playstation.com/\">https://godofwar.playstation.com/</a></li>\r\n<li>The Witcher<br />\r\n<a href=\"https://thewitcher.com/en/\">https://thewitcher.com/en/</a></li>\r\n<li>Ghost of Tsushima<br />\r\n<a href=\"https://www.suckerpunch.com/category/games/ghost-of-tsushima/\">https://www.suckerpunch.com/category/games/ghost-of-tsushima/</a></li>\r\n<li>Plumble<br />\r\n<a href=\"https://play.google.com/store/apps/details?id=com.morlunk.mumbleclient.free&hl=en_US\">https://play.google.com/store/apps/details?id=com.morlunk.mumbleclient.free&hl=en_US</a></li>\r\n<li>mint cast<br />\r\n<a href=\"https://mintcast.org/\">https://mintcast.org/</a></li>\r\n<li>Free DOS<br />\r\n<a href=\"https://www.freedos.org/\">https://www.freedos.org/</a></li>\r\n<li>Compact flash<br />\r\n<a href=\"https://en.wikipedia.org/wiki/CompactFlash\">https://en.wikipedia.org/wiki/CompactFlash</a></li>\r\n<li>rtl-sdr<br />\r\n<a href=\"https://www.amazon.com/RTL-SDR-Blog-RTL2832U-Software-Defined/dp/B0129EBDS2\">https://www.amazon.com/RTL-SDR-Blog-RTL2832U-Software-Defined/dp/B0129EBDS2</a></li>\r\n<li>Cigarettes</li>\r\n<li>Taxing</li>\r\n<li>Alcohol</li>\r\n<li>Old Speckled Hen beer<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Old_Speckled_Hen\">https://en.wikipedia.org/wiki/Old_Speckled_Hen</a></li>\r\n<li>Motorcycles</li>\r\n<li>Harley Davidson<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Harley-Davidson\">https://en.wikipedia.org/wiki/Harley-Davidson</a></li>\r\n<li>Electric Cars</li>\r\n</ul>\r\n',159,121,0,'CC-BY-SA','HPR new years show, new years, community',0,0,1),
(2845,'2019-06-28','2018-2019 New Years Eve show part 4',10265,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 4</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019</p>\r\n<ul>\r\n<li>3D Printing</li>\r\n<li>OSMC<br />\r\n<a href=\"https://osmc.tv/\">https://osmc.tv/</a></li>\r\n<li>Anet A8<br />\r\n<a href=\"https://3dprint.wiki/reprap/anet/a8\">https://3dprint.wiki/reprap/anet/a8</a></li>\r\n<li>Dell Venue 11 pro 7130<br />\r\n<ol>\r\n<li><a href=\"https://www.cnet.com/products/dell-venue-11-pro/specs/\">https://www.cnet.com/products/dell-venue-11-pro/specs/</a></li>\r\n<li><a href=\"https://www.studioteabag.com/science/dell-venue-pro-linux/DV11P/\">https://www.studioteabag.com/science/dell-venue-pro-linux/DV11P/</a></li>\r\n</ol>\r\n</li>\r\n<li>Drag vape<br />\r\n<a href=\"https://en.voopootech.com/drag-param\">https://en.voopootech.com/drag-param</a></li>\r\n<li>Gigabyte Brix<br />\r\n<a href=\"https://www.gigabyte.com/us/Mini-PcBarebone\">https://www.gigabyte.com/us/Mini-PcBarebone</a></li>\r\n<li>SDR talk</li>\r\n<li>DSP hack a day<br />\r\n<a href=\"https://hackaday.com/tag/dsp/\">https://hackaday.com/tag/dsp/</a></li>\r\n<li>Mastodon<br />\r\n<a href=\"https://joinmastodon.org/\">https://joinmastodon.org/</a></li>\r\n<li>hpr 2627 Home phone setup<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2627\">https://hackerpublicradio.org/eps.php?id=2627</a></li>\r\n<li>Asterisk<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Asterisk_(PBX)\">https://en.wikipedia.org/wiki/Asterisk_(PBX)</a></li>\r\n<li>Hanging LED lights</li>\r\n<li>The Wall</li>\r\n<li>Clipper chip<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Clipper_chip\">https://en.wikipedia.org/wiki/Clipper_chip</a></li>\r\n<li>Podcasting</li>\r\n<li>Time zones yet again</li>\r\n<li>Firearms</li>\r\n<li>President Trump</li>\r\n<li>Linux action news<br />\r\n<a href=\"https://linuxactionnews.com/\">https://linuxactionnews.com/</a></li>\r\n<li>Late night Linux<br />\r\n<a href=\"https://latenightlinux.com/\">https://latenightlinux.com/</a></li>\r\n<li>User error<br />\r\n<a href=\"https://www.jupiterbroadcasting.com/show/error/\">https://www.jupiterbroadcasting.com/show/error/</a></li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','HPR new years show, new years, community',0,0,1),
(2825,'2019-05-31','More text to speech trials',286,'A supplementary show to Jeroens episode 2792','<p>\r\nA supplementary show to Jeroens episode <a href=\"https://hackerpublicradio.org/eps.php?id=2792\">HPR2792 :: Playing around with text to speech synthesis on Linux</a>.\r\n</p>\r\n<p>\r\nI found two addional options. The first is <a href=\"https://mimic.mycroft.ai/\">mimic</a>\r\n</p>\r\n<pre>\r\n# dnf info mimic\r\nSummary      : Mycroft\'s TTS engine\r\nURL          : https://mimic.mycroft.ai/\r\nLicense      : BSD\r\nDescription  : Mimic is a fast, lightweight Text-to-speech engine developed by Mycroft A.I.\r\n             : and VocalID, based on Carnegie Mellon University’s FLITE software. Mimic takes\r\n             : in text and reads it out loud to create a high quality voice. Mimic\'s\r\n             : low-latency, small resource footprint, and good quality voices set it apart\r\n             : from other open source text-to-speech projects.\r\n</pre>\r\n\r\n<p>\r\nAnd the second is <a href=\"https://gtts.readthedocs.io/en/latest/index.html\">gTTS</a> which is a interface to the google TTS api.\r\n</p>\r\n',30,0,0,'CC-BY-SA','gTTS, Mimic, tts',0,0,1),
(2848,'2019-07-03','Random numbers in Haskell',1957,'Tuula talks how to generate random numbers (and other values) in Haskell','<p>There’s lots of random and similar sounding words in this episode. I hope you can still follow what I’m trying to explain, but I’m aware that it might be hard.</p>\r\n<p>Haskell functions are pure, meaning that they will always produce same values for same set of arguments. This might sound hard when you want to generate random numbers, but it turns out that the solution isn’t too tricky.</p>\r\n<p>First part to the puzzle is type class <code>RandomGen</code>:</p>\r\n<pre><code>class RandomGen g where\r\n    next :: g -&gt; (Int, g)\r\n    genRange :: g -&gt; (Int, Int)\r\n    split :: g -&gt; (g, g)</code></pre>\r\n<p><code>next</code> produces tuple, where first element is random <code>Int</code> and second element is new random generator. <code>genRange</code> returns tuple defining minimum and maximum values this generator will return. <code>split</code> produces tuple with two new random generators.</p>\r\n<p>Using <code>RandomGen</code> to produce random values of specific type or for specific range requires a bit of arithmetic. It’s easier to use <code>Random</code> that defines functions for that specific task:</p>\r\n<pre><code>class Random a where\r\n    randomR :: RandomGen g =&gt; (a, a) -&gt; g -&gt; (a, g)\r\n    random :: RandomGen g =&gt; g -&gt; (a, g)\r\n    randomRs :: RandomGen g =&gt; (a, a) -&gt; g -&gt; [a]\r\n    randoms :: RandomGen g =&gt; g -&gt; [a]\r\n    randomRIO :: (a, a) -&gt; IO a\r\n    randomIO :: IO a</code></pre>\r\n<ul>\r\n<li><code>randomR</code>, when given range and random generator, produces tuple with random number and new generator</li>\r\n<li><code>random</code>, is similar but doesn’t take range. Instead it will use minimum and maximum specific to that data type</li>\r\n<li><code>randomRs</code>, takes range and produces infinite list of random values within that range</li>\r\n<li><code>randoms</code>, simply produces infinite list of random values using range that is specific to datatype</li>\r\n<li><code>randomRIO</code> and <code>randomIO</code> are effectful versions that don’t need random generator, but use some default one</li>\r\n</ul>\r\n<p>In short, <code>RandomGen</code> is source of randomness and <code>Random</code> is datatype specific way of generating random values using random generator <code>RandomGen</code>.</p>\r\n<p>Final part of the puzzle is where to get <code>RandomGen</code>? One could initialize one manually, but then it wouldn’t be random. However, there’s function <code>getStdGen</code> that will seed <code>RandomGen</code> using OS default random number generator, current time or some other method. Since it has signature of <code>getStdGen :: IO StdGen</code>, one can only call it in IO monad.</p>\r\n<p>Functions that operate with IO can only be called from other IO functions. They can call pure functions, but pure functions can’t call them. So there’s two options: have the code that needs random numbers in effectful function or get <code>RandomGen</code> in effectful function and pass it to pure function.</p>\r\n<h2 id=\"example\">Example</h2>\r\n<pre><code>import System.Random\r\nimport Data.List\r\n\r\n-- | get n unique entries from given list in random order\r\n-- | if n &gt; length of list, all items of the list will be returned\r\ngetR :: RandomGen g =&gt; g -&gt; Int -&gt; [a] -&gt; [a]\r\ngetR g n xs =\r\n    fmap (xs !!) ids\r\n    where\r\n        ids = take (min n $ length xs) $ nub $ randomRs (0, length xs - 1) g\r\n\r\n-- | Returns 4 unique numbers between 1 and 10 (inclusive)\r\ntest :: IO [Int]\r\ntest = do\r\n    g &lt;- getStdGen\r\n    return $ getR g 4 [1..10]</code></pre>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>Pseudo randomness doesn’t require IO, only seeding the generator does. Simple computation that don’t require many calls to <code>random</code> are easy enough. If you need lots of random values, <a href=\"https://hackage.haskell.org/package/MonadRandom-0.4.1/docs/Control-Monad-Random-Class.html\"><code>MonadRandom</code></a> is better suited. It takes care of carrying implicit <code>RandomGen</code> along while your computation progresses.</p>\r\n<p>Best way to catch me nowadays is either email or fediverse where I’m <code>Tuula@mastodon.social</code></p>\r\n',364,107,0,'CC-BY-SA','haskell, random numbers',0,0,1),
(2820,'2019-05-24','29 - CERT Home Security Tips',1337,'What CERT recommends to mitigate security and privacy threats to your home network.','<p>The Computer Emergency Readiness Team of the US Department of Homeland Security issues a security bulletin, ST15-002, which has tips for home network security. In this episode we review these tips and why they make sense.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.us-cert.gov/ncas/tips/ST15-002\" class=\"uri\">https://www.us-cert.gov/ncas/tips/ST15-002</a></li>\r\n<li><a href=\"https://www.zwilnik.com/\" class=\"uri\">https://www.zwilnik.com/</a></li>\r\n</ul>\r\n',198,74,0,'CC-BY-SA','Home Networks, Security',0,0,1),
(2821,'2019-05-27','Interviewing some exhibitors at the 2019 vcfe.org event',2784,'I interviewed some of the exhibitors at the recent vcfe.org event in Munich, Germany.','<p>I visited the vcfe.org event in Munich, Germany.</p>\r\n<p>Below you will find some urls for the projects that I came across.</p>\r\n<ul>\r\n<li>Steckschwein 6502 computer: <a href=\"https://steckschwein.de/\" class=\"uri\">https://steckschwein.de/</a></li>\r\n<li>Siemens Simatic S5 PLC: <a href=\"https://en.wikipedia.org/wiki/Simatic_S5_PLC\" class=\"uri\">https://en.wikipedia.org/wiki/Simatic_S5_PLC</a></li>\r\n<li>CP/M operating system: <a href=\"https://en.wikipedia.org/wiki/CP/M\" class=\"uri\">https://en.wikipedia.org/wiki/CP/M</a></li>\r\n<li>Old fashioned MUD game Nemesis: <a href=\"https://nemesis.de\" class=\"uri\">https://nemesis.de</a></li>\r\n<li>Eastern Germany Robotron hardware: <a href=\"https://en.wikipedia.org/wiki/VEB_Robotron\" class=\"uri\">https://en.wikipedia.org/wiki/VEB_Robotron</a></li>\r\n</ul>\r\n<p>If you like these things, the next exhibition will be in September in Berlin (you can find more info on <a href=\"https://vcfb.de/2019/\">vcfb.de</a>).</p>\r\n<p>Regards, Jeroen Baten</p>',369,78,0,'CC-BY-SA','vcfe, vintage, computers, exhibition, munich, germany',0,0,1),
(3111,'2020-07-06','HPR Community News for June 2020',3596,'Dave struggles to keep Ken on track as they talk about shows and comments in June 2020','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nThere were no new hosts this month.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3086\" target=\"_blank\">3086</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-06-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3086\" target=\"_blank\">HPR Community News for May 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=3087\" target=\"_blank\">3087</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-06-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3087\" target=\"_blank\">Phonetic alphabet</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=3088\" target=\"_blank\">3088</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-06-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3088\" target=\"_blank\">Matchbox Restoration Part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3089\" target=\"_blank\">3089</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-06-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3089\" target=\"_blank\">For my Entertainment</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=3090\" target=\"_blank\">3090</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-06-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3090\" target=\"_blank\">Locating Computer on a Enterprise Network</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=3091\" target=\"_blank\">3091</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-06-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3091\" target=\"_blank\">fuguserv</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=3092\" target=\"_blank\">3092</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-06-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3092\" target=\"_blank\">Pens, pencils, paper and ink - 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3093\" target=\"_blank\">3093</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-06-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3093\" target=\"_blank\">Response to Linux Inlaws S01E06 (hpr 3079) on NeXT</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0152.html\" target=\"_blank\">Claudio Miranda</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3094\" target=\"_blank\">3094</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-06-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3094\" target=\"_blank\">Holy crud! I have a kinesis advantage 2 keyboard!</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0115.html\" target=\"_blank\">sigflup</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3095\" target=\"_blank\">3095</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-06-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3095\" target=\"_blank\">Intro to GIMP</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=3096\" target=\"_blank\">3096</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-06-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3096\" target=\"_blank\">Unscripted ramblings on a walk:  PC Building.</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0241.html\" target=\"_blank\">Christopher M. Hobbs</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3097\" target=\"_blank\">3097</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-06-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3097\" target=\"_blank\">Linux Inlaws S01E07 The Big Blue Button</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=3098\" target=\"_blank\">3098</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-06-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3098\" target=\"_blank\">Matchbox Restoration Part 3</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3099\" target=\"_blank\">3099</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-06-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3099\" target=\"_blank\">Linux Inlaws S01E08 The review of the review</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=3100\" target=\"_blank\">3100</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-06-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3100\" target=\"_blank\">For your consideration - Makers Corner</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=3101\" target=\"_blank\">3101</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-06-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3101\" target=\"_blank\">Metrics</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=3102\" target=\"_blank\">3102</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-06-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3102\" target=\"_blank\">RFC 5005 Part 2 – Webcomics, subscribers and feed readers</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=3103\" target=\"_blank\">3103</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-06-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3103\" target=\"_blank\">A warning about browser extensions and add-ons.</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=3104\" target=\"_blank\">3104</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-06-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3104\" target=\"_blank\">HPR AudioBook Club 19 - Tincture: An Apocalyptic Proposition</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0157.html\" target=\"_blank\">HPR_AudioBookClub</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3105\" target=\"_blank\">3105</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-06-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3105\" target=\"_blank\">Akaso EK7000 Pro</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3106\" target=\"_blank\">3106</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-06-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3106\" target=\"_blank\">Linux Inlaws S01E09 Postgres</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=3107\" target=\"_blank\">3107</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-06-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3107\" target=\"_blank\">Generating comfortable passwords</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0385.html\" target=\"_blank\">crvs</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 23 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 6 comments on\n5 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3056#comments\" target=\"_blank\">hpr3056</a></strong>\n(2020-04-20) \"<em>Jitsi</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=3056#8\" target=\"_blank\">Comment 8</a>:\noperat0r on 2020-06-13:\n\"dERp\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3072#comments\" target=\"_blank\">hpr3072</a></strong>\n(2020-05-12) \"<em>The joy of pip-tools and pyenv-virtualenv</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0311.html\" target=\"_blank\">clacke</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3072#3\" target=\"_blank\">Comment 3</a>:\nclacke on 2020-06-02:\n\"The joy is real\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3079#comments\" target=\"_blank\">hpr3079</a></strong>\n(2020-05-21) \"<em>Linux Inlaws S01E06 Porn and Trump</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3079#1\" target=\"_blank\">Comment 1</a>:\nfrank on 2020-06-15:\n\"The sketch\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3082#comments\" target=\"_blank\">hpr3082</a></strong>\n(2020-05-26) \"<em>RFC 5005 Part 1 – Paged and archived feeds? Who cares?</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0311.html\" target=\"_blank\">clacke</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3082#1\" target=\"_blank\">Comment 1</a>:\nclacke on 2020-06-02:\n\"Atom \"tombstones\" RFC\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3083#comments\" target=\"_blank\">hpr3083</a></strong>\n(2020-05-27) \"<em>Mumbling while on lockdown</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3083#3\" target=\"_blank\">Comment 3</a>:\nWindigo on 2020-06-03:\n\"Modern Sheevaplug support\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3083#4\" target=\"_blank\">Comment 4</a>:\nDave Morriss on 2020-06-04:\n\"Re: Modern Sheevaplug support\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 17 comments on 11 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3087#comments\" target=\"_blank\">hpr3087</a></strong>\n(2020-06-02) \"<em>Phonetic alphabet</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=3087#1\" target=\"_blank\">Comment 1</a>:\ncrvs on 2020-06-02:\n\"you forgot november\"</li></ul><br/>\n</li><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><li><a href=\"https://hackerpublicradio.org/eps.php?id=3090#1\" target=\"_blank\">Comment 1</a>:\nMr. Young on 2020-06-05:\n\"Thanks for reminding me\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3090#2\" target=\"_blank\">Comment 2</a>:\ncmhobbs on 2020-06-08:\n\"quality episode\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3091#comments\" target=\"_blank\">hpr3091</a></strong>\n(2020-06-08) \"<em>fuguserv</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=3091#1\" target=\"_blank\">Comment 1</a>:\nnorrist on 2020-06-08:\n\"read only router\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3091#2\" target=\"_blank\">Comment 2</a>:\nlZen_Floater1 on 2020-06-11:\n\"READ ONLY ROOTS\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3093#comments\" target=\"_blank\">hpr3093</a></strong>\n(2020-06-10) \"<em>Response to Linux Inlaws S01E06 (hpr 3079) on NeXT</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0152.html\" target=\"_blank\">Claudio Miranda</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3093#1\" target=\"_blank\">Comment 1</a>:\nmonochromec on 2020-05-27:\n\"The review of the review\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3094#comments\" target=\"_blank\">hpr3094</a></strong>\n(2020-06-11) \"<em>Holy crud! I have a kinesis advantage 2 keyboard!</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0115.html\" target=\"_blank\">sigflup</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3094#1\" target=\"_blank\">Comment 1</a>:\ncmhobbs on 2020-06-11:\n\"great keyboard\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3095#comments\" target=\"_blank\">hpr3095</a></strong>\n(2020-06-12) \"<em>Intro to GIMP</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=3095#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-06-14:\n\"the gimp\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3095#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-06-14:\n\"I\'m glad it helped\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3096#comments\" target=\"_blank\">hpr3096</a></strong>\n(2020-06-15) \"<em>Unscripted ramblings on a walk:  PC Building.</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0241.html\" target=\"_blank\">Christopher M. Hobbs</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3096#1\" target=\"_blank\">Comment 1</a>:\nMike Brehm on 2020-06-17:\n\"Productive walk\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3096#2\" target=\"_blank\">Comment 2</a>:\ncmhobbs on 2020-06-21:\n\"re: productive walk\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3099#comments\" target=\"_blank\">hpr3099</a></strong>\n(2020-06-18) \"<em>Linux Inlaws S01E08 The review of the review</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=3099#1\" target=\"_blank\">Comment 1</a>:\nClaudioM on 2020-06-18:\n\"All According to Plan! }:-)\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3100#comments\" target=\"_blank\">hpr3100</a></strong>\n(2020-06-19) \"<em>For your consideration - Makers Corner</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=3100#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-06-19:\n\"a book recommendation\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3101#comments\" target=\"_blank\">hpr3101</a></strong>\n(2020-06-22) \"<em>Metrics</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3101#1\" target=\"_blank\">Comment 1</a>:\nClinton Roy on 2020-06-22:\n\"Looking forward to further episodes.\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3101#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-06-22:\n\"Excellent!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3101#3\" target=\"_blank\">Comment 3</a>:\nbrian-in-ohio on 2020-06-22:\n\"more episodes\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3107#comments\" target=\"_blank\">hpr3107</a></strong>\n(2020-06-30) \"<em>Generating comfortable passwords</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=3107#1\" target=\"_blank\">Comment 1</a>:\nsigflup on 2020-06-30:\n\"Thanks\"</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-June/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-June/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=\"error-feedback-from-show-notes\">Error feedback from show notes</h3>\n<p>Most of the shows we process require us to make some level of modifications to get them posted. This ranges from fixing tags to a complete rewrite of the shownotes, or verifying whether intros were actually added or not.</p>\n<p>Each modification that we make means that it requires more human intervention and prevents us from being able to completely automate the upload process. In addition there is a non trivial amount of time needed to \"fix\" these issues. This can range from a few minutes to an hour or more per show, and with 260 shows a year this mounts up.</p>\n<p>We normally don\'t contact hosts about these issues as it is usually quicker to fix the issues than composing emails, and waiting for the reply that may never come. For the most part our experience has been that hosts are more than willing to fix these issues if they are aware of them.</p>\n<p>As part of the ongoing steps toward automation, would hosts be open to the idea of getting a processing report once we have posted the show? This would list all the issues the test tools found and the steps that we needed to take to rectify them.</p>\n<h3 id=\"making-changes-to-shows-after-upload\">Making changes to shows after upload</h3>\n<p>Sometimes an error or omission in notes for an HPR episode isn\'t noticed until the show is posted to the site. In recent times a few hosts have sent in their changes by way of comments. This is not ideal:</p>\n<ol type=\"1\">\n<li>There\'s a limit on how much text a comment can hold</li>\n<li>The comment form has a nasty habit of stripping backslashes, so code corrections can be messed up</li>\n<li>We don\'t put comments on the show\'s page on <code>archive.org</code>, so such corrections will not be seen by people reading the notes there</li>\n</ol>\n<p>The HPR admins would prefer changes to be sent in the form of emails to <code>admin at hackerpublicradio.org</code>. They will then be applied to the show notes and the <code>archive.org</code> version updated in step.</p>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</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>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),
(3131,'2020-08-03','HPR Community News for July 2020',7227,'Warning Ken and Dave discuss some disturbing agricultural practices. Listener discretion is advised.','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nThere were no new hosts this month.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3108\" target=\"_blank\">3108</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3108\" target=\"_blank\">Fuguita as a Desktop</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3109\" target=\"_blank\">3109</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3109\" target=\"_blank\">Matchbox Restoration Part 4</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3110\" target=\"_blank\">3110</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3110\" target=\"_blank\">Finding an Android phone to run LineageOS</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3111\" target=\"_blank\">3111</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-07-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3111\" target=\"_blank\">HPR Community News for June 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3112\" target=\"_blank\">3112</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-07-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3112\" target=\"_blank\">finishing the frame on the long wheelbase recumbent</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0326.html\" target=\"_blank\">Brian in Ohio</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3113\" target=\"_blank\">3113</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3113\" target=\"_blank\">OpenJDK 15 - Unsafe Garbage</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3114\" target=\"_blank\">3114</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3114\" target=\"_blank\">Using the Akaso EK7000 Pro</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3115\" target=\"_blank\">3115</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3115\" target=\"_blank\">Pest Control</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3116\" target=\"_blank\">3116</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-07-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3116\" target=\"_blank\">Unscripted ramblings on a walk:  Crisis at The Manor</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0241.html\" target=\"_blank\">Christopher M. Hobbs</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3117\" target=\"_blank\">3117</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-07-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3117\" target=\"_blank\">The joy of retro computing</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0111.html\" target=\"_blank\">knightwise</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3118\" target=\"_blank\">3118</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3118\" target=\"_blank\">Linux Inlaws S01E10 The Python Bumper Part 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3119\" target=\"_blank\">3119</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3119\" target=\"_blank\">Converting to FFS2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3120\" target=\"_blank\">3120</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3120\" target=\"_blank\">How open are roleplaying games?</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3121\" target=\"_blank\">3121</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-07-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3121\" target=\"_blank\">Opposing Views on Tattoos</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0215.html\" target=\"_blank\">Windigo</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3122\" target=\"_blank\">3122</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-07-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3122\" target=\"_blank\">Devuan review - and commentary</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3123\" target=\"_blank\">3123</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3123\" target=\"_blank\">Arduino controlled Christmas lights</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3124\" target=\"_blank\">3124</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3124\" target=\"_blank\">Matchbox Restoration Part 5</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3125\" target=\"_blank\">3125</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3125\" target=\"_blank\">GIMP: The Canvas</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3126\" target=\"_blank\">3126</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-07-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3126\" target=\"_blank\">Metrics part II</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3127\" target=\"_blank\">3127</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-07-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3127\" target=\"_blank\">HPR AudioBook Club 20 - Quarter Share</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0157.html\" target=\"_blank\">HPR_AudioBookClub</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3128\" target=\"_blank\">3128</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-07-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3128\" target=\"_blank\">Linux Inlaws S01E11 The Python Bumper Part 2</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3129\" target=\"_blank\">3129</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-07-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3129\" target=\"_blank\">Followup on HPR3122</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3130\" target=\"_blank\">3130</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-07-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3130\" target=\"_blank\">More Quick Tips</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 33 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 5 comments on\n3 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=2774#comments\" target=\"_blank\">hpr2774</a></strong>\n(2019-03-21) \"<em>CJDNS and Yggdrasil</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0374.html\" target=\"_blank\">aldenp</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=2774#6\" target=\"_blank\">Comment 6</a>:\nSam on 2020-07-19:\n\"hpr2774 :: CJDNS and Yggdrasil\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3097#comments\" target=\"_blank\">hpr3097</a></strong>\n(2020-06-16) \"<em>Linux Inlaws S01E07 The Big Blue Button</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3097#1\" target=\"_blank\">Comment 1</a>:\nan anonymous listener on 2020-07-02:\n\"free software licensing\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3097#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-07-02:\n\"Good interview\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3106#comments\" target=\"_blank\">hpr3106</a></strong>\n(2020-06-29) \"<em>Linux Inlaws S01E09 Postgres</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3106#1\" target=\"_blank\">Comment 1</a>:\nBob on 2020-07-03:\n\"Levels\"</li>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3106#2\" target=\"_blank\">Comment 2</a>:\nBruce Momjian on 2020-07-07:\n\"Amazon\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 28 comments on 12 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3108#comments\" target=\"_blank\">hpr3108</a></strong>\n(2020-07-01) \"<em>Fuguita as a Desktop</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3108#1\" target=\"_blank\">Comment 1</a>:\nLuna Jernberg on 2020-07-01:\n\"Firefox Flatpak\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3108#2\" target=\"_blank\">Comment 2</a>:\nKlaatu on 2020-07-27:\n\"SD Card + encrypted hard drive\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3109#comments\" target=\"_blank\">hpr3109</a></strong>\n(2020-07-02) \"<em>Matchbox Restoration Part 4</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3109#1\" target=\"_blank\">Comment 1</a>:\narcher72 on 2020-07-04:\n\"Very cool topic\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3111#comments\" target=\"_blank\">hpr3111</a></strong>\n(2020-07-06) \"<em>HPR Community News for June 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3111#1\" target=\"_blank\">Comment 1</a>:\ncrvs on 2020-07-07:\n\"On math @ HPR\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3115#comments\" target=\"_blank\">hpr3115</a></strong>\n(2020-07-10) \"<em>Pest Control</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3115#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-07-12:\n\"surprise\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3116#comments\" target=\"_blank\">hpr3116</a></strong>\n(2020-07-13) \"<em>Unscripted ramblings on a walk:  Crisis at The Manor</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0241.html\" target=\"_blank\">Christopher M. Hobbs</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3116#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-07-13:\n\"network\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3116#2\" target=\"_blank\">Comment 2</a>:\nWindigo on 2020-07-14:\n\"Co-op hosting\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3116#3\" target=\"_blank\">Comment 3</a>:\nbk on 2020-07-15:\n\"Please tell us about how you built the Manor\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3117#comments\" target=\"_blank\">hpr3117</a></strong>\n(2020-07-14) \"<em>The joy of retro computing</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0111.html\" target=\"_blank\">knightwise</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3117#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-07-15:\n\"computer learning today\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3118#comments\" target=\"_blank\">hpr3118</a></strong>\n(2020-07-15) \"<em>Linux Inlaws S01E10 The Python Bumper Part 1</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3118#1\" target=\"_blank\">Comment 1</a>:\nGuido on 2020-07-15:\n\"Nice episode on a weird language\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3119#comments\" target=\"_blank\">hpr3119</a></strong>\n(2020-07-16) \"<em>Converting to FFS2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3119#1\" target=\"_blank\">Comment 1</a>:\nan anonymous listener on 2020-07-23:\n\"security is hard\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3119#2\" target=\"_blank\">Comment 2</a>:\nGumnos on 2020-07-29:\n\"OpenBSD on a Mini10\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3121#comments\" target=\"_blank\">hpr3121</a></strong>\n(2020-07-20) \"<em>Opposing Views on Tattoos</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0215.html\" target=\"_blank\">Windigo</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3121#1\" target=\"_blank\">Comment 1</a>:\nKlaatu on 2020-07-29:\n\"Team Mrs. Honeyhume\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3121#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-07-31:\n\"I have an aversion to tattoos\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3122#comments\" target=\"_blank\">hpr3122</a></strong>\n(2020-07-21) \"<em>Devuan review - and commentary</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#1\" target=\"_blank\">Comment 1</a>:\nbittin on 2020-07-21:\n\"Politics\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#2\" target=\"_blank\">Comment 2</a>:\nDan on 2020-07-21:\n\"Purposely misleading episode\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#3\" target=\"_blank\">Comment 3</a>:\nKen Fallon on 2020-07-21:\n\"Updated show notes\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#4\" target=\"_blank\">Comment 4</a>:\ndraxil on 2020-07-21:\n\"Very interesting listen\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#5\" target=\"_blank\">Comment 5</a>:\nMr. Young on 2020-07-22:\n\"Interesting but misleading title\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#6\" target=\"_blank\">Comment 6</a>:\nKo on 2020-07-23:\n\"Misuse of HPR\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#7\" target=\"_blank\">Comment 7</a>:\nKen Fallon on 2020-07-24:\n\"Apologies to Zen_Floater2\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#8\" target=\"_blank\">Comment 8</a>:\nx on 2020-07-26:\n\"Good!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#9\" target=\"_blank\">Comment 9</a>:\nigottrolledintolisteningtothis on 2020-07-27:\n\"Title should be\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3122#10\" target=\"_blank\">Comment 10</a>:\nbrian-in-ohio on 2020-07-31:\n\"the ruling\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3126#comments\" target=\"_blank\">hpr3126</a></strong>\n(2020-07-27) \"<em>Metrics part II</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0268.html\" target=\"_blank\">Andrew Conway</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3126#1\" target=\"_blank\">Comment 1</a>:\nDave Morriss on 2020-07-29:\n\"Etymology of \'geodesic\'\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3126#2\" target=\"_blank\">Comment 2</a>:\nsesamemucho on 2020-07-31:\n\"Special thanks\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3129#comments\" target=\"_blank\">hpr3129</a></strong>\n(2020-07-30) \"<em>Followup on HPR3122</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3129#1\" target=\"_blank\">Comment 1</a>:\nJan on 2020-07-30:\n\"Zen_Floater2  asked for Comments  on \"Explicit or not\"\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3129#2\" target=\"_blank\">Comment 2</a>:\nbrian-in-ohio on 2020-07-31:\n\"supreme court ruling\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-July/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-July/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributors for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a>, <a href=\"https://hackerpublicradio.org/correspondents/0382.html\">Daniel Persson</a></b></p>\n<p>Over the period tags and/or summaries have been added to 81 shows which were without them.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(2819,'2019-05-23','Reply to Knightwise - podcasts',493,'I provide a slightly different view on podcasts to that recently given by Knightwise.','<p>Knightwise, in <a href=\"https://hackerpublicradio.org/eps.php?id=2798\">HPR 2798</a>, made the argument that podcasts are better if they are done by \"pirates\", i.e. not by corporations, but by individuals with something to say. While I see some merit in this view, I think the more significant feature of podcasts is that it gets us away from \"broadcasting\" (shows aimed at the lowest common denominator) and towards \"narrowcasting\", an environment where small niche interests can find an audience and thrive since podcasting does not require a lot of resources. But I do appreciate the chance to hear some radio programs that I would not otherwise be able to listen to when they are offered as podcasts.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.npr.org/podcasts/583350334/science-friday\" class=\"uri\">https://www.npr.org/podcasts/583350334/science-friday</a></li>\r\n<li><a href=\"https://www.bbc.co.uk/programmes/b00snr0w\" class=\"uri\">https://www.bbc.co.uk/programmes/b00snr0w</a></li>\r\n<li><a href=\"https://www.palain.com\" class=\"uri\">https://www.palain.com</a></li>\r\n</ul>',198,75,0,'CC-BY-SA','podcasts, narrowcasting, broadcasting',0,0,1),
(2849,'2019-07-04','2018-2019 New Years Eve show part 5',7759,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 5</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019</p>\r\n<ul>\r\n<li>Sans Holiday Hack Challenge<br />\r\n<a href=\"https://www.holidayhackchallenge.com/2018/\">https://www.holidayhackchallenge.com/2018/</a></li>\r\n<li>Hack The Box<br />\r\n<a href=\"https://www.hackthebox.eu/\">https://www.hackthebox.eu/</a></li>\r\n<li>Over the Wire<br />\r\n<a href=\"https://overthewire.org/wargames/\">https://overthewire.org/wargames/</a></li>\r\n<li>Under the Wire<br />\r\n<a href=\"https://underthewire.tech/\">https://underthewire.tech/</a></li>\r\n<li>Gnome Boxes<br />\r\n<a href=\"https://en.wikipedia.org/wiki/GNOME_Boxes\">https://en.wikipedia.org/wiki/GNOME_Boxes</a></li>\r\n<li>Talking about headsets</li>\r\n<li>Mobile operating systems</li>\r\n<li>Plasma Mobile<br />\r\n<a href=\"https://www.plasma-mobile.org/\">https://www.plasma-mobile.org/</a></li>\r\n<li>Kansas Linux Fest<br />\r\n<a href=\"https://kansaslinuxfest.org/\">https://kansaslinuxfest.org/</a></li>\r\n<li>FreeNas<br />\r\n<a href=\"https://freenas.org/?\">https://freenas.org/</a></li>\r\n<li>Talking Desktop Environments</li>\r\n<li>GPD mini laptops<br />\r\n<a href=\"https://www.gpd.hk/\">https://www.gpd.hk/</a></li>\r\n<li>Gemini PDA<br />\r\n<a href=\"https://www.indiegogo.com/projects/gemini-pda-android-linux-keyboard-mobile-device--2#/\">https://www.indiegogo.com/projects/gemini-pda-android-linux-keyboard-mobile-device--2#/</a></li>\r\n<li>usb-c<br />\r\n<a href=\"https://en.wikipedia.org/wiki/USB-C\">https://en.wikipedia.org/wiki/USB-C</a></li>\r\n<li>Talking uefi<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface\">https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface</a></li>\r\n<li>Boxing day<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Boxing_Day\">https://en.wikipedia.org/wiki/Boxing_Day</a></li>\r\n<li>UK vs US</li>\r\n<li>More Brexit talk<br />\r\n<a href=\"https://www.bbc.com/news/uk-politics-32810887\">https://www.bbc.com/news/uk-politics-32810887</a></li>\r\n<li>year 2038 problem<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Year_2038_problem\">https://en.wikipedia.org/wiki/Year_2038_problem</a></li>\r\n<li>LXQT desktop<br />\r\n<a href=\"https://lxqt.org/\">https://lxqt.org/</a></li>\r\n<li>Enlightenment desktop<br />\r\n<a href=\"https://www.enlightenment.org/\">https://www.enlightenment.org/</a></li>\r\n<li>gnome boxes<br />\r\n<a href=\"https://wiki.gnome.org/Apps/Boxes\">https://wiki.gnome.org/Apps/Boxes</a></li>\r\n</ul>\r\n\r\n\r\n',159,121,1,'CC-BY-SA','HPR new years show, new years, community',0,0,1),
(2850,'2019-07-05','NIST Cybersecurity Framework',1702,'What NIST suggests as a framework to improve security at the  Enterprise level','<p>The National Institute of Standards and Technology of the US Government issued the NIST Cybersecurity Framework, which has recommendations for private companies and mandates for U.S. Government agencies. For people who work in information security in an Enterprise environment, this framework may be of interest, so we will take a walk through it.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/National_Institute_of_Standards_and_Technology\" class=\"uri\">https://en.wikipedia.org/wiki/National_Institute_of_Standards_and_Technology</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/NIST_Cybersecurity_Framework\" class=\"uri\">https://en.wikipedia.org/wiki/NIST_Cybersecurity_Framework</a></li>\r\n<li><a href=\"https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.04162018.pdf\" class=\"uri\">https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.04162018.pdf</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=997\" class=\"uri\">https://www.zwilnik.com/?page_id=997</a></li>\r\n</ul>',198,74,0,'CC-BY-SA','Enterprise, Security',0,0,1),
(2860,'2019-07-19','Encryption and Quantum Computing',757,'How will quantum computing affect the security of encryption?','<p>The Quantum Computer is supposed to be a game changer that renders encryption useless. But is this true? We look at how quantum computing will affect encryption going forward, and show that we are already working on quantum-resistant encryption.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=530\" class=\"uri\">https://www.zwilnik.com/?page_id=530</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=1620\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=1620</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Utah_Data_Center\" class=\"uri\">https://en.wikipedia.org/wiki/Utah_Data_Center</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Quantum_computing\" class=\"uri\">https://en.wikipedia.org/wiki/Quantum_computing</a></li>\r\n<li><a href=\"https://csrc.nist.gov/Projects/Post-Quantum-Cryptography\" class=\"uri\">https://csrc.nist.gov/Projects/Post-Quantum-Cryptography</a></li>\r\n<li><a href=\"https://www.nist.gov/programs-projects/information-security-and-privacy-advisory-board-ispab\" class=\"uri\">https://www.nist.gov/programs-projects/information-security-and-privacy-advisory-board-ispab</a></li>\r\n<li><a href=\"https://csrc.nist.gov/Projects/Post-Quantum-Cryptography/Round-2-Submissions\" class=\"uri\">https://csrc.nist.gov/Projects/Post-Quantum-Cryptography/Round-2-Submissions</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=999\" class=\"uri\">https://www.zwilnik.com/?page_id=999</a></li>\r\n</ul>',198,74,0,'CC-BY-SA','Encryption, Quantum Computing',0,0,1),
(2870,'2019-08-02','Hierarchy of Evidence',865,'All studies are not the same. Some are better than others.','<p>The idea of a Hierarchy of Evidence is that there is a ranking of studies of different kinds in terms of how persuasive they are. It is not enough to simply say that “A study shows…” without also looking at what kind of study it is how powerful the results are. We look at the different kinds of studies and rank them from top to bottom.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Hierarchy_of_evidence\" class=\"uri\">https://en.wikipedia.org/wiki/Hierarchy_of_evidence</a></li>\r\n<li><a href=\"https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2707010/\" class=\"uri\">https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2707010/</a></li>\r\n<li><a href=\"https://www.phru.nhs.uk/casp/rcts.htm\" class=\"uri\">https://www.phru.nhs.uk/casp/rcts.htm</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Cohort_study\" class=\"uri\">https://en.wikipedia.org/wiki/Cohort_study</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Framingham_Heart_Study\" class=\"uri\">https://en.wikipedia.org/wiki/Framingham_Heart_Study</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Case-control_studies\" class=\"uri\">https://en.wikipedia.org/wiki/Case-control_studies</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Cross-sectional_study\" class=\"uri\">https://en.wikipedia.org/wiki/Cross-sectional_study</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Case_reports\" class=\"uri\">https://en.wikipedia.org/wiki/Case_reports</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=402\" class=\"uri\">https://www.palain.com/?page_id=402</a></li>\r\n</ul>',198,100,0,'CC-BY-SA','Health, Medicine, Evidence, Science, Studies',0,0,1),
(2880,'2019-08-16','Evaluating a Study',861,'We\'ve developed the standards to judge, so now let\'s do an example!','<p>We take the ideas we have developed over the previous episodes and use them to evaluate a a study I found online. These are things anyone can do with just a little work on Google, and the payoff is to have a good idea of whether or not you are looking at a quality study</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.medicalnewstoday.com/\" class=\"uri\">https://www.medicalnewstoday.com/</a></li>\r\n<li><a href=\"https://www.medicalnewstoday.com/articles/324558.php\" class=\"uri\">https://www.medicalnewstoday.com/articles/324558.php</a></li>\r\n<li><a href=\"https://mediabiasfactcheck.com/medical-news-today/\" class=\"uri\">https://mediabiasfactcheck.com/medical-news-today/</a></li>\r\n<li><a href=\"https://www.quora.com/How-can-I-find-a-replication-of-a-study\" class=\"uri\">https://www.quora.com/How-can-I-find-a-replication-of-a-study</a></li>\r\n<li><a href=\"https://en.m.wikipedia.org/wiki/Web_of_Science\" class=\"uri\">https://en.m.wikipedia.org/wiki/Web_of_Science</a></li>\r\n<li><a href=\"https://www.nature.com/articles/s41551-019-0356-9#MOESM1\" class=\"uri\">https://www.nature.com/articles/s41551-019-0356-9#MOESM1</a></li>\r\n<li><a href=\"https://www.nature.com/natbiomedeng/\" class=\"uri\">https://www.nature.com/natbiomedeng/</a></li>\r\n<li><a href=\"https://www.nature.com/articles/s41551-019-0356-9\" class=\"uri\">https://www.nature.com/articles/s41551-019-0356-9</a></li>\r\n<li><a href=\"https://www.palain.com/?page_id=404\" class=\"uri\">https://www.palain.com/?page_id=404</a></li>\r\n</ul>',198,100,0,'CC-BY-SA','Health, Medicine, Evidence, Science, Studies',0,0,1),
(2855,'2019-07-12','2018-2019 New Years Eve show part 6',8486,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 6</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019</p>\r\n<ul>\r\n<li>The Makerz Podcast<br />\r\n<a href=\"https://podnutz.com/category/themakerz/\">https://podnutz.com/category/themakerz/</a></li>\r\n<li>Tronxy X1<br />\r\n<a href=\"https://all3dp.com/1/tronxy-x1-3d-printer-review/\">https://all3dp.com/1/tronxy-x1-3d-printer-review/</a></li>\r\n<li>SBC talk</li>\r\n<li>Apple Talk</li>\r\n<li>Linux on mobile</li>\r\n<li>more 3d printing talk</li>\r\n<li><a href=\"https://www.newmodeus.com/shop/\">https://www.newmodeus.com/shop/</a></li>\r\n<li>new years food traditions</li>\r\n<li>Cats</li>\r\n<li>The Last Centurion<br />\r\n<a href=\"https://www.amazon.com/Last-Centurion-John-Ringo/dp/1439132917\">https://www.amazon.com/Last-Centurion-John-Ringo/dp/1439132917</a></li>\r\n<li><a href=\"https://www.chewy.com/\">https://www.chewy.com/</a></li>\r\n</ul>',159,121,1,'CC-BY-SA','HPR new years show, new years, community',1,0,1),
(2832,'2019-06-11','How I got started in Linux',168,'This is a very brief introduction on what got me into using Linux.','<p>This is just a brief intro into my introduction to Linux.</p>\r\n',378,29,0,'CC-BY-SA','linux, introduction',0,0,1),
(2836,'2019-06-17','Interview with Wendy Hill',1576,'In this episode, Yannick talks with Wendy Hill about her use of opensource software in her job','<p>Wendy Hill is a photographer. And by that, I don’t mean she takes pictures of her kids on Sundays at the baseball game. Although, if she was to do that, it would probably turn out to be great pictures. No, Wendy is a professional photographer, and to run her business, she uses free and opensource software.</p>\r\n<p>Wait… no Photoshop? No Illustrator? How is that possible? Wendy joined me on Mumble earlier this year – that’s 2019 for you, visitors from the future – and we discussed about that.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.wendyhillphoto.com/\" class=\"uri\">https://www.wendyhillphoto.com/</a></li>\r\n<li><a href=\"https://launchpad.net/lubuntu\" class=\"uri\">https://launchpad.net/lubuntu</a></li>\r\n</ul>\r\n',370,78,0,'CC-BY-SA','opensource,photography,lubuntu,darktable,Rapid Photo Downloader,displaycal,gimp',0,0,1),
(2831,'2019-06-10','Interview with Robbie Ferguson',2347,'In this episode, Yannick talks with Robbie Ferguson about the Nagios Enterprise Monitoring System','<p>When it comes to monitoring your network, and the machines on it, you have a lot of options. But, let’s face it : none of those are easy to implement, and configuring a monitoring tool, whether it’s an open-source or a proprietary one, is often complex and time consuming.</p>\r\n<p>Well, someone took that matter into their own hands, and made <a href=\"https://nemslinux.com/\">NEMS</a>. What is NEMS, how can it help us, and what infrastructure does it require? Those are a few of the questions I asked <a href=\"https://baldnerd.com/\">Robbie Ferguson</a>, the maintainer of NEMS, who joined me on Easter week-end for a little chat.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://nemslinux.com/\" class=\"uri\">https://nemslinux.com/</a></li>\r\n<li><a href=\"https://twitter.com/NEMSLinux\" class=\"uri\">https://twitter.com/NEMSLinux</a></li>\r\n<li><a href=\"https://baldnerd.com/\" class=\"uri\">https://baldnerd.com/</a></li>\r\n</ul>\r\n',370,78,0,'CC-BY-SA','nagios,network,monitoring,opensource,single board computer,sbc,raspberrypi,odroid',0,0,1),
(2837,'2019-06-18','parallax live desktops in android',1040,'Parallax_Wallpaper, mouse gigglers, system d Youtube background play and more ! ','<h2 id=\"parallax-live-desktops-in-android\">parallax live desktops in android</h2>\r\n<ul>\r\n<li><p><a href=\"https://www.linkedin.com/pulse/caffeine-pfft-espresso-robert-mccurdy/\" class=\"uri\">https://www.linkedin.com/pulse/caffeine-pfft-espresso-robert-mccurdy/</a><br />\r\nlinkedin Cafinee.exe MouseGiggler espresso autohotkey</p></li>\r\n<li><p>Systemd linkedin<br />\r\n<a href=\"https://www.linkedin.com/pulse/initd-dead-long-live-robert-mccurdy/\" class=\"uri\">https://www.linkedin.com/pulse/initd-dead-long-live-robert-mccurdy/</a></p></li>\r\n<li><p>linkedin youtube in background<br />\r\n<a href=\"https://www.linkedin.com/pulse/play-youtube-background-robert-mccurdy/\" class=\"uri\">https://www.linkedin.com/pulse/play-youtube-background-robert-mccurdy/</a><br />\r\nViewers can download</p></li>\r\n<li><p><a href=\"https://f-droid.org/repo/org.schabi.newpipe_71.apk\" class=\"uri\">https://f-droid.org/repo/org.schabi.newpipe_71.apk</a></p></li>\r\n</ul>\r\n',36,0,1,'CC-BY-SA','youtube downloader,systemd,linux,autohotkey',0,0,1),
(2829,'2019-06-06','Discussion around fair use clips on HPR',1391,'A request for comments on not publishing clips with known fair use samples','<h1>Request for comments</h1>\r\n<p>Hi All,</p>\r\n<p>Under safe harbor provisions, we as volunteers are usually insulated from any copyright issues that may arise in the shows. \"We do not vet, edit, moderate or in any way censor any of the shows on the network, we trust you to do that.\"</p>\r\n<p>This we got by accident <a href=\"https://hackerpublicradio.org/stuff_you_need_to_know.php#not_moderated\">because</a> \"This is a long standing tradition arising from the fact that HPR is a community of peers who believe that any host has as much right to submit shows as any other.\"</p>\r\n<p>In the show notes associated with hpr2829 on 2019-06-06, the host included the following text \"For all included materials: If anyone feels they have right to any material in this show please let me know and I will comply.\"</p>\r\n<p>This violates the HPR <a href=\"https://hackerpublicradio.org/stuff_you_need_to_know.php#permission\">upload policy</a>.</p>\r\n<p>\"Never include content, for example music, in your show that you do not have permission to redistribute. Try to avoid using any content in your show that can not be redistributed under a Creative Commons Attribution-ShareAlike 3.0 Unported license. If you are redistributing under another Creative Commons License or by arranged permission please make note of the restrictions when you upload your show. We can then signal that, so that others who redistribute HPR content can filter your show out.\"</p>\r\n<p>As it was clear that they were not in compliance, I contacted the host. The host has been very helpful and has already removed some of the content but commented \"There are still 2 audio clips included. I claim I can use them on the basis off fair use principles.\"</p>\r\n<p>While the host may be correct, if they are not, then it is me and not the host that will be held responsible for posting it. I do not want that responsibility.</p>\r\n<p>Under the current HPR rules I am allowed to reject this submission.</p>\r\n<p>Before I do, I would appreciate as much feedback as possible on this topic so that we can gauge the opinions of the HPR Community as a whole.</p>\r\n<p>Regards,</p>\r\n<p>Ken. </p>\r\n\r\n<p>The discussion <a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-May/014446.html\">thread</a> remains open and is open to all by joining the <a href=\"https://hackerpublicradio.org/mailman/listinfo/hpr_hackerpublicradio.org\">Maillist</a>.</p>',109,0,0,'CC-BY-SA','HPR, Policy Change, Legal, DMCA, TWAT, Fair Use, PacketSniffers, Copyright',0,0,1),
(2827,'2019-06-04','Unscripted ramblings from my garage about my first CTF event',832,'I briefly discss a CTF event I was invited to and what I plan to bring with me.','<h2 id=\"unscripted-ramblings-about-an-upcoming-ctf-event.\">Unscripted ramblings about an upcoming CTF event.</h2>\r\n<h3 id=\"hak5-items-mentioned-hak5.org\">Hak5 items mentioned (hak5.org):</h3>\r\n<ul>\r\n<li>WiFi Pineapple</li>\r\n<li>Bash Bunny (erroneously referred to as a ‘rabbit’)</li>\r\n<li>USB Rubber Ducky</li>\r\n<li>Packet Squirrel</li>\r\n<li>LAN Turtle (unmentioned but I’ll bring one)</li>\r\n</ul>\r\n<h3 id=\"software-mentioned\">Software mentioned:</h3>\r\n<ul>\r\n<li>MetaSploit: <a href=\"https://metasploit.com\">metasploit.com</a></li>\r\n<li>Ronin: <a href=\"https://ronin-ruby.github.io\">ronin-ruby.github.io</a></li>\r\n<li>Maltego: <a href=\"https://www.paterva.com/web7/\">www.paterva.com/web7/</a></li>\r\n<li>Burpsuite: <a href=\"https://portswigger.net/burp/\">portswigger.net/burp/</a></li>\r\n<li>SET: <a href=\"https://trustedsec.com/social-engineer-toolkit-set/\">trustedsec.com/social-engineer-toolkit-set/</a></li>\r\n<li>Parrot Linux: <a href=\"https://parrotsec.org\">parrotsec.org</a></li>\r\n</ul>\r\n<h3 id=\"my-info\">My info:</h3>\r\n<ul>\r\n<li>Chat with us on irc.freenode.net in #manor\r\n<ul>\r\n<li>More info at <a href=\"https://manor.space\" class=\"uri\">https://manor.space</a></li>\r\n</ul></li>\r\n<li>My little business: <a href=\"https://ascia.tech\" class=\"uri\">https://ascia.tech</a></li>\r\n<li>Email: <a href=\"mailto:cmhobbs@member.fsf.org\">cmhobbs@member.fsf.org</a>\r\n<ul>\r\n<li>1200 0808 F968 47AB F489 91A3 FE26 6FFB 1A77 0868</li>\r\n</ul></li>\r\n<li>Other shows by me (in case this one doesn’t get linked)\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0241.html\" class=\"uri\">https://hackerpublicradio.org/correspondents/0241.html</a></li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li>CTF: Capture the flag; <a href=\"https://en.wikipedia.org/wiki/Capture_the_flag_(disambiguation)\">Wikipedia disambiguation page</a>\r\n<ul>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Wargame_(hacking)\">Cyber-security challenge</a></li>\r\n</ul></li>\r\n</ul>\r\n',241,0,0,'CC-BY-SA','ctf, hacking, security, infosec, events, conventions, gear',0,0,1),
(2833,'2019-06-12','Jeroen chats with Joep Piscaer',1176,'Interviewing Joep Piscaer during Loadays in Antwerpen, Belgium','<p>In this show an Interview with Joep Piscaer, recorded during the recent Loadays conference in Antwerpen, Belgium.</p>\r\n<p>Schedule of recent Loadays event: <a href=\"https://cfp.loadays.org/2019/schedule/\">https://cfp.loadays.org/2019/schedule/</a></p>\r\n<p>I mention the \"Cut the crap podcast\", made by Ryan Caligiuri.</p>\r\n<p>And specifically episode 145 as an excellent example of his podcast quality:</p>\r\n<p><a href=\"https://player.fm/series/the-cut-the-crap-show/ep-145-stronger-develop-the-resilience-you-need-to-succeed-with-dr-george-everly\">https://player.fm/series/the-cut-the-crap-show/ep-145-stronger-develop-the-resilience-you-need-to-succeed-with-dr-george-everly</a></p>\r\n<p>At the end of the podcast I a refer to the \"Follow your Gift\" talk, by Steve Harvey.</p>\r\n<p>You can find a recording of this talk on YouTube at <a href=\"https://www.youtube.com/watch?v=3x3rEg2qvcQ\">https://www.youtube.com/watch?v=3x3rEg2qvcQ</a></p>\r\n\r\n',369,78,0,'CC-BY-SA','loadays, ryan caligiuri, steve harvey',0,0,1),
(2834,'2019-06-13','My favorite desktop and android applications',1757,'Moving right along with shows from the requests list, I combine two program lists.','<p>Desktop:</p>\r\n<ul>\r\n<li>xfce4-terminal</li>\r\n<li>globaltime (orage)</li>\r\n<li>xfce4 notes</li>\r\n<li>thunar</li>\r\n<li>firefox</li>\r\n<li>Emacs</li>\r\n<li>claws-mail</li>\r\n<li>weechat</li>\r\n<li>mupdf</li>\r\n<li>gtk-redshift</li>\r\n<li>asunder</li>\r\n<li>keepassx</li>\r\n<li>lucky backup</li>\r\n<li>virtualbox/kvm</li>\r\n<li>xlog</li>\r\n<li>gpredict</li>\r\n<li>arduino ide</li>\r\n<li>tor browser bundle</li>\r\n<li>ledger wallet</li>\r\n<li>xmame</li>\r\n<li>freedoom</li>\r\n<li>rRootage</li>\r\n<li>dia</li>\r\n<li>fbreader</li>\r\n<li>gnumeric/libreoffice</li>\r\n<li>mandelbulber2</li>\r\n<li>gqrx</li>\r\n<li>transmission</li>\r\n<li>xastir</li>\r\n<li>youtube-dl gui</li>\r\n<li>zenmap</li>\r\n<li>mpv</li>\r\n</ul>\r\n<p>Android</p>\r\n<ul>\r\n<li>LineageOS</li>\r\n<li>built in phone</li>\r\n<li>signal</li>\r\n<li>built in fm radio</li>\r\n<li>built in camera</li>\r\n<li>2048</li>\r\n<li>acrylic paint</li>\r\n<li>amsatdroid free</li>\r\n<li>antennapod</li>\r\n<li>aprsdroid</li>\r\n<li>audiofx</li>\r\n<li>barcode scanner</li>\r\n<li>binaural beats</li>\r\n<li>blockinger</li>\r\n<li>blowtorch</li>\r\n<li>built in calendar</li>\r\n<li>call recorder</li>\r\n<li>chroma doze</li>\r\n<li>built in clock</li>\r\n<li>cloudlibrary</li>\r\n<li>built in contacts</li>\r\n<li>danmaku death</li>\r\n<li>echolink</li>\r\n<li>equate</li>\r\n<li>f-droid</li>\r\n<li>fbreader</li>\r\n<li>fennec f-droid</li>\r\n<li>red cross first aid</li>\r\n<li>flashlight</li>\r\n<li>freegal music</li>\r\n<li>gadgetbridge</li>\r\n<li>built in gallery</li>\r\n<li>ghost commander</li>\r\n<li>gobandroid</li>\r\n<li>hoopla</li>\r\n<li>iz2uuf morse code trainer</li>\r\n<li>libby</li>\r\n<li>lightning</li>\r\n<li>mobilinkd tnc</li>\r\n<li>mupdf</li>\r\n<li>netguard</li>\r\n<li>o’reilly</li>\r\n<li>orbot, orfox</li>\r\n<li>osmand~</li>\r\n<li>red cross pet first aid</li>\r\n<li>plumble</li>\r\n<li>propel graviton</li>\r\n<li>radiodroid (radio-browser.info)</li>\r\n<li>recorder</li>\r\n<li>roblox</li>\r\n<li>rpn</li>\r\n<li>sealnote</li>\r\n<li>sim card</li>\r\n<li>simple world clock</li>\r\n<li>space trader</li>\r\n<li>spotify</li>\r\n<li>suntimes, suntimes alarms</li>\r\n<li>survival manual</li>\r\n<li>termux</li>\r\n<li>timber</li>\r\n<li>tsumego pro</li>\r\n<li>ttrss-reader</li>\r\n<li>unifi</li>\r\n<li>vlc</li>\r\n<li>webtube</li>\r\n<li>weechat-android</li>\r\n<li>wifianalyzer</li>\r\n<li>wikipedia</li>\r\n<li>yalp store</li>\r\n<li>yorecast</li>\r\n</ul>\r\n',241,0,0,'CC-BY-SA','programs, linux, android, apps, applications, lists, favorites',0,0,1),
(2841,'2019-06-24','How I got into Linux (and then some...)',1864,'A response to the request for \"how i got into linux\" and a little of my history with Linux/BSD','<p>Basically what it says on the tin. Most distros I mention can be easily searched for. I meander through a discussion of how I got into Linux and where I am with it now.</p>',241,29,0,'CC-BY-SA','linux, intro, story, discourse, bsd',0,0,1),
(2858,'2019-07-17','Vehicle designer for a space game',1404,'Tuula talks about modeling vehicle designer for their space game','<p>This episode is about modeling vehicle designer that can be used to design all kinds of vehicles available in the game. It relates to episode about <a href=\"https://hackerpublicradio.org/eps.php?id=2818\">performing research</a>.</p>\r\n<h2 id=\"major-parts\">Major parts</h2>\r\n<p>Two major parts about vehicle designer are components and chassis.</p>\r\n<p>Components are modular pieces of vehicle that are assembled on chassis. They can, among other things, be things lie star sails, astrolabe navigators or long range sensor. Each component is defined by two values <code>ComponentId</code> and <code>ComponentLevel</code>. If you know these two values, you’ll be able to find out details of the component. <code>ComponentId</code> tells what component it is and <code>ComponentLevel</code> the general knowledge of it. When component is first discovered as a result of research, it’s just a prototype and as a such doesn’t function particularly well. Further research refines it and factories are able to produce higher quality components.</p>\r\n<p>Full definition of component is show below:</p>\r\n<pre><code>data Component = Component\r\n    { componentId :: ComponentId\r\n    , componentLevel :: ComponentLevel\r\n    , componentName :: ComponentName\r\n    , componentDescription :: ComponentDescription\r\n    , componentWeight :: Weight\r\n    , componentSlot :: ComponentSlot\r\n    , componentType :: [ ComponentPower ]\r\n    , componentCost :: RawResources ResourceCost\r\n    , componentChassisType :: ChassisType\r\n    }\r\n    deriving (Show, Read, Eq, Ord)</code></pre>\r\n<p>Two particularly interesting fields are <code>componentSlot</code> and <code>componentType</code>. <code>componentSlot</code> has type of <code>ComponentSlot</code> and defines what kind of slot the component occupies in chassis. As there are limited amount of slots in each chassis, designer needs to make compromises on what components to install. <code>componentType</code> has type of <code>ComponentPower</code>, which defines what component does in general. It could be sensor or provide supplies for the vehicle for example.</p>\r\n<p>Technology requirements are defined by function: <code>componentRequirements :: ComponentId -&gt; Maybe Technology</code>. It defines which technology unlock a given component. Part of the definition is show below. Each and every <code>ComponentId</code> has to be handled.</p>\r\n<pre><code>componentRequirements ShipLongRangeSensors = Just HighSensitivitySensors\r\ncomponentRequirements ShipBridge = Nothing\r\ncomponentRequirements VehicleWheeledMotiveSystem = Nothing\r\ncomponentRequirements VehicleHoverMotiveSystem = Just HoverCrafts\r\n...</code></pre>\r\n<p>Second major part of the designer are chassis. They’re stored in database, as I wanted a bit more flexible system than hardcoding as I did with components. Following piece of configuration is used to define database table and generated data for Haskell code. Most of the fields are probably easy enough to guess. <code>type</code> with type of <code>ChassisType</code> defines if this particular chassis is for example a land vehicle or a space ship. Various slot fields on other hand define amount of particular slots that the chassis offers.</p>\r\n<pre><code>Chassis json\r\n    name ChassisName\r\n    tonnage Weight\r\n    type ChassisType\r\n    technology Technology Maybe\r\n    armourSlots SlotAmount\r\n    innerSlots SlotAmount\r\n    outerSlots SlotAmount\r\n    sensorSlots SlotAmount\r\n    weaponSlots SlotAmount\r\n    engineSlots SlotAmount\r\n    motiveSlots SlotAmount\r\n    sailSlots SlotAmount\r\n    deriving Show Read Eq</code></pre>\r\n<p>Not all chassis are equal and some (probably pretty much every one of them) have some sort of requirements that has to be fulfilled when designing a vehicle. For example, space ships require a bridge for captain and star sails. Bawley, smallest of the working ships has room for two star sails, but requires only one of them to be installed in order to be a valid design. Flyboat on the other hand is smaller ship built for speed and always requires two set of sails.</p>\r\n<p>This data is stored in <code>required_component</code> table and represented as <code>RequiredComponent</code> data. Both are generated from the definition show below:</p>\r\n<pre><code>RequiredComponent json\r\n    chassisId ChassisId\r\n    componentType ComponentType\r\n    level ComponentLevel\r\n    amount ComponentAmount\r\n    deriving Show Read Eq</code></pre>\r\n<h2 id=\"designing-a-vehicle\">Designing a vehicle</h2>\r\n<p>With all that data, we can now design a vehicle. Process is roughly the following:</p>\r\n<ul>\r\n<li>based on completed research, get a list of chassis that are available</li>\r\n<li>select chassis from the list</li>\r\n<li>based on the selected chassis and completed research, get a list of components that are available</li>\r\n<li>select components to install</li>\r\n<li>remember to check that maximum tonnage isn’t exceeded and that there’s enough slots and requirements are met</li>\r\n<li>fill in name</li>\r\n<li>save into database</li>\r\n</ul>\r\n<p>Completed design is saved in two different tables. First one <code>design</code> holds info like name of the design, faction that design belongs to and used chassis. <code>planned_component</code> holds info about which components are planned to be installed and in what quantity.</p>\r\n<pre><code>Design json\r\n    name Text\r\n    ownerId FactionId\r\n    chassisId ChassisId\r\n    deriving Show Read Eq</code></pre>\r\n<p>and</p>\r\n<pre><code>PlannedComponent json\r\n    designId DesignId\r\n    componentId ComponentId\r\n    level ComponentLevel\r\n    amount ComponentAmount\r\n    deriving Show Read Eq</code></pre>\r\n<p>As a little teaser, below is an screenshot of what the vehicle designer currently looks like.</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2858/hpr2858/hpr2858_1.png\" alt=\"Screenshot of vehicle designer showing chassis and components\" /></p>\r\n<h2 id=\"finally\">Finally</h2>\r\n<p>Thanks for interest. If you have questions or comments, best way to reach me nowadays is either by email or in fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','haskell',0,0,1),
(2859,'2019-07-18','2018-2019 New Years Eve show part 7',10714,'The HPR community comes together to say happy new year and chat','<h2>Hacker Public Radio New Years Show episode 7</h2>\r\n<p>Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019</p>\r\n<ul>\r\n<li>Trucking</li>\r\n<li>Patrick Stewart and Bret Spiner<br />\r\n<a href=\"https://www.youtube.com/watch?v=l5zQIKeh9B4\">https://www.youtube.com/watch?v=l5zQIKeh9B4</a><br />\r\n<a href=\"https://www.youtube.com/watch?v=EvJ7xR4D1ZI\">https://www.youtube.com/watch?v=EvJ7xR4D1ZI</a></li>\r\n<li>Self Defense</li>\r\n<li>The origin of Irish coffee</li>\r\n<li>Calendars</li>\r\n<li>Sleep</li>\r\n<li>The Pine Book<br />\r\n<a href=\"https://www.pine64.org/pinebook/\">https://www.pine64.org/pinebook/</a></li>\r\n<li>Guns</li>\r\n<li>Tanks</li>\r\n<li>AmazFit Bip<br />\r\n<a href=\"https://us.amazfit.com/shop/bip?variant=336750\">https://us.amazfit.com/shop/bip?variant=336750</a></li>\r\n<li>Canes</li>\r\n</ul>\r\n',159,121,1,'CC-BY-SA','HPR new years show, new years, community',0,0,1),
(2842,'2019-06-25','What\'s in my Bag an update to hpr2065',225,'This is a short update show on what I carry in my Geek Bag','<p>Hello HPR land, this is Tony Hughes again coming to you from Blackpool in the UK.</p>\r\n<p>During my last episode, which was my 50th for HPR, I realized that my ‘Bag’ has changed considerably since recording my episode hpr2065 about it back in July 2016. So this is an update on what I currently carry in my ‘Geek’ Bag when out and about.</p>\r\n<p>I have several laptops which are used for different things at different times so may or may not be in the bag/bags depending on what I am doing. This is the list:</p>\r\n<ul>\r\n<li>Lenovo X230i</li>\r\n<li>Toshiba z30</li>\r\n<li>Dells E6220 x 2, E7250, E7440 and E6540</li>\r\n</ul>\r\n<p>Recently I have moved more to Dell laptops and the Dell E7440 is a great compromise of portability and usability with its 14&quot; 1080p screen, but if I want light and long battery life the Toshiba z30 is a fantastic little PC with all day battery life and a great 13.3&quot; screen.</p>\r\n<p>But all the others have their place in the bag, for demonstrating Linux Distros at events or at my LUG.</p>\r\n<p>So the next thing that makes it into the bag is my ZoomH2 recorder that goes with me for recording interviews at events I attend, with the intention of producing HPR shows.</p>\r\n<p>I also have some tools, the first is a little set of a screwdriver and small driver bits made by Draper this is handy for laptop tear downs as it has all the necessary bit heads needed to work on electronics. I also carry a small set of pliers and a wire cutter in the bag.</p>\r\n<p>I also carry a 10000mA battery pack for charging my mobile phone if needed while out and about. In conjunction with this a I carry several micro USB charging cables and a USB C cable for the increasing number of USB C devices around these days.</p>\r\n<p>In the bag are also a couple of 128Gb SSD’s as spares for quick swap outs, if I don’t want to wipe a drive but wish to test a new OS, or for those times the only solution to helping someone rescue an older laptop is to stick an SSD into it.</p>\r\n<p>I generally carry my 1Tb portable USB3 HDD around with me as I store a large number of current Linux ISO files for burning to a flash drive to create boot discs. With that it goes without saying that I have a few spare flash drives in the bag for just this use. I also usually carry a few SD cards for creating Raspberry Pi images if needed.</p>\r\n<p>Other items include a USB WiFi card as a backup if I have a WiFi malfunction, or I’m working on a machine without its own WiFi card.</p>\r\n<p>Well that’s about it for what I’m currently carrying in my bag, but before I go a bit of sad news. Many of you have heard me talk of my latest bargains from the Computer Auction I have frequented since 2006. Well sadly NO MORE, Northern Realisations after 20 years of trading have closed their doors for the last time, so I need to find another source of cheap PC equipment. As they say: <em>All good things come to an end</em>.</p>\r\n<p>Well that’s it for this episode, this is Tony Hughes signing off for Hacker Public Radio.</p>\r\n<ul>\r\n<li><p><a href=\"https://www.keithstead.com/and_more/reviews/zoomh2.html\" class=\"uri\">https://www.keithstead.com/and_more/reviews/zoomh2.html</a></p></li>\r\n<li><p><a href=\"https://www.realnorth.co.uk/\" class=\"uri\">https://www.realnorth.co.uk/</a></p></li>\r\n</ul>\r\n',338,0,0,'CC-BY-SA','Linux, PC\'s, Laptops, Geek Bag',0,0,1),
(2847,'2019-07-02','earbuds',902,'My trials with earbuds and custom setups','<p>operat0r discusses his trials with earbuds and custom setups.</p>',36,0,0,'CC-BY-SA','earbuds,hacking,music,diy',0,0,1),
(2856,'2019-07-15','Mint Mobile Security Rant',1185,'Settle in for a Mint Mobile Security Rant ','<p>\r\nYou can also use call forwarding to forward calls to your google voice number. Mint does not seem to stay connected all the time.\r\n</p>',36,0,1,'CC-BY-SA','Mint Mobile,ANdroid,Phones,4G,VoIP,google voice',0,0,1),
(2861,'2019-07-22','Safety Razors',870,'I go over some of my thoughts on Safety Razors Etc','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B01859QHJU/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1\" class=\"uri\">https://smile.amazon.com/gp/product/B01859QHJU/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1</a></li>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B01M2Y82H8/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1\" class=\"uri\">https://smile.amazon.com/gp/product/B01M2Y82H8/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1</a></li>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B000684Z70/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;th=1\" class=\"uri\">https://smile.amazon.com/gp/product/B000684Z70/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;th=1</a></li>\r\n<li><a href=\"https://smile.amazon.com/gp/product/B0022RB080/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1\" class=\"uri\">https://smile.amazon.com/gp/product/B0022RB080/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1</a></li>\r\n</ul>\r\n',36,0,0,'CC-BY-SA','shaving,safety,razor,health,grooming',0,0,1),
(2886,'2019-08-26','INFOSECOND',1136,'Thoughts around IT and Information Security','<p>\r\nIn todays show, operat0r shares his personal thoughts around information security and getting into the field. He also talks about ways to get support from your local community.\r\n</p>',36,0,1,'CC-BY-SA','information security,careers',0,0,1),
(2853,'2019-07-10','Feeding the beast',424,'How the swedes are killing their hardcash and feeding the beast','<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.bankid.com/\" class=\"uri\">https://www.bankid.com/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Swish_(payment)\" class=\"uri\">https://en.wikipedia.org/wiki/Swish_(payment)</a></li>\r\n</ul>',309,0,0,'CC-BY-SA','bankid, swish, cash, payment, digitalization, sweden',0,0,1),
(2839,'2019-06-20','Sample episode of the Distrohoppers Digest podcast',2231,'We bring you the first episode of the new Creative Commons show the Distrohoppers Digest','<p>\r\nThis is a sample episode of the new Creative Commons tech podcast. It\'s brought to us by Moss and our own <a href=\"https://hackerpublicradio.org/correspondents/0338.html\">Tony Hughes</a>. From the blurb:\r\n</p>\r\n\r\n<quote>\r\nWe are two Blokes who love Linux and trying out new stuff, we thought it would be interesting to share our experience of trying new Linux and BSD distributions and how we found it trying to live with them as our daily driver for up to a Month at a time, by recording a podcast about how we got on.\r\n</quote>\r\n\r\n<h3>Links</h3>\r\n<ul>\r\n<li><a href=\"https://distrohoppersdigest.blogspot.com/\">https://distrohoppersdigest.blogspot.com/</a></li>\r\n<li><a href=\"https://distrohoppersdigest.blogspot.com/feeds/posts/default\">https://distrohoppersdigest.blogspot.com/feeds/posts/default</a></li>\r\n<li><a href=\"https://distrohoppersdigest.blogspot.com/feeds/posts/default?alt=rss\">https://distrohoppersdigest.blogspot.com/feeds/posts/default?alt=rss</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/correspondents/0338.html\">https://hackerpublicradio.org/correspondents/0338.html</a></li>\r\n<li><a href=\"https://mintcast.org/\">https://mintcast.org/</a></li>\r\n</ul>',30,0,0,'CC-BY-NC-SA','Distrohoppers Digest, mintCast, linux, bsd',0,0,1),
(2844,'2019-06-27','The Sony TC-222-A Portable Reel-To-Reel Tape Recorder',1868,'I talk about my latest thrift-store gadget, a 1969 Sony portable reel-to-reel tape recorder','<p>In this episode I talk about my new 1969 <a href=\"https://flic.kr/s/aHsmEcunXZ\" target=\"_blank\">Sony TC-222-A</a> portable reel-to-reel tape recorder. I found it about 3 weeks ago at <a href=\"https://www.handupthrift.com/\" target=\"_blank\">Hand-Up Thrift store</a> in Lafayette Louisiana for $5. It was in partially working condition, without a power cord, and in need of some work. I cleaned the contact points, overhauled the fast-forward idler wheel, lubricated both of the tape shafts, replaced the belts, hacked an old electric razor cord to work as a power cord, and tightened up the record linkage. One thing I still can\'t get working is recording using the microphone.</p>\r\n\r\n<p>I spend about half of this episode talking about trying to make a super-long recording fit on a 5-inch reel and playing at 4.8 cm/second. I use Kimiko Ishizaka\'s wonderful <a href=\"https://kimiko-piano.com/open-goldberg\" target=\"_blank\">Open Goldberg Variations</a> and <a href=\"https://music.kimiko-piano.com/album/bach-well-tempered-clavier-book-1\" target=\"_blank\">Open Well-Tempered Clavier</a> as the music. To do this, I speeded up all of the tracks to play at 4x speed, for which I use the following script to loop through all mp3s in the current directory and subject them to the appropriate <a href=\"https://linux.die.net/man/1/sox\" target=\"_blank\">sox</a> command:</p>\r\n\r\n<pre>\r\n#!/bin/bash\r\n\r\nfor i in *.mp3; do\r\n# speed em up 4x\r\n  infile=$(basename $i)\r\n  stem=$(basename \"$i\" .mp3)\r\n  outfile=\"$stem\"_4x.mp3\r\n  sox $infile $outfile speed 4.0\r\n  sleep .1\r\ndone\r\n</pre>\r\n\r\n<p>It worked! Well. The script and <code>sox</code> command worked. Recording the 4x-speed audio at 19 cm/second and then playing back at 4.8 cm/second also mostly worked, I just had a very poor-quality tape so it sounded pretty bad. The speed was just about right, though. In fact when I compared pitch against my piano, it was EXACTLY right. I may try again with a better tape. (BTW I said my tape was \"old new stock,\" but obviously I meant \"new old stock.\")</p>\r\n\r\n<h3>Photo Album (click image)</h3>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157709041025907\" title=\"Sony TC-222-A Portable Reel-to-Reel Tape Recorder\"><img src=\"https://live.staticflickr.com/65535/48046250816_552453ece7.jpg\" width=\"500\" height=\"375\" alt=\"Sony TC-222-A Portable Reel-to-Reel Tape Recorder\"></a></p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li>Video: <a href=\"https://www.youtube.com/watch?v=52BbX_aP1sQ\" target=\"_blank\">The Sony TC-222-A in action</a></li>\r\n	<li><a href=\"https://www.youtube.com/user/Techmoan\" target=\"_blank\">Techmoan</a>: one of my favorite YouTube channels</li>\r\n	<li>Music bumpers are from Kimiko Ishizaka\'s <em>The Open Goldberg Variations</em>: <a href=\"https://www.opengoldbergvariations.org/\" target=\"_blank\">https://www.opengoldbergvariations.org/</a>, used by permission of their <a href=\"https://creativecommons.org/publicdomain/zero/1.0/\" target=\"_blank\">CC0 1.0 Universal (CC0 1.0) Public Domain Dedication license</a>.</li>\r\n	<li><a href=\"https://www.vintage-electronics.net/\" target=\"_blank\">Vintage Electronics</a>, my source for replacement belts, replacement lamps for my Marantz receiver, etc. </li>\r\n</ul>',238,0,0,'CC-BY-SA','Music,Recording,Audio,Tape,Reel-To-Reel,Open-Reel,Recording Devices,Tape Speeds,Bash Scripting',0,0,1),
(2843,'2019-06-26','Afrikan Tähti (or Star of Africa)',678,'Tuula talks about one of the most important Finnish board game ever','<p>For more information about the game and history behind it, have a look at the following links:</p>\r\n<ul>\r\n<li>Wikipedia: <a href=\"https://en.wikipedia.org/wiki/Afrikan_t%C3%A4hti\">https://en.wikipedia.org/wiki/Afrikan_t%C3%A4hti</a></li>\r\n<li>Board Game Geek: <a href=\"https://www.boardgamegeek.com/boardgame/5130/afrikan-tahti\" class=\"uri\">https://www.boardgamegeek.com/boardgame/5130/afrikan-tahti</a></li>\r\n</ul>\r\n',364,95,0,'CC-BY-SA','finnish, childhood favourite',0,0,1),
(2851,'2019-07-08','An introduction to the work of fire fighters',1847,'A small introduction into the work of fire fighters ','<p>Some general basic knowledge of fire fighting. Also an invitation to ask questions in the comments.</p>',369,0,0,'CC-BY-SA','fire fighting, fire brigade',0,0,1),
(2868,'2019-07-31','Custom data with Persistent',1202,'Tuula explains how to serialize custom data with Persistent','<p>Podcast episode is about two things, serializing custom data with Persistent and <code>IsString</code> typeclass.</p>\r\n<p>I’m using Persistent in conjunction with Yesod (web framework). Process in short is that data is defined in <code>/config/models</code> file that is used in compile time to generate data type definitions for Haskell. Same information is used to create schema for the database when Yesod application starts. It can even do simple migrations if schema changes, but I wouldn’t recommend using that in production.</p>\r\n<p>Persistent maps information between database and program written in Haskell. There’s pre-existing mappings for things like text and various kinds of numbers. In case one wants to use custom data type, compiler can automatically generate needed mapping. This automatic generation works well with enumerations and very complex data.</p>\r\n<p>For example, following piece defines enumeration <code>BuildingType</code> that is mapped in <code>varchar</code> field in database. Enumeration is thus stored as text.</p>\r\n<pre><code>data BuildingType = SensorStation\r\n    | ResearchComplex\r\n    | Farm\r\n    | ParticleAccelerator\r\n    | NeutronDetector\r\n    | BlackMatterScanner\r\n    | GravityWaveSensor\r\n    deriving (Show, Read, Eq)\r\n\r\nderivePersistField &quot;BuildingType&quot;</code></pre>\r\n<p>For newtypes, automatic deriving works too, but generates (in my opinion) extra information that isn’t needed. This extra information causes data saved as text. For those cases, manual mapping can be used.</p>\r\n<p>Our example is for <code>StarDate</code>, which is just glorified <code>Int</code>. I’m using newtype to make <code>StarDate</code> distinct from any other <code>Int</code>, even when it behaves just like <code>Int</code>.</p>\r\n<pre><code>newtype StarDate = StarDate { unStarDate :: Int }\r\n    deriving (Show, Read, Eq, Num, Ord)\r\n\r\ninstance PersistField StarDate where\r\n    toPersistValue (StarDate n) =\r\n        PersistInt64 $ fromIntegral n\r\n\r\n    fromPersistValue (PersistInt64 n) =\r\n        Right $ StarDate $ fromIntegral n\r\n\r\n    fromPersistValue _ =\r\n        Left &quot;Failed to deserialize&quot;\r\n\r\n\r\ninstance PersistFieldSql StarDate where\r\n    sqlType _ = SqlInt64</code></pre>\r\n<p>One more trick, that doesn’t directly relate to Persistent is <code>IsString</code> type class. Instead of having to specify all the time what type text literal is, one can let compiler to deduce it from usage.</p>\r\n<p>For example, if I had a newtype like:</p>\r\n<pre><code>newtype PlanetName = PlanetName { unPlanetName :: Text }</code></pre>\r\n<p>I can turn on OverloadedStrings pragma and create <code>IsString</code> instance:</p>\r\n<pre><code>instance IsString PlanetName where\r\n    fromString = PlanetName . fromString</code></pre>\r\n<p>Now I can write: <code>placeName = &quot;Earth&quot;</code> instead of <code>placeName = PlanetName &quot;Earth&quot;</code> and compiler can deduce correct type based on how the <code>placeName</code> is used.</p>\r\n<p>Thanks for listening, if you have any questions or comments, you can reach me via email or in the fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','haskell, persistent, database',0,0,1),
(2890,'2019-08-30','Penguicon 2019 Report',843,'Penguicon 2019 took place on May 3-5, 2018 in Southfield, Michigan','<p>Penguicon 2019 is a combined technology and science fiction convention in Southfield, Michigan, a suburb of Detroit, and presents over 500 hours of programming over the entire weekend. Of this, around 100 hours are open source, tech-related. In this episode I tell you about my own personal experience at Penguicon this year.</p>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://2019.penguicon.org/\" class=\"uri\">https://2019.penguicon.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Saladin_Ahmed\" class=\"uri\">https://en.wikipedia.org/wiki/Saladin_Ahmed</a></li>\r\n<li><a href=\"https://www.mikeymason.com/\" class=\"uri\">https://www.mikeymason.com/</a></li>\r\n<li><a href=\"https://zedshaw.com/\" class=\"uri\">https://zedshaw.com/</a></li>\r\n<li><a href=\"https://www.facebook.com/CraftyCelts/posts/d41d8cd9/233607537127/\" class=\"uri\">https://www.facebook.com/CraftyCelts/posts/d41d8cd9/233607537127/</a></li>\r\n<li><a href=\"https://www.sophiabrueckner.com/\" class=\"uri\">https://www.sophiabrueckner.com/</a></li>\r\n<li><a href=\"https://www.facebook.com/public/Karen-Corbeill\" class=\"uri\">https://www.facebook.com/public/Karen-Corbeill</a></li>\r\n<li><a href=\"https://www.youtube.com/playlist?list=PLwO8CTSLTkii9S_vhEOsyJ17RI3jjBZ95\" class=\"uri\">https://www.youtube.com/playlist?list=PLwO8CTSLTkii9S_vhEOsyJ17RI3jjBZ95</a></li>\r\n<li><a href=\"https://www.allhandsactive.org/\" class=\"uri\">https://www.allhandsactive.org/</a></li>\r\n<li><a href=\"https://www.zwilnik.com\" class=\"uri\">https://www.zwilnik.com</a></li>\r\n</ul>\r\n',198,96,0,'CC-BY-SA','Penguicon, Open Source, Convention',0,0,1),
(2852,'2019-07-09','Gnu Awk - Part 16',2564,'Winding up the Gnu Awk series','<h2 id=\"introduction\">Introduction</h2>\r\n<p>This is the sixteenth and final episode of the <code>\'</code><a href=\"https://hackerpublicradio.org/series/0094.html\" title=\"Learning Awk\">Learning Awk</a><code>\'</code> series which is being produced by <a href=\"https://hackerpublicradio.org/correspondents/0300.html\" title=\"Mr. Young\">Mr. Young</a> (BY) and <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" title=\"Dave Morriss\">Dave Morriss</a> (DM).</p>\r\n<p>We are using this as an opportunity to have a round-table discussion about the series, about Awk, and where we recommend the listeners should go from here. Including this one we have produced 16 episodes covering the features most likely to be used in pipelines on the command line or in simple shell and awk scripts.</p>\r\n<p><small> Note that although the HPR site will list this episode as having a single host, in fact it has two! Plans are afoot to enhance the HPR database so we can eventually indicate this properly. </small></p>\r\n<h2 id=\"topics-discussed\">Topics Discussed</h2>\r\n<ul>\r\n<li>The series\r\n<ul>\r\n<li>Started in 2016 (first show released 2016-07-13)</li>\r\n<li>Finishing in 2019</li>\r\n<li>16 episodes in total</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Why are we finishing the series?\r\n<ul>\r\n<li>We have probably reached the limit of what is useful on the command line or in shell scripts or even in manageable-sized Awk scripts</li>\r\n<li>Awk shows its limitations as we go on and doesn’t compare well with more modern text processing languages</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>Our personal experiences with Awk\r\n<ul>\r\n<li>BY:\r\n<ul>\r\n<li>Started with sed and awk when first moving to Linux in 2011</li>\r\n<li>(ongoing) Exploring and cleaning client data</li>\r\n<li>(ongoing) Personal scripts when adding python or other tool would be overkill</li>\r\n</ul></li>\r\n<li>DM:\r\n<ul>\r\n<li>Working with VAX/VMS in the 1980’s. No very good text processing features built-in, so Gnu Awk (and sed) was a great way to handle the data we were using to generate accounts for new students each year. Could easily spot bad records, do some data validation (for example impossible dates of birth).</li>\r\n<li>Later in the late 1980’s and early 1990’s more Unix systems came on the scene running HP-UX, Ultrix, SunOS, Solaris, OSF/1, True64 Unix, and awk was very much used there.</li>\r\n<li>Later still we moved to Linux; initially Fedora but later RHEL, and of course awk figured in the list of tools there as well.</li>\r\n</ul></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>What have we left out? Why?\r\n<ul>\r\n<li>User-defined functions are pretty clunky and hard to use</li>\r\n<li>Multi-dimensional arrays: other languages do this better</li>\r\n<li>Internationalization: assumes you’re writing <em>big</em> awk programs</li>\r\n<li>The <code>gawk</code> debugger: quite clever but probably overkill for this series</li>\r\n<li>Extensions written in C and C++: some come with <code>gawk</code> and look quite good, but this subject is out of scope</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>What to use as an alternative to Awk?\r\n<ul>\r\n<li>DM moved from <code>gawk</code> to Perl (version 4) in the 1980’s and later to Perl version 5. This might have engendered an <em>awk</em>y, <em>Bash</em>y mindset that’s hard to shake off. Not the recommended place to start these days.</li>\r\n<li>BY moved from <code>gawk</code> to Python and R for large projects. For interactive <em>Bash</em>y exploration, moved to <a href=\"https://github.com/BurntSushi/xsv\" title=\"XSV\">XSV</a>, <a href=\"https://harelba.github.io/q/\" title=\"q to run SQL on csv files\">q</a>, and <a href=\"https://csvkit.readthedocs.io/en/latest/\" title=\"CSV Kit\">csv-kit</a> for most use cases.</li>\r\n<li>These tools have built-in convenience features, like accounting for headers, data types, and file encodings</li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li>What’s next?\r\n<ul>\r\n<li>It is planned to turn the notes for this series into a combined document which will be available on the HPR site and on archive.org. There is no timescale for this at the moment</li>\r\n</ul></li>\r\n</ul>\r\n<h2 id=\"links\">Links</h2>\r\n<ul>\r\n<li><a href=\"https://www.gnu.org/software/gawk/manual/html_node/index.html\"><em>GNU Awk User’s Guide</em></a>\r\n<ul>\r\n<li><a href=\"https://www.gnu.org/software/gawk/manual/gawk.html#Internationalization\"><em>Internationalization with gawk</em></a></li>\r\n</ul></li>\r\n</ul>\r\n<ul>\r\n<li><a href=\"https://catonmat.net/proof-that-sed-is-turing-complete\"><em>A proof that Unix utility sed is Turing complete</em></a></li>\r\n<li><a href=\"https://mutagen.readthedocs.io/en/latest/\"><em>Mutagen</em></a> - discussed as an alternative way to access audio metadata (<em>tags</em>) from Python</li>\r\n<li><a href=\"https://github.com/BurntSushi/xsv\"><em>XSV</em></a></li>\r\n<li><a href=\"https://csvkit.readthedocs.io/en/latest/\"><em>csvkit</em></a></li>\r\n<li><a href=\"https://harelba.github.io/q/\"><em>Run SQL on CSV files with <b>q</b></em></a></li>\r\n</ul>\r\n<ul>\r\n<li>Links to all of the shows in this series on HPR:\r\n<ul>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2114\"><em>Gnu Awk - Part 1</em></a> - episode 2114</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2129\"><em>Gnu Awk - Part 2</em></a> - episode 2129</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2143\"><em>Gnu Awk - Part 3</em></a> - episode 2143</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2163\"><em>Gnu Awk - Part 4</em></a> - episode 2163</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2184\"><em>Gnu Awk - Part 5</em></a> - episode 2184</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2238\"><em>Gnu Awk - Part 6</em></a> - episode 2238</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2330\"><em>Gnu Awk - Part 7</em></a> - episode 2330</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2438\"><em>Gnu Awk - Part 8</em></a> - episode 2438</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2476\"><em>Gnu Awk - Part 9</em></a> - episode 2476</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2526\"><em>Gnu Awk - Part 10</em></a> - episode 2526</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2554\"><em>Gnu Awk - Part 11</em></a> - episode 2554</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2610\"><em>Gnu Awk - Part 12</em></a> - episode 2610</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2804\"><em>Gnu Awk - Part 13</em></a> - episode 2804</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2816\"><em>Gnu Awk - Part 14</em></a> - episode 2816</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2824\"><em>Gnu Awk - Part 15</em></a> - episode 2824</li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2852\"><em>Gnu Awk - Part 16</em></a> - episode 2852</li>\r\n</ul></li>\r\n</ul>\r\n',225,94,1,'CC-BY-SA','Gnu Awk, advanced features',0,0,1),
(2854,'2019-07-11','Telling myself something In The Morning',374,'There was a need for some software, so I wrote some','<ul>\r\n<li>Source for In The Morning: <a href=\"https://gitlab.com/jezra/in-the-morning\" class=\"uri\">https://gitlab.com/jezra/in-the-morning</a></li>\r\n<li>Bottle Framework: <a href=\"https://bottlepy.org\" class=\"uri\">https://bottlepy.org</a></li>\r\n</ul>',243,25,0,'CC-BY-SA','python, programming',0,0,1),
(2857,'2019-07-16','Creating CounterParty Collectible Tokens for the Bitcorn Game',995,'How to create Bitcorn collectibles: tokens issued on Bitcoin blockchain, used in Bitcorn Farms game','<p>Bitcorn is an idle farming game created with and played using Bitcoin tokens using the CounterParty protocol. I’ll walk you through how it all works, how to get started and what all that means.</p>\r\n<p>In this episode we’ll walk through the basics of creating and submitting a Bitcorn collectible card to be included in the game, along with setting up a wallet so you can buy and sell them.</p>\r\n',379,110,0,'CC-BY-SA','bitcorn, bitcoin, collectibles',0,0,1),
(2862,'2019-07-23','Art vs. Commerce In Storytelling',830,'Lostnbronx examines stories as both art and products.','<p>In this final episode of \"Random Elements of Storytelling\", Lostnbronx looks at the question of art vs. commerce.</p>\r\n<p>When is a story a product? When is it a work of passion? Can it be both? In a era of interactive storytelling, what is the difference between a story teller and an audience? And where do art, commerce, creativity, and consumption intersect?</p>\r\n<p>Lostnbronx wanders over hill and dale, and likely fails to adequately explain anything at all.</p>\r\n',107,105,0,'CC-BY-SA','stories, storytelling, art, commerce, lostnbronx',0,0,1),
(2900,'2019-09-13','Better Social Media 01 - Introduction',711,'We don\'t have to use Twitter and Facebook. There are alternatives.','<p>While many people like to use social media, platforms like Twitter and Facebook are very unsatisfying, not to mention inimical to your security and privacy. Fortunately there are alternatives we can try, and in this series I want to explore a few of them. <a href=\"https://www.zwilnik.com/?page_id=1025\" class=\"uri\">https://www.zwilnik.com/?page_id=1025</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://elplatt.com/\" class=\"uri\">https://elplatt.com/</a></li>\r\n<li><a href=\"https://litmus.com/blog/email-client-market-share-trends-first-half-of-2018\" class=\"uri\">https://litmus.com/blog/email-client-market-share-trends-first-half-of-2018</a></li>\r\n<li><a href=\"https://www.amazon.com/dp/B07H7G7CMN/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1\" class=\"uri\">https://www.amazon.com/dp/B07H7G7CMN/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1</a></li>\r\n<li><a href=\"https://mewe.com/\" class=\"uri\">https://mewe.com/</a></li>\r\n<li><a href=\"https://ello.co/\" class=\"uri\">https://ello.co/</a></li>\r\n<li><a href=\"https://diasporafoundation.org/\" class=\"uri\">https://diasporafoundation.org/</a></li>\r\n<li><a href=\"https://pluspora.com/\" class=\"uri\">https://pluspora.com/</a></li>\r\n<li><a href=\"https://www.bitchute.com/\" class=\"uri\">https://www.bitchute.com/</a></li>\r\n<li><a href=\"https://joinmastodon.org/\" class=\"uri\">https://joinmastodon.org/</a></li>\r\n<li><a href=\"https://textile.photos/\" class=\"uri\">https://textile.photos/</a></li>\r\n<li><a href=\"https://pixelfed.org/\" class=\"uri\">https://pixelfed.org/</a></li>\r\n<li><a href=\"https://www.wire.com/\" class=\"uri\">https://www.wire.com/</a></li>\r\n<li><a href=\"https://www.signal.org/\" class=\"uri\">https://www.signal.org/</a></li>\r\n<li><a href=\"https://gnu.io/social/\" class=\"uri\">https://gnu.io/social/</a></li>\r\n<li><a href=\"https://www.scuttlebutt.nz/\" class=\"uri\">https://www.scuttlebutt.nz/</a></li>\r\n<li><a href=\"https://mediagoblin.org/\" class=\"uri\">https://mediagoblin.org/</a></li>\r\n<li><a href=\"https://freenetproject.org/author/freenet-project-inc.html\" class=\"uri\">https://freenetproject.org/author/freenet-project-inc.html</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1025\" class=\"uri\">https://www.zwilnik.com/?page_id=1025</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','Fediverse, social media, federated',0,0,1),
(2910,'2019-09-27','Better Social Media 02 - Pluspora',582,'Pluspora was advertised as the federated alternative to Google Plus.','<p>Pluspora is an instance of the Diaspora software that was specifically designed to appeal to users of Google Plus. So when Google Plus disappeared, many people moved over to this platform. <a href=\"https://www.zwilnik.com/?page_id=1027\" class=\"uri\">https://www.zwilnik.com/?page_id=1027</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://pluspora.com/\" class=\"uri\">https://pluspora.com/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/GNU_General_Public_License\" class=\"uri\">https://en.wikipedia.org/wiki/GNU_General_Public_License</a></li>\r\n<li><a href=\"https://diasporafoundation.org/formatting\" class=\"uri\">https://diasporafoundation.org/formatting</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Markdown\" class=\"uri\">https://en.wikipedia.org/wiki/Markdown</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1027\" class=\"uri\">https://www.zwilnik.com/?page_id=1027</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','Fediverse, social media, federated',0,0,1),
(2920,'2019-10-11','Better Social Media 03 - MeWe',729,'MeWe was advertised as another popular alternative to Google Plus.','<p>MeWe is another platform that was advertised to users left high-and-dry by the closure of Google Plus. It is not federated, but does make strong claims of privacy protection, and is the slickest alternative I have seen to Google Plus. So when Google Plus disappeared, many people moved over to this platform. <a href=\"https://www.zwilnik.com/?page_id=1030\" class=\"uri\">https://www.zwilnik.com/?page_id=1030</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://mewe.com/\" class=\"uri\">https://mewe.com/</a></li>\r\n<li><a href=\"https://mewepro.com/\" class=\"uri\">https://mewepro.com/</a></li>\r\n<li><a href=\"https://mewe.com/store\" class=\"uri\">https://mewe.com/store</a></li>\r\n<li><a href=\"https://mewe.com/#\" class=\"uri\">https://mewe.com/#</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1030\" class=\"uri\">https://www.zwilnik.com/?page_id=1030</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative',0,0,1),
(2930,'2019-10-25','Better Social Media 04 - Diaspora',886,'Diaspora was the original alternative platform when it went up against Facebook.','<p>I don’t know if Diaspora was the first of the alternatives to come along, but it was certainly the first I was aware of. It got a lot of attention for the college students who first put it together (and remember that Facebook was originally created by a college student, Mark Zuckerberg). The four students, Ilya Zhitomirskiy, Dan Grippi, Max Salzberg, and Raphael Sofaer, were inspired by a speech Eben Moglen gave to the Internet society’s New York Chapter, where he described centralized social networks as “Spying for free”. The students chose the name Diaspora, which is a Greek word that means a “scattered or dispersed population” to reflect the idea that instead of a centralized platform, Diaspora would consist of independent nodes, called pods, each running a copy of the free software which is open source and licensed under the GNU-AGPL-3.0 license. <a href=\"https://www.zwilnik.com/?page_id=1032\" class=\"uri\">https://www.zwilnik.com/?page_id=1032</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://diasporafoundation.org/\" class=\"uri\">https://diasporafoundation.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/GNU_General_Public_License\" class=\"uri\">https://en.wikipedia.org/wiki/GNU_General_Public_License</a></li>\r\n<li><a href=\"https://softwarefreedom.org/\" class=\"uri\">https://softwarefreedom.org/</a></li>\r\n<li><a href=\"https://web.archive.org/web/20111002003516/https://blog.diasporafoundation.org/2011/09/21/diaspora-means-a-brighter-future-for-all-of-us.html\" class=\"uri\">https://web.archive.org/web/20111002003516/https://blog.diasporafoundation.org/2011/09/21/diaspora-means-a-brighter-future-for-all-of-us.html</a></li>\r\n<li><a href=\"https://podupti.me/\" class=\"uri\">https://podupti.me/</a></li>\r\n<li><a href=\"mailto:ahuka@pod.haxxors.com\">ahuka@pod.haxxors.com</a></li>\r\n<li><a href=\"https://pod.haxxors.com/i/394c80269066\" class=\"uri\">https://pod.haxxors.com/i/394c80269066</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1032\" class=\"uri\">https://www.zwilnik.com/?page_id=1032</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','social media, alternative, federated, Fediverse',0,0,1),
(2940,'2019-11-08','Better Social Media 05 - Mastodon',778,'Mastodon is the federated alternative to Twitter.','<p>As mentioned earlier, Diaspora was one of the earliest alternative, privacy-respecting social media platforms, but it was focused on being an alternative to Facebook (and it has done this fairly well). But that leaves the other big platform of the social world, Twitter. Mastodon is a nice federated alternative to Twitter and a nicer place to be. <a href=\"https://www.zwilnik.com/?page_id=1034\" class=\"uri\">https://www.zwilnik.com/?page_id=1034</a></p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://joinmastodon.org/\" class=\"uri\">https://joinmastodon.org/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Identi.ca\" class=\"uri\">https://en.wikipedia.org/wiki/Identi.ca</a></li>\r\n<li><a href=\"https://pump.io/\" class=\"uri\">https://pump.io/</a></li>\r\n<li><a href=\"https://en.wikipedia.org/wiki/Gamergate_controversy\" class=\"uri\">https://en.wikipedia.org/wiki/Gamergate_controversy</a></li>\r\n<li><a href=\"https://blog.joinmastodon.org/2018/07/cage-the-mastodon/\" class=\"uri\">https://blog.joinmastodon.org/2018/07/cage-the-mastodon/</a></li>\r\n<li><a href=\"https://mastodon.social/about/more\" class=\"uri\">https://mastodon.social/about/more</a></li>\r\n<li><a href=\"https://instances.noct.zone/\" class=\"uri\">https://instances.noct.zone/</a></li>\r\n<li><a href=\"https://instances.social/list#lang=&amp;allowed=&amp;prohibited=&amp;users=\" class=\"uri\">https://instances.social/list#lang=&amp;allowed=&amp;prohibited=&amp;users=</a></li>\r\n<li><a href=\"https://mwl.io/\" class=\"uri\">https://mwl.io/</a></li>\r\n<li><a href=\"https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md\" class=\"uri\">https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1034\" class=\"uri\">https://www.zwilnik.com/?page_id=1034</a></li>\r\n</ul>\r\n',198,108,0,'CC-BY-SA','Fediverse, social media, federated, alternative',0,0,1),
(2863,'2019-07-24','Simplified application architectures for improved security',955,'A thought experiment in whether reducing runtime dependencies can improve security and how to do it.','<p>Before the days of the PC, application architectures were often very simple - being little more than the executable itself and any input files. The constraints of the early PC’s very limited resources required new architectures to make the most of those resources.</p>\r\n<p>We now have a situation where most applications either install, or require the presence of, multiple runtime dependencies. Each dependency has an interface which allows communication between itself and the application, but every interface presents an attack surface with the potential to be exploited by a malicious 3rd party.</p>\r\n<p>Modern computers do not have those same resource constraints yet we are still developing applications using the principles that applied 3 decades ago.</p>\r\n<p>Re-usable functionality can be internalised through static linking at compile-time or by code inclusion (along the lines of a .h file in C/C++)</p>\r\n<p>To change from using tried and tested methods is never convenient, but with concern for cyber security high and rising, has the time come to exchange convenience for simpler application architectures that should reduce vulnerabilities?</p>\r\n<p>…And may a move to new (or is it old) architectures deliver a big win for open source software?</p>\r\n',246,0,0,'CC-BY-SA','Application development, Application architecture, Security',0,0,1),
(2864,'2019-07-25','One weird trick to add a --help option to your awk scripts',1213,'Klaatu demonstrates two ways to add a --help message to your awk scripts','<p>\r\nThe first method is in Awk itself.\r\n</p>\r\n\r\n<pre><code>\r\n#!/usr/bin/awk -f\r\n#\r\n# USAGE EXAMPLE:\r\n# echo the input of some var\r\n# $ foo -v var=8\r\n#\r\n\r\nBEGIN {\r\n    if (length(var) == 0) {\r\n        printf \"%s %s\\n\", ENVIRON[\"_\"], \"is a proof-of-concept help message\";\r\n        printf \"%s\\n\", \"Usage:\";\r\n        printf \"%s\\n\", \"------\";\r\n        printf \"%s %s %s\\n\", \"$\", ENVIRON[\"_\"], \"-v var=NUM\";\r\n        printf \"%s\\n\", \"substitute NUM with the number you want echoed\";\r\n        exit\r\n    }\r\n    else {\r\n        printf \"%s %s\\n\", \"You have entered \", var;\r\n    }\r\n}\r\n</code></pre>\r\n\r\n<p>\r\nThe disadvantage to this is that it only provides a help message if no option is provided. If you actually type <code>--help</code>, then you get Awk\'s help message, which is not useful in this context.\r\n</p>\r\n\r\n<p>\r\nThe shell script wrapper method uses the shell to parse options, which are then passed to an embedded Awk script:\r\n</p>\r\n\r\n<pre><code>\r\n#!/bin/sh\r\n\r\nif [ \"${1}\" = \"--help\" -o \"${1}\" = \"-h\" -o \"${1}\" = \"\" ]; then\r\n    echo \"This is a help message.\"\r\n    exit\r\nfi\r\n\r\n/usr/bin/awk -v var=\"${1}\" \'\r\n\r\nBEGIN {\r\nprintf \"%s %s\\n\", \"You provided\", var;\r\n}\'\r\n</code></pre>\r\n</p>\r\n\r\n<p>\r\nThe disadvantage here is only that you\'re not just writing an Awk script, you\'re writing a shell script with embedded Awk. I can\'t think of a reason not to do it this way (even though in the script that served as the inspiration for this episode, I don\'t use this method).\r\n</p>\r\n\r\n',78,94,0,'CC-BY-SA','awk,option,help,arg',0,0,1),
(2866,'2019-07-29','Intro to Bitcoin for techies',1915,'Survey of Bitcoin: blockchains, blocks, transactions, miners, PoW, hashing, addresses, wallets','<p>This is a broad introduction to Bitcoin from a technical perspective. We do not talk about finance or economics, and we don’t compare distributed ledger technologies. We’re not addressing exchanges, layer 2 technologies, mainstream adoption, etc.</p>\r\n<p>We’re also going to avoid going deep into forks, fungibility, mining or the math of Bitcoin.</p>\r\n<p>In this episode we introduce these fundamental Bitcoin topics:</p>\r\n<ul>\r\n<li>What is Bitcoin?</li>\r\n<li>Blockchains and blocks</li>\r\n<li>What are transactions?</li>\r\n<li>What are miners and what do they do?</li>\r\n<li>Proof of Work in Bitcoin - SHA256 hashing</li>\r\n<li>Bitcoin consensus mechanism</li>\r\n<li>How do wallets work?</li>\r\n<li>Brief discussion about various types of wallets and wallet security</li>\r\n</ul>\r\n<p>I hope this is accessible and informative and look forward to doing more in the future.</p>',379,110,0,'CC-BY-SA','bitcoin, blockchain, cryptocurrency',0,0,1),
(2873,'2019-08-07','Death Angel - Card game',1045,'Short description of Death Angel card game','<p>For more information, have a look at BoardGameGeek: <a href=\"https://boardgamegeek.com/boardgame/71721/space-hulk-death-angel-card-game\" class=\"uri\">https://boardgamegeek.com/boardgame/71721/space-hulk-death-angel-card-game</a></p>\r\n',364,95,0,'CC-BY-SA','cardgame',0,0,1),
(2878,'2019-08-14','Type classes in Haskell',1168,'Tuula explains what type classes are and how to use them','<h2 id=\"background\">Background</h2>\r\n<p>Type classes are Haskell’s way of doing ad hoc polymorphics or overloading. They are used to defined set of functions that can operate more than one specific type of data.</p>\r\n<h2 id=\"equality\">Equality</h2>\r\n<p>In Haskell there’s no default equality, it has to be defined.</p>\r\n<p>There’s two parts to the puzzle. First is type class <code>Eq</code> that comes with the standard library and defines function signatures for equality and non-equality comparisons. There’s type parameter <code>a</code> in the definition, which is filled by user when they define instance of <code>Eq</code> for their data. In that instance definition, <code>a</code> is filled with concrete type.</p>\r\n<pre><code>class  Eq a where\r\n  (==) :: a -&gt; a -&gt; Bool\r\n  (/=) :: a -&gt; a -&gt; Bool\r\n\r\n  x /= y = not (x == y)</code></pre>\r\n<p>Definition above can be read as “class Eq a that has two functions with following signatures and implementations”. In other words, given two <code>a</code>, this function determines are they equal or not (thus <code>Bool</code> as return type). <code>/=</code> is defined in terms of <code>==</code>, so it’s enough to define one and you get other one for free. But you can still define both if you’re so included (maybe some optimization case).</p>\r\n<p>If we define our own <code>Size</code> type, like below, we can compare sizes:</p>\r\n<pre><code>data Size = Small | Medium | Large\r\n    deriving (Show, Read)\r\n\r\ninstance Eq Size where\r\n    Small == Small = True\r\n    Medium == Medium = True\r\n    Large == Large = True\r\n    _ == _ = False</code></pre>\r\n<p>And here’s couple example comparisons.</p>\r\n<pre><code>&gt; Small == Small\r\nTrue\r\n&gt; Large /= Large\r\nFalse</code></pre>\r\n<p>Writing these by hand is both tedious and error prone, so we usually use automatic derivation for them. Note how the second line now reads <code>deriving (Show, Read, Eq)</code>.</p>\r\n<pre><code>data Size = Small | Medium | Large\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<h2 id=\"hierarchy-between-type-classes\">Hierarchy between type classes</h2>\r\n<p>There can be hierarchy between type classes, meaning one requires presence of another. Common example is <code>Ord</code>, which is used to order data.</p>\r\n<pre><code>class Eq a =&gt; Ord a where\r\n    compare :: a -&gt; a -&gt; Ordering\r\n    (&lt;) :: a -&gt; a -&gt; Bool\r\n    (&gt;=) :: a -&gt; a -&gt; Bool\r\n    (&gt;) :: a -&gt; a -&gt; Bool\r\n    (&lt;=) :: a -&gt; a -&gt; Bool\r\n    max :: a -&gt; a -&gt; a\r\n    min :: a -&gt; a -&gt; a</code></pre>\r\n<p>This definition can be read as “class Ord a, where a has instance of Eq, with pile of functions as follows”. <code>Ord</code> has default implementation for quite many of these, in terms of others, so it’s enough to implement either <code>compare</code> or <code>&lt;=</code>.</p>\r\n<p>For our <code>Size</code>, instance of <code>Ord</code> could be defined as:</p>\r\n<pre><code>instance Ord Size where\r\n    Small &lt;= _ = True\r\n    Medium &lt;= Small = False\r\n    Medium &lt;= _ = True\r\n    Large &lt;= Large = True\r\n    Large &lt;= _ = False</code></pre>\r\n<h2 id=\"writing-generic-code\">Writing generic code</h2>\r\n<p>There’s lots and lots of type classes in standard library:</p>\r\n<ul>\r\n<li><code>Num</code> for numeric operations</li>\r\n<li><code>Integral</code> for integer numbers</li>\r\n<li><code>Floating</code> for floating numbers</li>\r\n<li><code>Show</code> for turning data into strings</li>\r\n<li><code>Read</code> for turning strings to data</li>\r\n<li><code>Enum</code> for sequentially ordered types (these can be enumerated)</li>\r\n<li><code>Bounded</code> for things with upper and lower bound</li>\r\n<li>and so on…</li>\r\n</ul>\r\n<p>Type classes allow you to write really generic code. Following is contrived example using <code>Ord</code> and <code>Show</code>:</p>\r\n<pre><code>check :: (Ord a, Show a) =&gt; a -&gt; a -&gt; String\r\ncheck a b =\r\n    case compare a b of\r\n        LT -&gt;\r\n            show a ++ &quot; is smaller than &quot; ++ show b\r\n        GT -&gt;\r\n            show a ++ &quot; is greater than &quot; ++ show b\r\n        EQ -&gt;\r\n            show a ++ &quot; and &quot; ++ show b ++ &quot; are equal&quot;</code></pre>\r\n<p>Check takes two parameters that are same type and that type has to have <code>Ord</code> and <code>Show</code> instances. <code>Ord</code> is for ordering and <code>Show</code> is for turning data into string (handy for displaying it). The end result is string telling result of comparison. Below is some examples of usage. Note how our function can handle different types of data: <code>Size</code>, <code>Int</code> and <code>[Int]</code>.</p>\r\n<pre><code>&gt; check Medium Small\r\n&quot;Medium is greater than Small&quot;\r\n&gt; check Small Large\r\n&quot;Small is smaller than Large&quot;\r\n&gt; check 7 3\r\n&quot;7 is greater than 3&quot;\r\n&gt; check [1, 2] [1, 1, 1]\r\n&quot;[1, 2] is greater than [1, 1, 1]&quot;</code></pre>\r\n<p>There are many extensions to type classes that add more behaviour. These aren’t part of standard Haskell, but can be enabled with a pragma definition or compiler flag. They can be somewhat more complicated to use, have special cases that need careful consideration, but offer interesting options.</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>Thank you for listening. Question, comments and feedback welcome. Best way to catch me nowadays is either by email or in fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','type class',0,0,1),
(2883,'2019-08-21','Pass the pigs',318,'Tuula talks about their childhood game pass the pigs','<p>For more information, have a look at <a href=\"https://boardgamegeek.com/boardgame/2593/pass-pigs\" class=\"uri\">https://boardgamegeek.com/boardgame/2593/pass-pigs</a></p>\r\n',364,95,0,'CC-BY-SA','dice game',0,0,1),
(2950,'2019-11-22','NotPetya and Maersk: An Object Lesson',861,'Looking at an object lesson for proper IT management processes and the cost of failure','<p>We previously looked at the NIST Security Framework, which lays out how organizations should manage their network security. That may have seemed a bit dry, so let’s look at this case study to put some flesh on those dry bones. Failing to manage your security risks properly can have significant consequences.</p>\r\n<h2 id=\"links\">Links:</h2>\r\n<ul>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=997\" class=\"uri\">https://www.zwilnik.com/?page_id=997</a></li>\r\n<li><a href=\"https://hackerpublicradio.org/eps.php?id=2850\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2850</a></li>\r\n<li><a href=\"https://www.zwilnik.com/?page_id=1045\" class=\"uri\">https://www.zwilnik.com/?page_id=1045</a></li>\r\n</ul>\r\n',198,74,0,'CC-BY-SA','IT Management, Security',0,0,1),
(2898,'2019-09-11','Modeling people in space game',1315,'Tuula talks how they approach modeling people in space game','<p>People are what makes dynasty simulators interesting and this episode will be about them. There isn’t much code this time, mainly just how data is organized. Topic is long and split over several episodes.</p>\r\n<p>Some people in game are controlled by computer, while some are controlled by player. There’s no difference on what each can do in game, computer is basically just filling in for players when there aren’t enough players.</p>\r\n<p>There’s plenty of data about people, spread over several entities and database tables. Main one is <code>Person</code>, which stores name, gender, sex, date of birth and some stats (and then some more).</p>\r\n<p>There are lots of various ways of naming people and I chose to model three for the starters:</p>\r\n<pre><code>data PersonName =\r\n    RegularName FirstName FamilyName (Maybe Cognomen)\r\n    | SimpleName FirstName (Maybe Cognomen)\r\n    | RegalName FirstName FamilyName RegnalNumber (Maybe Cognomen)\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>The higher the rank, more complicated names you tend to have (for some reason). Later on I’ll try and see if I can add more varied names, like matronyms and patronyms.</p>\r\n<p>Sex and gender I’m modeling with simple system of two enumerations, sex can be <code>Female</code>, <code>Male</code> or <code>Intersex</code>, while gender has values <code>Man</code>, <code>Woman</code>, <code>Agender</code> and <code>Nonbinary</code>. System is coarse, but should be enough to get started with the game. Later on, this can be expanded to more nuanced system.</p>\r\n<p>Traits are defining features of people. These include things like brave, coward, ambitious, content, honest and such. Values are binary, character either is brave or not. And character can’t be brave and coward at the same time.</p>\r\n<p>Relations are modeled as <code>PersonRelation</code> and thus stored in <code>person_relation</code> table:</p>\r\n<pre><code>Relation json\r\n    originatorId PersonId\r\n    targetId PersonId\r\n    type RelationType\r\n    visibility RelationVisibility\r\n    deriving Show Read Eq</code></pre>\r\n<p>I find this corner of the puzzle particular interesting. This models who is parent or child, who is friend or rival. Interconnected web created by relations isn’t completely visible to players (or any other person in game). Relations have visibility, modeled as <code>RelationVisibility</code>, which tells how visible it is. Public ones are known by everyone, family relations are limited to small group of people and secret relations are only known by those who are in the fold. One aspect of the game is acquiring this information.</p>\r\n<p>Intel is modeled as <code>HumanIntelligence</code> and stored in <code>human_intelligence</code> table:</p>\r\n<pre><code>HumanIntelligence json\r\n    personId PersonId\r\n    ownerId PersonId\r\n    level PersonIntel\r\n    deriving Show Read Eq</code></pre>\r\n<p>Essentially it just lists which character has what information about certain other character. So when displaying information to players, this table has to be referenced in order to know how much to reveal to them.</p>\r\n<p>Different types of intels are listed as <code>PersonIntel</code>:</p>\r\n<pre><code>data PersonIntel =\r\n    Stats\r\n    | Demesne\r\n    | FamilyRelations\r\n    | SecretRelations\r\n    | Opinions OpinionIntel\r\n    | Traits\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>Person related data is sent back to client in <code>PersonReport</code> record (I’m not copying it here as it’s relatively large). We can have a look on how one field is processed.</p>\r\n<p>For example, in case of traits. <code>PersonReport</code> has field <code>personReportTraits :: !(Maybe [TraitReport])</code>. Exclamation mark in the beginning of type instructs Haskell that this value should be computed immediately when record is created and not left for later. I’m doing this as I know for sure that it’ll always be used and there’s no advantage on delaying computation for the time when it might be needed.</p>\r\n<p>Report creating (high level):</p>\r\n<pre><code>personReportTraits = if Traits `elem` targetIntel\r\n                        then Just $ traitReport &lt;$&gt; targetTraits\r\n                        else Nothing</code></pre>\r\n<p>That first checks that <code>Traits</code> level of intel is available and then creates list of trait reports (one for each trait person has). These have things like trait name, description, trait type and how long the trait is valid. Having separate name and description fields makes it easier to work on client side as I don’t have to come up with descriptions there anymore. I can just use what the server sends to me and be happy.</p>\r\n<p>Comments, questions and feedback are welcome. Best way to catch me nowadays is email or fediverse where I’m <code>Tuula@mastodon.social</code>.</p>\r\n',364,107,0,'CC-BY-SA','modelling,data',0,0,1),
(2867,'2019-07-30','The Kenwood TS940S Automatic Tuning Unit',784,'I cover the Automatic Tuning unit on my Kenwood TS940S, re comment from HPR2668','<p>In this episode I let you hear the operation of my Kenwood TS940S automatic tuning unit. It had been a while since I’d last transmitted and I was a bit nervous that it might not even work – apparently it still does.</p>\r\n<ul>\r\n<li><p>Link to my original show that had a comment from Michael<br />\r\nhpr2668 :: Explaining the controls on my Amateur HF Radio Part 3<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2668\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2668</a></p></li>\r\n<li><p>Link to article about the Kenwood TS940-S<br />\r\n<a href=\"https://www.universal-radio.com/catalog/hamhf/ts940s.html\" class=\"uri\">https://www.universal-radio.com/catalog/hamhf/ts940s.html</a></p></li>\r\n<li><p>Information on the Automatic Tuning Unit located internally within the Kenwood TS940S apparently its an optional Unit with Part number AT-940<br />\r\n<a href=\"https://www.universal-radio.com/catalog/hamhf/at940.html\" class=\"uri\">https://www.universal-radio.com/catalog/hamhf/at940.html</a></p></li>\r\n<li><p>if you really want to dive into more detail about Tuning units feel free to follow this link in wikipedia.<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Antenna_tuner\" class=\"uri\">https://en.wikipedia.org/wiki/Antenna_tuner</a></p></li>\r\n<li><p>Dipole information from wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Dipole_antenna\" class=\"uri\">https://en.wikipedia.org/wiki/Dipole_antenna</a></p></li>\r\n<li><p>40M band allocation information from Wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/40-meter_band\" class=\"uri\">https://en.wikipedia.org/wiki/40-meter_band</a></p></li>\r\n<li><p>Noise Blanker information from wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Noise_blanker\" class=\"uri\">https://en.wikipedia.org/wiki/Noise_blanker</a></p></li>\r\n</ul>\r\n',201,43,1,'CC-BY-SA','Amateur, Radio, Ham',0,0,1),
(2865,'2019-07-26','The YouTube channels I really like',857,'Just some random thoughts on some random youtube channels','<ul>\r\n<li><p>The Late Show with Stephen Colbert<br />\r\n(<a href=\"https://www.youtube.com/channel/UCMtFAi84ehTSYSE9XoHefig\" class=\"uri\">https://www.youtube.com/channel/UCMtFAi84ehTSYSE9XoHefig</a>)</p></li>\r\n<li><p>CuriousMarc<br />\r\nApollo AGC Part 1: Restoring the computer that put man on the Moon<br />\r\n(<a href=\"https://www.youtube.com/watch?v=2KSahAoOLdU\" class=\"uri\">https://www.youtube.com/watch?v=2KSahAoOLdU</a>)</p></li>\r\n<li><p>Virtual AGC — AGS — LVDC — Gemini<br />\r\n(<a href=\"https://github.com/virtualagc/virtualagc\" class=\"uri\">https://github.com/virtualagc/virtualagc</a>)<br />\r\n(<a href=\"https://www.ibiblio.org/apollo/\" class=\"uri\">https://www.ibiblio.org/apollo/</a>)</p></li>\r\n<li><p>Moshix<br />\r\n(<a href=\"https://www.youtube.com/user/moshe5760\" class=\"uri\">https://www.youtube.com/user/moshe5760</a>)</p></li>\r\n<li><p>Death Wears Bunny Slippers<br />\r\n(<a href=\"https://www.youtube.com/channel/UCd50A5qLv8FemVufSvDgkCQ\" class=\"uri\">https://www.youtube.com/channel/UCd50A5qLv8FemVufSvDgkCQ</a>)</p></li>\r\n</ul>\r\n',369,0,0,'CC-BY-SA','apollo,agc,youtube',0,0,1),
(2888,'2019-08-28','Pattern matching in Haskell',1236,'Tuula talks about one of their favourite features in Haskell','<p>Pattern matching is one of those features of Haskell that immediately got me interested as it reduces amount of branching inside of functions I write. Basic idea is that if value constructors are for making data, pattern matching is for taking it apart.</p>\r\n<p>First example is a function that takes a <code>Bool</code> and returns a respective <code>String</code>:</p>\r\n<pre><code>boolToString :: Bool -&gt; String\r\nboolToString n =\r\n    if n\r\n        then &quot;True&quot;\r\n        else &quot;False&quot;</code></pre>\r\n<p>Nothing too fancy, just an <code>if</code> expression inside a function. We can move that <code>if</code> out of there though and define exactly same functionality, but with patterns:</p>\r\n<pre><code>boolToString :: Bool -&gt; String\r\nboolToString True =\r\n    &quot;True&quot;\r\n\r\nboolToString False =\r\n    &quot;False&quot;</code></pre>\r\n<p>There’s one definition for <code>boolToString</code>, but two different patterns used.</p>\r\n<p>Second example is bit more complex, this time we have <code>Maybe Int</code> that is being turned into <code>String</code>. <code>Maybe</code> has two value constructors <code>Nothing</code> and <code>Just a</code>. We have two cases for <code>Just</code>, specific one for when it’s <code>Just 1</code> and more general one <code>Just n</code> that takes care of rest of the cases.</p>\r\n<pre><code>isBig :: Maybe Int -&gt; String\r\nisBig Nothing =\r\n    &quot;Not at all&quot;\r\n\r\nisBig (Just 1) =\r\n    &quot;Just perfect&quot;\r\n\r\nisBig (Just n) =\r\n    if n &lt; 10\r\n        then &quot;Just slightly&quot;\r\n        else &quot;Definitely is&quot;</code></pre>\r\n<p>Some example usage:</p>\r\n<pre><code>&gt; isBig Nothing\r\n&quot;Not at all&quot;\r\n&gt; isBig $ Just 0\r\n&quot;Just perfect&quot;\r\n&gt; isBig $ Just 50\r\n&quot;Definitely is&quot;</code></pre>\r\n<p>Pattern matching isn’t limited to algebraic datatypes that we have been working with so far. We can do same things with records. Below is an function used to calculate total fee when cost and customer are known. Each customer can have their own discount percentage, but in addition we’re giving 10% discount to VIP customers:</p>\r\n<pre><code>data Customer = Customer\r\n    { customerName :: String\r\n    , customerDiscountPct :: Double\r\n    , vipCustomer :: Bool\r\n    }\r\n\r\ntotalFee :: Double -&gt; Customer -&gt; Double\r\ntotalFee bill cust@(Customer { vipCustomer = True }) =\r\n    bill * 0.9 * customerDiscountPct cust\r\n\r\ntotalFee bill cust =\r\n    bill * customerDiscountPct cust</code></pre>\r\n<p>There’s two cases of <code>totalFee</code> function. First one is for when passed in <code>Customer</code> has <code>vipCustomer</code> field <code>True</code>. Second one takes care of general case. In the first case we’re using <code>@</code> to bind <code>Customer</code> as a whole to <code>cust</code> name.</p>\r\n<p>Lists can be matched too. The basic idea is exactly the same:</p>\r\n<ul>\r\n<li><code>(x:xs)</code> matches a list with at least one item, <code>x</code> is first item, <code>xs</code> is rest of the items (might be an empty list)</li>\r\n<li><code>(x:y:_)</code> matches two first items in a list of at least two items, <code>x</code> is first, <code>y</code> is second, <code>_</code> is rest</li>\r\n<li><code>[]</code> matches empty list</li>\r\n<li><code>(x:[])</code> matches list of exactly one item</li>\r\n</ul>\r\n<p>Underscore <code>_</code> matches to everything without binding value to a name. This is useful when you don’t care about exact value, so you don’t want to give it a name. One could give it a name, but compiler will issue a warning if there are unused values in the code.</p>\r\n<p>Next example is recursively counting amount if items in a list using pattern matching:</p>\r\n<pre><code>count :: [a] -&gt; Int\r\ncount [] =\r\n    0\r\n\r\ncount (x:xs) =\r\n    1 + count xs</code></pre>\r\n<p>Fibonacci series is series of number which starts with 0, 1 and then rest of the numbers are sum of two previous ones: 0, 1, 1, 2, 3, 5, 8…</p>\r\n<p>To calculate number in series, we can write following code (this is extremely slow way of calculating them by the way):</p>\r\n<pre><code>fibonacci :: Int -&gt; Int\r\nfibonacci 0 =\r\n    0\r\n\r\nfibonacci 1 =\r\n    1\r\n\r\nfibonacci n =\r\n    fibonacci (n - 1) + fibonacci (n - 2)</code></pre>\r\n<p>Last trick in our sleeve for now is <code>case</code> expression. This allows us to do pattern matching inside of a function. Otherwise it works in the same way. Our fibonacci function could be defined as:</p>\r\n<pre><code>fibonacci :: Int -&gt; Int\r\nfibonacci n =\r\n    case n of\r\n        0 -&gt;\r\n            0\r\n\r\n        1 -&gt;\r\n            1\r\n\r\n        n -&gt;\r\n            fibonacci (n - 1) + fibonacci (n - 2)</code></pre>\r\n<p>Questions, comments and feedback are welcome. Best way to catch me nowadays is either email or in fediverse where I’m <code>Tuula@mastodon.social</code></p>\r\n',364,107,0,'CC-BY-SA','pattern matching',0,0,1),
(2869,'2019-08-01','building a bike, following in John Kulp\'s footsteps',694,'turning a couple of old bikes into a long wheel base recumbent','<ul>\r\n<li><p>recycled recumbent<br />\r\n<a href=\"https://sites.google.com/site/recycledrecumbents/home\" class=\"uri\">https://sites.google.com/site/recycledrecumbents/home</a></p></li>\r\n<li><p>wisil recumbent<br />\r\n<a href=\"https://www.wisil.recumbents.com/home/\" class=\"uri\">https://www.wisil.recumbents.com/home/</a></p></li>\r\n<li><p>hpr 1282<br />\r\n<a href=\"https://www.hackerpublicradio.org/eps.php?id=1282\" class=\"uri\">https://www.hackerpublicradio.org/eps.php?id=1282</a></p></li>\r\n<li><p>cj hoyle<br />\r\n<a href=\"https://www.youtube.com/user/cjhoyle\" class=\"uri\">https://www.youtube.com/user/cjhoyle</a></p></li>\r\n<li><p>toledo bike<br />\r\n<a href=\"https://www.toledobikes.org/\" class=\"uri\">https://www.toledobikes.org/</a></p></li>\r\n</ul>\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent, recycle',0,0,1),
(2872,'2019-08-06','Shoe Lace Tips',472,'In this episode I give some shoe lace tips','<p>In this episode I give some shoe lace tips</p>\r\n<ul>\r\n<li><p>Shoe Laces Ted Talk with over 6.5 million views<br />\r\n<a href=\"https://www.ted.com/talks/terry_moore_how_to_tie_your_shoes?language=en\" class=\"uri\">https://www.ted.com/talks/terry_moore_how_to_tie_your_shoes?language=en</a></p></li>\r\n<li><p>Some further info on the shoe lace knot from the wonderful wikipedia site<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Shoelace_knot\" class=\"uri\">https://en.wikipedia.org/wiki/Shoelace_knot</a></p></li>\r\n<li><p>Fast tie shoe laces recommended for anyone in a hurry<br />\r\n<a href=\"https://www.amazon.co.uk/Gritin-Elastic-Laces-Black-Reflective/dp/B07GYM9RC8/ref=cts_sp_3_vtp\" class=\"uri\">https://www.amazon.co.uk/Gritin-Elastic-Laces-Black-Reflective/dp/B07GYM9RC8/ref=cts_sp_3_vtp</a></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','hacks, tips',0,0,1),
(2874,'2019-08-08','Repair of G.E. Variable Speed Cassette Recorder',1228,'I talk about repairing a 1997 handheld cassette recorder and demonstrate its use.','<p>I found a pretty cool little handheld cassette recorder at Salvation Army Thrift Store for 99 cents yesterday. It was non-functioning. I was able to get it working again by 1. cleaning corrosion from battery compartment; 2. replacing the nasty gooey belt; 3.  repairing the battery compartment, which had a broken-off spring for one of the battery\'s negative connections. The most interesting feature of the device is that it has a variable-speed knob for playback at higher speed. I demonstrate this in the podcast.</p>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157709909168017\" title=\"G.E. Variable Speed Cassette Recorder Repair\" target=\"_blank\"><img src=\"https://live.staticflickr.com/65535/48384093097_f35a19caaa.jpg\" width=\"500\" height=\"281\" alt=\"G.E. Variable Speed Cassette Recorder Repair\"></a></p>\r\n\r\n<h2>Links to Stuff Mentioned in the Episode</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://www.flickr.com/photos/137675441@N05/albums/72157709909168017\" target=\"_blank\">Flickr Photo Album</a></li>\r\n	<li><a href=\"https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=assorted+cassette+belts&_sacat=0\" target=\"_blank\">Assorted cassette deck belts on eBay</a></li>\r\n	<li><a href=\"https://kahoot.com/\" target=\"_blank\">Kahoot!</a> Make Learning Awesome.</li>\r\n</ul>\r\n\r\n\r\n',238,0,0,'CC-BY-SA','Recording, Audio, Tape, Cassette, Recording Devices, Tape Speeds, Electronics, Repair',0,0,1),
(2875,'2019-08-09','cutting up the frames',456,'you\'ve got to crack some eggs to make an omelette','<h2 id=\"drawings\">Drawings</h2>\r\n<p><a href=\"https://sites.google.com/site/recycledrecumbents/ez-clone-drawings\" class=\"uri\">https://sites.google.com/site/recycledrecumbents/ez-clone-drawings</a></p>\r\n<h2 id=\"pictures\">Pictures</h2>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/hpr2875/picture01-one-of-the-donors.jpg\" alt=\"picture01-one-of-the-donors.jpg\" /><br />\r\nOne of the donors</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/hpr2875/picture02-dross.jpg\" alt=\"picture02-dross.jpg\" /><br />\r\nDross</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/hpr2875/picture03-the-gold.jpg\" alt=\"picture03-the-gold.jpg\" /><br />\r\nThe gold</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/hpr2875/picture04-first-cut.jpg\" alt=\"picture04-first-cut.jpg\" /><br />\r\nFirst cut</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/hpr2875/picture05-cutting-tubes.jpg\" alt=\"picture05-cutting-tubes.jpg\" /><br />\r\nCutting tubes</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/hpr2875/picture06-workmate.jpg\" alt=\"picture06-workmate.jpg\" /><br />\r\nWorkmate</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/hpr2875/picture07-frame2-parts.jpg\" alt=\"picture07-frame2-parts.jpg\" /><br />\r\nFrame 2 parts</p>\r\n<p><img src=\"https://hackerpublicradio.org/eps/hpr2875/hpr2875/picture08-frame1-parts.jpg\" alt=\"picture08-frame1-parts.jpg\" /><br />\r\nFrame 1 parts</p>\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent, recycle',0,0,1),
(2876,'2019-08-12','Sausage Orzotto',2543,'A favorite recipe, dictated while it is cooked.','<p>This recipe has been heavily adapted from one I received from <a href=\"https://www.hellofresh.com\">Hello Fresh</a> - credit where credit\'s due!</p>\r\n<p>Ingredients:</p>\r\n<ul>\r\n<li>1 lb (500g) Sausage (chicken or pork works)</li>\r\n<li>1 ½ cups (192g) Orzo</li>\r\n<li>2 tbsp (40g) Butter</li>\r\n<li>Olive oil</li>\r\n<li>Zucchini</li>\r\n<li>Shallot</li>\r\n<li>1 - 2 tbsp (20-40g) Italian Seasoning</li>\r\n<li>Pepper</li>\r\n<li>2 cups (475ml) water</li>\r\n<li>1 tsp (4g) stock concentrate</li>\r\n<li>16oz (450g?? One normal can, whatever that is) Crushed or diced tomatoes</li>\r\n<li>1 cup (226g) Mozzarella cheese (shredded)</li>\r\n<li>Panko Breadcrumbs</li>\r\n<li>Salt (Optional)</li>\r\n</ul>\r\n<ol>\r\n<li>Mince half the shallot (or all of it, I\'m not the boss of you). Trim and shred the zucchini. Prepare a mixing bowl lined with a paper towel.</li>\r\n<li>Preheat oven to 500 F</li>\r\n<li>Drizzle some oil into a large oven-proof pan (if you\'ve got one) and cook the sausage, with half the Italian seasoning, over medium heat, breaking it into bite-sized pieces as you cook it. Transfer to the mixing bowl for later.</li>\r\n<li>Add another drizzle of olive oil, and shred the zucchini into the pan. Add shallot, and cook until the zucchini shrinks to ⅔ of its size (about 5 minutes). Transfer to the mixing bowl with the sausage.</li>\r\n<li>Wipe out the pan with a paper towel. Melt 1 tbsp of butter over medium heat, and add orzo, stirring pretty frequently for 2-3 minutes.</li>\r\n<li>Stir in the rest of the Italian seasoning, along with the water, tomatoes, and stock concentrate. Bring to a boil and stir until orzo is done - around 12 - 14 minutes.</li>\r\n<li>Drain excess liquid from the zucchini and sausage.</li>\r\n<li>Mix sausage &amp; zucchini into orzo mixture, with 1 tbsp of butter. Season with salt &amp; pepper, if you want.</li>\r\n<li>If you don\'t have an oven-proof pan, you\'re going to want to transfer everything over to a large baking dish of some kind. 13x9&quot; works for me.</li>\r\n<li>Cover the mixture in mozzarella cheese and panko breadcrumbs - in that order!</li>\r\n<li>Place dish in the oven for 2-3 minutes, until the breadcrumbs are toasted.</li>\r\n</ol>\r\n<p>Note: If these metric measurements seem crazy, they probably are.</p>\r\n',196,0,1,'CC-BY-SA','food,cooking',0,0,1),
(2877,'2019-08-13','Using Zenity with Pdmenu',1358,'Zenity is a rather cool program that will display GTK+ dialogs from a script','<h2 id=\"overview\">Overview</h2>\n<p>I use <code>pdmenu</code> a lot to help me do work on my main desktop PC. I did an HPR show on <a href=\"https://hackerpublicradio.org/eps.php?id=2443\" title=\"hpr2443 :: pdmenu\"><code>pdmenu</code></a> on 13 December 2017 and the author <a href=\"https://joeyh.name/\" title=\"Joey Hess\">Joey Hess</a> responded in show <a href=\"https://hackerpublicradio.org/eps.php?id=2459\" title=\"hpr2459 :: free software&#39;s long tail\">2459</a>.</p>\n<p>In the intervening time I have also integrated <a href=\"https://help.gnome.org/users/zenity/\" title=\"Zenity Manual\"><code>Zenity</code></a> into my menus. This is a GUI tool which generates a number of different pop-up windows known as <em>dialogs</em>, which can display information, or into which information can be typed. The capabilities provided by <code>pdmenu</code> are a little too basic to enable me to do what I need to do.</p>\n<p>I thought it might be of interest to show some examples of how I use this tool with <code>pdmenu</code>.</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=\"hpr2877_full_shownotes.html\">viewed here</a>.</p>\n<h2 id=\"links\">Links</h2>\n<ul>\n<li>Pdmenu:\n<ul>\n<li><a href=\"https://joeyh.name/code/pdmenu/\">Pdmenu website</a></li>\n<li><a href=\"https://joeyh.name/\">Joey Hess</a></li>\n</ul></li>\n<li>Zenity\n<ul>\n<li><a href=\"https://en.wikipedia.org/wiki/Zenity\">Wikipedia page</a></li>\n<li><a href=\"https://help.gnome.org/users/zenity/\">Zenity Manual</a></li>\n</ul></li>\n</ul>\n',225,42,1,'CC-BY-SA','zenity,Bash scripting,pdmenu,GTK+',0,0,1),
(2879,'2019-08-15','Describing how I listen to podcasts PART 1',1877,'This episode badly covers the console audio player moc.','<p>In this series I cover how I listen to podcasts and how the process has change over the years. This episode badly covers the console audio player <code>moc</code>.</p>\r\n<ul>\r\n<li><p>Link to HPR 2112 (Home Server) episode mentioned in this podcast<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2112\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2112</a></p></li>\r\n<li><p>My first MP3 player was a Jelly Bean shaped MP3 player apparently known as an S1 MP3 player<br />\r\n<a href=\"https://en.wikipedia.org/wiki/S1_MP3_player\" class=\"uri\">https://en.wikipedia.org/wiki/S1_MP3_player</a></p></li>\r\n<li><p>Sansa Clip info on wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Sansa_Clip#Sansa_Clip\" class=\"uri\">https://en.wikipedia.org/wiki/Sansa_Clip#Sansa_Clip</a></p></li>\r\n<li><p>Raspberry Pi<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Raspberry_Pi\" class=\"uri\">https://en.wikipedia.org/wiki/Raspberry_Pi</a></p></li>\r\n<li><p>Music On Console (MOC) is an ncurses-based console audio player for Linux/UNIX<br />\r\n</p>\r\n<ul>\r\n<li><p>Here is a link to information about moc on wikipedia<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Music_on_Console\" class=\"uri\">https://en.wikipedia.org/wiki/Music_on_Console</a></p></li>\r\n<li>On a Debian based system Moc can be installed by issuing the following command<br />\r\n</li>\r\n</ul>\r\n<pre><code>      sudo apt-get install moc</code></pre>\r\n<ul>\r\n<li>Link to Moc, Music On Console homepage<br />\r\n<a href=\"https://moc.daper.net/\" class=\"uri\">https://moc.daper.net/</a></li>\r\n</ul></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Ncurses',0,0,1),
(2884,'2019-08-22','TASCAM Porta 02 MiniStudio 4-Track Cassette Recorder Demonstration',4636,'I demonstrate the use of a vintage home studio device','<p>I discuss and demonstrate the latest retro gadget I found at the flea market last weekend, a TASCAM Porta 02 MiniStudio 4-Track Cassette Recorder. It was in a bin full of junk—filthy, lacking its power supply, and I got it for only $5. I hacked a power supply, disassembled it completely, washed everything thoroughly, and put it back together. It worked perfectly with the exception of the pause button. This has been one of the most fun projects I can remember, especially because my daughter is into it too, and she\'s learning how to make multi-track recordings. I always wanted a 4-track when I was in high school but never had one. Now I do!</p>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157710065663101\" title=\"TSACAM Porta 02 4-Track Recording Demonstration\"><img src=\"https://live.staticflickr.com/65535/48445093092_64359d6b68.jpg\" width=\"500\" height=\"375\" alt=\"TSACAM Porta 02 4-Track Recording Demonstration\"></a></p>\r\n\r\n<h2>Links to info about stuff I mentioned</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://flic.kr/s/aHsmFL2UUv\" target=\"_blank\">Flickr album with photos from this recording session</a></li>\r\n	<li><a href=\"https://flic.kr/s/aHsmFyCT82\" target=\"_blank\">Flickr album with photos from the TASCAM machine restoration</a></li>\r\n	<li>My earlier episode about the Marantz recorder: <a href=\"https://hackerpublicradio.org/eps.php?id=1844\">hpr1844 :: The Marantz PMD 660 Professional Solid State Recorder</a></li>\r\n	<li>My video of the TASCAM testing, power supply hack, disassembly, and cleaning: <a href=\"https://youtu.be/HhM6UwBhykM\" target=\"_blank\">Watch on YouTube</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Multitrack_recording\" target=\"_blank\">Multitrack recording</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/G%C3%BCiro\" target=\"_blank\">Güiro</a> (mine is metal)</li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Claves\" target=\"_blank\">Clave</a> (instrument) and <a href=\"https://en.wikipedia.org/wiki/Clave_(rhythm)\" target=\"_blank\">clave rhythm</a> (you heard the 2-3 clave rhythm on this podcast)</li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Harmonica#Diatonic_harmonicas\" target=\"_blank\">Diatonic harmonica</a></li>\r\n	<li>	<a href=\"https://en.wikipedia.org/wiki/Chromatic_harmonica\" target=\"_blank\">Chromatic harmonica</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Microphone\" target=\"_blank\">Microphone types</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Phantom_power\" target=\"_blank\">Phantom power</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Clipping_(audio)\" target=\"_blank\">Clipping</a></li>\r\n	<li>EQ: <a href=\"https://en.wikipedia.org/wiki/Equalization_(audio)\" target=\"_blank\">Equalization</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Audio_mixing_(recorded_music)\">Mixing</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Mastering_(audio)\">Mastering</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Demo_(music)\">Demo Recordings</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Portastudio\">The TASCAM PortaStudio</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/David_Mead_(musician)\" target=\"_blank\">David Mead</a> (his first two albums were with RCA, not Polygram</li>\r\n	<li>My first test recording on the restored TASCAM Porta 02: <a href=\"https://soundcloud.com/jonkulp/tascam-4-track-cassette-recorder-test-1-vamos-a-bailar\" target=\"_blank\">Listen on Soundcloud</a></li>\r\n</ul>\r\n',238,0,0,'CC-BY-SA','Multi-Track Recording, Recording Devices, Home Recording Studios, Cassette Tapes, Vintage Recording ',0,0,1),
(2881,'2019-08-19','Automatically split album into tracks in Audacity',250,'Inspired by a Jon Kulp show, Ken splits a large recording based on silence between tracks','<p>\r\nIn this show Ken, recalls <a href=\"https://hackerpublicradio.org/eps.php?id=1771\">hpr1771 :: Audacity: Label Tracks</a> by <a href=\"https://hackerpublicradio.org/correspondents/0238.html\">Jon Kulp</a> to add Labels to an large audio file.\r\n</p>\r\n\r\n<ul>\r\n<li>Tidy up the audio to the point where you are happy with it, but do not truncate silence.</li>\r\n<li>Find the first break in the audio and check how long it is. In my case it was 4 seconds.</li>\r\n<li>Select the entire track and select <em>Analyze>Silence Finder</em></li>\r\n<li>Change <em>Maximum duration of silence</em> to just under the length of the break. In my case I set it to 3 seconds</li>\r\n<li>This will then create a series of labels on a new Label track</li>\r\n<li>Edit the names of each as desired.</li>\r\n<li>Select File > Export > Export Multiple</li>\r\n<li>Select Split Files based on Labels</li>\r\n<li>Name files using Label/Track Name</li>\r\n</ul>',30,0,1,'CC-BY-SA','Audacity, hpr1771, Detect Silence, Split Track, Label',0,0,1),
(3156,'2020-09-07','HPR Community News for August 2020',4202,'HPR Volunteers talk about shows released and comments posted in August 2020','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nWelcome to our new host: <br />\n\n    <a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a>.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3131\" target=\"_blank\">3131</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3131\" target=\"_blank\">HPR Community News for July 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3132\" target=\"_blank\">3132</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-08-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3132\" target=\"_blank\">Keeping track of where I am</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3133\" target=\"_blank\">3133</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-08-05</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3133\" target=\"_blank\">Quick tip - Using MPV with Youtube links</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3134\" target=\"_blank\">3134</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-08-06</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3134\" target=\"_blank\">Tomorrowland 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3135\" target=\"_blank\">3135</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-08-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3135\" target=\"_blank\">Quick Tips for May 20 20</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3136\" target=\"_blank\">3136</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3136\" target=\"_blank\">Matchbox Restoration Part 6</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0338.html\" target=\"_blank\">Tony Hughes AKA TonyH1212</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3137\" target=\"_blank\">3137</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-08-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3137\" target=\"_blank\">Coronavirus Update 2020-07-30</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3138\" target=\"_blank\">3138</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-08-12</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3138\" target=\"_blank\">Linux Inlaws S01E12: Reminiscing in FLOSS Weekly</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3139\" target=\"_blank\">3139</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-08-13</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3139\" target=\"_blank\">MIDI Sysex</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3140\" target=\"_blank\">3140</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-08-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3140\" target=\"_blank\">GIMP: Selection Tools</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3141\" target=\"_blank\">3141</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3141\" target=\"_blank\">Lessons learnt from Magic the Gathering game design</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3142\" target=\"_blank\">3142</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-08-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3142\" target=\"_blank\">tcsh</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3143\" target=\"_blank\">3143</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-08-19</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3143\" target=\"_blank\">LibreOffice 7.0 Released!</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3144\" target=\"_blank\">3144</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-08-20</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3144\" target=\"_blank\">Pentesting: Insecure Object Reference</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3145\" target=\"_blank\">3145</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-08-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3145\" target=\"_blank\">A light bulb moment, part 1</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0201.html\" target=\"_blank\">MrX</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3146\" target=\"_blank\">3146</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3146\" target=\"_blank\">Help Me Help you with HPR eps!</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3147\" target=\"_blank\">3147</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-08-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3147\" target=\"_blank\">NIST\'s Quantum Cryptography Update</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3148\" target=\"_blank\">3148</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-08-26</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3148\" target=\"_blank\">Why Open Source matters (to me)</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3149\" target=\"_blank\">3149</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-08-27</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3149\" target=\"_blank\">HPR AudioBook Club 21  - The Terrible Business of Salmon and Dusk</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0157.html\" target=\"_blank\">HPR_AudioBookClub</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3150\" target=\"_blank\">3150</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-08-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3150\" target=\"_blank\">GIMP: Paint Tools</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3151\" target=\"_blank\">3151</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-08-31</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3151\" target=\"_blank\">How I listen to podcasts</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 23 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 2 comments on\n2 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3119#comments\" target=\"_blank\">hpr3119</a></strong>\n(2020-07-16) \"<em>Converting to FFS2</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0377.html\" target=\"_blank\">Zen_Floater2</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3119#3\" target=\"_blank\">Comment 3</a>:\nZen_Floater2 on 2020-08-13:\n\"reply back to Gumnos\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3123#comments\" target=\"_blank\">hpr3123</a></strong>\n(2020-07-22) \"<em>Arduino controlled Christmas lights</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0318.html\" target=\"_blank\">Archer72</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3123#1\" target=\"_blank\">Comment 1</a>:\nArcher72 on 2020-08-03:\n\"Funny story\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 21 comments on 8 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3131#comments\" target=\"_blank\">hpr3131</a></strong>\n(2020-08-03) \"<em>HPR Community News for July 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3131#1\" target=\"_blank\">Comment 1</a>:\nZen_Floater2 on 2020-08-13:\n\"I\'ve learned much.and I\'d like to share much as well...\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3134#comments\" target=\"_blank\">hpr3134</a></strong>\n(2020-08-06) \"<em>Tomorrowland 2020</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0382.html\" target=\"_blank\">Daniel Persson</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3134#1\" target=\"_blank\">Comment 1</a>:\nfatherfinch on 2020-08-07:\n\"Great Energy\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3134#2\" target=\"_blank\">Comment 2</a>:\ncatn0b0t on 2020-08-10:\n\"TML 2020\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3137#comments\" target=\"_blank\">hpr3137</a></strong>\n(2020-08-11) \"<em>Coronavirus Update 2020-07-30</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-08-11:\n\"some \'smart\' people may not take a vaccine\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-08-12:\n\"Why it matters\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#3\" target=\"_blank\">Comment 3</a>:\nZen_Floater2 on 2020-08-13:\n\"The Squirrel from the Magical Forrest\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#4\" target=\"_blank\">Comment 4</a>:\nSkepticalA on 2020-08-16:\n\"Condescending\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#5\" target=\"_blank\">Comment 5</a>:\nBob on 2020-08-16:\n\"Fact Checks on one of your claims\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#6\" target=\"_blank\">Comment 6</a>:\nbrian-in-ohio on 2020-08-16:\n\"sympathy\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#7\" target=\"_blank\">Comment 7</a>:\nAhuka on 2020-08-16:\n\"Clarification\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#8\" target=\"_blank\">Comment 8</a>:\nZen_Floater2 on 2020-08-19:\n\"Detailed research Corbit Report\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3137#9\" target=\"_blank\">Comment 9</a>:\nAnon on 2020-08-21:\n\"Conspiracy Theories: Last Week Tonight with John Oliver\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3138#comments\" target=\"_blank\">hpr3138</a></strong>\n(2020-08-12) \"<em>Linux Inlaws S01E12: Reminiscing in FLOSS Weekly</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3138#1\" target=\"_blank\">Comment 1</a>:\nAhuka on 2020-08-12:\n\"Excellent Interview\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3138#2\" target=\"_blank\">Comment 2</a>:\nClaudioM on 2020-08-14:\n\"Agree with Ahuka. Great Interview!\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3138#3\" target=\"_blank\">Comment 3</a>:\nbrian-in-ohio on 2020-08-16:\n\"follow up question\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3138#4\" target=\"_blank\">Comment 4</a>:\nan anonymous listener on 2020-08-21:\n\"volume\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3139#comments\" target=\"_blank\">hpr3139</a></strong>\n(2020-08-13) \"<em>MIDI Sysex</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3139#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-08-16:\n\"the voice\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3139#2\" target=\"_blank\">Comment 2</a>:\nKen Fallon on 2020-08-18:\n\"Voice\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3143#comments\" target=\"_blank\">hpr3143</a></strong>\n(2020-08-19) \"<em>LibreOffice 7.0 Released!</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3143#1\" target=\"_blank\">Comment 1</a>:\nbrian-in-ohio on 2020-08-19:\n\"slackware\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3144#comments\" target=\"_blank\">hpr3144</a></strong>\n(2020-08-20) \"<em>Pentesting: Insecure Object Reference</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3144#1\" target=\"_blank\">Comment 1</a>:\nMr. Young on 2020-08-20:\n\"I deal with this all the time\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3148#comments\" target=\"_blank\">hpr3148</a></strong>\n(2020-08-26) \"<em>Why Open Source matters (to me)</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3148#1\" target=\"_blank\">Comment 1</a>:\nZen_Floater2 on 2020-08-29:\n\"Vic 20\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-August/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-August/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributors for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a>, <a href=\"https://hackerpublicradio.org/correspondents/0225.html\">Dave Morriss</a></b></p>\n<p>Over the period tags and/or summaries have been added to 12 shows which were without them.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(3176,'2020-10-05','HPR Community News for September 2020',4187,'HPR Volunteers talk about shows released and comments posted in September 2020','<style>\ntable td.shrink {\n    white-space:nowrap\n}\n</style>\n\n<h2>New hosts</h2>\n<p>\nThere were no new hosts this month.\n</p>\n\n<h2>Last Month\'s Shows</h2>\n<table id=\"t01\">\n<tr>\n<th>Id</th>\n<th>Day</th>\n<th>Date</th>\n<th>Title</th>\n<th>Host</th>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3152\" target=\"_blank\">3152</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-01</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3152\" target=\"_blank\">My Pocket Knives</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3153\" target=\"_blank\">3153</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-02</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3153\" target=\"_blank\">Fixing eBooks with Calibre and pdfcrop</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3154\" target=\"_blank\">3154</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-09-03</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3154\" target=\"_blank\">Make NextCloud your next cloud</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3155\" target=\"_blank\">3155</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-09-04</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3155\" target=\"_blank\">LastPass Security Dashboard</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3156\" target=\"_blank\">3156</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-09-07</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3156\" target=\"_blank\">HPR Community News for August 2020</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0159.html\" target=\"_blank\">HPR Volunteers</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3157\" target=\"_blank\">3157</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-08</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3157\" target=\"_blank\">Compost</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3158\" target=\"_blank\">3158</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-09</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3158\" target=\"_blank\">Fingerprint access control? LOL... </a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3159\" target=\"_blank\">3159</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-09-10</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3159\" target=\"_blank\">Vivaldi - The Four Seasons</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3160\" target=\"_blank\">3160</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-09-11</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3160\" target=\"_blank\">GIMP: Transform Tools</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3161\" target=\"_blank\">3161</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-09-14</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3161\" target=\"_blank\">How I manage podcast listening</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3162\" target=\"_blank\">3162</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-15</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3162\" target=\"_blank\">Introduction to Ansible</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3163\" target=\"_blank\">3163</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-16</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3163\" target=\"_blank\">Linux Inlaws S01E13: The road to communism and freedom</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3164\" target=\"_blank\">3164</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-09-17</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3164\" target=\"_blank\">I\'m Learning Spanish</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3165\" target=\"_blank\">3165</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-09-18</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3165\" target=\"_blank\">Spanish Tools Continued</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3166\" target=\"_blank\">3166</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-09-21</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3166\" target=\"_blank\">Using Ansible to mirror a Git repo</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0078.html\" target=\"_blank\">klaatu</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3167\" target=\"_blank\">3167</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-22</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3167\" target=\"_blank\">A ramble with the Pentland Squires (part 1)</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3168\" target=\"_blank\">3168</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-23</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3168\" target=\"_blank\">FreeBSD Jails and iocage</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3169\" target=\"_blank\">3169</a></strong></td>\n<td>Thu</td>\n<td class=\"shrink\">2020-09-24</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3169\" target=\"_blank\">Ludwig van Beethoven with a hint of Chopin</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3170\" target=\"_blank\">3170</a></strong></td>\n<td>Fri</td>\n<td class=\"shrink\">2020-09-25</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3170\" target=\"_blank\">GIMP: Color Tools</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0198.html\" target=\"_blank\">Ahuka</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3171\" target=\"_blank\">3171</a></strong></td>\n<td>Mon</td>\n<td class=\"shrink\">2020-09-28</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3171\" target=\"_blank\">A Week On Soylent</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0107.html\" target=\"_blank\">lostnbronx</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3172\" target=\"_blank\">3172</a></strong></td>\n<td>Tue</td>\n<td class=\"shrink\">2020-09-29</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3172\" target=\"_blank\">A ramble with the Pentland Squires (part 2)</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a></td>\n</tr>\n<tr>\n<td><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3173\" target=\"_blank\">3173</a></strong></td>\n<td>Wed</td>\n<td class=\"shrink\">2020-09-30</td>\n<td><a href=\"https://hackerpublicradio.org/eps.php?id=3173\" target=\"_blank\">Manage your Raspberry Pi fleet with Ansible</a></td>\n<td><a href=\"https://hackerpublicradio.org/correspondents/0030.html\" target=\"_blank\">Ken Fallon</a></td>\n</tr>\n</table>\n\n<h2>Comments this month</h2>\n\n<p>These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 15 comments in total.</p>\n<h3>Past shows</h3>\n<p>There are 2 comments on\n2 previous shows:</p>\n<ul>\n<li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3138#comments\" target=\"_blank\">hpr3138</a></strong>\n(2020-08-12) \"<em>Linux Inlaws S01E12: Reminiscing in FLOSS Weekly</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0384.html\" target=\"_blank\">monochromec</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3138#5\" target=\"_blank\">Comment 5</a>:\nRobert on 2020-09-02:\n\"..._---_\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3146#comments\" target=\"_blank\">hpr3146</a></strong>\n(2020-08-24) \"<em>Help Me Help you with HPR eps!</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0036.html\" target=\"_blank\">operat0r</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul>\n<li>\n<a href=\"https://hackerpublicradio.org/eps.php?id=3146#1\" target=\"_blank\">Comment 1</a>:\nKen Fallon on 2020-09-05:\n\"Keep doing what you\'re doing\"</li></ul><br/>\n</li></ul>\n<h3>This month\'s shows</h3>\n<p>There are 13 comments on 6 of this month\'s shows:</p>\n<ul><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3152#comments\" target=\"_blank\">hpr3152</a></strong>\n(2020-09-01) \"<em>My Pocket Knives</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3152#1\" target=\"_blank\">Comment 1</a>:\nReto on 2020-09-24:\n\"Link to the other knive podcast\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3154#comments\" target=\"_blank\">hpr3154</a></strong>\n(2020-09-03) \"<em>Make NextCloud your next cloud</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0383.html\" target=\"_blank\">Paul Quirk</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3154#1\" target=\"_blank\">Comment 1</a>:\nWindigo on 2020-09-11:\n\"Nextcloud and self hosting\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3158#comments\" target=\"_blank\">hpr3158</a></strong>\n(2020-09-09) \"<em>Fingerprint access control? LOL... </em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0387.html\" target=\"_blank\">Cedric De Vroey</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3158#1\" target=\"_blank\">Comment 1</a>:\nBeeza on 2020-09-11:\n\"The need for \"meta procedures\"\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3158#2\" target=\"_blank\">Comment 2</a>:\nAhuka on 2020-09-11:\n\"Fantastic show!\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3161#comments\" target=\"_blank\">hpr3161</a></strong>\n(2020-09-14) \"<em>How I manage podcast listening</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3161#1\" target=\"_blank\">Comment 1</a>:\nReto on 2020-09-24:\n\"Sansa MP3 Players\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3161#2\" target=\"_blank\">Comment 2</a>:\nDave Morriss on 2020-09-27:\n\"Rockbox and Sansa players\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3161#3\" target=\"_blank\">Comment 3</a>:\nKevin O&#39;Brien on 2020-09-27:\n\"My Rockbox/Sansa experience\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3161#4\" target=\"_blank\">Comment 4</a>:\nDave Morriss on 2020-09-29:\n\"No more Sansa Clip Plus\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3167#comments\" target=\"_blank\">hpr3167</a></strong>\n(2020-09-22) \"<em>A ramble with the Pentland Squires (part 1)</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0225.html\" target=\"_blank\">Dave Morriss</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3167#1\" target=\"_blank\">Comment 1</a>:\nAaron on 2020-09-27:\n\"Nice conversation, thanks for sharing it\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3167#2\" target=\"_blank\">Comment 2</a>:\nZen_Floater2 on 2020-09-27:\n\"Squirrels love local chit-chat\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3167#3\" target=\"_blank\">Comment 3</a>:\nDave Morriss on 2020-09-29:\n\"Thanks for the feedback\"</li></ul><br/>\n</li><li><strong><a href=\"https://hackerpublicradio.org/eps.php?id=3168#comments\" target=\"_blank\">hpr3168</a></strong>\n(2020-09-23) \"<em>FreeBSD Jails and iocage</em>\"\nby <a href=\"https://hackerpublicradio.org/correspondents/0342.html\" target=\"_blank\">norrist</a>.</li>\n<li style=\"list-style: none; display: inline\">\n<ul><li><a href=\"https://hackerpublicradio.org/eps.php?id=3168#1\" target=\"_blank\">Comment 1</a>:\n0xf10e on 2020-09-27:\n\"Why an additional disk/zpool?\"</li><li><a href=\"https://hackerpublicradio.org/eps.php?id=3168#2\" target=\"_blank\">Comment 2</a>:\nnorrist on 2020-09-28:\n\"2nd disk for iocage\"</li></ul><br/>\n</li></ul>\n\n<h2>Mailing List discussions</h2>\n<p>\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the <a href=\"https://hackerpublicradio.org/maillist\"\ntarget=\"_blank\">Mail List</a> which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/\">Mailman</a>.\n</p>\n<p>The threaded discussions this month can be found here:</p>\n<a href=\"https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-September/thread.html\" target=\"_blank\">https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-September/thread.html</a>\n\n\n<h2>Events Calendar</h2>\n<p>With the kind permission of <strong>LWN.net</strong> we are linking to\n<a href=\"https://lwn.net/Calendar/\" target=\"_blank\">The LWN.net Community Calendar</a>.</p>\n<p>Quoting the site:</p>\n<blockquote>This is the LWN.net community event calendar, where we track\nevents of interest to people using and developing Linux and free software.\nClicking on individual events will take you to the appropriate web\npage.</blockquote>\n\n<h2>Any other business</h2>\n<h3 id=\"tags-and-summaries\">Tags and Summaries</h3>\n<p>Thanks to the following contributor for sending in updates in the past month:<br />\n<b><a href=\"https://hackerpublicradio.org/correspondents/0215.html\">Windigo</a></b></p>\n<p>Over the period tags and/or summaries have been added to 7 shows which were without them.</p>\n<p>If you would like to contribute to the tag/summary project visit the summary page at <a href=\"https://hackerpublicradio.org/report_missing_tags.php\" class=\"uri\">https://hackerpublicradio.org/report_missing_tags.php</a> and follow the instructions there.</p>\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1),
(2889,'2019-08-29','Describing how I listen to podcasts PART 2',1052,'In this episode I cover the hardware I\'ve used over the years to listen to podcasts.','<h3 id=\"short-summary\">Short Summary</h3>\r\n<p>In this series I cover how I listen to podcasts and how the process has change over the years. In this episode I cover the hardware I’ve used over the years to listen to podcasts.</p>\r\n<ul>\r\n<li><p>Link to HPR 2112 (Home Server) episode mentioned in this podcast<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2112\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2112</a></p></li>\r\n<li><p>Link to HPR 2106 (Hpodder) Episode mentioned in this podcast<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=2106\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=2106</a></p></li>\r\n<li><p>The cordless headphones I use are analogue cordless headphones they operate in the UHF 860 MHz RF spectrum and use Frequency modulation</p></li>\r\n<li><p>(Picture 01) shows a pair of JVC cordless headphones, these were my first pair of cordless headphones, from memory they were reasonably comfortable and lasted a reasonably long time, they eventually gave way when the strap along the top completely split if you look carefully you can see evidence of this in the picture. <img src=\"https://hackerpublicradio.org/eps/hpr2889/hpr2889/Picture-01.JPG\" alt=\"Picture-01.JPG\" /></p></li>\r\n<li><p>I think my 2nd set pair of cordless headphones were made by Phillips, unfortunately I don’t have a picture of these. The headphones were too big and kept falling from my head.</p></li>\r\n<li><p>(Picture 02) shows a pair of Sony headphones that I can’t even remember owning! I’ve lost count of how many cordless headphones I’ve owned over the years, these were also too big and regularly fell off my head, there are probably other pairs which I have forgotten about. It took a lot of trial an error to find a pair that would fit properly. <img src=\"https://hackerpublicradio.org/eps/hpr2889/hpr2889/Picture-02.JPG\" alt=\"Picture-02.JPG\" /></p></li>\r\n<li><p>I think my 3rd set of cordless headphones were a cheap pair from Liddles, unfortunately I don’t have a picture of these again these were also too big.</p></li>\r\n<li><p>(Picture 03) Shows my current set of cordless headphones, unfortunately my camera refused to work while taking this picture so you’ll not be able to identify the manufacturer which is a great pity as they are absolutely great also the lighting in here is very bad so you won’t be able to make out the writing printed on them :) <img src=\"https://hackerpublicradio.org/eps/hpr2889/hpr2889/Picture-03.JPG\" alt=\"Picture-03.JPG\" /></p></li>\r\n<li><p>Compaq N610C laptop<br />\r\n<img src=\"https://1.bp.blogspot.com/_73lLV6srqwY/SxB7dASme9I/AAAAAAAAAVU/QsNP-O2chaU/s1600/missionaccomplished.jpg\" alt=\"https://1.bp.blogspot.com/_73lLV6srqwY/SxB7dASme9I/AAAAAAAAAVU/QsNP-O2chaU/s1600/missionaccomplished.jpg\" /></p></li>\r\n<li><p>Screen<br />\r\n<a href=\"https://en.wikipedia.org/wiki/GNU_Screen\" class=\"uri\">https://en.wikipedia.org/wiki/GNU_Screen</a></p></li>\r\n<li><p>EEE PC Laptop<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Asus_Eee_PC\" class=\"uri\">https://en.wikipedia.org/wiki/Asus_Eee_PC</a></p></li>\r\n<li><p>Pictures (04 and 05) are of my Nokia N810 <img src=\"https://hackerpublicradio.org/eps/hpr2889/hpr2889/Picture-04.JPG\" alt=\"Picture-04.JPG\" /><br />\r\n<img src=\"https://hackerpublicradio.org/eps/hpr2889/hpr2889/Picture-05.JPG\" alt=\"Picture-05.JPG\" /></p></li>\r\n<li><p>Below is a link from wikipedia covering the Nokia N810.<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nokia_N810\" class=\"uri\">https://en.wikipedia.org/wiki/Nokia_N810</a></p></li>\r\n<li><p>Links to shows where klaatu references the Nokia N770 which came out before the Nokia N810 but is very similar<br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=0228\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=0228</a><br />\r\n<a href=\"https://hackerpublicradio.org/eps.php?id=0416\" class=\"uri\">https://hackerpublicradio.org/eps.php?id=0416</a></p></li>\r\n<li><p>Nexus 7, first generation<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Nexus_7_(2012)\" class=\"uri\">https://en.wikipedia.org/wiki/Nexus_7_(2012)</a></p></li>\r\n<li><p>Psion 3C<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Psion_Series_3#Psion_Series_3c\" class=\"uri\">https://en.wikipedia.org/wiki/Psion_Series_3#Psion_Series_3c</a></p></li>\r\n<li><p>Raspberry pi<br />\r\n<a href=\"https://en.wikipedia.org/wiki/Raspberry_Pi\" class=\"uri\">https://en.wikipedia.org/wiki/Raspberry_Pi</a></p></li>\r\n</ul>\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, PDA, hardware',0,0,1),
(2908,'2019-09-25','Modeling opinions in space game',2104,'Tuula talks about modeling opinions','<p>We continue with people, this time focusing on opinions. This episode has somewhat more code than previous one, so following along with the shownotes might be a good idea. I’m trying to minimize amount of code I read out aloud.</p>\r\n<h2 id=\"intro\">Intro</h2>\r\n<p>One person’s opinion of another is expressed as <code>OpinionScore</code> that ranges from -100 to 100.</p>\r\n<p>Computing the score is based on intelligence player has available to them. Internally we have <code>ReportResult</code> that tracks score, reasons for the score and confidence level about the results. It’s defined as:</p>\r\n<pre><code>data ReportResult =\r\n    FeelingLevel OpinionScore\r\n    | ReasonsLevel OpinionScore [OpinionReason]\r\n    | DetailedLevel OpinionScore [OpinionReason]\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>We’re going to be adding up these results quite a bit, so we define <code>SemiGroup</code> and <code>Monoid</code> instances for it. When two results are combined, scores are added together, lists of reasons are concatenated and the lowest confidence level is used. This is written as:</p>\r\n<pre><code>instance Semigroup ReportResult where\r\n    (FeelingLevel s1) &lt;&gt; (FeelingLevel s2) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (FeelingLevel s1) &lt;&gt; (ReasonsLevel s2 _) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (FeelingLevel s1) &lt;&gt; (DetailedLevel s2 _) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (ReasonsLevel s1 _) &lt;&gt; (FeelingLevel s2) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (ReasonsLevel s1 r1) &lt;&gt; (ReasonsLevel s2 r2) = ReasonsLevel (s1 &lt;&gt; s2) (r1 &lt;&gt; r2)\r\n    (ReasonsLevel s1 r1) &lt;&gt; (DetailedLevel s2 r2) = ReasonsLevel (s1 &lt;&gt; s2) (r1 &lt;&gt; r2)\r\n    (DetailedLevel s1 _) &lt;&gt; (FeelingLevel s2) = FeelingLevel (s1 &lt;&gt; s2)\r\n    (DetailedLevel s1 r1) &lt;&gt; (ReasonsLevel s2 r2) = ReasonsLevel (s1 &lt;&gt; s2) (r1 &lt;&gt; r2)\r\n    (DetailedLevel s1 r1) &lt;&gt; (DetailedLevel s2 r2) = DetailedLevel (s1 &lt;&gt; s2) (r1 &lt;&gt; r2)\r\n\r\n\r\ninstance Monoid ReportResult where\r\n    mempty = DetailedLevel mempty mempty</code></pre>\r\n<h2 id=\"opinion-based-on-traits\">Opinion based on traits</h2>\r\n<p>Current system compares two lists of traits. For example, two brave characters like each other slightly better than if one of them would be coward. Comparison is done by <code>traitPairOpinion</code> function, which definition I’m omitting as it’s rather long and not too interesting. It’s signature is: <code>traitPairOpinion :: TraitType -&gt; TraitType -&gt; Maybe (OpinionScore, OpinionReason)</code>. So, given two traits, tells how that pair affects to opinion and reasoning for it.</p>\r\n<p>In order to have nicer format for out data, we introduce a helper function:</p>\r\n<pre><code>traitPairScore :: TraitType -&gt; TraitType -&gt; (OpinionScore, [OpinionReason])\r\ntraitPairScore a b =\r\n    case traitPairOpinion a b of\r\n            Nothing -&gt;\r\n                mempty\r\n\r\n            Just (s, r) -&gt;\r\n                (s, [r])</code></pre>\r\n<p>This is because <code>(OpinionScore, OpinionReason)</code> isn’t monoid, but <code>(OpinionScore, [OpinionReason])</code> is, which means we can combine them with <code>&lt;&gt;</code>.</p>\r\n<p>Actual score calculation based on traits, we do it like this:</p>\r\n<pre><code>traitScore :: [TraitType] -&gt; [PersonIntel] -&gt; [TraitType] -&gt; [PersonIntel] -&gt; ReportResult\r\ntraitScore originatorTraits originatorIntel targetTraits targetIntel =\r\n    if (Traits `elem` originatorIntel) &amp;&amp; (Traits `elem` targetIntel)\r\n        then DetailedLevel score reasons\r\n        else FeelingLevel score\r\n    where\r\n        (score, reasons) = mconcat $ traitPairScore &lt;$&gt; originatorTraits &lt;*&gt; targetTraits</code></pre>\r\n<p>The interesting part is <code>mconcat $ traitPairScore &lt;$&gt; originatorTraits &lt;*&gt; targetTraits</code>. Function <code>traitPairScore</code> expects two <code>TraitType</code> values as parameters, but we’re calling it with two lists of such values. First step is to use <code>&lt;$&gt;</code> and list of values, which produces a list of partially applied functions. Second step is to use <code>&lt;*&gt;</code> to call each and every of those functions with values from second list. Result is a list of results that were obtained by calling <code>traitPairScore</code> with every combination of elements from two lists. Final step is to take this list of <code>ReportResult</code> values and combine them to single result with <code>mconcat</code>.</p>\r\n<p>Finally, based on available intel, <code>ReportResult</code> of correct level is created.</p>\r\n<h2 id=\"opinion-based-on-relations\">Opinion based on relations</h2>\r\n<p>Score based on relations is similar, but a bit convoluted (or rather, a lot more).</p>\r\n<p>Intel here has two dimensions. One of them is relationship visibility (is it public, family relation or secret relation), another is level of detail: <code>BaseOpinionIntel</code>, <code>ReasonsForOpinions</code> and <code>DetailedOpinions</code>.</p>\r\n<p><code>relationScore</code> is the entry point for calculation:</p>\r\n<pre><code>relationScore :: [PersonIntel] -&gt; [Relation] -&gt; ReportResult\r\nrelationScore intel relations =\r\n    mconcat $ (relReport oIntel score) &lt;$&gt; visibilities\r\n    where\r\n        score = mconcat $ (relationTypeScore . relationType) &lt;$&gt; relations\r\n        visibilities = mkUniq $ relationVisibility &lt;$&gt; relations\r\n        oIntel = mkUniq $ mapMaybe (\\case\r\n                                        Opinions x -&gt;\r\n                                            Just x\r\n\r\n                                        _ -&gt;\r\n                                            Nothing)\r\n                                   intel</code></pre>\r\n<p>Code has to take into account of what level of intel we have about opinions and on what detail: <code>oIntel</code>. On the other hand, <code>visibilities</code> is unique relation visibilities that exists in relations in this particular case and <code>score</code> is computed based on relations.</p>\r\n<p>Function <code>relReport</code> creates final report. It takes into account on what level of intel we have, by doing: <code>matching = safeHead $ reverse $ sort $ filter (\\x -&gt; opinionIntelVisibility x == visibility) intel</code>. This finds highest level intel we have about this particular relationship visibility. Based on the highest level of available intel <code>ReportResult</code> is created with correct confidence level. Ie. if there’s no specific intel, we get <code>FeelingLevel</code> report. If there’s intel about why particular person has certain opinion, we get <code>ReasonsLevel</code> report. Whole definition of function is below:</p>\r\n<pre><code>relReport :: [OpinionIntel]\r\n    -&gt; (OpinionScore, [OpinionReason])\r\n    -&gt; RelationVisibility\r\n    -&gt; ReportResult\r\nrelReport intel (score, reasons) visibility =\r\n    case matching of\r\n        Nothing -&gt;\r\n            FeelingLevel score\r\n\r\n        Just (BaseOpinionIntel _) -&gt;\r\n            FeelingLevel score\r\n\r\n        Just (ReasonsForOpinions _) -&gt;\r\n            ReasonsLevel score reasons\r\n\r\n        Just (DetailedOpinions _) -&gt;\r\n            DetailedLevel score reasons\r\n    where\r\n        matching = safeHead $ reverse $ sort $ filter (\\x -&gt; opinionIntelVisibility x == visibility) intel</code></pre>\r\n<h2 id=\"opinion-report\">Opinion report</h2>\r\n<p>To pull all this together, we combine results of these two functions. Based on given information, it’ll compute <code>traitsRep</code> and <code>relationsRep</code>. These two are combined with <code>&lt;&gt;</code> as explained earlier in episode:</p>\r\n<ul>\r\n<li>scores are summed up</li>\r\n<li>reason lists are concatenated</li>\r\n<li>confidence level is lowest of two</li>\r\n</ul>\r\n<pre><code>opinionReport :: [TraitType]\r\n    -&gt; [PersonIntel]\r\n    -&gt; [TraitType]\r\n    -&gt; [PersonIntel]\r\n    -&gt; [Relation]\r\n    -&gt; OpinionReport\r\nopinionReport originatorTraits originatorIntel targetTraits targetIntel targetRelations =\r\n    reportResultToOpinionResult $ traitsRep &lt;&gt; relationsRep\r\n    where\r\n        traitsRep = traitScore originatorTraits originatorIntel targetTraits targetIntel\r\n        relationsRep = relationScore originatorIntel targetRelations</code></pre>\r\n<p>Finally <code>ReportResult</code> is transformed to <code>OpinionReport</code>, which can be sent to client.</p>\r\n<p><code>OpinionReport</code> has three levels:</p>\r\n<ul>\r\n<li><code>BaseOpinionReport</code> only tells if feeling is positive, neutral or negative</li>\r\n<li><code>OpinionReasonReport</code> has feeling and in addition to reasoning</li>\r\n<li><code>DetailedOpinionReport</code> has exact (more or less) score and reasoning</li>\r\n</ul>\r\n<pre><code>data OpinionReport =\r\n    BaseOpinionReport OpinionFeeling\r\n    | OpinionReasonReport OpinionFeeling [OpinionReason]\r\n    | DetailedOpinionReport OpinionScore [OpinionReason]\r\n    deriving (Show, Read, Eq)</code></pre>\r\n<p>Actual transformation is shown here:</p>\r\n<pre><code>reportResultToOpinionResult :: ReportResult -&gt; OpinionReport\r\nreportResultToOpinionResult (FeelingLevel score) =\r\n    BaseOpinionReport $ scoreFeeling score\r\n\r\nreportResultToOpinionResult (ReasonsLevel score reasons) =\r\n    OpinionReasonReport (scoreFeeling score) reasons\r\n\r\nreportResultToOpinionResult (DetailedLevel score reasons) =\r\n    DetailedOpinionReport (clamp (-100) 100 score) reasons</code></pre>\r\n<h2 id=\"note-about-incorrectness\">Note about incorrectness</h2>\r\n<p>Reports are based on intel and this might lead into incorrect results. In case of player’s own avatar, they have full intel (ie. they know all relations, all traits and so on.) Therefore opinion about some other person is based wholly on what we know about them.</p>\r\n<p>But in case of gauging somebody else’s opinion about us or person A’s opinion of person B, when A or B isn’t us, there’s chance of misjudging things. We might not know everything about them, or we might know more about A than B knows about them. In short, opinion shown for player, is just best effort guess.</p>\r\n<h2 id=\"in-closing\">In closing</h2>\r\n<p>Questions, comments and feedback is welcome. Even better is if you record your own HPR episode. Best way to reach me nowadays is by email or in fediverse, where I’m <code>Tuula@mastodon.social</code>.</p>\r\n<p>ad astra!</p>\r\n',364,107,0,'CC-BY-SA','haskell, game development',0,0,1),
(2903,'2019-09-18','What is PMEM',453,'Persistent memory (PMEM), also known as storage-class memory','<h3 id=\"what-is-persistent-memory\">What is persistent memory?</h3>\r\n<p>In brief, PMEM is next generation memory technology whose data transfer speed is as good as DRAM (50-300 ns, 100 times faster than SSDs) and unlike DRAM, it can even retain the data after reboots.</p>\r\n<p>In detail persistent memory (PMEM) is a solid-state high-performance byte-addressable memory device that resides on the memory bus. Being on the memory bus allows PMEM to have DRAM-like access to data, which means that it has nearly the same speed and latency of DRAM and the nonvolatility of NAND flash. NVDIMM (nonvolatile dual in-line memory module) and Intel 3D XPoint DIMMs (also known as Optane DC persistent memory modules) are two examples of persistent memory technologies.</p>\r\n<p>Persistent memory, such as Intel® Optane™ DC Persistent Memory, provides a future-proofed solution. Installed alongside traditional RAM, PMEM has many of the advantages of DRAM, including low latency access. But it comes in greater capacities. Intel® Optane™ DC, for example, will be available in 128GB, 256GB and 512GB sizes.</p>\r\n<h3 id=\"persistent-memory-benefits\">Persistent Memory Benefits</h3>\r\n<p>Persistent memory in the data center allows applications to run without incurring the latency penalty of going out to storage.</p>\r\n<p>The main advantages of persistent memory include:</p>\r\n<ul>\r\n<li>Provides access latencies less than those of flash SSDs.</li>\r\n<li>Increases throughput more than flash storage.</li>\r\n<li>Cheaper than DRAM.</li>\r\n<li>PMEM is cacheable. This is a huge advantage over PCIe interconnect, which cannot be cached in the CPU.</li>\r\n<li>Real-time access to data; allows ultrafast access to large datasets.</li>\r\n<li><p>Data persists in memory after power interruption, like flash.</p></li>\r\n<li>Persistent Memory Use Cases\r\n<ul>\r\n<li>Fraud detection</li>\r\n<li>Cyberthreat analysis</li>\r\n<li>Web-scale personalization</li>\r\n<li>Financial trading</li>\r\n<li>Internet of Things (IoT)</li>\r\n</ul></li>\r\n</ul>\r\n<pre><code>    Non       \\\r\n    Volatile  /- Non-volatile: you plug it off and on again, and the Information is still there\r\n\r\n    Double    \\\r\n    In-line   | DIMM: This the HW format\r\n    Memory    |\r\n    Module    /</code></pre>\r\n<h3 id=\"persistent-memory-vs.-nvram\">Persistent Memory Vs. NVRAM</h3>\r\n<p>Nonvolatile random-access memory (NVRAM) is random-access memory that retains its information even if there is no power. If power is lost before the data is written to disk, you don’t lose the data because it can be recovered from NVRAM. NVRAM uses battery backup to keep data persistent. During this time it can flash the data out to a flash device that is attached directly. In most cases, NVRAM resides on the PCIe bus.</p>\r\n<p>PMEM or NVDIMM-N can also be backed up by battery. It resides only on the memory bus.</p>\r\n<h3 id=\"where-pmem-is-going\">Where PMEM is going</h3>\r\n<p>It’s no wonder that this sort of ‘in-memory’ computing has exploded in recent years. According to Gartner, 75 percent of cloud-native application development will use in-memory/PMEM computing by 2019, and by 2021, at least 25 percent of large and global organisations will adopt platforms using in-memory technologies.</p>\r\n<h3 id=\"drawbacks-of-pmem\">Drawbacks of PMEM</h3>\r\n<ul>\r\n<li>PMEM is a local store.</li>\r\n<li>Host failures can result in loss of availability.</li>\r\n<li>In the case of catastrophic errors you may lose all data and must take manual steps to reformat the PMEM.</li>\r\n</ul>\r\n<h2 id=\"reference-notes\">Reference Notes</h2>\r\n<ul>\r\n<li><a href=\"https://www.netapp.com/us/info/what-is-persistent-memory.aspx\" class=\"uri\">https://www.netapp.com/us/info/what-is-persistent-memory.aspx</a></li>\r\n<li><a href=\"https://www.intel.co.uk/content/www/uk/en/it-management/cloud-analytic-hub/pmem-next-generation-storage.html\" class=\"uri\">https://www.intel.co.uk/content/www/uk/en/it-management/cloud-analytic-hub/pmem-next-generation-storage.html</a></li>\r\n<li><a href=\"https://vthinkbeyondvm.com/vsphere-6-7-what-is-pmem-and-how-vsphere-drs-works-with-pmem-configured-vms/\" class=\"uri\">https://vthinkbeyondvm.com/vsphere-6-7-what-is-pmem-and-how-vsphere-drs-works-with-pmem-configured-vms/</a></li>\r\n<li><a href=\"https://docs.vmware.com/en/VMware-vSphere/6.7/com.vmware.vsphere.resmgmt.doc/GUID-EB72D358-9C2C-4FBD-81A9-A145E155CE31.html\" class=\"uri\">https://docs.vmware.com/en/VMware-vSphere/6.7/com.vmware.vsphere.resmgmt.doc/GUID-EB72D358-9C2C-4FBD-81A9-A145E155CE31.html</a></li>\r\n<li><a href=\"https://vmsplice.net/~stefan/nvdimm_slides_public.pdf\" class=\"uri\">https://vmsplice.net/~stefan/nvdimm_slides_public.pdf</a></li>\r\n<li><a href=\"https://www.theregister.co.uk/2018/09/07/persistent_memory_whirlwind_is_spinning_up/\" class=\"uri\">https://www.theregister.co.uk/2018/09/07/persistent_memory_whirlwind_is_spinning_up/</a></li>\r\n</ul>\r\n',129,0,0,'CC-BY-SA','Pmem, intel, memory, storage',0,0,1),
(2882,'2019-08-20','ONICS Part 1:  Basic Commands',1364,'In this episode I review some basic commands for manipulating packet captures','<p>Background</p>\r\n<ul>\r\n<li>It\'s been about 6 years since I talked about my project ONICS in HPR 1350</li>\r\n<li>ONICS stands for Open Network Inpection Command Suite</li>\r\n<li>I created ONICS as because I thought it would be neat to have a suite of tools that could manipulate packets on the command line in a way similar to how tools lik sed, awk, grep, cut, and so forth manipulate text.</li>\r\n</ul>\r\n<p>Installing</p>\r\n<ul>\r\n<li>Not currently maintained in any package distributions</li>\r\n<li>Maintainers who are interested in doing so are welcome</li>\r\n<li>Install by source</li>\r\n</ul>\r\n<pre><code>    $ git clone https://gitlab.com/catlib/catlib\r\n    $ cd catlib\r\n    $ make\r\n    $ cd ..\r\n    $ git clone https://gitlab.com/onics/onics\r\n    $ cd onics\r\n    $ ./configure\r\n    $ make\r\n    $ make test\r\n    $ sudo make install\r\n    $ make veryclean\r\n</code></pre>\r\n<ul>\r\n<li>Can always uninstall cleanly from the source directory</li>\r\n</ul>\r\n<pre><code>    $ make uninstall\r\n</code></pre>\r\n<ul>\r\n<li>Alternate to installation is to stop at \'make test\' and then add to \'onics/bin\' and \'onics/scripts\' to your path.</li>\r\n</ul>\r\n<p>Documentation</p>\r\n<ul>\r\n<li><p>Manpages are available in onics/doc directory if you aren\'t installing locally. They are quite extensive.</p></li>\r\n<li><p>If installed locally, starting with:</p></li>\r\n</ul>\r\n<pre><code>    $ man onics\r\n</code></pre>\r\n<p>XPKT Format</p>\r\n<ul>\r\n<li><p>PCAP format is outdated and not very extensible</p>\r\n<ul>\r\n<li>I want to be able to annotate with interface IDs, flow IDs, packet numbers, classification info, header offsets, etc...</li>\r\n</ul></li>\r\n<li><p>First and foremost, the file header prevents just <code>cat</code>ing files together.</p>\r\n<ul>\r\n<li>it makes merging live streams more difficult</li>\r\n<li>pcapng improves things but still has global file header</li>\r\n</ul></li>\r\n</ul>\r\n<p>First Programs</p>\r\n<ul>\r\n<li>Let\'s first capture in the traditional way</li>\r\n</ul>\r\n<pre><code>    $ sudo tcpdump -i eth0 -c 5 -w file1.pcap\r\n</code></pre>\r\n<ul>\r\n<li>First program is to capture packets from the wire:</li>\r\n</ul>\r\n<pre><code>    $ sudo pktin eth0 &gt; file2.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>If not running as root</li>\r\n</ul>\r\n<pre><code>    $ sudo chown myname file1.pcap file2.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Let\'s dump them:</li>\r\n</ul>\r\n<pre><code>    $ tcpdump -r file1.pcap\r\n    $ xpktdump file2.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Now lets convert the PCAP to XPKT</li>\r\n</ul>\r\n<pre><code>    $ pc2xpkt file1.pcap file1.xpkt\r\n      or\r\n    $ pc2xpkt file1.pcap &gt; file1.xpkt\r\n      or\r\n    $ pc2xpkt &lt; file1.pcap &gt; file1.xpkt\r\n      or\r\n    $ cat file1.pcap | pc2xpkt &gt; file1.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Now we can dump file1 using xpktdump:</li>\r\n</ul>\r\n<pre><code>    $ xpktdump file1.xpkt\r\n</code></pre>\r\n<p>Something we can\'t do w/ tcpdump</p>\r\n<ul>\r\n<li>Lets now merge them one after another</li>\r\n</ul>\r\n<pre><code>    $ cat file1.xpkt file2.xpkt &gt; merged.xpkt\r\n    $ xpktdump merged.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Of course there\'s a simpler way</li>\r\n</ul>\r\n<pre><code>    $ cat file1.xpkt file2.xpkt | xpktdump\r\n</code></pre>\r\n<p>Convert back to pcap:</p>\r\n<ul>\r\n<li>Let\'s convert file2 to PCAP</li>\r\n</ul>\r\n<pre><code>    $ xpkt2pc file2.xpkt file2.pcap\r\n      or\r\n    $ xpkt2pc &lt; file2.xpkt &gt; file2.pcap\r\n      or\r\n    $ xpkt2pc file2.xpkt &gt; file2.pcap\r\n      or\r\n    $ cat file2.xpkt | xpkt2pc &gt; file2.pcap\r\n</code></pre>\r\n<ul>\r\n<li>Let\'s look at the stream using tcpdump:</li>\r\n</ul>\r\n<pre><code>    $ tcpdump -r file2.pcap\r\n</code></pre>\r\n<ul>\r\n<li>If we didn\'t want to actually store as a PCAP</li>\r\n</ul>\r\n<pre><code>    $ xpkt2pc file2.xpkt | tcpdump -r -\r\n</code></pre>\r\n<ul>\r\n<li>Let\'s concatenate and dump using tcpdump</li>\r\n</ul>\r\n<pre><code>    $ cat file1.xpkt file2.xpkt | xpkt2pc | tcpdump -r | less\r\n</code></pre>\r\n<p>Sending packets:</p>\r\n<pre><code>    $ sudo tcpdump -i eth0  # in one terminal\r\n    $ sudo pktout -i eth0 file1.xpkt\r\n      or\r\n    $ sudo pktout -i eth0 &lt; file1.xpkt\r\n      or\r\n    $ cat file1.xpkt | sudo pktout -i eth0\r\n</code></pre>\r\n<p>Summary</p>\r\n<ul>\r\n<li>XPKT is a versatile, extensible, self-contained packet trace format</li>\r\n<li>ONICS\' most basic tools are pktin, pktout, pc2xpkt and xpkt2pc</li>\r\n<li>We\'ve demonstrated how the ONICS design supports leveraging the power of the UNIX command line for packets</li>\r\n<li>This is only the VERY beginning. ONICS has over 20 binaries and 30 scripts for manipulating packets.</li>\r\n</ul>\r\n',259,61,0,'CC-BY-SA','networking, command-line, tools',0,0,1),
(2887,'2019-08-27','Stardrifter RPG Playtest Part 01',2202,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode begins a limited series covering the first playtest of a new role-playing game, based upon my Stardrifter series of books and short stories. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this first episode, as well as the next, we we go over the rules of the game, and discuss them in some detail.\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2892,'2019-09-03','Stardrifter RPG Playtest Part 02',2247,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode is Part 2 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this part, we continue to go over the rules of the game, and discuss them in some detail.\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n</p>',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2897,'2019-09-10','Stardrifter RPG Playtest Part 03',2446,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode is Part 3 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this part, we continue to go over the rules of the game, and then start into the adventure!\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n</p>',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2902,'2019-09-17','Stardrifter RPG Playtest Part 04',3286,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode is Part 4 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this part, the characters have a job prospect...but is it legitimate, or are they being conned?\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n</p>',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2907,'2019-09-24','Stardrifter RPG Playtest Part 05',3120,'Lostnbronx and friends playtest a new, original RPG system.','<p>\r\nThis episode is Part 5 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.\r\n</p>\r\n<p>\r\nThis series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.\r\n</p>\r\n<p>\r\nIn this part, the characters take on a contract to deal with some...hippies?\r\n</p>\r\n<p>\r\nSpecial thanks to my playtesters: Klaatu, Thaj, and Mark (who was playing Brinn)\r\n</p>',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2885,'2019-08-23','ONICS Part 2: Filtering and Extraction',994,'In this episode I discuss commands to filter and/or extract packets from a packet trace file.','<p>In this episode we\'ll talk about filtering and dissecting packet traces and streams and introduce diffing. Remember that most tools have very flexible options for a variety of use cases. So check their manpages. Each man page also has multiple examples of how to use each tool.</p>\r\n<h3 id=\"counting-packets\">Counting Packets</h3>\r\n<ul>\r\n<li>Lets start with grabbing a trace from the unit tests:</li>\r\n</ul>\r\n<pre><code>   $ mkdir /tmp/packets\r\n   $ cd /tmp/packets\r\n   $ cp /path/to/onics/tests/data/packets/sample.xpkt .\r\n</code></pre>\r\n<ul>\r\n<li>Lets see what we have inside. First, lets see how many packets there are. We\'ll use a new tool \'pcount\'.</li>\r\n</ul>\r\n<pre><code>   $ pcount sample.xpkt\r\n\r\n   90 total packets and 19082 total bytes.\r\n</code></pre>\r\n<ul>\r\n<li>Good thing we looked first. Don\'t want to walk through all the packets.</li>\r\n</ul>\r\n<h3 id=\"scanning-packet-flows\">Scanning Packet Flows</h3>\r\n<ul>\r\n<li><p>Well, lets look at the connections or &quot;flows&quot; in the trace. We\'ll do this by using the \'nftrk\' command for &quot;network flow tracker&quot;.</p></li>\r\n<li><p>Like \'pcount\' this utility (and many or most ONICS utilities), this program can run on a live stream or a trace file. We\'ll run:</p></li>\r\n</ul>\r\n<pre><code>   $ nftrk -dt sample.xpkt | grep END\r\n</code></pre>\r\n<p>and get:</p>\r\n<pre><code>   |FLOW END|IP:ca=192.168.0.43,sa=224.0.0.251,proto=2|Start=1565446184.543,\r\n   End=1565446184.544,Dur=0.001|SENT:1,60|\r\n   ...\r\n   |FLOW END|IP:ca=192.168.0.7,sa=192.168.0.255,proto=17,cpt=631,spt=631|\r\n   Start=1565446184.543,End=1565446184.544,Dur=0.001|SENT:3,660|\r\n</code></pre>\r\n<ul>\r\n<li><p>\'nftrk\' tracks flows giving events like the start and end of each flow or connection. We just want a summary of all the connections so we just grep for \'END\' (all caps).</p></li>\r\n<li><p>We could just as easily have grepped for START, but this way we get the final number of packets sent and received on each connection. If we just want a count of the connections we can do:</p></li>\r\n</ul>\r\n<pre><code>   $ nftrk -dt sample.xpkt | grep START | wc -l\r\n</code></pre>\r\n<p>and that tells us that there are 10 flows in the trace.</p>\r\n<h3 id=\"basic-filtering\">Basic Filtering</h3>\r\n<ul>\r\n<li>Ok, so 90 packets, in 10 flows totalling ~19000 bytes. Lets now see about filtering the connection so we just get the TCP packets.</li>\r\n</ul>\r\n<pre><code>   $ pflt tcp sample.xpkt tcponly.xpkt\r\n\r\n   $ pcount tcponly.xpkt\r\n   73 total packets and 17184 total bytes.\r\n\r\n   $ nftrk -dt tcponly.xpkt | grep END | wc -l\r\n   2\r\n</code></pre>\r\n<ul>\r\n<li>We could have been super fancy and done:</li>\r\n</ul>\r\n<pre><code>   $ pflt tcp sample.xpkt |\r\n     pcount -p |\r\n     nftrk -t 2&gt;/tmp/flows &gt; tcponly.xpkt &amp;&amp;\r\n     echo -n &quot;Number of flows &quot; &amp;&amp;\r\n     grep END /tmp/flows | wc -l &amp;&amp;\r\n     rm -f /tmp/flows\r\n</code></pre>\r\n<ul>\r\n<li>Ok, enough of that. Anyway, now we have a trace file with only the TCP connections. Running</li>\r\n</ul>\r\n<pre><code>   $ nftrk -dt /tmp/tcponly.xpkt | grep END\r\n   |FLOW END|IP:ca=192.168.0.4,sa=192.168.0.7,proto=6,cpt=38859,spt=22|\r\n   Start=1566073862.612,End=1566073862.613,Dur=0.000|C2S:25,4561|S2C:30,5124|\r\n   |FLOW END|IP:ca=192.168.0.4,sa=64.233.169.147,proto=6,cpt=35071,spt=80|\r\n   Start=1566073862.613,End=1566073862.613,Dur=0.000|C2S:9,704|S2C:9,6795|\r\n</code></pre>\r\n<p>Shows that the server ports are 22 and 80 for the two connections. That\'s SSH and HTTP.</p>\r\n<ul>\r\n<li><p>The patterns we can use to filter packets are pretty standard across most of the ONICS tools.</p></li>\r\n<li><p>We\'ll discuss this is more detail in a future podcast. But if you want to see the kinds of fields you can match on go to</p></li>\r\n</ul>\r\n<pre><code>   $ man onics_proto\r\n</code></pre>\r\n<h3 id=\"extracting-ranges-of-packets\">Extracting Ranges of Packets</h3>\r\n<ul>\r\n<li>What if we wanted to just grab specific packets out of the trace file? Say we wanted packets 3-6. For that we would run:</li>\r\n</ul>\r\n<pre><code>   $ pxtr 3,6 sample.xpkt pkts-3-to-6.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Alternately we could ask for all packets from the 7th packet to the first TCP packet. We match using the same types of matching conditions as with pflt, but we must enclose them in {}s.</li>\r\n</ul>\r\n<pre><code>   $ pxtr &quot;7,{tcp}&quot; sample.xpkt | xpktdump\r\n</code></pre>\r\n<ul>\r\n<li>Lets say we just wanted to drop packets 5-10 from the stream. There are several ways to do this in ONICS, but using pxtr, the way we would do it would be:</li>\r\n</ul>\r\n<pre><code>   $ pxtr 1,4 sample.xpkt &gt; not-5-to-10.xpkt\r\n   $ pxtr 11,NONE sample.xpkt &gt;&gt; not-5-to-10.xpkt\r\n</code></pre>\r\n<ul>\r\n<li>Maybe I should add another option to pxtr to invert the boundary conditions. It\'s a tradeoff between having the tools do one thing and one thing well and supporting a potentially common use case.</li>\r\n</ul>\r\n<h3 id=\"differences-between-traces\">Differences Between Traces</h3>\r\n<ul>\r\n<li>Finally, lets look at one tool that I really like. Let\'s see the difference between the original stream and the one that we just created:</li>\r\n</ul>\r\n<pre><code>   $ pdiff sample.xpkt not-5-to-10.xpkt | less\r\n</code></pre>\r\n<ul>\r\n<li>Sure enough that shows us that packets 5-10 were dropped from the stream. If we do the reverse</li>\r\n</ul>\r\n<pre><code>   $ pdiff -v not-5-to-10.xpkt sample.xpkt | less\r\n</code></pre>\r\n<p>it describes the sample.xpkt from the perspective of starting with not-5-to-10.xpkt and inserting a bunch of packets into the middle.</p>\r\n<h3 id=\"conclusion\">Conclusion</h3>\r\n<ul>\r\n<li>In this podcast we looked at a few tools to help analyze and dissect packet traces or packet streams.</li>\r\n<li>Next time we\'ll look at some of the more powerful pattern matching we can apply and</li>\r\n</ul>\r\n',259,61,0,'CC-BY-SA','networking, command-line, tools',0,0,1),
(2894,'2019-09-05','Repairing a Musical Instrument Case',1318,'I talked about repairing the case for a Vietnamese Dan Tranh','<p>In this episode I talk about repairing the case for a Vietnamese Đàn tranh, a zither-like instrument which was donated to the School of Music by a member of the community. I also demonstrate the instrument as best I can so that you can hear what it sounds like.</p>\r\n\r\n<p>See the Flickr photo album that accompanies this show by clicking the image below.</p>\r\n\r\n<p><a data-flickr-embed=\"true\"  href=\"https://www.flickr.com/photos/137675441@N05/albums/72157710403088542\" title=\"Dan Tranh Case Repair\"><img src=\"https://live.staticflickr.com/65535/48570414971_d678f8ff0c.jpg\" width=\"500\" height=\"375\" alt=\"Dan Tranh Case Repair\"></a></p>\r\n\r\n<h2>Links</h2>\r\n\r\n<ul>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/%C4%90%C3%A0n_tranh\">Đàn tranh</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Adhesive#Contact\">Contact cement</a></li>\r\n	<li><a href=\"https://en.wikipedia.org/wiki/Pentatonic_scale\">Pentatonic scale</a></li>\r\n</ul>\r\n\r\n<h2>Credits</h2>\r\n\r\n<ul>\r\n	<li>Music bumpers are from Kimiko Ishizaka\'s <em>The Open Goldberg Variations</em>: <a href=\"https://www.opengoldbergvariations.org/\">https://www.opengoldbergvariations.org/</a>, used by permission of their <a href=\"https://creativecommons.org/publicdomain/zero/1.0/\">CC0 1.0 Universal (CC0 1.0) Public Domain Dedication license</a>.</li>\r\n</ul>',238,0,0,'CC-BY-SA','Music, Musical Instruments, Repairs, DIY, Vietnamese Stringed Instruments',0,0,1),
(2895,'2019-09-06','The work of fire fighters, part 2',2370,'The continued introduction into the work of fire fighters','<p>Continued general basic knowledge of fire fighting.<br />\r\nAlso an extended invitation to ask questions in the comments.<br />\r\nps: I started making podcasts one year ago! o/</p>',369,0,0,'CC-BY-SA','fire fighting, fire brigade',0,0,1),
(2899,'2019-09-12','Endeavour OS',99,'A quick show introducing Endeavour OS','<p>Hi to all you out there in HPR land, this is a quick show to help out with the current summer shortage of shows.</p>\r\n<p>So over the last few months I’ve been busy with my new Podcasting career, well it fills in the time now I’m retired. Anyway the Distro-hoppers show has been getting a regular audience and recently we decided to branch out a little and open up the review format to the audience, you can find details of how to do that on the Blog.</p>\r\n<p>The most recent show was a review of the new Endeavour OS which has risen from the ashes of Antergos Linux an Arch based OS. Well I decided to use this opportunity to delve into the world of Arch for the first time with Endeavour OS and I can report I was pleasantly surprised with this slick iteration of Arch. OK when you first install Endeavour all you will have is a new XFCE 4.14 DE and some basic software to get you started, you are then expected to do a little research to find out how to install other software you need to get your PC setup the way you like but all the basic information on package management is on the Endeavour OS Wiki and also on the Arch Linux Wiki.</p>\r\n<p>If you have thought of trying Arch Linux but would prefer to start with a running Desktop from install then Endeavour OS is definitely the place to start. I have been running it as my daily Driver for over a month and have fallen in love with it.<br />\r\nMy full review is on the Distrohoppers Blog as is a link to the Audio of the show.</p>\r\n<p>That’s it for this time, this is Tony Hughes saying goodbye until next time.</p>\r\n<p><a href=\"https://distrohoppersdigest.blogspot.com/\" class=\"uri\">https://distrohoppersdigest.blogspot.com/</a></p>\r\n<p><a href=\"https://endeavouros.com/\" class=\"uri\">https://endeavouros.com/</a></p>\r\n<p><a href=\"https://www.archlinux.org/\" class=\"uri\">https://www.archlinux.org/</a></p>\r\n',338,0,0,'CC-BY-SA','EndeavourOS, Linux, Arch Linux, Distrohopping',0,0,1),
(2912,'2019-10-01','Stardrifter RPG Playtest Part 06',2013,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 6 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes. The remaining episodes in this mini-series, including this one, were all from the second session.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>In this part, the characters fly out to the derelict (though hardly empty) spaceship, and find a way to sneak aboard.</p>\r\n<p>Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2917,'2019-10-08','Stardrifter RPG Playtest Part 07',1685,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 7 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>In this part, the characters make some new friends who show them their guns! Bonus Fun: I make tons of mistakes reading my own rules!</p>\r\n<p>Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
(2922,'2019-10-15','Stardrifter RPG Playtest Part 08',1967,'Lostnbronx and friends playtest a new, original RPG system.','<p>This episode is Part 8 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.</p>\r\n<p>This series is meant to give listeners some insight into the RPG construction process. Playtesting is not the final step, but rather, just another stage. The construction of an RPG can be convoluted, and feedback from players is absolutely vital.</p>\r\n<p>In this part, the characters reevaluate their life choices, and decide that negotiation is the better part of valor!</p>\r\n<p>Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!</p>\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1),
