(2428,'2017-11-22','git Blobs',1982,'Klaatu talks about git-media and git-annex','

How do you manage large binary blobs, like pictures or video or sounds, when using git?

\r\n\r\n

In this episode, Klaatu explains two popular options:

\r\n\r\n\r\n\r\n

Thanks to CapsLok at freesound.org for the sound effect.

\r\n',78,81,0,'CC-BY-SA','git',0,0,1), (2444,'2017-12-14','Interface Zero Play-through Part 4',1927,'Klaatu, Lobath, and Thaj play the Interface Zero RPG','

The investigation continues!

\r\n

Guest voice in this and episode 3 by Gort.

',78,95,0,'CC-BY-SA','Interface Zero,rpg,game,play,pathfinder,dnd',0,0,1), (2438,'2017-12-06','Gnu Awk - Part 8',1239,'More about loops','

Gnu Awk - Part 8

\r\n

Introduction

\r\n

This is the eighth episode of the "Learning Awk" series that\r\nb-yeezi and I are doing.

\r\n

Recap of the last episode

\r\n\r\n

These types of loops were demonstrated by examples in the last episode.

\r\n

Note that the example for \'do while\' was an infinite loop (perhaps as a test of the alertness of the audience!):

\r\n
#!/usr/bin/awk -f\r\nBEGIN {\r\n\r\n    i=2;\r\n    do {\r\n        print "The square of ", i, " is ", i*i;\r\n        i = i + 1\r\n    }\r\n    while (i != 2)\r\n\r\nexit;\r\n}
\r\n

The condition in the while is always true:

\r\n
The square of  2  is  4\r\nThe square of  3  is  9\r\nThe square of  4  is  16\r\nThe square of  5  is  25\r\nThe square of  6  is  36\r\nThe square of  7  is  49\r\nThe square of  8  is  64\r\nThe square of  9  is  81\r\nThe square of  10  is  100\r\n...\r\nThe square of  1269630  is  1611960336900\r\nThe square of  1269631  is  1611962876161\r\nThe square of  1269632  is  1611965415424\r\nThe square of  1269633  is  1611967954689\r\nThe square of  1269634  is  1611970493956\r\n...
\r\n

The variable i is set to 2, the print is executed, then i is set to 3. The test "i != 2" is true and will be ad infinitum.

\r\n

Some more statements

\r\n

We will come back to loops later in this episode, but first this seems like a good point to describe another statement: the switch statement.

\r\n

Long notes

\r\n

The notes for rest of this episode are available here.

\r\n

Links

\r\n\r\n',225,94,1,'CC-BY-SA','Awk utility,Awk language,gawk,loops',0,0,1), (2442,'2017-12-12','The sound of Woodbrook Quaker Study centre in the Spring',937,'I recorded the sound of bird song at Woodbrook Quaker study Centre in Birmingham UK in April 2017','

This is a recording I made at Woodbrook Quaker Study Centre in Birmingham UK while I was there in April 2017.

\r\n

I got the idea to release it as a show after listening to hpr2354 :: Night Sounds in Rural Tennessee hosted by Jon Kulp so here it is all 15 minutes of it.

\r\n

The centre is right by the busy A38 trunk road so hence the constant hum of traffic noise in the background.

\r\n

Links

\r\n',338,101,0,'CC-BY-SA','birdsong',0,0,1), (2443,'2017-12-13','pdmenu',927,'I have been using this menu tool over the past year, and I really like it','

pdmenu

\r\n

Introduction

\r\n

Pdmenu is a tool written by Joey Hess which allows the creation of a simple menu in a terminal (console) window. It is in his list of less active projects, and the latest version is dated 2014, but it seems to be quite complete and useful as it is.

\r\n

I like simple menus. As a Sysadmin in my last job I used one on OpenVMS which helped me run the various periodic tasks I needed to run - especially the less frequent ones - without having to remember all of the details.

\r\n

I do the same on my various Linux systems, and find that pdmenu is ideal for the task.

\r\n

Installation

\r\n

I found pdmenu in the Debian repositories (I run Debian Testing), and it was very easily installed. The C source is available as a tarfile, though I\r\n haven\'t tried building it myself.

\r\n

Running pdmenu

\r\n

Simply typing pdmenu at a command prompt will invoke the utility. It uses the file /etc/pdmenurc as its default configuration file, and this generates a menu with a demonstration of some of its features.

\r\n

This is not particularly useful but it can be overridden by creating your own configuration, which by default is in ~/.pdmenurc. The pdmenu command itself takes a configuration file as an argument, so there is plenty of flexibility.

\r\n

Full notes and examples

\r\n

The full notes which describe the use of pdmenu with examples can be found here.

\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','command line,menu,pdmenu,.pdmenurc',0,0,1), (2451,'2017-12-25','Server Basics 105 OpenVPN Client',1931,'Klaatu walks you through installing and configuring an OpenVPN client','

In the previous episode of this series, you set up an OpenVPN server. In this episode, Klaatu walks you through:

\r\n\r\n
    \r\n
  1. \r\nInstalling OpenVPN on a client machine.\r\n

  2. \r\n
  3. \r\nGenerating a key and certificate request.\r\n

  4. \r\n
  5. \r\nSigning a client cert from the server.\r\n

  6. \r\n
  7. \r\nConfiguring the client.conf file.\r\n

  8. \r\n
  9. \r\nConfiguring the client routing table to use the VPN subnet.\r\n

  10. \r\n
  11. \r\nPinging the server over VPN!!!\r\n

  12. \r\n
\r\n\r\n

Where to go from here? \r\n

\r\n

Your next steps should be to investigate how your org wants to use VPN, how your clients actually want to join the VPN (Network Manager has some nice features that makes joining a VPN fairly transparent). Have fun!

',78,0,0,'CC-BY-SA','server,vpn,sys admin',0,0,1), (2447,'2017-12-19','Server Basics 104 OpenVPN Server',2595,'Klaatu walks you through installing and configuring OpenVPN Server','

In this episode, Klaatu demonstrates how to:\r\n

\r\n\r\n
    \r\n
  1. \r\nInstall OpenVPN\r\n

  2. \r\n
  3. \r\nGenerate certificates for your OpenVPN server\r\n

  4. \r\n
  5. \r\nGenerate a private key for your OpenVPN server\r\n

  6. \r\n
  7. \r\nConfigure the /etc/openvpn/server.conf file\r\n

  8. \r\n
  9. \r\nStart the OpenVPN daemon\r\n

  10. \r\n
\r\n\r\n

In case it is not clear, you can follow along with Klaatu, using the exact same options and configuration values as he is using for a successful install. You do not need to change

\r\n

In the next episode, he will demonstrate how to do all of the above for OpenVPN clients.

\r\n\r\n

\r\nVPN is a big topic that warrants a whole miniseries unto itself, so this and the next episode concentrate on getting a VPN up and running, with clients connected and pinging back to the server on a dedicated subnet. Additional config options based on your specific use-case are left for you to explore on your own.\r\n

',78,0,0,'CC-BY-SA','server,vpn,sys admin',0,0,1), (2448,'2017-12-20','Useful Bash functions - part 3',2033,'A few more possibly useful Bash functions are discussed','

Useful Bash functions - part 3

\r\n

Overview

\r\n

This is the third show about Bash functions. These are a little more advanced than in the earlier shows, and I thought I\'d share them in case they are useful to anyone.

\r\n

As before it would be interesting to receive feedback on these functions and would be great if other Bash users contributed ideas of their own.

\r\n

Full Notes

\r\n

Since the notes explaining this subject are long, they have been placed here.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','coding,Bash,script,function',0,0,1), (2439,'2017-12-07','Internal Logic of Stories',1152,'Lostnbronx talks about stories and story consistency.','

Lostnbronx rambles on about the structure of stories, and how their internal logic can make or break them.

\r\n',107,105,0,'CC-BY-SA','stories,storytelling,gaming,rpg,movies,writing,star trek,stardrifter,warp,starjump,lostnbronx',0,0,1), (2446,'2017-12-18','Git server and git hooks',2430,'Klaatu talks about running git on a server, and explains git hooks.','

A sample post-receive git hook:

\r\n
\r\n#!/usr/bin/tcsh\r\n\r\nforeach arg ( $< )\r\n  set argv = ( $arg )\r\n  set refname = $1\r\nend\r\n\r\nset branch = `git rev-parse --symbolic --abbrev-ref $refname`\r\necho $branch\r\n\r\n    if ( \"$branch\" == \"master\" ) then\r\n      echo \"Branch detected: master\"\r\n      echo \"Do some stuff here.\"\r\n    else if ( \"$branch\" == \"dev\" ) then\r\n      echo \"Branch detected: dev\"\r\n      echo \"Do something else here.\"\r\n      else\r\n        echo \"Do something entirely different here.\"\r\n    endif\r\n
\r\n',78,81,0,'CC-BY-SA','git',0,0,1), (2440,'2017-12-08','How to save bad beans or the French press',57,'how to hash tag coffee?','

Memorial

\r\n

\r\nWe take some time to remember our good friend and fellow host Lord Drachenblut who passed away one year ago yesterday.
\r\nNow may be a good time to re listen to hpr2201 :: Matthew \"Lord Drachenblut\" Williams HPR Community members remember the digital dragon.\r\n

\r\n\r\n

Shownotes

\r\n

I was driving in a place where I had no signal, so I recorded an episode about the first thing that popped into my mind.

\r\n

Recorded with lineageos recorder app through monster isport bluetooth headphones. I\'m amazed at the sound quality. I\'ll do this more. I promise

\r\n

(no I won\'t, I\'m lazy)

',126,88,1,'CC-BY-SA','driving, coffee',0,0,1), (2445,'2017-12-15','Information Underground: Backwards Capitalism',2896,'Klaatu, Deepgeek, and Lostnbronx talk about markets, innovation, and opportunity.','

\r\nThe Info-Underground guys consider why capitalism does (or maybe doesn\'t) work, why people use it as a tool for a better life (or maybe don\'t), and what the source of ambition, commercial aspiration, and greed truly is (or maybe isn\'t).\r\n

',107,99,0,'CC-BY-SA','information underground,capitalism,klaatu,deepgeek,lostnbronx',0,0,1), (2453,'2017-12-27','The power of GNU Readline - part 2',1165,'Various ways of deleting and undeleting on the command line with GNU Readline','

The power of GNU Readline - part 2

\r\n

In part 1 we looked at some Control key and Meta key sequences as well as the Backspace and DEL keys in the context of GNU Readline.

\r\n

The full-length notes (available here) contain a brief summary of what we covered and introduce cutting and pasting the GNU Readline way, with some examples.

\r\n

Links

\r\n',225,102,1,'CC-BY-SA','command line,cli,GNU Readline',0,0,1), (2449,'2017-12-21','Org-mode mobile solution',578,'My search for taking org mode on the road','

brief introduction

\r\n

myself

\r\n

Hi, I\'m Brian in Ohio

\r\n

inspiration for show

\r\n

I wanted to tell a little about my trials and tribulations of finding a solution to taking org mode on the road. What\'s org mode? Listen to my last episode or do a duckduckgo to find out.

\r\n

parameters

\r\n

After switching from using a bullet journal to using emacs-org-mode as my organizing device I immediately saw that lugging a laptop everywhere was not going to work for me. I wanted to be able to access org-mode, especially the agenda view, anywhere I might be. Laptops with limited battery life and a large physical presence were not going to work for me.

\r\n

mobile-org app

\r\n

The first solution I tried, and the most obvious, was the mobile-org app. Its available for android or ios. I can only attest to the android version. Its an easy from the play store. This solution didn\'t work for me for a number of reasons. First, the documentation for the setup is terrible, and I became frustrated by the workflow and could not get useful results using the app. Mobile-org seems to be built around using dropox. In order to get around that I tried various methods of syncing my org files using onboard storage. Seeing this wasn\'t going to work I bit the bullet setup a dropbox account installed the clients, one on my slackware laptop and the other on my phone only to find dropbox doesn\'t support this application anymore. A little digging around and it seems the API used by mobile-org isn\'t up to snuff any more so, fail. I cut my loses and moved on to another possible solution.

\r\n

pi-top

\r\n

My next crack at solving the portable org mode problem was getting a pitop laptop https://pi-top.com/. Pitop is a laptop based on a raspberrypi. I won\'t go into the details of the device here but I\'ll say my idea for using this device was its advertised 8+ hour battery life. My old linux laptops rarely give me 2 hours of life So even though the pitop was physically larger than I wanted I gave it a whirl. Lets just say the battery does last 8+ hours, it just can\'t survive many recharges. 2 battery packs later I gave up on the pitop and went looking for something else.

\r\n

pocketchip

\r\n

I heard klaatu mention a device called a pocketchip on his gnuworld order podcast https://gnuworldorder.info/. I looked into it and here I thought might be a device that could work. Pocketchip https://getchip.com/pages/pocketchip is a handheld linux computer. After ordering the device I began setting it up for my use case. There are plenty of tutorials on the pocketchip website on how to extend the usefulness of this product. The size of the device was good and the battery life was ok. Some people complain about the chicklet keyboard but I actually did not mind it to much. It took some fiddling to get the emacs keybindings I use to work on the odd keyboard layout, but its a linux computer so there\'s plenty of information out there. I used a thumb drive as a repository for my org files, wrote a couple of scripts to sync up the files with whatever device the drive was plugged into and wala a mobile org solution! Alas, the pocketchips demise was its build quality. The heart of the pocketchip, the system board\'s usb mini plug fell off, and then one system tweak later I bricked the device. I\'ll recover it eventually, you can program it through the gpio pins, but this was a quest for portable-org-mode, not fixing pocketchips, so onward.

\r\n

raspberry pi tablet

\r\n

I saw a build of a raspberry pi tablet that looked very nice https://www.stefanv.com/electronics/a-compact-home-made-raspberry-pi-tablet.html. Always up for a challenge, I cobbled together a prototype and tried it out. The reason I eventually dropped this solution because the virtual keyboard didn\'t work well and I couldn\'t get the official raspberrypi lcd to rotate from portrait to landscape dynamically. Still a fun project and I\'ll get some use out of it sometime.

\r\n

android phone

\r\n

Well here\'s the solution I came up with. I was searching around on the internet and found a link telling about running emacs on an android phone. https://endlessparentheses.com/running-emacs-on-android.html. It involves installing the termux app, the hackers keyboard, both available in the google play store and apt-get installing emacs on the phone. After that I had full emacs running, all be it in a terminal so its slightly different then running on the desktop, and with emacs you get, drum roll please, org-mode. With this i have the device I always take with running org-mode. I sink my org files between my laptop and phone using the afore mentioned drop box account. The hackers keyboard works flawlessly and can digest any emacs keybinding I need. I also have a logitech bluetoothkeyboard that I can use if I have a lot of typing to do in org-mode on my phone, such as these shownotes!

\r\n

conclusions

\r\n

I find org-mode so useful that I want it available any where I go. And over the course of the last 8 months I went on a journey trying to find a solution to that desire. In the end, the solution was pretty obvious, these portable computers we carry around are amazing and thanks to the developers of termux and the hackers keyboard my phone is now infinitely more useful to me. Thanks for listening.

\r\n',326,0,0,'CC-BY-SA','emacs,org-mode,mobile,mobile-org app,pi-top,pocketchip,Android',0,0,1), (2450,'2017-12-22','Android Audio with viper 4 android and magisk',609,'I go over some ways to help manage audio with android','',36,0,1,'CC-BY-SA','audio,android',0,0,1), (2452,'2017-12-26','Hydraulic Heavy Scale Project',1339,'Hydraulic Jack Mod, DIY, Travel Trailer Balance','

Hydraulic Heavy Scale Project

\r\n

by David Whitman

\r\n

Why? - to weigh a heavy object yourself

\r\n

Not very difficult. Can be done in about 1/2 hour by someone who has experience doing this type of stuff. Lots longer for beginners.

\r\n

Things you will need: A drill motor, The right size bit for a small pilot hole and the right size bit for a fitting to connect the jack cylinder to the pressure gauge, A Thread TAP to make threads to connect the hydraulic 90 degree fitting to the jack, Some pipe dope is not a bad idea, A 90 degree appropriately sized fitting to connect a pressure gauge to the jack, a vise is nice, a wrench to dismantle the jack, A way to accurately measure the cylinder bore (best is a caliper) and some oil to refill the jack.

\r\n

This link is a youtube to help you visualize the steps. https://www.youtube.com/watch?v=ZBmxkWK_OFA

\r\n

Hate this episode? No problem. Do a better one

',209,0,0,'CC-BY-SA','Hydraulic Jack Mod, DIY, Travel Trailer Balance',0,0,1), (2454,'2017-12-28','The Alien Brothers Podcast - S01E02 - Strictly Hacking',6389,'Casper and Rutiger discuss the Uber hacks and the Intel ME known and unknown vulnerabilties','

Casper and Rutiger attempt to STAY ON TARGET by discussing hacking… which when you think about it is an utterly pretentious and vague goal for a podcast presented by Hacker Public Radio, especially when considering the end result. Shame on us!

\r\n

Other topics include Friendsgiving and giving thanks; probably the greatest gaming console of the 1970’s; early “hackings” (sic) committed by the hosts; << >>

\r\n

References:

\r\n
    \r\n
  1. The link to the first chapter of Dief Minusky’s seminal the Nature of Systems is freely available here.
    \r\nhttps://www.dropbox.com/s/or5vefjumde4qsk/TNOS%20E-I%20C1%2020030415.pdf?dl=0
    \r\nAlthough we referred to the Chapter 8 material on system network security during the show, Rutiger decided it was better to release chapters, incrementally, in order let listeners gain a fuller appreciation for the work. Rutiger is also attempting to track down the original author, who never publicly released the work, to gain retroactive permission for this link, but for the moment Alien Brothers Podcast takes full responsibility for allowing access to this non-copyrighted work and we’ll just go ahead, you know, feel good about the possibility it will all turn out OK.
  2. \r\n
  3. Uber Data Breach (2017; CNN.com)
  4. \r\n
  5. How to Disable the Intel Management Engine Backdoor
    \r\nhttps://beinglibertarian.com/disable-intel-management-engine-backdoor-courtesy-nsa/
  6. \r\n
',359,0,1,'CC-BY-SA','Uber Hack, Intel ME, Alien Brothers',0,0,1), (2455,'2017-12-29','Interface Zero RPG Part 5',5074,'Klaatu, Lobath, and Thaj play the Interface Zero RPG part 5','

An extra-long episode of the grand finale of the Interface Zero RPG play-through.

\r\n\r\n

Spoilers: Chaiwei dies in combat and Syd runs off with Tina.

\r\n\r\n

\r\nAt the end of the show are all the credits containing sound effects and source materials. Here they are in text form.

\r\n\r\n

\r\nSound effects were taken from freesound.org. Thanks to the following artists:\r\n

\r\n\r\n\r\n\r\n

Music

\r\n\r\n\r\n

Story

\r\n\r\n

\r\nWant to play this game yourself?\r\n

\r\n\r\n\r\n

Editor\'s note 2017-12-28: link added from comments.

\r\n',78,95,1,'CC-BY-SA','Interface Zero,game,gaming,tabletop,rpg',0,0,1), (2457,'2018-01-02','Getting ready for my new Macbook Pro',1165,'Knightwise is about to order a new macbook pro and shares some tips and tricks','

I am about to buy a new macbook pro and talk about the things I do to install and protect it.

\r\n\r\n',111,0,1,'CC-BY-SA','Macbook Pro, Homebrew, warranty, case, cables',0,0,1), (2458,'2018-01-03','Chrome Plugins You Must Have',643,'I go over my current list of Chrome plugins and how I secure my browser','

https://www.linkedin.com/pulse/block-more-ads-unlimited-cloud-storage-multi-threaded-robert-mccurdy

\r\n',36,0,1,'CC-BY-SA','Chrome extensions',0,0,1), (2465,'2018-01-12','TronScript where have you been all my life!',1669,'I take an initial look at TronScript and its features','',36,0,1,'CC-BY-SA','windows,scripting,batch files,antivirus,malware',0,0,1), (2459,'2018-01-04','free software\'s long tail',436,'Response to hpr2443 :: pdmenu by pdmenu\'s author','

Surprised to see in my podcast feed an episode about an insignificant program which I\'d written two decades earlier, I thought I\'d record a response with some thoughts on free software\'s long tail.

\r\n',360,0,0,'CC-BY-SA','pdmenu,free software',0,0,1), (2461,'2018-01-08','Gitolite',1839,'Using Gitolite to administer your Git server.','

Gitolite provides an admin a centralised interface, in the form of a configuration file, to make managing users, user permissions, repos, and user and repo groups easy. It abstracts Git users from UNIX users by defining a user by public keys, and manages permissions down to the branch-level. And better yet, it is itself managed over Git.\r\n

\r\n

\r\nProper documentation is available on Gitolite.com

',78,81,0,'CC-BY-SA','git,server,admin,dev',0,0,1), (2471,'2018-01-22','Tea Time!',379,'I go over where I am at with Tea','',36,0,1,'CC-BY-SA','Tea, Yerba Mate Pajarito',0,0,1), (2462,'2018-01-09','AudioBookClub-14-Triplanetary-(First-in-the-Lensman-Series)',7030,'The HPR_AudioBookClub discusses Triplanetary: First in the Lensman Series by E. E. \"Doc\" Smith','

SUMMARY

\r\n

In this episode, the HPR_AudioBookClub discusses Triplanetary: First in the Lensman Series by E. E. \"Doc\" Smith.\r\n
https://librivox.org/triplanetary-first-in-the-lensman-series-by-e-e-doc-smith/

\r\n

Non-Spoiler Thoughts

\r\n\r\n

BEVERAGE REVIEWS

\r\n

As usual, the HPR_AudioBookClub took some time to review the beverages that each of us were drinking during the episode

\r\n\r\n

Other Things We Talked About

\r\n\r\n

OUR NEXT AUDIOBOOK

\r\n

City Of Masks by Mike Reeves-McMillan\r\n
https://scribl.com/books/PC439/city-of-masks

\r\n

FURTHER RECOMMENDATIONS

\r\n

The rest of the Lensman Series: https://en.wikipedia.org/wiki/Lensman_series

\r\n

What the new Star Wars movies should have been about: https://en.wikipedia.org/wiki/Thrawn_trilogy

\r\n

FEEDBACK

\r\n

Thank you very much for listening to this episode of the HPR_AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time. Please leave a few words in the episode\'s comment section.\r\n
As always; remember to visit the HPR contribution page HPR could really use your help right now.

\r\n

https://hackerpublicradio.org/contribute.php

\r\n

Sincerely,\r\n
The HPR_AudioBookClub

\r\n

P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.

\r\n
\r\n

OUR AUDIO

\r\n

This episode was processed using Audacity https://audacity.sourceforge.net/. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. It\'s been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).

\r\n

Mumble uses a sample rate of 48kHz, but HPR requires a sample rate of 44.1kHz so the first step in our audio process is to resample the file at 44.1kHz. Resampling can take a long time if you don\'t have a powerful computer, and sometimes even if you do. If you record late at night, like we do, you may want to start the task before you go to bed, and save it first thing in the morning, so that the file is ready to go the next time you are.

\r\n

Next we use the \"Compressor\" effect with the following settings:

\r\n \r\n

After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.

\r\n

At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata. We use the \"Truncate Silence\" effect with it\'s default settings to minimize the silence between people speaking. When used with it\'s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.

\r\n

At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.

\r\n

We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR FTP server.

\r\n

Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.

\r\n',157,53,1,'CC-BY-SA','HPR AudioBookClub, Triplanetary, E. E. \"Doc\" Smith',0,0,1), (2460,'2018-01-05','The Alien Brothers Podcast - S01E03 - Decline of American Empire',6830,'The Alien Brothers penetrate the Van Allen belt to tap in, and transmit an intergalactic podcast','

Summary:

\r\n

\r\nCasper and Rutiger opt for a time of ease and relaxation by discussing happy light topics: the decline of American Empire and recent reversal of Net Neutrality protections [or the rollout of Net Neuterality -c] (December 2017).\r\n

\r\n

Links and Notes:

\r\n

\r\nRe: Empire - moral decline and massive wealth inequality, role in imperial decline [1] -r
\r\nRe: Empire - Noam Chomsky and Decline of American Empire [2] -r
\r\nRe: Empire - moral decline - death as sport (Onion spoof) [3] -r
\r\nRe: Net Neutrality - Rutiger apologies - to Casper, for completely derailing the conversation on Net Neutrality by believing that pay-for-bandwidth/capacity and limiting access to content are both legitimate elements of the Net Neutrality debate, but over-focusing on the infrastructure/de-emphasizing the content argument. See Prevent Over-Use of Bandwidth and Pricing Models vs. Data Discrimination [4] -r
\r\nRe: Empire - consumption of human suffering as entertainment - modern Roman colosseum [5] -r
\r\nRe: Empire - the thought leaders over at Reddit on elements of declining empire [6] -r
\r\nRe: Thoughts - Volume One Chapter Two of Diek Minusky’s The Nature of Systems will be coming with… episode 4! Sorry folks. Hold… hold! -r
\r\nRe: Getting Things Done - by David Allen [7]
\r\n

\r\n\r\n\r\n

Timeline / Additional Links:

\r\n

\r\n00:00:00 - 00:13:00 Settling in - Casper and Rutiger get acquainted after being off the air for a while. Skip this part if you don’t care about the characters Casper and Rutiger and their degeneration…
\r\nBegin Topic 1: Net Neuterality / Net Neutrality Rollback
\r\n00:14:00 - 00:30:00 The Deployment of Net Neuterality / Rollback of Net Neutrality - Casper attempts to boil this topic down nice and easy for Rutiger, yet Rutiger conflates this (see above), but that is OK as this is normal for pleebs. Members of HPR will understand.
\r\n00:30:00 - 00:36:00 Fox & Disney Merger - Coincidence or Conspiracy on timing w/ Net Neutrality rollback?
\r\n00:36:00 - 00:40:30 How Should HPR Community Respond or Mitigate This? Credit goes to Rob Placone and Jimmy Dore for mentioning Municipality developed internet
\r\nhttps://www.youtube.com/watch?v=mvJ93kjSXiQ
\r\n00:40:30 - 00:48:00 Discussion on Availability of Access
\r\n00:48:00 - 00:52:00 Casper takes a sharp pivot off track - A satellite is mentioned and Casper brings up DMB unfortunately for the listener
\r\n00:52:00 - 00:56:00 FREESTYLE JAM!@&#%^
\r\n00:58:00 - Ron Swanson has words for Ajit Pai
\r\n01:00:00 - Rutiger Does Not Speak in Tribe Called Quest Protocol call and response
\r\n01:05:00 - 01:20:00 Casper and Rutiger give their distinct definition of Empire and expand upon this
\r\n01:20:00 - 01:23:00 MUDs, OG Tech & Being Alone Together
\r\n01:23:00 - Casper mentions 150 people own EVERYTHING as mentioned here by Chamath Palihapitiya
\r\nhttps://www.youtube.com/watch?v=PMotykw0SIk
\r\n“During his View From The Top talk, Chamath Palihapitiya, founder and CEO of Social Capital, discussed how money is an instrument of change which should be used to make the world a better place”
\r\n01:27:00 - 01:30:00 - Being Alone Together
\r\n01:30:00 - 01:33:00 - Bullying and how Technology can Exponentiate this
\r\n01:33:00 - How to DEBUG… seriously https://conncounseling.weebly.com/stop--debug.html
\r\n01:39:00 - Consumerism and the Decline of Empire
\r\n01:40:00 - DW Documentaries Casper said he would find
\r\nGreed - https://www.dw.com/en/tv/greed/s-32898
\r\nThe Divide Part 1 - https://www.dw.com/en/the-divide-part-1/av-41378206
\r\nThe Divide Part 2 - https://www.dw.com/en/the-divide-2/av-41467377
\r\n01:42:00 - Immortality Through Consumerism?
\r\n01:43:00 - Where are we if Not Here?
\r\n01:45:00 - Self Destruction
\r\n01:46:00 - Celebrity Chefs and the Tie to the Roman Empire - Casper remembered post-cast that this was from The Four Horsemen Documentary as explained here:
\r\nhttps://barnabyisright.com/2013/03/30/why-celebrity-chefs-herald-the-end-of-empire/
\r\n01:47:00 - Casper (Mis)Quotes Frank Zappa - by saying “Politics is the entertainment branch of the Military Industrial Complex” https://www.reddit.com/r/Zappa/comments/2qxpnu/politics_is_the_entertainment_branch_of_industry/
\r\n01:48:00 - (S)Elections are becoming irrelevant
\r\n01:50:00 - Casper recommends International News Alternatives like BBC, RT, AlJazeera if you would like to know what is going on in the world
\r\nAddendum - Not mentioned in Podcast, but worth a link regarding the state of our MSM in reporting false information on Russia and WikiLeaks from Glenn Greenwald:
\r\nhttps://theintercept.com/2017/12/09/the-u-s-media-yesterday-suffered-its-most-humiliating-debacle-in-ages-now-refuses-all-transparency-over-what-happened/
\r\n01:51:00 - Wrapping Up The Show & ShoutOuts to Klaatu!
\r\n01:53:00 - Casper argues with Gerald to cut the recording\r\n

\r\n',359,0,1,'CC-BY-SA','Net Neutrality',0,0,1), (2463,'2018-01-10','Setting up a 32 Bit Ubuntu Server',762,'Repurpose a 32 bit small form factor working station','

So what is the purpose - I had an old windows backup workstation at work that I did a lot backups with. It got to the point where it was just too slow and low spec to handle the windows 7 updates and with my company switching to the 365/sharepoint/one drive it was not needed anymore. So I wanted not to throw it away as I had sprung for 160GB hard drive a long time ago. “I know at work and purchasing a hard drive for work.” But it lasted more than 10 years doing my outlook backups and file shares.

\r\n

So my first problem was I was pretty sure I only had 32 bit.

\r\n

So no centos or suse in 32 bit. I could have went fedora but I wanted a really long time with support. So it came down to ubuntu 16.04, Debian or Net BSD with I386 repos I could use long term. I was more comfortable with Ubuntu and 16.04 has about 3 years support left on it.

\r\n

Its a small form factor computer so I carried it home for a few days. And got the ISO down loaded again no usb drive boot only DVD.

\r\n

So what is it. I did a uname -a and and looked at the proc cpu to see what the cpu was.
\r\nhttps://www.tecmint.com/find-out-linux-system-is-32-bit-or-64-bit/
\r\nhttps://www.computerhope.com/issues/ch001121.htm
\r\nThe second linked worked best.

\r\n

I had a lot of trouble with lamp and own/next cloud with both snaps and straight install. I broke the install several times. In the end I said what do really know how do well with it right now. So I installed Open SSH server, tightVNC, A really thin xfce 4, ffmpeg and youtube-dl and uget. So I will play with snaps only in the future and keep this basic config.

\r\n

https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-16-04

\r\n

Note I did not auto start VNC because I found in my creations of this server that it used too much RAM vs just starting it and killing it.

\r\n

It is the perfect video processing machine in the moment. If youtube-dl can’t get it I can use uget via vnc and that will then transcode if needed. Mostly for mp3.
\r\nhttps://rg3.github.io/youtube-dl/ youtube-dl is a command-line program to download videos from YouTube.com and a few more sites. It requires the Python interpreter, version 2.6, 2.7, or 3.2+, and it is not platform specific. It should work on your Unix box, on Windows or on Mac OS X. It is released to the public domain, which means you can modify it, redistribute it or use it however you like.

\r\n

I will work on the nextcloud snap and other snaps as they are easy to install or remove without hurting the base system.

\r\n

Possible other projects - Owncloud or Storj
\r\nhttps://storj.io/share.html
\r\nOne you can make a little money with it :)

\r\n',129,0,0,'CC-BY-SA','32-bit server, Ubuntu',0,0,1), (2464,'2018-01-11','The Alien Brothers Podcast - S01E04 - Digital Instruments',3906,'Casper and Rutiger Detail their Digital and Analog Sonic Setups in IOS and Android','

Casper and Rutiger are back with a very simple topic: Making music with various Digital Audio Workstations.

\r\n

Rutiger details his MacOS / iOS platform and the Apps he uses to create his noise:
\r\nhttps://soundcloud.com/fibrechannel

\r\n

Casper details his Windows setup with a relatively cheap DAW and various Analog and Digital transmissions he uses to create his noise:
\r\nhttps://soundcloud.com/user-393542827

\r\n

@alienbpc

\r\n',359,0,1,'CC-BY-SA','DAW, Sonic Voyages, iOS Music Apps, PreSonus Audiobox 22vsl, Logic Pro X, Studio One',0,0,1), (2696,'2018-12-03','HPR Community News for November 2018',4317,'HPR Volunteers talk about shows released and comments posted in November 2018','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n desearcher.\n

\n\n

Last Month\'s Shows

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
IdDayDateTitleHost
2674Thu2018-11-01Raspberry pi3 open media serverJWP
2675Fri2018-11-02YouTube PlaylistsAhuka
2676Mon2018-11-05HPR Community News for October 2018HPR Volunteers
2677Tue2018-11-06Thoughts on language learning part 4 - RPG.dodddummy
2678Wed2018-11-07Explaining the controls on my Amateur HF Radio Part 4MrX
2679Thu2018-11-08Extra ancillary Bash tips - 13Dave Morriss
2680Fri2018-11-09Some Additional Talk About Characters -- 01lostnbronx
2681Mon2018-11-12DerbyCon Interview - Hackers for CharityXoke
2682Tue2018-11-13(NOT) All About Blenderm1rr0r5h4d35
2683Wed2018-11-14Using Open source tools to visualize the heartrate and blood oxygen saturation level of my stepchildJeroen Baten
2684Thu2018-11-15Making a remote control visibleKen Fallon
2685Fri2018-11-16Scientific and Medical ReportsAhuka
2686Mon2018-11-19(NOT) All About Blender - Part the Secondm1rr0r5h4d35
2687Tue2018-11-20Some Additional Talk About Characters -- 02lostnbronx
2688Wed2018-11-21Explaining the controls on my Amateur HF Radio Part 5MrX
2689Thu2018-11-22Bash Tips - 14Dave Morriss
2690Fri2018-11-23A chat about the HiveMQ BrokerKen Fallon
2691Mon2018-11-26DerbyCon Interview - John StrandXoke
2692Tue2018-11-27YouTube URL tricksdesearcher
2693Wed2018-11-28Getting started with web based game in Haskell and ElmTuula
2694Thu2018-11-29Bandit UpdateNYbill
2695Fri2018-11-30Problems with StudiesAhuka
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows\nreleased during the month or to past shows.
\nThere are 24 comments in total.

\n

There are 9 comments on\n7 previous shows:

\n\n

There are 15 comments on 8 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2018-November/thread.html\n\n\n

Any other business

\n

Hacker Public Radio New Year’s Eve Show

\n

Edited from linuxlugcast.com

\n

Hey folks

\n

It’s that time of year again. Time for the Hacker Public Radio 24 hr (26 hr) New Years Eve Show.

\n

For those who don’t know on New Years Eve 2018-12-31 at 10:00 am UTC (5:00 am EST) we will have a recording going on the HPR Mumble server (at ch1.teamspeak.cc on port 64747) for anyone to come on say “Happy New Year” and talk about what ever they want.

\n

We will leave the recording going until 2019-01-01 12:00 am UTC (7:00 am EST) or until the conversation stops.

\n

For those who have never used Mumble before, we have a guide over at linuxlugcast.com in our how to section explaining how to setup the desktop Mumble client, but Mumble isn’t only available for the desktop. It is also available for Android and IOS.

\n

We are also going to setup an etherpad for people to share links to things they are discussing.

\n

So please stop in. Say “Hi” and maybe join in the conversation with other HPR listeners and contributors. It’s always a good time.

\n

New podcast - Libre Lounge

\n

Libre Lounge

\n

Quoted from the site:

\n
\n

Libre Lounge is a podcast where we casually discuss various topics involving user freedom, crossing free software, free culture, network and hosting freedom, and libre hardware designs. We discuss everything from policy and licensing to deep dives on technical topics… whatever seems interesting that week. At some point we might even have guests!

\n
\n

Internet Archive funding drive

\n

As you know, HPR uploads all current episodes to the Internet Archive at https://archive.org, and is in the process of uploading older shows, so we are particularly keen that this amazing service continues.

\n

The Internet Archive is currently fundraising. Donations are currently being matched by a generous supporter, so this will double your impact if you are able to donate.

\n

Tags and Summaries

\n

Over the period tags and/or summaries have been added to 23 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2721,'2019-01-07','HPR Community News for December 2018',4247,'HPR Volunteers talk about shows released and comments posted in December 2018','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Edward Miro / c1ph0r.\n

\n\n

Last Month\'s Shows

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
IdDayDateTitleHost
2696Mon2018-12-03HPR Community News for November 2018HPR Volunteers
2697Tue2018-12-04The Linux Shutdown Command ExplainedJWP
2698Wed2018-12-05XSV for fast CSV manipulations - Part 1b-yeezi
2699Thu2018-12-06Bash Tips - 15Dave Morriss
2700Fri2018-12-07Episode 3000Ken Fallon
2701Mon2018-12-10First impressions of the Odroid-gododddummy
2702Tue2018-12-11Audacity set up and response to episode 2658Tony Hughes AKA TonyH1212
2703Wed2018-12-12Fog of war in Yesod based gameTuula
2704Thu2018-12-13Intro to Scribusklaatu
2705Fri2018-12-14Evidence-based MedicineAhuka
2706Mon2018-12-17Why I love the IBM AS/400 computer systemsJeroen Baten
2707Tue2018-12-18Steganalysis 101Edward Miro / c1ph0r
2708Wed2018-12-19Ghostscriptklaatu
2709Thu2018-12-20Bash Tips - 16Dave Morriss
2710Fri2018-12-21Youtube downloader for channelsKen Fallon
2711Mon2018-12-24Raspberry Pi 3A+ ReviewYannick the french guy from Switzerland
2712Tue2018-12-25Steganographyklaatu
2713Wed2018-12-26Resources in 4x gameTuula
2714Thu2018-12-27Airplane stalls and Angle of AttackBrian in Ohio
2715Fri2018-12-28About ONAPJWP
2716Mon2018-12-31Really Simple YouTubeThaj Sara
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows\nreleased during the month or to past shows.
\nThere are 34 comments in total.

\n

There are 15 comments on\n11 previous shows:

\n\n

There are 19 comments on 10 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2018-December/thread.html\n\n\n

Any other business

\n

\nThanks to all HPR contributors in 2018!\n

\n

\nAaressaar, Ahuka, Al, Archer72, b-yeezi, bjb, bookewyrmm, Brian in Ohio, clacke, Claudio Miranda, Clinton Roy, Dave Morriss, David Whitman, desearcher, dodddummy, Edward Miro / c1ph0r, finux, folky, Honkeymagoo, HPR Volunteers, HPR_AudioBookClub, Jeroen Baten, Joey Hess, Jon Kulp, JWP, Ken Fallon, klaatu, knightwise, lostnbronx, m1rr0r5h4d35, MPardo, MrX, NYbill, operat0r, Philip, Quvmoh, Shane Shennan, sigflup, Steve Saner, swift110, Thaj Sara, The Alien Brothers Podcast (ABP), the_remora, TheDUDE, thelovebug, ToeJet, Tony Hughes AKA TonyH1212, Tuula, Various Creative Commons Works, Various Hosts, Xoke, Xtrato, Yannick the french guy from Switzerland.\n

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2741,'2019-02-04','HPR Community News for January 2019',4598,'Yannick Dave and Ken talk about shows released and comments posted in January 2019','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
IdDayDateTitleHost
2717Tue2019-01-01Mobile Device SecurityEdward Miro / c1ph0r
2718Wed2019-01-02Genre In Storytellinglostnbronx
2719Thu2019-01-03Bash Tips - 17Dave Morriss
2720Fri2019-01-04Download youtube channels using the rss feedsKen Fallon
2721Mon2019-01-07HPR Community News for December 2018HPR Volunteers
2722Tue2019-01-08RAID 6 a short descriptionJWP
2723Wed2019-01-09Using Elm in context of 4X game clientTuula
2724Thu2019-01-10Using a DIN Rail to mount a Raspberry PiDave Morriss
2725Fri2019-01-11The Illumos Shutdown Command Explainedklaatu
2726Mon2019-01-14Home Theater - Part 2 Software (High Level)operat0r
2727Tue2019-01-15PasswordsEdward Miro / c1ph0r
2728Wed2019-01-16The Unreliable Narrator In Storytellinglostnbronx
2729Thu2019-01-17Bash Tips - 18Dave Morriss
2730Fri2019-01-18Resizing images for vcard on AndroidKen Fallon
2731Mon2019-01-21My 8 bit ChristmasAndrew Conway
2732Tue2019-01-22Storytelling formula complianceklaatu
2733Wed2019-01-23Writing Web Game in Haskell - News and NotificationsTuula
2734Thu2019-01-24MashpodderMrX
2735Fri2019-01-25SoffrittoTony Hughes AKA TonyH1212
2736Mon2019-01-28Response to show 2720Dave Morriss
2737Tue2019-01-29My Pioneer RT-707 Reel-to-Reel Tape DeckJon Kulp
2738Wed2019-01-30My ApplicationsTony Hughes AKA TonyH1212
2739Thu2019-01-31Bash Tips - 19Dave Morriss
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows\nreleased during the month or to past shows.
\nThere are 29 comments in total.

\n

There are 8 comments on\n4 previous shows:

\n\n

There are 21 comments on 9 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-January/thread.html\n\n\n

Any other business

\n\n

Tags and Summaries

\n

Over the period tags and/or summaries have been added to 11 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1); INSERT INTO `eps` (`id`, `date`, `title`, `duration`, `summary`, `notes`, `hostid`, `series`, `explicit`, `license`, `tags`, `version`, `downloads`, `valid`) VALUES (3959,'2023-10-05','Download any HPR series with english file names',165,'A dir with the series name will be created and all shows will be renamed to ShowTitle.mp3 inside it','

Hello all. This is gemlog from Terrace, bc, canada just up near the\nalaska panhandle.

\n

Some of you may know me from in COM chat on sdf dot org or as a\nfedizen on the tilde dot zone instance of mastodon.

\n

Now, the other day I finally got around to checking out HPR properly,\neven though my masto-pal claw-dio-m turned me on to it a couple of years\nago.

\n

Recently, on a friday night in irc on tilde radio, I noticed there\nwere whole series on hpr and not only single shows and that got me kind\nof excited.
\nI guess I\'m easily excitable.

\n

Anyhow, something I could listen to at work or while driving. Still,\nI managed to forget about it until /just/ before I was leaving the house\nfor work on Monday morning. I rushed to copy over a few shows - nearly\nat random onto my phone and headed out to work.

\n

After I got my morning sorted at work, I told VLC to play-all and\nenjoyed a couple of shows. I noticed that each show I had chosen had a\nbeg post at the beginning. I figured I could make one on at least\nsomething from my messy gemlog/bin dir.

\n

However, after a break, I came back and couldn\'t remember which 4\ndigit numbered dot mp3 I had finished up on, which mildly irked me.\nWell, as we all know, irk becomes itch and I put my sad regex skills to\nthe test scraping the hpr website with a custom bash script later when I\ngot home.

\n

A very custom bash script. Like all scrapers, if any of the guys at\nhpr even breathe the wrong way, it will probably break horribly. On the\nother hand, I\'ve had scrapers that looked just as sad running for many\nyears against a canadian government site. So. Who knows?

\n

All the script uses are some built-ins from bash along with sed and\nwget for the actual getting. My local instance of searX N G was left\nsmoking as scrambled for sed incantations to string together. I\'m not a\nsed guy.

\n

Usage is simple, as the script only accepts one argument: ... the\nfour digit series number of the show you want to download. It will\ncreate a dir with the series name and download every mp3 it finds,\nrenaming each show to the show title.

\n

I was tempted to doll it up with some niceties like options for\ndownload dir, a selector for a series with a dialog of some kind... yada\nyada yada.

\n

But... we all know what happens when you stretch a quick hack with a\nbash script too far for the scripting language: hours of misery wishing\nyou\'d started with some other language.

\n

So far, I\'ve used the script to download 8 series. DU dash S H tells\nme they add up to 2 dot 2 gig, so it seems to work well enough.

\n

It comes with the same iron clad warranty as everything I write:

\n

If it breaks, you get to keep all the pieces. Thanks for\nlistening.

\n
#!/bin/bash\n# gemlog@gemlog.ca 2023-08-26\n# License: CC BY-SA 4.0.\n# not proud of my continuing lack of regex foo frankly...\n\nif [ $# -lt 1 ]; then\n  echo 1>&2 "$0: You need to enter the HPR Series Number to download as 4 digits"\n  echo "The full list of HPR Series is at https://hackerpublicradio.org/series/index.html"\n  exit 2\nfi\n\nsnumber=$1\nre='^[[:digit:]]{4}$'\nif [[ $snumber =~ $re ]]; then\n    wget https://hackerpublicradio.org/series/$snumber.html -q -O /tmp/$snumber.html\n    content=$(</tmp/$snumber.html)\n    declare -a shows\n    shows=$(grep -P '^(?=.*h3)(?=.*title)' /tmp/$snumber.html)\nelse\n    echo "'$snumber' is not exactly 4 digits like an HPR series number"\n    exit 2\nfi\n\nseries=$(echo $content | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | grep -o -P -m1 '(?<=In-Depth Series:).*(?=Number)' | sed 's/[ t]*$//' )\nseries=$(echo ${series// /_} | cut -b 2-50 | sed 's/_*$//' | sed 's/^_*//' | sed s/[^A-Za-z0-9_.]/_/g)\n\n#outdir="/home/gemlog/Music/Audio/HPR/$series-Se$snumber/"\noutdir=~/"Downloads/HPR/$series-Se$snumber/"\nmkdir -p "$outdir"\necho "Files for the series "$series" will be saved in $outdir"\n\ndeclare -a shows\ndeclare -a url_array\nshows=$(grep -P '^(?=.*h3)(?=.*title)' /tmp/$snumber.html)\nIFS=$'n'\n\nfor line in $shows\n  do\n    f=$((f+1))\ndone\necho\necho\necho "Downloading $f mp3 files"\n\n\nfor line in $shows\n  do\n    i=$((i+1))\n    title=$(echo $line | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | grep -o -P '(?<=::).*('host')'  | sed 's/host//' | sed 's/[ t]*$//' | sed s/[^A-Za-z0-9_.]/_/g | sed 's/ /_/g' | sed 's/^_*//' )\n    enumber=$(echo $line | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | grep -o -P '(?<=hpr).*('::')' | sed 's/:://')\n    enumber=$(printf "%04d" $((enumber)) )\n    outfile=$outdir$title-Ep$enumber.mp3\n    url="https://www.hackerpublicradio.org/eps/hpr$enumber.mp3"\n    echo "Downloading file $i: $title"\n    wget --verbose --max-redirect 2 $url -O $outfile\n    sleep 2\n  done\n\n\necho\nttlfiles=$(ls -1 $outdir | wc -l)\necho "$ttlfiles files for the series "$series" were saved in $outdir"\n\nexit 0
\n',425,42,1,'CC-BY-SA','Bash, sed, grep, wget, scraper',0,0,1), (2761,'2019-03-04','HPR Community News for February 2019',4022,'HPR Volunteers talk about shows released and comments posted in February 2019','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
IdDayDateTitleHost
2740Fri2019-02-01Pop!_OS 18.10 (quick) reviewYannick the french guy from Switzerland
2741Mon2019-02-04HPR Community News for January 2019HPR Volunteers
2742Tue2019-02-05SAP Hana Certification DirectoryJWP
2743Wed2019-02-06Character build in the d20 systemklaatu
2744Thu2019-02-07Yet Another Rambling Drive Into WorkMrX
2745Fri2019-02-08My YouTube Subscriptions #1Ahuka
2746Mon2019-02-11My software part 2Tony Hughes AKA TonyH1212
2747Tue2019-02-12checking oilbrian
2748Wed2019-02-13Writing Web Game in Haskell - Special eventsTuula
2749Thu2019-02-14Lostnbronx and Klaatu commentary from episode 2743klaatu
2750Fri2019-02-15Windmill is on the FritzKen Fallon
2751Mon2019-02-18Battling with English - part 3Dave Morriss
2752Tue2019-02-19XSV for fast CSV manipulations - Part 2b-yeezi
2753Wed2019-02-20Specific Settings In Storytellinglostnbronx
2754Thu2019-02-21Craigslist Scam CatchEdward Miro / c1ph0r
2755Fri2019-02-22My YouTube Subscriptions #2Ahuka
2756Mon2019-02-25Bash Tips - 20Dave Morriss
2757Tue2019-02-26How to DMklaatu
2758Wed2019-02-27Haskell - Data types and database actionsTuula
2759Thu2019-02-28Cleaning the Potentiometers on a Peavey Bandit 65Jon Kulp
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows\nreleased during the month or to past shows.
\nThere are 10 comments in total.

\n

There are 6 comments on\n5 previous shows:

\n\n

There are 4 comments on 4 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-February/thread.html\n\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month: windigo

\n

Over the period tags and/or summaries have been added to 24 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2466,'2018-01-15','ShareX is awesome',447,'ShareX, for all your screenshot needs and more','

Find it at https://getsharex.com/

',79,0,0,'CC-BY-SA','Windows, Screenshot, documentation',0,0,1), (2468,'2018-01-17','THE WELL',408,'I record a video with audio on my fathers well setup in the sticks','

I record a video with audio on my fathers well setup in the sticks

\r\n

https://rmccurdy.com/scripts/videos/rmccurdy_com/THE_WELL.mp4

',36,0,1,'CC-BY-SA','well, pump, troubleshooting',0,0,1), (2469,'2018-01-18','A flight itinerary in Bash',1065,'Working out dates and times in a Bash script','

A flight itinerary in Bash

\r\n

My daughter flew out to New Zealand before Christmas 2017 to spend some time with her brother, who had been there with his girlfriend since November. I saw her flight itinerary from the airline, but had no idea of how the times related to time back home, so I wrote a little Bash script to calculate times in UTC (my local timezone).

\r\n

Both of my children have travelled a fair bit in the past few years. I like to keep track of where they are and how they are progressing through their journeys because otherwise I tend to worry. This one was a reasonably simple journey, two flights via Doha in Qatar, with not too long a wait between them. The overall journey was long of course.

\r\n

When my daughter flew out to Indonesia in 2015 (4 flights and a boat trip, over 38 hours travel time) I built a spreadsheet. Just whatever provides a good distraction!

\r\n

The rest of the notes, including details of the date command and the script I wrote can be found here.

\r\n

Links

\r\n\r\n',225,42,1,'CC-BY-SA','Bash,date,ISO 8601,epoch',0,0,1), (2470,'2018-01-19','Obamacare Update At The End Of 2017',798,'Where is US Health Care policy as we head into 2018?','

In 2017 Obamacare was the subject of a great deal of political jockeying, and yet by the end of the year almost nothing changed. So what happened, and why?

\r\n\r\n',198,100,0,'CC-BY-SA','Health Insurance, Health Policy, Insurance Marketplace, Obamacare',0,0,1), (2479,'2018-02-01','Intergraph workstation',1725,'My rebuild of my Intergraph workstation','

Been going through my old work servers.

\r\n

They typically run until I can\'t update them anymore and then sit not used until I have a bit of free time. So I have an old intergraph box in it that I new pentium 4 motherboard from about 8 years back. I had the receipt taped to the inside of the box. And the Expense statement from work. I had centos 6.0 on it try as it must It got no more updates and repros. It also has a weak PSU as I had to remove the DVD and graphics card to get to work.

\r\n

About intergraph:

\r\n
\r\n

Intergraph Corporation is an American software development and services company. It provides enterprise engineering and geospatially powered software to businesses, governments, and organizations around the world. Intergraph operates through three divisions: Hexagon PPM, Hexagon Safety & Infrastructure, and Hexagon Geospatial. The company\'s headquarters is in Huntsville, Alabama, USA. In 2008, Intergraph was one of the 100 largest software companies in the world. In 2010, Intergraph was acquired by Hexagon AB. Intergraph was founded in 1969 as M&S Computing, Inc., by former IBM engineers who had been working with NASA and the U.S. Army in developing systems that would apply digital computing to real-time missile guidance. The company was later renamed to Intergraph Corporation in 1980. In 2000, Intergraph exited the hardware business and became purely a software company. On July 21, 2000, it sold its Intense3D graphics accelerator division to 3Dlabs, and its workstation and server division to Silicon Graphics. The companies incorporated SmartSketch, a drawing program used previously for the PenPoint OS and EO tablet computer. When Pen computing did not take off, SmartSketch was ported to the Windows and Macintosh platforms. https://www.cnet.com/news/intergraph-delivers-cheap-workstations/

\r\n
\r\n

The new TD-300 and TD-400 "Personal Workstations" offer 3D graphics capabilities equal to or below the prices of PCs configured as 3D workstations, the company said. The TD-300 and TD-400 Personal Workstations are available immediately, with prices starting at $5,495. https://www.intergraph.com/about_us/history_90s.aspx

\r\n

So the box now has a Pentium 4 dual core in it which is 64 bit. This chip is 2004-2007. https://en.wikipedia.org/wiki/Pentium_4

\r\n

So I have the ubuntu 32 bit work. And Suse Enterprise 12, tumbleweed and leap on hyperV. I had my Transmeta box on Debian I386 32 bit. So I need a redhat flavor. Since its 64 bit I picked CentOS. https://www.centos.org/

\r\n

What is CentOS?

\r\n
\r\n

CentOS (/ˈsɛntɒs/, from Community Enterprise Operating System) is a Linux distribution that attempts to provide a free, enterprise-class, community-supported computing platform functionally compatible with its upstream source, Red Hat Enterprise Linux (RHEL). In January 2014, CentOS announced the official joining with Red Hat while staying independent from RHEL, under a new CentOS governing board. In July 2010, CentOS overtook Debian to become the most popular Linux distribution for web servers, with almost 30% of all Linux web servers using it. Debian retook the lead in January 2012.

\r\n

In January 2014, Red Hat announced that it would sponsor the CentOS project, "helping to establish a platform well-suited to the needs of open source developers that integrate technologies in and around the operating system". As a result of these changes, ownership of CentOS trademarks was transferred to Red Hat, which now employs most of the CentOS head developers; however, they work as part of Red Hat\'s Open Source and Standards team, which operates separately from the Red Hat Enterprise Linux team. A new CentOS governing board was also established.

\r\n

CentOS developers use Red Hat\'s source code to create a final product very similar to RHEL. Red Hat\'s branding and logos are changed because Red Hat does not allow them to be redistributed. CentOS is available free of charge. Technical support is primarily provided by the community via official mailing lists, web forums, and chat rooms. CentOS version numbers for releases older than 7.0 have two parts, a major version and a minor version, which correspond to the major version and update set of Red Hat Enterprise Linux (RHEL) used to build a particular CentOS release. For example, CentOS 6.5 is built from the source packages of RHEL 6 update 5 (also known as RHEL version 6.5), which is a so-called "point release" of RHEL 6.

\r\n

Starting with version 7.0, CentOS version numbers also include a third part that indicates the monthstamp of the source code the release is based on. For example, version number 7.0-1406 still maps this CentOS release to the zeroth update set of RHEL 7, while "1406" indicates that the source code this release is based on dates from June 2014. Using the monthstamp allows installation images to be reissued for (as of July 2014) oncoming container and cloud releases, while maintaining a connection to the related base release version.

\r\n

Since mid-2006 and starting with RHEL version 4.4, which is formally known as Red Hat Enterprise Linux 4.0 update 4, Red Hat has adopted a version-naming convention identical to that used by CentOS (for example, RHEL 4.5 or RHEL 6.5). AltArch releases are released by the Alternative Architecture Special Interest Group (AltArch SIG) to supporThere are three primary CentOS repositories (also known as channels), containing software packages that make up the main CentOS distribution: base - contains packages that form CentOS point releases, and gets updated when the actual point release is formally made available in form of ISO images. updates - contains packages that serve as security, bugfix or enhancement updates, issued between the regular update sets for point releases. Bugfix and enhancement updates released this way are only those unsuitable to be released through the CentOS-Fasttrack repository described below. addons - provides packages required for building the packages that make up the main CentOS distribution, but are not provided by the upstream. The CentOS project provides several additional repositories that contain software packages not provided by the default base and updates repositories. Those repositories include the following: CentOS Extras - contains packages that provide additional functionality to CentOS without breaking its upstream compatibility or updating the base components. CentOSPlus - contains packages that actually upgrade certain base CentOS components, changing CentOS so that it is not exactly like the upstream provider\'s content. CentOS-Testing - serves as a proving ground for packages on their way to CentOSPlus and CentOS Extras. Offered packages may or may not replace core CentOS packages, and are not guaranteed to work properly. CentOS-Fasttrack - contains bugfix and enhancement updates issued from time to time, between the regular update sets for point releases. The packages released this way serve as close candidates for the inclusion into the next point release. This repository does not provide security updates, and does not contain packages unsuitable for uncertain inclusion into point releases. CR (Continuous Release) - makes generally available packages that will appear in the next point release of CentOS. The packages are made available on a testing and hotfix basis, until the actual point release is formally released in form of ISO images. debuginfo - contains packages with debugging symbols generated when the primary packages were built contrib - contains packages contributed by CentOS users that do not overlap with any of the core distribution packages Software Collections - provides versions of software newer than those provided by the base distribution, see above for more details

\r\n
\r\n\r\n

The end of support on my box is currently 2024. During my setup I let the centos do something with LVM the drive had two WD 320GB disks. One was very hot so I moved it so it have some more air.

\r\n

LVM:

\r\n
\r\n

In Linux, Logical Volume Manager (LVM) is a device mapper target that provides logical volume management for the Linux kernel. Most modern Linux distributions are LVM-aware to the point of being able to have their root file systems on a logical volume.

\r\n

Heinz Mauelshagen wrote the original LVM code in 1998, taking its primary design guidelines from the HP-UX\'s volume manager. LVM is used for the following purposes: Creating single logical volumes of multiple physical volumes or entire hard disks (somewhat similar to RAID 0, but more similar to JBOD), allowing for dynamic volume resizing. Managing large hard disk farms by allowing disks to be added and replaced without downtime or service disruption, in combination with hot swapping. On small systems (like a desktop), instead of having to estimate at installation time how big a partition might need to be, LVM allows filesystems to be easily resized as needed. Performing consistent backups by taking snapshots of the logical volumes. LVM can be considered as a thin layer of continuity and ease-of-use for managing hard drive replacement, repartitioning and backup. software layer on top of the hard disks and partitions, which creates an abstraction Basic functionality Volume groups (VGs) can be resized online by absorbing new physical volumes (PVs) or ejecting existing ones. Logical volumes (LVs) can be resized online by concatenating extents onto them or truncating extents from them. LVs can be moved between PVs. Creation of read-only snapshots of logical volumes (LVM1), or read-write snapshots (LVM2). VGs can be split or merged in situ as long as no LVs span the split. This can be useful when migrating whole LVs to or from offline storage. LVM objects can be tagged for administrative convenience. VGs and LVs can be made active as the underlying devices become available through use of the lvmetad daemon.

\r\n
\r\n

Setup with CentOS is not as simple as linux mint or ubuntu and very different than debian. You have to click and know a little about what you doing. For me with the basic 500GB install disk I got only a bare server with ssh. The machine was having power issues and would not boot from a usb stick so I had to go through 4 different DVD drives until I found one that worked with the DVD-R format. I had to use another deskop and power the DVD threw the other desk up connecting only the sata port the IDE drive was not working well either on this old board.

\r\n

I had to remove the old centos 6 from the drives using Gparted. There were errors with the gparted but the centos installer worked great after I removed ext4 part of the lvms.

\r\n

GParted is a free partition editor for graphically managing your disk partitions.

\r\n

With GParted you can resize, copy, and move partitions without data loss,

\r\n

Getting the mirrors working and getting it to work through a fire wall was pretty hard I had to make two config changes to the yum.conf one with the proxy address and the other to allow http cache. I also used export_proxy= to get it work globally. I had really trouble finding a fast mirror but I did not give up hope after a while it found fast mirrors that I got over 2MB per second from.

\r\n

So I installed Gnome and made boot up at startup I will install x2go or vncserver on it also just in case I need it.

\r\n

After some time of playing with it I was able to get it to fully update.

\r\n

I then moved to the server room, got the IP address and connected it it from putty. I think the advantage of this box is that I will always have a Redhat 7 install ready to demo or learn something without having to setup a lot of things.

\r\n

Links

\r\n\r\n',129,0,0,'CC-BY-SA','Intergraph Corporation, Pentium 4, CentOS, Logical Volume Manager',0,0,1), (2480,'2018-02-02','What\'s In My Podcatcher 1',1067,'A current report, with descriptions, of the podcasts I enjoy','

I listen to many podcasts as my primary form of audio entertainment, and because Hacker Public Radio listeners also tend to be podcast listeners (pretty much by definition) I am sharing my finds with the community. Besides, Ken made me do it.

\r\n

Links:

\r\n\r\n',198,75,0,'CC-BY-SA','Podcasts',0,0,1), (2490,'2018-02-16','What\'s In My Podcatcher 2',959,'A current report, with descriptions, of the podcasts I enjoy','

I listen to many podcasts as my primary form of audio entertainment, and because Hacker Public Radio listeners also tend to be podcast listeners (pretty much by definition) I am sharing my finds with the community. Besides, Ken made me do it.

\r\n

Links:

\r\n\r\n',198,75,0,'CC-BY-SA','Podcasts',0,0,1), (2467,'2018-01-16','I randomly talk about my laptops',574,'Random talk about my laptops and the linux distros that are on them','

Just decided to start talking about my laptops after I installed Ubuntu Mate 16.04 to my x60.

',297,0,0,'CC-BY-SA','laptop, linux, fun, computers',0,0,1), (2472,'2018-01-23','Forum Failure',1000,'Lostnbronx talks about his recent experiment in running a forum.','

In 2017 I created a forum over at Proboards dedicated to my audio work and writing. It didn\'t attract a user base, and I deleted it when 2018 rolled around.

\r\n

These are just some thoughts about why I wanted it to begin with, and why I think it failed.

\r\n

I still believe Proboards is a good way to jump into forums and using forum software, and still recommend it for that reason:

\r\n

https://proboards.com/

\r\n

Here are some of my projects mentioned briefly in this episode:

\r\n\r\n',107,0,0,'CC-BY-SA','forum,lostnbronx,platform,community',0,0,1), (2473,'2018-01-24','Frotz - A Portable Z-Machine Interpreter',608,'How to use Frotz to play those old Infocom text adventure games from the 80s.','

Frotz is an interpreter for Infocom games (like Zork) and other Z-machine games. You can install it via your respective package manager or download the source code from the URLs below.

\r\n\r\n',152,0,0,'CC-BY-SA','Frotz,Z-code,Z-machine,Interactive Fiction',0,0,1), (2474,'2018-01-25','Open Source Gaming #3 The Atari Jaguar',832,'Episode 3 is about the Atari Jaguar which has been open source since 1999','https://www.atariage.com/Jaguar/archives/HasbroRights.html\r\n\r\n
\r\nHasbro Releases Jaguar Publishing Rights\r\nFOR IMMEDIATE RELEASE:\r\nCONTACTS:\r\nDana Henry\r\nHasbro Interactive\r\n978-921-3759\r\ndhenry@hasbro.com\r\n\r\nBeverly, MA (May 14, 1999) - Leading entertainment software publisher, \r\nHasbro Interactive announced today it has released all rights that it \r\nmay have to the vintage Atari hardware platform, the Jaguar.\r\n\r\nHasbro Interactive acquired rights to many Atari properties, including \r\nthe legendary Centipede, Missile Command, and Pong games, in a March \r\n1998 acquisition from JTS Corporation.\r\n\r\nThis announcement will allow software developers to create and publish \r\nsoftware for the Jaguar system without having to obtain a licensing \r\nagreement with Hasbro Interactive for such platform development. \r\nHasbro Interactive cautioned, however, that the developers should not \r\nuse the Atari trademark or logo in connection with their games or \r\npresent the games as authorized or approved by Hasbro Interactive.\r\n\r\n\"Hasbro Interactive is strictly focused on developing and publishing \r\nentertainment software for the PC and the next generation game \r\nconsoles,\" said Richard Cleveland, Head of Marketing for Hasbro \r\nInteractive\'s Atari Business Unit. \"We realize there is a passionate \r\naudience of diehard Atari fans who want to keep the Jaguar system alive, \r\nand we don\'t want to prevent them from doing that. We will not interfere \r\nwith the efforts of software developers to create software for the \r\nJaguar system.\"\r\n\r\nHasbro Interactive, Inc. is a leading all-family interactive games \r\npublisher, formed in 1995 to bring to life on the computer the deep \r\nlibrary of toy and board games of parent company, Hasbro, Inc. (ASE:HAS). \r\nHasbro Interactive has expanded its charter to include original and \r\nlicensed games for the PC, the Playstation(R) and Nintendo(R) 64 game \r\nconsoles and for multi-player gaming over the internet. Headquartered \r\nin Beverly, Massachusetts, Hasbro Interactive has offices in the U.K., \r\nFrance, Germany, Japan and Canada. For more information, visit the \r\nHasbro Interactive Web site at https://www.hasbro-interactive.com.\r\n
',354,0,1,'CC-BY-SA','Atari Corporation, Atari Jaguar',0,0,1), (2475,'2018-01-26','Information Underground -- Sex, Drugs, and Rock-n-Roll',2601,'The IU guys examine the first Sexual Revolution in America, back during Prohibition.','

Deepgeek, Klaatu, and Lostnbronx look back at the flappers and speakeasies of the 1920\'s and 30\'s, and attempt to draw a line from the newly independent women of that era, up through the Playboy Bunnies of the 1950\'s, all the way to today.

\r\n

Are things better or worse? Is what we "know" about history really important? And do the Info-Underground boys have any clue what they\'re even talking about?

',107,99,1,'CC-0','sex,alcohol,women,prohibition,freedom,history,pornography,oppression,playboy,hugh hefner',0,0,1), (2483,'2018-02-07','Useful Bash functions - part 4',2386,'A Bash function for parsing lists of numbers and ranges','

Useful Bash functions - part 4

\r\n

Overview

\r\n

This is the fourth show about the Bash functions I use, and it may be the last unless I come up with something else that I think might be of general interest.

\r\n

There is only one function to look at this time, but it\'s fairly complex so needs an entire episode devoted to it.

\r\n

As before it would be interesting to receive feedback on this function and would be great if other Bash users contributed ideas of their own.

\r\n

Full Notes

\r\n

Since the notes explaining this subject are long, they have been placed here.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','coding,Bash,script,function',0,0,1), (2500,'2018-03-02','What\'s In My Podcatcher 3',1272,'A current report, with descriptions, of the podcasts I enjoy','

I listen to many podcasts as my primary form of audio entertainment, and because Hacker Public Radio listeners also tend to be podcast listeners (pretty much by definition) I am sharing my finds with the community. Besides, Ken made me do it.

\r\n

Links:

\r\n\r\n',198,75,1,'CC-BY-SA','Podcasts',0,0,1), (2510,'2018-03-16','26 - Diffie-Hellman-Merkle Key Exchange',1231,'A basic explanation of how Diffie-Hellman-Merkle Key Exchange works','

Diffie-Hellman Key Exchange is based on work initially done by Ralph Merkle, and remains one of the key developments in secure communication over the Internet. In this episode I try to explain just how this works, with an example of a calculated key exchange.

\r\n

For more go to https://www.zwilnik.com/?page_id=955

\r\n

Links

\r\n\r\n',198,74,0,'CC-BY-SA','Diffie-Hellman, Encryption',0,0,1), (2476,'2018-01-29','Gnu Awk - Part 9',1956,'In part 9 of the series, we discuss the printf function','

Awk Series Part 9 - printf

\n

The printf function allows for greater control over the output, in comparison to print.

\n

To follow along, you can either use these show notes or refer to the gawk manual.

\n

There are 3 main areas to cover:

\n\n

Syntax

\n
printf format, item1, item2, …
\n

The big difference in the syntax of printf statements is the format argument. It allows you to use complex formatting and layouts for outputs. Unlike print, printf does not automatically start a new line after the function. This can be useful when you want to print all of the items in a column on a single line.

\n

For example, remember the example file, file1.csv:

\n
name,color,amount\napple,red,4\nbanana,yellow,6\nstrawberry,red,3\ngrape,purple,10\napple,green,8\nplum,purple,2\nkiwi,brown,4\npotato,brown,9\npineapple,yellow,5
\n

Look at the difference between the following outputs:

\n
awk -F, 'NR!=1{print "Color", $2, "has", $3}' file1.csv
\n

and

\n
awk -F, 'NR!=1{printf "Color %s has %s. ", $2, $3}' file1.csv
\n

Control Letters

\n

Control letters control or cast the output to specific types. Use it as a way to convert ints to floats, ints to chars, etc.

\n

%c = to char. printf "%c", 65 prints a
\n%i, %d = to int. printf "%i", 3.4 prints 3
\n%f = to float. printf "%c", 65 prints 65.000000
\n%e, %E = to scientific notation. printf "%e", 65 prints 6.500000e+01. If you use %E will use a capital E instead of e.
\n%g = to either scientific notation or int. printf "%.2g", 65 prints 65, while printf "%.1g", 65 prints 6e+01
\n%s = to string. printf "%s", 65 prints 65
\n%u = to unsigned int. printf "%u", -6 prints 18446744073709551610

\n

There are others. See documentation.

\n

Formatting

\n

N$ = positional specifier. printf "%2$s %1$s", "second", "first"
\nn = spaces to the left of the string.
\n-n = spaces to the right of string.
\nspace = prefix positive numbers with a space, negative numbers with a -
\n+ = prefix all numbers with a sign (either + or -)
\n0n = leading 0\'s before input. printf "%03i", 65 prints 065.
\n\' = comma place holder for thousands. printf "%\'i", 6500 prints 6,500

\n

Below is an (crude) illustration of how I like to think when formatting output:

\n
          7          2\n├──────┼───────┼────┼──┤\n Color: RedXXXX Sum: X6
\n
       18            3\n├──────────────────╂───┤\n Total Sum:XXXXXXXX X34
\n

See the following awk file

\n
BEGIN {\n    FS=",";\n}\nNR != 1 {\n    a[$2]+=$3;\n    c+=$3;\n    d+=1;\n}\nEND {\n    for (b in a) {\n        printf "Color: %-7s Sum: %2i\\n", b, a[b];\n    }\n    print "----------------------"\n    printf "%-18s %3i\\n", "Total Sum:", c;\n    printf "%-18s %3i\\n", "Total Count:", d;\n    printf "%-18s %3.1f\\n", "Mean:", c / d;\n}
\n

This gives the following output:

\n
Color: brown   Sum: 13\nColor: purple  Sum: 12\nColor: red     Sum:  7\nColor: yellow  Sum: 11\nColor: green   Sum:  8\n----------------------\nTotal Sum:          51\nTotal Count:         9\nMean:              5.7
\n

Resources

\n
    \n
  1. https://www.gnu.org/software/gawk/manual/gawk.html#Printf
  2. \n
  3. https://www.grymoire.com/Unix/Awk.html
  4. \n
  5. https://datascienceatthecommandline.com/
  6. \n
\n',300,94,1,'CC-BY-SA','awk,bash,Linux,command line',0,0,1), (2477,'2018-01-30','Reading Audio Books While Distracted',610,'My attempt to solve the problem of listening to audio books when you can\'t fully concentrate. ','

Just a quick and dirty episode on my attempt to solve the problem of listening to audio books at work or anytime you can\'t fully concentrate on the important thing, the audio book, of course.

\r\n

Problem

\r\n

I have more time to listen to books than to read them. I have no issues listening to audio books on my commute or when taking walks. The problem occurs at work. I have about 4 hours a day I could be listening to audio books. Over the years I\'ve tried countless times, all with the same result. I get distracted by work and find I\'ve missed key parts of the story and end up listening to music or podcasts I don\'t mind missing instead.

\r\n

There\'s nothing wrong with music or podcasts I don\'t mind missing but that doesn\'t help with my growing list of books I want to \'read\'.

\r\n

I decided to treat this like a regular problem and break it down to see if I can find a solution to this problem.

\r\n

Here are the variable I have to play with. These might be different for you.

\r\n\r\n

Design goals

\r\n

Be able to listen to an audio book and have reasonable comprehension. Super Simple. I can\'t be seen as messing around with my player more than whatever it is that\'s keeping me from my player :)

\r\n

Normally I listen to books in one large file because at one point in time it was easier for me to keep track of them in my player and bookmarking was easier for my little brain to handle. But I got to thinking this might solve the problem of wasted time when needing to repeat sections of the book. If the book were broken into pieces, I wouldn\'t need to repeat as often. I tried listening to 3 chapters at a time and had two issues. The first is that 3 chapters is still quite a bit of time and I was repeating sections I didn\'t need to repeat. For example, I might have been able to follow along with chapter 1 but not chapters 2 and 3. This meant repeating chapter 1 or messing around to manually skip chapter 1 when I repeat. Not good.

\r\n

The second issue I had when listening to 3 chapter chunks was spoilers. If I got distracted during chapter 1 but not chapter 3, chapter 3 would contain spoilers for chapter 1 and chapter 1 would be spoiled on the re-listen :)

\r\n

Solution

\r\n

As it turns out listening in 1 chapter chunks solved both of these issues. So now I play one chapter on a loop until I feel I comprehend it well enough and then move to the next. This reduces the time when I need to re-listen because I was distracted and is simple because I only need to mess with the player when I\'m ready to move to the next chapter.

\r\n

It also reduces the spoiler issue. While there are still spoilers, they are limited to spoiling the same chapter. A good enough compromise for me.

\r\n

As far as playback speed goes, I like to speed audio up when I can concentrate on the audio but prefer to listen at normal speed when I can\'t.

\r\n

Other considerations

\r\n

Some content might lend itself more to being broken into chunks by time rather than chapters. After all, not all chapters are the same length and podcasts don\'t usually have chapters. Assuming I decide to stick with this approach, I\'ll probably try running podcasts which require one to pay attention through a script that splits them up into chunks based on duration and treat those chunks as chapters in books.

\r\n

If you try this and find it useful and/or have modifications, by all means, share.

\r\n

Also, if this is a well known technique, feel free to make fun of me. It\'ll be fun listening to the comments being read on the community news show.

\r\n',151,0,0,'CC-0','Audio book, reading',0,0,1), (2478,'2018-01-31','City Of Masks - HPR_AudioBookClub',5187,'The HPR Audiobook Club reviews City Of Masks with author Mike Reeves-McMillan','

SUMMARY

\r\n

In this episode, the HPR_AudioBookClub discusses City Of Masks by Mike Reeves-Mc-Millian

\r\n

It\'s available from Scribl https://scribl.com/books/PC439/city-of-masks/

\r\n

It is also available as a paperback or an ebook. https://www.amazon.com/City-Of-Masks-Mike-Reeves-Mcmillan/dp/0473122138

\r\n

Non-Spoiler Thoughts

\r\n

Pokey loved this AudioBook! It\'s one of his all time favorites. It ranks up there with Lester Del Ray\'s Badge of Infamy

\r\n

BEVERAGE REVIEWS

\r\n

As usual, the HPR_AudioBookClub took some time to review the beverages that each of us were drinking during the episode

\r\n\r\n

Things We Talked About

\r\n

https://gplus.to/mikerm will link to everything else. It\'s also where I hang out the most. I post samples of whatever I\'m working on at the moment on G+ most Saturdays, as part of the #saturdayscenes group.\r\n
\r\nhttps://csidemedia.com/gryphonclerks is my blog. There\'s a signup link for the mailing list in the sidebar, or the direct link is: \r\n
\r\nhttps://eepurl.com/vB-t5\r\n
\r\nThere\'s some member-only content for mailing list members, and I\'m planning to release another piece of content for them soon (a 12,000-word novelette in my Gryphon Clerks setting).

\r\n

Mike\'s G+ Page: https://gplus.to/mikerm

\r\n

OUR NEXT AUDIOBOOK

\r\n

Matcher Rules by Mary Holland

\r\n

NEXT RECORDING

\r\n

Our next book club recording will be 2015/02/10T23:00:00+00:00. https://en.wikipedia.org/wiki/ISO_8601#Times. If you\'d like a Google calendar invite, or if you\'d like to be on the HPR_AudioBookClub mailing list, please get in contact with us on the HPR mailing list \'hpr at hackerpublicradio dot org\'

\r\n

FURTHER RECOMMENDATIONS

\r\n

Other mostly unrelated points

\r\n

Port knocking: https://www.portknocking.org/

\r\n

Cask of Amontillado https://en.wikipedia.org/wiki/The_Cask_of_Amontillado

\r\n

NetSplits https://en.wikipedia.org/wiki/Netsplit

\r\n

Valerian Root https://www.subzin.com/quotes/M145312bbc/Fight+Club/Chew+some+Valerian+root+and+get+more+exercise

\r\n

FEEDBACK

\r\n

Thank you very much for listening to this episode of the HPR_AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time. Please leave a few words in the episode\'s comment section.\r\n
As always; remember to visit the HPR contribution page HPR could really use your help right now.

\r\n

https://hackerpublicradio.org/contribute.php

\r\n

Sincerely,\r\n
The HPR_AudioBookClub

\r\n

P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.

\r\n

OUR AUDIO

\r\n

This episode was processed using Audacity https://audacity.sourceforge.net/. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. It\'s been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).

\r\n

Mumble uses a sample rate of 48kHz, but HPR requires a sample rate of 44.1kHz so the first step in our audio process is to resample the file at 44.1kHz. Resampling can take a long time if you don\'t have a powerful computer, and sometimes even if you do. If you record late at night, like we do, you may want to start the task before you go to bed, and save it first thing in the morning, so that the file is ready to go the next time you are.

\r\n

Next we use the \"Compressor\" effect with the following settings:

\r\n \r\n

After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.

\r\n

At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata. We use the \"Truncate Silence\" effect with its default settings to minimize the silence between people speaking. When used with its default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.

\r\n

At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.

\r\n

We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR FTP server.

\r\n

Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.

\r\n',157,53,1,'CC-BY-SA','Audiobooks, City of Masks, Mike Reeves-McMillan',0,0,1), (2482,'2018-02-06','lca2018: Katie McLaughlin',1368,'An interview with Katie McLaughlin at linux.conf.au 2018','

Clinton interviews Katie McLaughlin at linux.conf.au 2018 on her role with the conference as community liaison and as the lead organiser of PyCon Australia.

\r\n

Editor\'s Note: Corrected audio now available

\r\n',315,0,1,'CC-BY-SA','lca2018',0,0,1), (2485,'2018-02-09','The Alien Brothers Podcast - S01E05 - I Saw the Invisible Man',4629,'Casper and Rutiger discuss the now-old-by-internet-standards news of New York Times piece about real','

Recorded December 23 2017

\r\n

All links are external.

\r\n

Real mobile recording platform(recording Exile on Main Street)

\r\n

Let Me Drown” by Soundgarden

\r\n

T-Mobile AccuRadio Online

\r\n

Slint(band)

\r\n

Sonic Youth(band)

\r\n

Thurston Moore’s other bands

\r\n

Glowing Aura’s and Black Money” (the New York Times)

\r\n

Robert Bigelow(wikipedia)

\r\n

Tom DeLonge’s UFO Academy(consequence of sound)

\r\n

Big Audio Dynamite “Rush”(YouTube)

\r\n

Mick Jones(wikipedia)

\r\n

Buy tuning machines!(amazon)

\r\n

Ministry (band) (wikipedia)

\r\n

The truth behind the Elf on the Shelf(wikipedia)

\r\n

Redacted (twitter)

\r\n

How Did Harry Reid Get Rich?(national review)

\r\n

Mr Show - “Praying Machines”(youtube)

\r\n

The Firm (film)(youtube)

\r\n

Link collector(Loomis Bros)

\r\n

Magnets and how they work(know your meme)

\r\n

Mechanical Man(Devo) (youtube)

\r\n

How to take apart a dryer(hometips.com)

\r\n

Electrocution(wikipedia)

\r\n

Maytag Repair Man(Characterweb)

\r\n

Extra heavy guitar picks(sweetwater sound)

\r\n

Headphone splitter(zsounds)

\r\n

The man in the moon(wikipedia)

\r\n

Buddhism

\r\n',359,0,1,'CC-BY-SA','parties,fun,x-files,aliens,harry reid,martial law, star chamber,greetings,belated',0,0,1), (2486,'2018-02-12','Some stuff I bought at a recent amateur radio rally',968,'In this episode I talk about some stuff I bought at a recent amateur radio rally.','

Links to the stuff I bought at a recent amateur radio rally I attended.

\r\n\r\n',201,43,1,'CC-BY-SA','Amateur Radio, Ham Radio',0,0,1), (2484,'2018-02-08','The Big Idea',1164,'A breezy look at what a \"big idea\" means in storytelling.','

\r\nLostnbronx looks at the concept of the \"big idea\" in storytelling and various genres, arguing that such a creative tool may not actually be all that necessary to tell a compelling tale.\r\n

',107,105,0,'CC-BY-SA','writing,storytelling,lostnbronx, science fiction,fantasy,history,historical romance, story structure',0,0,1), (2487,'2018-02-13','Simple LibreOffice Repo for Fedora',185,'Simple LibreOffice Repo for Fedora','

Simple LibreOffice Repo for Fedora

\r\n\r\n

My setup: You can look at the real setup. Hosted at home on a DLS connection so real usage is discouraged. https://home.toebesacademy.com/libreoffice/

\r\n\r\n

Actual Script https://home.toebesacademy.com/libreoffice/LOrepo

\r\n\r\n

Repo file to put in /etc/yum.repo.d https://home.toebesacademy.com/libreoffice/home.toebesacademy.com.repo

\r\n\r\n

Cron Entry. Should be run as web user, not root.

\r\n
\r\n# m h d m w\r\n# * * * * * command to be executed\r\n# - - - - -\r\n# | | | | |\r\n# | | | | +----- day of week (0 - 6) (Sunday=0)\r\n# | | | +------- month (1 - 12)\r\n# | | +--------- day of month (1 - 31)\r\n# | +----------- hour (0 - 23)\r\n# +------------- min (0 - 59)\r\n# m     h    dom mon dow command\r\n0       3    *   *   *    /var/www/html/libreoffice/LOrepo\r\n
\r\n',273,0,0,'CC-BY-SA','LibreOffice,Fedora,repository',0,0,1), (2488,'2018-02-14','Psychology of Love',792,'A look at some of the neuroscience and psychology behind love','\r\n',361,0,1,'CC-BY-SA','psychology, relationships, neuroscience, love',0,0,1), (2489,'2018-02-15','CONTEXT IS EVERYTHING',1634,'Lostnbronx creates a tiny video, from a large audio file.','

CONTEXT IS EVERYTHING

\r\n

hosted by Lostnbronx

\r\n

Turning a large audio file into a tiny video file for a very specific use case.

\r\n

This solution probably won\'t work for you, because none of the ones I found on the Internet worked for me. Trial and error led me here, and it\'s probably the only guide you\'ll have as well.

\r\n

Start with as high a quality audio file as you can manage. .wav is good, but it\'s big. Let\'s convert it to .flac. If you already have a .flac file, skip this part.

\r\n

1.) Convert .wav to .flac.

\r\n
sox INPUT.wav OUTPUT.flac
\r\n

2.) Convert the .flac to a very small mono .opus. Bitrate can be even smaller. I went down to 14.

\r\n
opusenc --bitrate 18 --downmix-mono INPUT.flac OUTPUT.opus
\r\n

3.) Combine the .opus file with a single static image, and output to a .webm video. This should not be very much bigger in file size than the .opus and .jpg combined. The smaller the image file, the better. (I tried using a .gif, but it was actually bigger than the .jpg I ended up with.)

\r\n
ffmpeg -i INPUT.opus -r 1 -loop 1 -i INPUT.jpg -c:v libvpx -tune stillimage -shortest -y -c:a copy OUTPUT.webm
\r\n

The final file. It doesn\'t sound great, but it\'s listenable, which is all that was desired.

\r\n

https://social.nasqueron.org/media/pEXqQotxC5P4GNJpf9U

\r\n

Here\'s a better quality version of the audiobook.

\r\n

https://downloads.cavalcadeaudio.com/stardrifter-novels/01-motherload/?p=home

\r\n

The process and final result can be improved upon by people smarter than I, without doubt, but this works for now.

\r\n

SPECIAL THANKS to the Urandom guys (X1101, Thaj, and Pokey), Monsterjavaguns (Jason van Gumster), and the ever-fabulous Klaatu, for their suggestions and encouragement. I would not have found a solution to this, nor even thought to do an episode of HPR, without them!

\r\n

Editor\'s Note 2018-02-15: The wrong audio was accidentally released with this show. It has been corrected and should be re-uploaded by your podcatcher.

\r\n',107,0,1,'CC-BY-SA','opus,opusenc,ffmpeg,avconv,webm,lostnbronx',1,0,1), (2493,'2018-02-21','YouTube Subscriptions - update',885,'Some of the YouTube channels I have subscribed to in the last year','

YouTube Subscriptions - update

\r\n

Introduction

\r\n

I reported on some of my YouTube subscriptions in show 2202, where I concentrated on the various Maker channels I subscribe to.

\r\n

Since then I have added a few more such channels, but this time I also want to talk about some of the others I subscribe to.

\r\n

YouTube Channels

\r\n
    \r\n
  1. Anne of All Trades
  2. \r\n
  3. bigclivedotcom
  4. \r\n
  5. Computerphile
  6. \r\n
  7. David Waelder
  8. \r\n
  9. EvanAndKatelyn
  10. \r\n
  11. ExplainingComputers
  12. \r\n
  13. HomeMadeModern
  14. \r\n
  15. izzy swan
  16. \r\n
  17. Jackman Works
  18. \r\n
  19. mugumogu
  20. \r\n
  21. Pask Makes
  22. \r\n
  23. Phil Pinsky Productions
  24. \r\n
  25. RetroWeld
  26. \r\n
  27. Thomas Sanladerer
  28. \r\n
  29. tim sway
  30. \r\n
  31. Unemployed Redneck Hillbilly Creations
  32. \r\n
  33. William Lutes
  34. \r\n
  35. Wintergatan
  36. \r\n
\r\n

Long notes

\r\n

I have another version of the above channel list in the long notes with more details and with some of my observations.

\r\n

Links

\r\n',225,0,1,'CC-BY-SA','YouTube,channel',0,0,1), (2491,'2018-02-19','Some news with Finux',1061,'Just a short little podcast on some recent(ish) security related news stories','

The 3 stories covered in this episode

\r\n\r\n',85,0,1,'CC-BY-SA','security, hacking, news',0,0,1), (2492,'2018-02-20','An Evening Subway Ride',1945,'An evening subway ride on the Toronto subway from College Station to Sheppard/Yonge Station','

\r\nAn experiment in background noise.\r\n

\r\n

\r\nHaving seen so many people fall asleep on subway trains, I wonder if the sound only would also be somniferous.\r\n

\r\n

\r\nUsing my cellphone I recorded the ride (including boarding and alighting) on the Toronto subway (line 1) from College Station, north to Sheppard/Yonge Station. There was always at least one person sleeping (or at least appearing to be asleep) during the ride.\r\n

\r\n

\r\nGoogle Maps - goo.gl/aq97jR\r\n

\r\n

\r\nSo far, listening to the recording has not put me to sleep. \r\n

\r\n',362,101,0,'CC-0','sound, Toronto, transit, subway, crowds, train',0,0,1), (2495,'2018-02-23','10 Years of Xoke',723,'Tomorrow marks 10 years since his first episode, and Xoke talks a bit about HPR','

HPR 40, on the 24th Feb 2008, was when a (slightly) younger Xoke debuted

',79,0,0,'CC-BY-SA','Anniversary',0,0,1), (2494,'2018-02-22','linux.conf.au 2018: Nicolas Steenhout',1205,'Clinton interviews Nicolas Steenhout, who ran an accessibility workshop','

\r\nClinton interviews Nicolas Steenhout about his accessibility workshop, covering the different areas that automated and manual testing can cover. We also talk about the conference in general, and on the different ways that conference get feedback about their speakers.\r\n

',315,78,0,'CC-BY-SA','lca2018',0,0,1), (2496,'2018-02-26','Making a Raspberry Pi inventory',670,'How to collect identifying information about RPi devices','

Making a Raspberry Pi inventory

\r\n

Introduction

\r\n

I have a number of Raspberry Pis -- possibly too many -- and I sometimes lose track of which is which, what model, size, name, address each one is. I wanted to be able to keep an inventory of them all, and to this end I wrote myself a little script that can be run on any Pi which will report useful information about it.

\r\n

Every Pi has a unique serial number. Actually it\'s randomly generated so there may be a few collisions but it\'s close to unique! It also contains a revision number which encodes various items of information about it such as release date, model, PCB revision and memory. My script decodes this revision number for you based on a published table.

\r\n

I run a Wikimedia instance on a Pi and have used this script to record details of my Pis there as well as what they are being used for and any planned projects. I now feel more organised!

\r\n

Long notes

\r\n

The full-length notes (available here) contain a listing of the script, a brief description of it, and some example output.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','Raspberry Pi, RPi',0,0,1), (2503,'2018-03-07','My journey into podcasting',868,'Dave takes us on his journey into 10 years of podcasting','

How I Got Into Podcasting

\r\n

The Background

\r\n

Audio production has always been an interest of mine: my late grandfather was an audiophile, my dad ran an AV studio in Woking (the one where the Spice Girls were formed - my dad got mentioned in a couple of their autobiographies) and now runs his own AV consultancy business, and my cousin also runs an AV consultancy... so there’s a definite family history in there.

\r\n

I dabbled briefly with hospital radio (as a technician, rather than a presenter) in the late 80’s, and I was a technician and presenter on College Radio in the early 90’s where I hosted a show called “The Barry Manilow Fan Club” on Friday lunchtimes.

\r\n

Yes, I am a huge fan of Barry Manilow - he’s given me a lot of inspiration as a musician - no, I didn’t play any Barry on the College Radio show.

\r\n

I’d also had a few people say that I had a good radio voice. Others say a good radio face, but I don’t like them anymore.

\r\n

The Catalyst

\r\n

In 2007, I discovered this podcasting lark through a couple of friends who had their own podcasts. One was The Random Three: a personal musical journey where Mark - the host - would play three seemingly-random pieces of music from his own collection (thus, not podsafe) and explain the reasons why he chose them. Most of the time, these seemingly-random tracks actually had a theme, but it didn’t necessarily become apparent until after the second track. It was a great show - now sadly defunct - and I really miss it. I even submitted my own music choices for Mark to present.

\r\n

The other was Dumbed Down Life: three chaps nattering about “stuff” and playing some music along with it. Another great show, which - although it still exists - currently releases episodes every year or so.

\r\n

What drew me to these shows - apart from being friends, was the fact that these were regular guys, not professionals.

\r\n

That led me to think “I can do that”, so I set about proving - to myself, mostly - that I could.

\r\n

The Start

\r\n

One Thursday in early March 2008, when the wife had gone to the gym for a couple of hours, I grabbed my Logitech headset, my Linux laptop, a handful of tracks from the Podsafe Music Network, and a piece of software called IDJC, and recorded the first ever episode of The Bugcast. It was just over 22 minutes long, and it was dire. Utterly dire. Every so often, I go back to it and listen and cringe and marvel at how much better the show is now!

\r\n

The music back then wasn’t strictly podsafe either: the first track I played was Moloko’s Sing It Back… but I didn’t worry about it then, as I got the track from a source that gave implicit permission for use in podcasts.

\r\n

I did do a show - episode 20 - which was a nostalgic trip back to my college years, where I played tracks by Chad Jackson, Japan, and Dream Warriors. This was a complete and intentional violation of copyright on my part, which led me to pull the show only a few weeks later. I did rerelease the show two years after that, but with the offending tracks removed. However, there is a story to the show, so I would recommend you go listen.

\r\n

Back then, it was just me and a small listener-base of friends, their family, their families’ servants; their families’ servants’ tennis partners, and some chap I bumped into in the mess the other day called Bernard. But as time went on and I got more experience, I was really enjoying what I was doing, and started to experiment.

\r\n

One thing I did discover by about episode 16 is that I wasn’t editing my shows in post, aside from topping and tailing silence. This made it so much easier for me as I was recording the shows as-live from the very beginning, but taking out the vocal gaps, gaffes and the like. So there was really only one place to go from there...

\r\n

Going live

\r\n

So in August 2008, on episode 24, to an audience of about 10 people, I streamed the first LIVE episode of the podcast. Wow, that was such a buzz! It was a major turning point in the show as I committed myself to do a regular show at a set time each week... turning a fun hobby into something a little step beyond amateur. There were a couple of non-live shows that I had to put together using the wife’s Windows machine when my laptop went bang and had to be repaired, but I hated doing that because I didn’t like the piecemeal sticky-tape method of production. There was little flow, and my spoken links between the music sounded very much like a bad Radio 4 anchor.

\r\n

In late September 2008, I was accepted as a member of the now-defunct Association of Music Podcasting. This was another major step for me. All member of the Association were peer-reviewed as part of the criteria for membership. This meant that my podcast was sufficiently good to be accepted. That meant so much to me, and made me take things so much more seriously (and was the main reason why I pulled episode 20 just prior)

\r\n

It also meant that the show was becoming more music-oriented - something I really did not have a problem with! Particularly as I was starting to strike up good relationships with some of the artists that I was featuring on the show. This led to me prerecording an interview with one of the bands in January 2009, and then again with another artist in March.

\r\n

Having registered a proper domain for the podcast (rather than piggybacking my own personal domain) and then celebrated the first anniversary of the show... you could say that the show was fuelling its own progression. And I was enjoying that journey immensely!

\r\n

Over the next 6 months, I joined the Made In The UK Show collective, interviewed an artist LIVE on the show, had the show syndicated on an internet radio station in the UK, and launched a new, independent chatroom for the website.

\r\n

The Major Change

\r\n

And then, in September of 2009, the 18 month anniversary of the show, and two days before my birthday, something happened to totally turn the show upside down.

\r\n

I decided that I wanted to improve the show. Bearing in mind that I was still using my Logitech headset, my Linux laptop, and a piece of software called IDJC to record and stream the show, I felt it was time for a change. So I spent a small fortune on a mixer, microphones, stands, audio interface, and cables.

\r\n

Yes, microphones. Plural.

\r\n

Up to this point my wife, Caroline, had progressed from occasional listener, to regular distraction (I don’t think details are appropriate!), to researcher. So I asked her a question... if I bought two microphones, would you join the show as a permanent co-host? She said yes.

\r\n

That really changed things. The dynamic of me talking to an imaginary audience (bar the activity in the live chatroom) changing to me bouncing off someone in the same room was electric! The show was totally transformed by that fairly simple change. Our listener figures jumped up, the music on the show was more varied, existing listeners enjoyed the show more... it was amazing.

\r\n

There have been occasions where Caroline hasn’t been able to join the show (illness, kids, etc) and the listeners (and I) have really noticed her absence.

\r\n

Since Then

\r\n\r\n

So there’s a potted history of how I got into podcasting.

\r\n

Beyond The Bugcast

\r\n

Outside the realms of The Bugcast, which is still my primary podcast:

\r\n\r\n

Also ran:

\r\n\r\n

I’m always happy to answer any questions or provide help with regard to podcasting, you can find various ways to find me over at my Contact page

\r\n

Thanks for listening! :-)

\r\n',314,0,0,'CC-BY-SA','podcasting, anniversary, history, journey',0,0,1), (2498,'2018-02-28','Life without Google',266,'Quvmoh goes a month without G apps on his phone','',110,0,0,'CC-BY-SA','google free, F-droid, LineageOS, magic device tool',0,0,1), (2499,'2018-03-01','Tuning around the HF 40Mtr band',767,'In this episode I give an example of what sort of things you can expect hear on the HF band','

Tuning around the band

\r\n

In this episode I tune around a small portion of the HF (High Frequency) band in the 40 Meters section which in the UK covers 7 to 7.2Mhz.

\r\n

Equipment details

\r\n

The mode being used was mostly LSB (Lower Side Band)
\r\nhttps://en.wikipedia.org/wiki/Sideband

\r\n

At the end of the recording I briefly switch mode to to listen to a commercial station on AM (Amplitude modulation).
\r\nhttps://en.wikipedia.org/wiki/Amplitude_modulation

\r\n

The radio being used is my trusty and much loved Kenwood TS 940S
\r\nhttps://www.universal-radio.com/catalog/hamhf/ts940s.html

\r\n

The antenna used is a dipole tuned for the 40 Meter band.
\r\nhttps://en.wikipedia.org/wiki/Dipole_antenna

\r\n

I used my trusty Dictaphone and internal microphone to do the recording
\r\nhttps://www.amazon.co.uk/HccToo-Multifunctional-Rechargeable-Dictaphone-Conversation/dp/B015H9JP6S/ref=sr_1_1?ie=UTF8&qid=1502381150&sr=8-1&keywords=dictation+machines

\r\n

If you want to hold private conversations with another party over radio then perhaps amateur radio is not for you as this goes against the whole principle of Amateur Radio.

\r\n

Listening to amateur radio broadcasts is actively encouraged, and in the UK a licence is not required for listening.

\r\n

A simple receiver capable of listening to sideband broadcasts and odd bit of long wire is all that\'s required.

\r\n

In the past it was common to hear an Amateur operator saying goodbye to any short wave listeners at the end of their conversation. If you listen carefully at about 10 minutes in the station DF2BO says goodbye to anybody still listening.

\r\n

Stations received

\r\n\r\n',201,43,1,'CC-BY-SA','ham radio, amateur radio, radio, hf',0,0,1), (2502,'2018-03-06','Volume Of Thought',440,'Lostnbronx attempts to measure the \"volume\" of his own thoughts.','

Lostnbronx measures how loud his own thoughts are -- or rather, how loud outside noise has to be before they are disrupted.

\r\n

It turns out that unwanted music in his ears at -30 dB is when his train of thought starts to derail.

',107,0,0,'CC-BY-SA','lostnbronx,thinking,thoughts,volume,noise,music,confusion',0,0,1), (2504,'2018-03-08','Intro to Git with pen and paper',2205,'Klaatu introduces Git using pen and paper.','
git add\r\n\r\ngit commit -m "some useful message"\r\n\r\ngit push origin HEAD
\r\n',78,104,0,'CC-BY-SA','git',0,0,1), (2497,'2018-02-27','2017-2018 New Years Eve show part 1',13200,'Part one of the sixth annual HPR New Year Show.','

HPR NYE 2017 - 1

\r\n\r\n',159,121,1,'CC-BY-SA','HPR new year show 2017',0,0,1), (2505,'2018-03-09','The power of GNU Readline - part 3',1631,'More useful key combinations','

The power of GNU Readline - part 3

\r\n

In part 2 we looked at deleting text in various ways and pasting it back, using GNU Readline key sequences.

\r\n

The full-length notes (available here) contain some new terms and features of GNU Readline, and introduce some further ways of manipulating text, with some examples.

\r\n

Links

\r\n',225,102,1,'CC-BY-SA','command line,cli,GNU Readline',0,0,1), (2506,'2018-03-12','Build Your Own Lisp (A Book Review)',544,'Learn C programming while building a LISP','

Build Your Own Lisp

\r\n
    \r\n
  1. https://www.buildyourownlisp.com/

  2. \r\n
  3. https://github.com/orangeduck/BuildYourOwnLisp

  4. \r\n
  5. Daniel Holden links:
    \r\nhttps://github.com/orangeduck
    \r\nhttps://www.theorangeduck.com/

  6. \r\n
',326,0,0,'CC-BY-SA','programming,C,Lisp,book review',0,0,1), (2507,'2018-03-13','Racket, Nix, Fractalide and the sounds of a Hong Kong New Town',1127,'It\'s a triple whammy! It\'s functional programming, functional package management and soundscape!','

Listen to me walk through five shopping malls and one bicycle tunnel, as I rant about how flow-based programming microservices and functional package management will save the future of programming and software reuse, and usher in a new era of software quality and productivity!

\r\n

If it sounds like I\'m a bit down about working alone on racket2nix, you\'re interpreting me wrong! I didn\'t expect any feedback at all from the small to non-existent racket/nix intersection, but it turns out the intersection is larger than I thought, and I\'m grateful for any words of encouragement, and feedback in any form on what the community needs.

\r\n

Links:

\r\n\r\n

Nix is the mother of Guix:

\r\n\r\n',311,0,0,'CC-BY-SA','racket, nix, racket2nix, fractalide, soundscape, hongkong',0,0,1), (2508,'2018-03-14','False Prophets',550,'Lostnbronx considers how a cult-of-personality may affect space exploration.','

Lostnbronx considers the effect that Elon Musk and SpaceX are having on the latest push for the exploitation and exploration of space, and the danger of pegging the future of the human race upon the showmanship of one man.

',107,0,1,'CC-BY-SA','space,spacex,elon musk,tesla,electric cars,cult-of-personality,lostnbronx',0,0,1), (2509,'2018-03-15','AudioBookClub 16 Matcher Rules',7171,'The HPR Audiobook Club reviews Matcher Rules by Mary Holland','

SUMMARY

\r\n

In this episode, the HPR_AudioBookClub discusses Matcher Rules by Mary Holland https://scribl.com/books/PDB66/matcher-rules

\r\n

NON-SPOILER THOUGHTS

\r\n\r\n

BEVERAGE REVIEWS

\r\n

As usual, the HPR_AudioBookClub took some time to review the beverages that each of us were drinking during the episode

\r\n\r\n

THINGS WE TALKED ABOUT

\r\n

We discuss the upsides and downsides of affinity groups. Pokey wonders why terminology for simple things are changed in sci-fi stories. How exactly do population and economics work together?

\r\n

OUR NEXT AUDIOBOOK

\r\n

Blood Witness by David Hitt - https://scribl.com/books/PA513/blood-witness

\r\n

NEXT RECORDING

\r\n

We are currently working through a backlog of pre-recorded episodes. Once this is completed we will restart the Audiobook Club again. If you want to be notified when this happens please let us know via the HPR Mailing List \'hpr at hackerpublicradio dot org\'.

\r\n

FURTHER RECOMMENDATIONS

\r\n

Nothing this time, well except for the typical Star Wars reference...and Star Trek, and comics.

\r\n

FEEDBACK

\r\n

Thank you very much for listening to this episode of the HPR_AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time. Please leave a few words in the episode\'s comment section. As always; remember to visit the HPR contribution page HPR could really use your help right now. https://hackerpublicradio.org/contribute.php

\r\n

Sincerely,
\r\nThe HPR_AudioBookClub

\r\n

P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.

\r\n

OUR AUDIO

\r\n

This episode was processed using Audacity https://audacity.sourceforge.net. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. It has been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).

\r\n

Mumble uses a sample rate of 48kHz, but HPR requires a sample rate of 44.1kHz so the first step in our audio process is to resample the file at 44.1kHz. Resampling can take a long time if you don\'t have a powerful computer, and sometimes even if you do. If you record late at night, like we do, you may want to start the task before you go to bed, and save it first thing in the morning, so that the file is ready to go the next time you are.

\r\n

Next we use the "Compressor" effect with the following settings:

\r\n

Threshold: -30db
\r\nNoise Floor: -50db
\r\nRatio: 3:1
\r\nAttack Time: 0.2sec
\r\nDecay Time: 1.0 sec
\r\nMake-up Gain for 0db after compressing" and "compress based on peaks" were both left un-checked.

\r\n

After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.

\r\n

At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata. We use the "Truncate Silence" effect with its default settings to minimize the silence between people speaking. When used with its default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying "uuuuummmm." Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too agressively your audio may sound sped up and choppy.

\r\n

At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.

\r\n

We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can "Mix and Render" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.

\r\n

Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being "crashy" but if you remember save after every major transform, you will wonder how it even got that reputation.

\r\n',157,53,1,'CC-BY-SA','HPR Audiobook Club, Audiobooks, Podiobooks, Science Fiction ',0,0,1), (2520,'2018-03-30','Diffie-Hellman and Forward Secrecy',1061,'Using Diffie-Hellman Key Exchange to implement Forward Secrecy','

Diffie-Hellman Key Exchange is used in a security technique called Forward Secrecy that aims to secure your encrypted communications from future decryption by unauthorized entities. While it does provide additional security it is not absolutely bullet-proof. So while we explain how it works and provides security, we will also discuss how it can go wrong. For more go to https://www.zwilnik.com/?page_id=957

\r\n

Links:

\r\n\r\n',198,74,1,'CC-BY-SA','Diffie-Hellman, Encryption, Forward Secrecy',0,0,1), (2530,'2018-04-13','Introduction to Health',719,'This is the Introduction to a series on health and taking care of yourself','

On our refrigerator we have a note card that says "If you don\'t take care of your body, where will you live?" This is a very pertinent question that can open up a discussion of how to achieve a better level of health and age gracefully. This show will kick off a series that will explore various topics in how to get good medical information and improve your health.

\r\n

Links

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Medicine',0,0,1), (2515,'2018-03-23','2017-2018 New Years Eve show part 2',10169,'Part two of the sixth annual HPR New Year Show.','

HPR NYE 2017 - 2

\r\n',159,121,1,'CC-BY-SA','HPR new year show 2017',0,0,1), (2525,'2018-04-06','2017-2018 New Years Eve show part 3',10932,'Part three of the sixth annual HPR New Year Show.','

HPR NYE 2017 - 3

\r\n\r\n',159,121,1,'CC-BY-SA','HPR new year show 2017',0,0,1), (2511,'2018-03-19','Response to episode 2496',419,'How I am using the Raspberry Pi script discussed Episode 2496','

Links

\r\n\r\n

Command

\r\n

This is written for fish shell

\r\n
for pi in pi1 pi2 pi3 pi4; cat what_pi | ssh "$pi" bash -; done
',300,0,0,'CC-BY-SA','Raspberry Pi, RPi',0,0,1), (2512,'2018-03-20','Intro to git remote',1590,'All about git remote','

\r\nInstantiate a git repo:\r\n

\r\n\r\n
\r\n$ mkdir alice\r\n$ cd !$\r\n$ git init\r\n
\r\n\r\n

\r\nAdd a remote:\r\n

\r\n\r\n
\r\n$ git remote add origin URI_OF_REMOTE\r\n
\r\n\r\n

\r\nChange a remote:\r\n

\r\n\r\n
\r\n$ git remote set-url origin NEW_URI\r\n
\r\n\r\n

\r\nA remote can be a server, it can be a local directory, an NFS share, pretty much whatever you want.\r\n

\r\n

\r\nIt is a Git convention that the primary remote is called origin. You don't have to call it that, but it's pretty common.\r\n

\r\n',78,104,0,'CC-BY-SA','git, remote, server',0,0,1), (2513,'2018-03-21','Why I choose Aperture first',723,'David Whitman encourages you to choose Aperture as the most important setting in setting up your cam','

David Whitman encourages you to choose Aperture as the most important setting in setting up your camera.

\r\n

Understanding Exposure, 3rd Edition by Bryan Peterson - a good book that is great for learning photography. Duck Duck Go can connect you with a place to buy this book.

\r\n

David\'s cache of BAD Photos mostly of Hunt Dogs (some cute girls with dogs too) https://drive.google.com/open?id=0B0VQmm3RmAmeTVVQdUhuaGVkTVU

\r\n\r\n

Have some fun. Take some photos and do a HPR episode.

',209,0,0,'CC-BY-SA','Photography, Cameras, ISO, Aperture, Shutter Speed',0,0,1), (2514,'2018-03-22','Electronics Calculator Kit',2006,'NYbill talks about building a $16 electronics calculator kit.','

\r\nNYbill talks about building a $16 electronics calculator kit.\r\n

\r\n

\r\nKkmoon DIY Calculator Kit: https://tinyurl.com/yc9z92pc\r\n

\r\n

\r\nPics for the episode: https://media.gunmonkeynet.net/u/nybill/collection/electronics-calculator-kit/\r\n

\r\n

Just to save anyone from searching for some secret mode on their\r\ncalculators, I misspoke. I mention using my TI calculator in “Degree Mode”.\r\nI meant to say “Normal Mode”. It just happens to say DEG on the screen in tiny\r\nletters. What can I say, I’m easily distra

\r\n

Oh look at that!

\r\n \r\n',235,103,0,'CC-BY-SA','Electronics, Kits, Soldering, DIY',0,0,1), (2516,'2018-03-26','Intro to git branch',2635,'Intro to git branch','

\r\nThese are all the commands covered in this episode. This is not a sequence, it\'s just all the commands in the episode, listed one after another.\r\n

\r\n\r\n

\r\nGet changes from the remote repo:\r\n

\r\n
\r\n$ git fetch\r\n
\r\n\r\n

\r\nSee all branches:\r\n

\r\n
\r\n$ git branch --all\r\n
\r\n\r\n

\r\nView a remote branch after you have fetched it:\r\n

\r\n
\r\n$ git checkout origin/dev\r\n
\r\n\r\n

\r\nCreate a copy of a fetched remote branch in your local repo:\r\n

\r\n
\r\n$ git checkout dev\r\n
\r\n\r\n

\r\nMerge changes from remote origin/master into your local master branch:\r\n

\r\n
\r\n$ git merge master origin/master\r\n
\r\n\r\n

\r\nFetch and merge automatically:\r\n

\r\n
\r\n$ git pull\r\n
\r\n\r\n

\r\nCreate a new branch, and change to it:\r\n

\r\n
\r\n$ git checkout -b dev\r\n
\r\n\r\n

\r\nMerge dev into master:\r\n

\r\n
\r\n$ git checkout master\r\n$ git merge master dev\r\n
\r\n\r\n

\r\nMerge master into dev\r\n

\r\n
\r\n$ git checkout dev\r\n$ git merge dev master\r\n
\r\n\r\n

\r\nDelete the dev branch:\r\n

\r\n
\r\n$ git branch -d dev\r\n
\r\n',78,104,0,'CC-BY-SA','git, branch, server',0,0,1), (2518,'2018-03-28','Converting My Laptop to Dual Boot',1440,'Converting a Linux only laptop to dual boot using information from a previous HPR episode.','

Converting My Laptop to Dual Boot

\r\n

Summary

\r\n

In this episode I describe how I converted my Linux-only laptop to dual-boot with Windows 10. Specifically, using information from a previous HPR episode.

\r\n

Reference

\r\n

The procedure used in this project drew heavily from the information presented in HPR episode 2305 by Mongo.

\r\n

Target Laptop

\r\n\r\n

Laptop was purchased in Jan 2016 as a factory refurb unit from an Ebay seller. The model was about 1 year old at the time. As soon as I got it, I summarily removed any trace of Windows, with prejudice, and installed Linux.

\r\n

The Problem

\r\n

I am needing to run some Windows software that doesn\'t work in either Wine or a virtual machine environment. Specifically Autodesk Fusion 360.

\r\n

Some Challenges

\r\n\r\n

The Procedure

\r\n
    \r\n
  1. Backed up my home directory, just in case.

  2. \r\n
  3. Replaced the hard drive.

  4. \r\n
  5. Tried to boot from Lenovo Windows thumb drive.

  6. \r\n
  7. Found that the BIOS was set to legacy mode, so reset BIOS to factory.

  8. \r\n
  9. Told the installer to use the entire drive.

  10. \r\n
  11. Went through the entire Windows install and update process.

  12. \r\n
  13. Used the instructions provided by Mongo to resize Windows filesystem size.

  14. \r\n
  15. Used the instructions provided by Mongo to turn of fast boot.

  16. \r\n
  17. Used the instructions provided by Mongo to turn of Secure Boot in BIOS.

  18. \r\n
  19. Booted from Xubuntu 16.04 thumb drive.

  20. \r\n
  21. Did Xubuntu install as normal, choosing the install type of installing along side Windows Boot Manager.

  22. \r\n
  23. Installed all of the updates.

  24. \r\n
  25. Mounted the old hard drive with a USB drive enclosure, which was a bit of a challenge because that drive was encrypted. The drive has 2 partitions. A small boot partition and then a large LUKS encrypted partition.

    \r\n

    This is a procedure that can be used to mount such a partition.

    \r\n
  26. \r\n
  27. Copied by entire home directory from the old hard drive to the new install.

    \r\n
    cd /home\r\ncp -rp /mnt/home/username .
  28. \r\n
  29. Rebooted computer and Xubuntu came up will all of my desktop settings intact. Just need to install non-default packages.

  30. \r\n
\r\n

Result

\r\n

This ended up being a totally successful process. The computer is now dual-boot. It boots into Xubuntu by default, but you can choose Windows. Xubuntu system is mostly restored back to the way it was.

\r\n',334,0,1,'CC-BY-SA','Linux, Windows, Dual Boot, Laptop, Lenovo, Xubuntu',0,0,1), (2517,'2018-03-27','DIY CCTV Security System',940,'I go over my Home CCTV setup','

CCTV Security System

\r\n\r\n

Issues:

\r\n\r\n

More Notes:

\r\n

Start with one zone at a time and raise/test sensitive KISS...don\'t setup like 4 zones and expect to trouble shoot anything. I used my Android to do a lot of tweaking. I also want to sort out "night" mode config so after night mode kicks in a different config is automatically applied.

\r\n

Use low quality for motion detection and drop frame rate of cam to lower than max of ZM for little to no smearing and I also set "Alarm Frame Count to 2" and "overload ignore frame count to 4" but I think it\'s more about Alarm Frame Count..I can\'t be sure..

\r\n

Explanation of overload ignore frame count
\r\nReport this post Quote
\r\nPost by bb99 » Thu May 10, 2012 5:22 pm

\r\n

For sudden changes to the environment, no better tool then Overload Frame Ignore Count. Your fps determines these settings but at 10 fps with Overload Frame Ignore Count set to 4, it only ignores .4 seconds. In other words if a drastic change to the lighting (such as a car with headlights on in darkness) passes within the monitors view it will ignore the number of frames you specify before processing for motion detection.

\r\n

Alarm Frame Count

\r\n

This option allows you to specify how many consecutive alarm frames must occur before an alarm event is generated. The usual, and default, value is 1 which implies that any alarm frame will cause or participate in an event. You can enter any value up to 16 here to eliminate bogus events caused perhaps by screen flickers or other transients. Values over 3 or 4 are unlikely to be useful however. Please note that if you have statistics recording enabled then currently statistics are not recorded for the first ‘Alarm Frame Count’-1 frames of an event. So if you set this value to 5 then the first 4 frames will be missing statistics whereas the more usual value of 1 will ensure that all alarm frames have statistics recorded.

\r\n

https://forums.zoneminder.com/viewtopic.php?f=36&t=26222

\r\n

Windows software to get basic idea ( install face plugin )
\r\nhttps://www.ispyconnect.com/plugins.aspx

\r\n

Videos

\r\n\r\n

eazy getting started

\r\n\r\n

getting started with GPU

\r\n

you need 4gig+ GPU and new nvidia or old GCC4.9 /GCC4_NEEDED_FOR_DARKNET$ ls cpp-4.9_4.9.2-10_amd64.deb gcc-4.9_4.9.2-10_amd64.deb libasan1_4.9.2-10_amd64.deb libcloog-isl-dev_0.18.2-1+b2_amd64.deb libisl10_0.12.2-2_amd64.deb g++-4.9_4.9.2-10_amd64.deb gcc-4.9-base_4.9.2-10_amd64.deb libcloog-isl4_0.18.2-1+b2_amd64.deb libgcc-4.9-dev_4.9.2-10_amd64.deb libstdc++-4.9-dev_4.9.2-10_amd64.deb https://github.com/dasGringuen/debian9-install

\r\n

GPU memory talk

\r\n

https://groups.google.com/forum/#!msg/darknet/ZRAEvMmKzFc/iVZgibJiJQAJ

\r\n

trying to GPU prep ..

\r\n
apt-get remove --purge nvidia-cuda-toolkit libcudnn*\r\ndpkg -i libcudnn7_7.0.5.15-1+cuda9.1_amd64.deb\r\ndpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.1_amd64.deb\r\ndpkg -i cuda-repo-ubuntu1704-9-1-local_9.1.85-1_amd64\r\n\r\nsudo dpkg -i cuda-repo-ubuntu1704-9-1-local_9.1.85-1_amd64.deb\r\nsudo apt-key add /var/cuda-repo-9-1-local/7fa2af80.pub\r\nsudo apt-get update\r\nsudo apt-get install cuda\r\n\r\napt install libopencv-dev
\r\n

more code/ references

\r\n\r\n

yolov2 training

\r\n\r\n\r\n
ffmpeg -c:v h264_vdpau -rtsp_transport tcp -i "rtsp://admin:@25.0.0.238/h264Preview_01_main" -f segment -segment_time 60 -segment_format mp4  -reset_timestamps 1 -strftime 1 -c copy -map 0 dauphine-%Y%m%d-%H%M%S.mp4\r\n\r\nffmpeg -hwaccel vdpau -i rtsp://admin:@25.0.0.238/h264Preview_01_main -an -f rawvideo -y /dev/null
\r\n

complicated zoneminder plugins and bits of code :(

\r\n\r\n

cheap cams 720p max

\r\n\r\n

Save as video

\r\n

By default ZoneMinder saves events as a sequence of images. It is however possible to save an event as a video file. Caution is advised when converting events to video as it is very strenuous on the ZoneMinder machine, however once you have converted an event it can be viewed/downloaded any time without additional stress on the server.

\r\n

First, make sure you have OPT_FFMPEG under Options -> Images set to yes (checked).

\r\n

If necessary, set the proper full path for the ffmpeg executable in PATH_FFMPEG (ex.: /usr/bin/ffmpeg)

\r\n

Open up the default view for an event and Click the video link located in the top left corner

\r\n

Choose a video export file type and click generate.

\r\n

Download the video to your machine. If video files have already been generated you will see them listed at the bottom of the page.

\r\n

When an event gets a video file encoded for it you can choose to automatically include that event with any future exports. For a more detailed explanation on how to select and export events investigate How to export download and view events

\r\n',36,0,0,'CC-BY-SA','CCTV,Security Camera System,YOLO,Object Recognition',0,0,1), (2535,'2018-04-20','2017-2018 New Years Eve show part 4',12357,'Part four of the sixth annual HPR New Year Show.','

HPR NYE 2017 - 4

\r\n\r\n',159,121,1,'CC-BY-SA','HPR new year show 2017',0,0,1), (2519,'2018-03-29','the_remora Builds a character in Edge of the Empire',1330,'I Sit down and Build a Character for Edge of the Empire using Oggdudes Character Generator','\r\n

Thanks and sorry the Audio was so bad, I was forced to use Bluetooth headphones because Audacity would not take audio from my USB headset.

',363,95,1,'CC-BY-SA','Roleplaying',0,0,1), (2545,'2018-05-04','2017-2018 New Years Eve show part 5',8433,'Part five of the sixth annual HPR New Year Show.','

HPR NYE 2017 - 5

\r\n\r\n',159,121,1,'CC-BY-SA','HPR new year show 2017',0,0,1), (2555,'2018-05-18','2017-2018 New Years Eve show part 6',11722,'Part six of the sixth annual HPR New Year Show.','

HPR NYE 2017 - 6

\r\n\r\n',159,121,1,'CC-BY-SA','HPR new year show 2017',0,0,1), (2565,'2018-06-01','2017-2018 New Years Eve show part 7',10683,'Part seven of the sixth annual HPR New Year Show. This is the last one.','

HPR NYE 2017 - 7

\r\n',159,121,1,'CC-BY-SA','HPR new year show 2017',0,0,1), (2781,'2019-04-01','HPR Community News for March 2019',3564,'HPR Volunteers talk about shows released and comments posted in March 2019','\r\n

Spoiler

\r\n

Dave has not left and HPR has not sold out

\r\n

New hosts

\r\n

\r\nWelcome to our new hosts:
\r\n\r\n Floyd C Poynter, \r\n aldenp, \r\n minnix.\r\n

\r\n\r\n

Last Month\'s Shows

\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
IdDayDateTitleHost
2760Fri2019-03-01What is VNFJWP
2761Mon2019-03-04HPR Community News for February 2019HPR Volunteers
2762Tue2019-03-05What You Really Arelostnbronx
2763Wed2019-03-06Deepgeek explains SPF recordsklaatu
2764Thu2019-03-07Personal password algorithmsklaatu
2765Fri2019-03-08My YouTube Subscriptions #3Ahuka
2766Mon2019-03-11Disk enumeration on Linuxklaatu
2767Tue2019-03-12Djvu and other paperless document formatsklaatu
2768Wed2019-03-13Writing Web Game in Haskell - Planetary statusesTuula
2769Thu2019-03-14Quick Review of the AstroAI WH5000A MultimeterNYbill
2770Fri2019-03-15Navigating the maze of RPG booksklaatu
2771Mon2019-03-18Embedding hidden text in Djvu filesklaatu
2772Tue2019-03-19My applications and software part 3Tony Hughes AKA TonyH1212
2773Wed2019-03-20Lead/Acid Battery Maintenance and Calcium Charge VoltageFloyd C Poynter
2774Thu2019-03-21CJDNS and Yggdrasilaldenp
2775Fri2019-03-22My YouTube Subscriptions #4Ahuka
2776Mon2019-03-25Sub-Plots In Storytellinglostnbronx
2777Tue2019-03-26The quest for the perfect laptop.knightwise
2778Wed2019-03-27Functor and applicative in HaskellTuula
2779Thu2019-03-28HTTP, IPFS, and torrentsaldenp
2780Fri2019-03-29My SBC Nextcloud Install Pt. 1 - Hardwareminnix
\r\n\r\n

Comments this month

\r\n\r\n

These are comments which have been made during the past month, either to shows\r\nreleased during the month or to past shows.
\r\nThere are 24 comments in total.

\r\n

There are 3 comments on\r\n3 previous shows:

\r\n\r\n

There are 21 comments on 12 of this month\'s shows:

\r\n\r\n\r\n

Mailing List discussions

\r\n

\r\nPolicy decisions surrounding HPR are taken by the community as a whole. This\r\ndiscussion takes place on the Mail List which is open to all HPR listeners and\r\ncontributors. The discussions are open and available on the HPR server under\r\nMailman.\r\n

\r\n

The threaded discussions this month can be found here:

\r\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-March/thread.html\r\n\r\n\r\n

Any other business

\r\n

Mint Cast

\r\n

\r\nDid we mention the The Mint Cast ?\r\n

\r\n

Sorry Yannick!

\r\n

There was a misunderstanding about Yannick’s show 2740 when it was discussed on the February Community News. The show was about Pop_OS!, a subject Yannick had also spoken about previously on an edition of the TuxJam podcast.

\r\n

The misunderstanding was that we thought this might have gone against guidelines on syndication, where in fact it did not. It was merely a case of the same subject being spoken about by the same person on two different podcasts.

\r\n

Change to the host page

\r\n

The page for each host:

\r\n
https://hackerpublicradio.org/correspondents/NNNN.html
\r\n

which used to contain a list of all shows contributed by that host, with the show notes, has been made more compact. It now displays only the title, release date, duration, series (if applicable), tags and the show summary. Clicking on the title takes you to the show itself. Note that the host id number NNNN must be 4 digits with leading zeroes.

\r\n

The list of all hosts in alphabetic order can be seen at https://hackerpublicradio.org/correspondents/index.html (navigate with the top menu bar: HomeAboutHosts). From there clicking on the host number takes you to the page for that host. There’s also a link to the host page from the page for each show.

\r\n

Community News Calendar

\r\n

An iCal calendar has been prepared which holds the next 12 recording dates for the Community News. This calendar can be downloaded and opened by suitable clients such as the Thunderbird mail client or Google Calendar. The file is linked from https://hackerpublicradio.org/about.php and may be downloaded from https://www.hackerpublicradio.org/HPR_Community_News_schedule.ics.

\r\n

Tags and Summaries

\r\n

Thanks to the following contributors for sending in updates in the past month: Ken Fallon, NYbill, windigo

\r\n

Over the period tags and/or summaries have been added to 32 shows which were without them.

\r\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\r\n',159,83,1,'CC-BY-SA','Community News',0,0,1), (2806,'2019-05-06','HPR Community News for April 2019',6840,'HPR Volunteers talk about shows released and comments posted in April 2019','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2781Mon2019-04-01HPR Community News for March 2019HPR Volunteers
2782Tue2019-04-02Never stop gamingklaatu
2783Wed2019-04-03The Windows \"Shutdown.exe\" Command ExplainedClaudio Miranda
2784Thu2019-04-04The Yamaha DisklavierJon Kulp
2785Fri2019-04-05What is uCPEJWP
2786Mon2019-04-08My YouTube ChannelsTony Hughes AKA TonyH1212
2787Tue2019-04-09NodeJS Part 1operat0r
2788Wed2019-04-10Looping in HaskellTuula
2789Thu2019-04-11Pacing In Storytellinglostnbronx
2790Fri2019-04-12My YouTube Subscriptions #5Ahuka
2791Mon2019-04-15LUKS like truecryptklaatu
2792Tue2019-04-16Playing around with text to speech synthesis on LinuxJeroen Baten
2793Wed2019-04-17bash coproc: the future (2009) is hereclacke
2794Thu2019-04-18Interview with Martin WimpressYannick the french guy from Switzerland
2795Fri2019-04-19Dead Earthklaatu
2796Mon2019-04-22IRS,Credit Freezes and Junk Mail Ohh My!operat0r
2797Tue2019-04-23Writing Web Game in Haskell - Simulation at high levelTuula
2798Wed2019-04-24Should Podcasters be Pirates ?knightwise
2799Thu2019-04-25building an arduino programmerBrian in Ohio
2800Fri2019-04-26My YouTube Subscriptions #6Ahuka
2801Mon2019-04-29Guitar Set Up Part 1.NYbill
2802Tue2019-04-30Mid-life (?) assessmentclacke
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 4 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 19 comments on 7 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-April/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

HPR on Wikipedia

\n

Please see the draft at https://en.wikipedia.org/w/index.php?title=Draft:Hacker_Public_Radio

\n

If you are not already a host, then please help improve the site.

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month: Tony Hughes

\n

Over the period tags and/or summaries have been added to 36 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2522,'2018-04-03','Flashbacks In Storytelling',656,'Lostnbronx takes a breezy look at the narrative technique of the flashback.','

Lostnbronx looks at flashbacks, flashforwards, plays-within-plays, and dream sequences as techniques of both good and bad storytelling.

',107,105,0,'CC-0','storytelling,flashback,lostnbronx',0,0,1), (2523,'2018-04-04','Run Linux on a Windows Box',809,'HP Stream book with windows 10','

A short show about running Debian on windows.
\r\nYes it really works.

\r\n

What you have do first
\r\nhttps://askubuntu.com/questions/966184/new-installation-of-windows-10-and-ubuntu-from-windows-store-error/966214

\r\n

and here
\r\nhttps://www.bing.com/search?q=how+to+run+windows+powershell+as+adminstrator&form=EDGTCT&qs=PF&cvid=75a5d473a2d140ea841cb0457e42026f&refig=ba953cbaebae48c8b5d1c46080dafd1a&cc=DE&setlang=en-US

',129,0,1,'CC-BY-SA','Windows Subsystem for Linux,WSL,Debian,PowerShell',0,0,1), (2524,'2018-04-05','General problem solver',1088,'Brief look into general problem solver system and how to use it solve simple problems','',364,0,0,'CC-BY-SA','lisp, artificial intelligence, problem solving',0,0,1), (2526,'2018-04-09','Gnu Awk - Part 10',2535,'More about arrays in Gnu Awk','

Gnu Awk - Part 10

\r\n

Introduction

\r\n

This is the tenth episode of the "Learning Awk" series which is being produced by b-yeezi and myself.

\r\n

In this episode I want to talk more about the use of arrays in GNU Awk and then I want to examine some real-world examples of the use of awk.

\r\n

Long notes

\r\n

The notes for rest of this episode are available here.

\r\n

Links

\r\n',225,94,1,'CC-BY-SA','Awk utility,Awk language,gawk,arrays',0,0,1), (2527,'2018-04-10','Reviews Vs. Critiques',839,'Lostnbronx contrasts \"reviews\" with \"critiques\", which are not the same things.','

Lostnbronx takes a quick look at what it is that constitutes "reviews" of stories (be they books, films, TV shows, audio dramas, whatever) as opposed to "critiques" of them.

\r\n

How do these two things differ, and what are their purposes? Is one more important than the other? Why does it even matter?

',107,105,0,'CC-BY-SA','storytelling,review,critique,lostnbronx,film,writing,audio drama,tv',0,0,1), (2528,'2018-04-11','CCTV with DARKNET',863,'I got over my current setup for CCTV with Darknet and YOLO','

Twitter: @operat0r

\r\n

DERP SHELL CODE https://rmccurdy.com/scripts/DARKNET

\r\n',36,0,1,'CC-BY-SA','CCTV,Darknet,YOLO',0,0,1), (2531,'2018-04-16','Plot And Story',866,'Lostnbronx shares some thoughts about the nature of plot and story in storytelling.','

Lostnbronx talks about plot and story, as well as characters and backgrounds, in storytelling of all types. These things are closely tied together, and a problem with one can easily be a problem with all.

',107,105,0,'CC-0','storytelling,plot,story,character,background,lostnbronx',0,0,1), (2529,'2018-04-12','What\'s in my podcatcher',592,'listing of podcasts I listen to ','

List of podcasts as read directly from my podcast player/catcher -- sorry, no official notes (I will do better next time, I promise).

',365,75,1,'CC-BY-SA','podcasts,feed',0,0,1), (2532,'2018-04-17','Podcrawl Glasgow 2018',1584,'The TuxJam guys introduce and invite the HPR community to join them at Podcrawl Glasgow in July 2018','

HPR Podcrawl 2018

\r\n

Dave, Kevie, and Andrew - hosts of TuxJam - take you via a slightly elongated route to an upcoming event.

\r\n

The event

\r\n

Podcrawl Glasgow 2018 Saturday 28 July 2018 from 18:00 starting at The State Bar, Holland Street, G2 4NG

\r\n

Dave\'s mistake

\r\n

A minor review of the 2017 event leaves a bitter taste in the mouth of the Big Jessie.

\r\n

Who is the event for?

\r\n

Kevie lists various groups of people who might be interested in going. Dave adds a couple more. So does Andrew. The upshot is: anyone human. Oh, and guide dogs. But probably not children after 19:00 (it\'s a Scottish pubs/licensing thing).

\r\n

Audio from the event

\r\n

Andrew suggests that we may be able to record or even stream audio from the Podcrawl. Dave apparently is an expert in such things, and tries to impress the others with science. Kevie suggests we wait towards the end of the event when it\'s quieter.

\r\n

Tactical chunder

\r\n

Dave is reminded - for a second time - about his mishap. Andrew decides to go into nauseating (pardon the pun) detail.

\r\n

How will you find us?

\r\n

Some of us will be wearing Podcrawl t-shirts, although the company that originally produced the t-shirts sadly has gone out of business.

\r\n

Andrew keeps Ken Fallon happy by suggesting that listeners record a response to this show with any suggestions about recording at live events.

\r\n

Kevie tells us where the event will be (see the top of the notes)

\r\n

We\'ll be posting through the event on Twitter/GNUsocial/Diaspora with the hashtag #PodcrawlGlasgow. Use any one of these to find out where we\'ll be at any time.

\r\n

Non-techy people are welcome. Cigars will be provided.

\r\n

If you\'re in a band, come along as well... we have plenty of opportunity for promotion of your music!

\r\n

Andrew reminds us that this is the fifth Podcrawl in Glasgow.

\r\n

Kevie says that if you\'re coming into Glasgow before 18:00, we\'d love to meet up with you beforehand. We believe that all three of us (plus Dave\'s good lady) will be there from early/mid afternoon.

\r\n

Contact Us

\r\n

You can contact all three of us at the same time via tuxjam@otherside.network - let us know you\'re coming!

\r\n

Kevie

\r\n

Twitter: @kevie49
\r\nDiaspora: kevie@diaspora.microdata.co.uk
\r\nFediverse: kevie@community.highlandarrow.com

\r\n

Andrew

\r\n

Fediverse: mcnalu@mastodon.me.uk
\r\nTwitter: @mcnalu

\r\n

Dave

\r\n

Twitter: @thelovebug
\r\nFediverse: thelovebug@s.wefamlee.be

\r\n

Other podcasts?

\r\n

Dave asks Andrew about a podcast featuring three guys talking about Creative Commons and Linux: TuxJam

\r\n

Dave asks Kevie about a short-form music podcast featuring a couple of pieces of music from a single artist: CCJam

\r\n

Andrew asks Dave about a husband and wife podcast with a live show that goes out every Friday night from South Yorkshire in England: The Bugcast - it\'s award-winning, has a live chatroom, and is 10-years old!

\r\n

Thanks for listening!

\r\n

Thanks to Torriden for allowing us to play their track Drinking Away. We hope to see you at Podcrawl in July for a beer or malt (or two)!

\r\n\r\n',314,0,0,'CC-BY-SA','podcrawl, event, beer, whisky, cigars, Creative Commons, music, Linux, tech, chunder',0,0,1), (2533,'2018-04-18','Burp Suite / ABCMouse Game',1504,'I got over my approach for most mobile/web app pentesting','

https://rmccurdy.com/scripts/videos/rmccurdy_com/HPR_ABC.mp4

\r\n

more burp/android videos:

\r\n',36,0,0,'CC-BY-SA','burp suite,android,pentesting',0,0,1), (2536,'2018-04-23','Lostnbronx examines points-of-view and tenses in storytelling.',1013,'Lostnbronx examines points-of-view and tenses in storytelling.','

Lostnbronx takes a breezy look at narrative points-of-view, as well as temporal tenses in storytelling. What are they, how do they differ, and why might one be better than another in a particular situation?

',107,105,0,'CC-0','storytelling,stories,pov,tense,writing,lostnbronx',0,0,1), (2534,'2018-04-19','Moving to Office 365 (and painting the ceiling)',1888,'Knightwise talks about moving his company email to Office 365','

A couple of weeks ago we moved to a new house and I had some time on my hands to talk to you guys while painting the ceiling. Moving was very much on the forefront of my mind since I also recently moved my company\'s Email platform to Office 365. As a cross platform slider with a foot in each major operating system I decided to give you my first impressions of the new platform (and upset the GNU-purists) with my review.

',111,0,0,'CC-BY-SA','office, microsoft, windows, 365, move, Migrate, google, Gmail',0,0,1), (2537,'2018-04-24','Recording HPR on the fly Part II',208,'In which I update the recommendation from HPR 1877: Just use Audio Recorder!','

This is an update to hpr1877 :: Recording HPR on the fly on your Android phone. I thought that was two years ago, but wow it\'s even two and a half years ago, back in late 2015.

\r\n

Updated recommendation! Back in #1877 I said that you could go with this app because it has these nice functions, or with that app because it has these other things. Well, there\'s no longer any need for trade-offs. Just go to f-droid, install \r\nAudio Recorder and you\'re good to go!

\r\n

I installed it in two minutes, recorded a two-minute episode on how great it seems to be, and then I recorded another three episodes and I can confirm that it\'s pretty great. You\'ve got the record/pause control available on the lock screen, it can save in FLAC, you can define the naming pattern it should use for the files, and you can tell it where to store its files.

\r\n

Some apps just insist on saving everything in internal storage, and that can run out pretty quick. Meanwhile I\'ve got 30 GB left on my SD card that I\'m struggling to make apps make use of.

\r\n

And finally, it also has a rename function (unlike my previous recommendation uRecord!), so you can conveniently, right in the app without finding the files through some other means, change the file name to reflect what it was that you were recording, so that you\'re not in the situation where one month later you\'re looking at a dozen files with just dates and times and need to listen to all of them to figure out which one it is you want.

\r\n

It even has an automatic skip silence function, but that\'s pretty useless for the places I record in. :-D

\r\n

When I said \"cool waveform\" I meant that it\'s displaying the recorded waveform on the screen as it records. Not that useful, but it\'s just part of the overall really nice polish of the app.

',311,0,0,'CC-BY-SA','android, recording, hpr',0,0,1), (2538,'2018-04-25','My geeky plans for the new house.',1613,'Knightwise talks about the new geek infrastructure in his house','

Moving house gives you plenty of possibilities. While painting the Living room I talk about the geeky infrastructure of my new house and how I plan to set it up.

',111,0,1,'CC-BY-SA','ubiquity, wifi, network, firewall, server',0,0,1), (2542,'2018-05-01','How I helped my dad run a static website using SparkleShare',728,'In which I describe my setup of SparkleShare and GitLab Pages to maintain a static website','

My #hprep tag up on Heldscalla serves as inspiration for times like this, when I should just record something while I have the chance. Suggest more topics for me to orate about and I\'ll put them up there!

\r\n

In this episode I\'m talking about how I\'ve set up SparkleShare (web site currently down, try the archived site if it\'s still down when you\'re reading this) and GitLab Pages to allow my dad to tinker with a static web site locally on his machine and automatically get the changes up on the official URL without having to bother with any manual steps (at least on the happy path).

\r\n

Errata: Oops, I said Jekyll uses Python. It uses Ruby.

\r\n

TL;DL: We have two directories, two git repos. He doesn\'t have to know about git. He plays around in the staging directory first, looks at the test site how it turned out, when he\'s happy he just copies the files over to the production directory and they go live. SparkleShare automatically pushes to gitlab.com (I didn\'t say it outright in the episode, but yeah, I\'m using the hosted service -- that\'s basically the point of this mode of doing things, minimal setup, responsibility and maintenance for me), and GitLab CI runs Jekyll (use the static site generator of your choice) to copy files over for deploying, and finally GitLab Pages deploys the new site.

\r\n

I believe all of this took me less than two hours to set up, effective time, once I got around to it (and was in the same time zone as my dad\'s computer). Don\'t forget to add your verification TXT record in the DNS.

',311,0,0,'CC-BY-SA','sparkleshare, static website, gitlab pages',0,0,1), (2547,'2018-05-08','MSYS2',657,'In which I talk briefly about the history of MSYS2 and Cygwin and why you might want MSYS2','

In the beginning there was Cygwin, by Cygnus Solutions (later acquired by Red Hat), then came msys, a lightweight derivative with no package manager, no fancy integration tools, just the bare minimum necessary to support a gcc compiler and the GNU autotools.

\r\n

msys2 is cygwin minus the package manager plus an adaptation of the pacman package manager from Arch, and a big archive of packages of all kinds. It offers a friendlier command-line experience than Cygwin does.

\r\n

I failed to mention here that msys was explicitly made to support the MinGW (Minimalist GNU for Windows) flavor of GCC, which is intended for building native Windows applications. GCC for Windows has two types of output, cygwin or mingw, where cygwin is for source code that expects POSIX-y facilities and mingw is for code that should compile (possibly with some minor adjustments for C dialect) equally well under GCC and Microsoft Visual C, and should produce about the same output.

',311,0,0,'CC-BY-SA','msys2, cygwin, windows, command-line, pacman, package manager',0,0,1), (2552,'2018-05-15','What is stow?',721,'How does stow work, why would you want it and what are its limitations?','

stow was perfected in 2002 with stow 1.3.3. Then it was silent for 9 years, and in 2011 stow 2.1.0 came out. It received a few updates until stow 2.2.2 in 2015, but don\'t worry. It\'s still relevant, and it won\'t eat your homework. I don\'t even know what these 2.x versions are about. You still just stow mything, stow -R mything and stow -D mything like you always did.

\r\n

If stow is too limiting to you, listen to hpr2198 :: How awesome is Guix and why will it take over the world about its big brother, which has all of the advantages of stow except radical simplicity, and none of the drawbacks.

\r\n

For a shorter and more practical episode on Guix, see hpr2308 :: Everyday package operations in Guix.

\r\n',311,0,0,'CC-BY-SA','stow, package manager',0,0,1), (2539,'2018-04-26','Interview - Austin Lee',2739,'operat0r Interviews Austin Lee','

https://www.youtube.com/watch?v=ktbiNmxFuZs

\r\n

RAW:
\r\nhttps://rmccurdy.com/stuff/Austen_Lee.zip

\r\n',36,78,1,'CC-BY-SA','interview',0,0,1), (2540,'2018-04-27','28 - TLS 1.3',1122,'TLS 1.3 is the newest protocol standard for secure communications on the Web.','

TLS 1.3 was just adopted, and it provides improved security for all Web communications. We take a look at what the protocol says and look at the controversies around its adoption. https://www.zwilnik.com/?page_id=980

\r\n

Links:

\r\n',198,74,0,'CC-BY-SA','Ephemeral Diffie-Hellman, Encryption, TLS',0,0,1), (2541,'2018-04-30','Microphone Wind Screen Demo',384,'Lostnbronx demonstrates the effectiveness of his new microphone wind screen.','

This is just a quick demo of my new microphone wind screen muff. Though you can still hear some wind noise getting through when especially sharp gusts roll by, I think you\'ll agree the difference with and without the screen is dramatic.

\r\n

The Movo is not perfect, and will not stop all wind noise on a very blustery day, but this kind of screen is essential for outdoor recording. The only editing I did on this track was a fade-in and out, and transcoding it from wav to flac (which was then transcoded at HPR into other formats).

\r\n
\r\n',107,0,0,'CC-BY-SA','recording,wind screen,muff,outdoors,lostnbronx',0,0,1), (2557,'2018-05-22','Styx -- The Purely Functional Static Site Generator',832,'For the Fractalide web site, we are using Styx as a site generator. Here\'s a bit of how and why.','

I switched phones, and complained about the microphone. It probably made a greater difference that I was recording in 16 kHz Vorbis, because I was on a fresh install of Audio Recorder. Always double-check your settings, and apologies for the quality.

\r\n\r\n
\r\n

I am currently in the process of converting our website from Hugo to Styx.

\r\n\r\n

Styx is s static site generator written entirely in the Nix language. It is able to figure out exactly what pages need to be rebuilt depending on what you changed in your page source and data sources, and all intermediate results are stored in the Nix store.

\r\n\r\n

The parsing of AsciiDoc and (multi)Markdown is done by external tools, but the templating and layouts is all Nix.

\r\n\r\n

I thought I may have dreamed the bit about carnix or buildRustPackage parsing TOML within Nix, because I couldn’t find any evidence of them ever having done that. But then I discovered it was in nixpkgs-mozilla I had seen it! That’s Mozilla’s overlay for nixpkgs, which makes Rust Nightly always available in Nix, so it’s kind of Nix’s rustup equivalent. So yeah, I guess I had dreamed who did it, but not that somebody did it. :-)

\r\n',311,0,0,'CC-BY-SA','nix, styx, static site generator',0,0,1), (2543,'2018-05-02','Home Theater - Part 1 Hardware',530,'I go over my Home Theater / Media setup starting with Hardware','\r\n
cat /etc/pwrstatd.conf\r\npowerfail-delay = 60\r\npowerfail-active = yes\r\npowerfail-cmd-path = /usr/local/bin/pwrstatd-powerfail.sh\r\npowerfail-duration = 0\r\npowerfail-shutdown = no\r\n\r\nlowbatt-delay = 30\r\nlowbatt-active = yes\r\nlowbatt-cmd-path = /usr/local/bin/pwrstatd-lowbatt.sh\r\nlowbatt-duration = 0\r\nlowbatt-shutdown = yes\r\nenable-alarm = yes\r\nshutdown-sustain = 60\r\nturn-ups-off = yes\r\nlowbatt-threshold = 15\r\n\r\nups-polling-rate = 1\r\nups-retry-rate = 10\r\nprohibit-client-access = no
\r\n',36,0,0,'CC-BY-SA','Home Theater',0,0,1), (2544,'2018-05-03','How I prepared episode 2493: YouTube Subscriptions - update',1978,'In show 2493 I listed some of my YT subscriptions - here\'s how','

How I prepared episode 2493: YouTube Subscriptions - update

\r\n

Introduction

\r\n

In show 2493 I listed a number of the YouTube channels I watch. Some of what I did to prepare the notes was to cut and paste information from YouTube pages, but the basic list itself was generated programmatically. I thought the process I used might be of interest to somebody so I am describing it here.

\r\n

Components

\r\n

I needed four components to achieve what I wanted:

\r\n\r\n

I will talk a little about the first three components in this episode in order to provide an overview.

\r\n

Full-length notes

\r\n

The full-length notes (available here) contain details of the processes involved in building the list of channels.

\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','YouTube,OPML,XML,xmlstarlet,Template Toolkit',0,0,1), (2548,'2018-05-09','Single Vs Multiple Characters',1050,'Lostnbronx looks at why single or multiple main characters are better in stories.','

Lostnbronx goes over the narrative technique of using one main character to tell a story, as opposed to using multiple characters. What advantage, if any, does so-called "head-hopping" have, over focusing on a single character at a time? Why is it sometimes better to do the opposite? And how can these different construction elements impact the story as a whole?

\r\n',107,105,0,'CC-BY-SA','storytelling,writing,characters,lostnbronx',0,0,1), (2549,'2018-05-10','DVD ripping using old hardware',314,'How I put an older machine and a little cash to repurpose it.','
    \r\n
  1. Had a tower with a bad motherboard.
  2. \r\n
  3. Wife found one at the Savers (Goodwill) for $8
  4. \r\n
  5. Board worked, but had no video
  6. \r\n
  7. Bought a 8mb video card for $10
  8. \r\n
  9. Power supply fan seized, $10,\r\n
  10. \r\n
  11. Distro should be on a USB key, and run headless\r\n
  12. \r\n
  13. Had Arch installed, no 32 bit support after end of 2017
  14. \r\n
  15. Installed Slackware, only working distribution for my hardware\r\n
  16. \r\n
  17. Set up ssh with alternative port
  18. \r\n
  19. Installed mplayer and tmux, and ripit with sbopkg\r\n
  20. \r\n
  21. Needed a way to rip any media regardless of encryption\r\n
  22. \r\n
  23. CD ripping was a bonus\r\n
  24. \r\n
  25. Scripts are on Github
  26. \r\n
\r\n

https://github.com/ricemark20/CD-DVD-ripping-on-Slackware

\r\n
    \r\n
  1. Happy ripping!
  2. \r\n
',318,0,0,'CC-BY-SA','ripping, movies, hardware, repurpose',0,0,1), (2550,'2018-05-11','Howto get started playing RPGs',1519,'Lostnbronx and Klaatu tag-team an intro to tabletop role-playing games [RPG]','

\r\nHave you ever wanted to start playing a tabletop RPG, but weren't sure where to start? In this one-hour episode, Lostnbronx and Klaatu introduce you to role-playing games, including what you need to have in order to get started, how to build a character, what a game session is like, and how to find other people to play with.\r\n

\r\n\r\n

\r\nSome resources mentioned in this episode:\r\n

\r\n\r\n\r\n',78,95,0,'CC-BY-SA','rpg,intro,howto,tutorial,dnd,pathfinder,opend6,ogl',0,0,1), (2551,'2018-05-14','Calibrating Calibration',1519,'NYbill talks about calibration issues with the Siglent SDS1202X-E oscilloscope','

NYbill talks about the Siglent SDS1202X-E oscilloscope and the calibration pitfalls of the BA model over the newer BB model.

\r\n

Pics for the episode:

\r\n

https://media.gunmonkeynet.net/u/nybill/collection/siglent-sds1202x-e/

',235,0,0,'CC-BY-SA','test gear, electronics, oscilloscope',0,0,1), (2553,'2018-05-16','Get ahead with git HEAD',2802,'Klaatu helps you understand git HEAD','

This episode is light on actual commands, and mostly a narrative analysis of what git HEAD is and why it matters to you.

\r\n

Some commands you can try:

\r\n
$ cat ~/path/to/git/repo/.git/HEAD
\r\n

and

\r\n
$ ls ~/path/to/git/repo/.git/refs\r\n$ cat ~/path/to/git/repo/.git/refs/master
\r\n',78,104,0,'CC-BY-SA','git, HEAD, branch, refs',0,0,1), (2556,'2018-05-21','Building trust',2549,'Quasi-philosophical musing about how trust is built both online and in real life','

\r\nWhat is trust? How do you get it? How can you exploit it? How can you keep from being exploited?\r\n

\r\n',78,74,0,'CC-BY-SA','trust,social engineering,gpg,pgp,community',0,0,1), (2572,'2018-06-12','What\'s in my tool kit',342,'Listing of items I carry for daily use','\r\n

If I expand the definition of tool kit to include the tool box on my pickup truck, I also have...

\r\n\r\n',365,23,1,'CC-BY-SA','daily carry, toolkit',0,0,1), (2554,'2018-05-17','Gnu Awk - Part 11',1686,'In part 11 of the series, we string and number built-in functions','

Awk Part 11

\r\n\r\n

Gnu Awk Documentation: https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions

\r\n\r\n

Numerical functions

\r\n\r\n\r\n\r\n\r\n

String functions

\r\n\r\n\r\n\r\n\r\n

References

\r\n\r\n',300,94,0,'CC-BY-SA','bash, linux, awk',0,0,1), (2826,'2019-06-03','HPR Community News for May 2019',3497,'HPR Volunteers talk about shows released and comments posted in May 2019','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n Joel D, \n Zen_Floater2.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2803Wed2019-05-01Update on my Raspi 3 B OpenMedia Vault and Next Cloud instancesJWP
2804Thu2019-05-02Awk Part 13: Fix-Width Field Processingb-yeezi
2805Fri2019-05-03My 50th ShowTony Hughes AKA TonyH1212
2806Mon2019-05-06HPR Community News for April 2019HPR Volunteers
2807Tue2019-05-07Are bash local variables local?clacke
2808Wed2019-05-08Haskell function typesTuula
2809Thu2019-05-09The Blue Oak Model License and Its One Big GotchaJoel D
2810Fri2019-05-10Wi-Fi on AndroidKen Fallon
2811Mon2019-05-13Interview with Alan PopeYannick
2812Tue2019-05-14Is 5G mobile data a danger to your health?clacke
2813Wed2019-05-15Should we dump the linux Desktop.knightwise
2814Thu2019-05-16Spectre and Meltdown and OpenBSD and our futureZen_Floater2
2815Fri2019-05-17Copy pastaklaatu
2816Mon2019-05-20Gnu Awk - Part 14Dave Morriss
2817Tue2019-05-21Are you successful? Click to find out more!clacke
2818Wed2019-05-22Writing Web Game in Haskell - Science, part 1Tuula
2819Thu2019-05-23Reply to Knightwise - podcastsAhuka
2820Fri2019-05-2429 - CERT Home Security TipsAhuka
2821Mon2019-05-27Interviewing some exhibitors at the 2019 vcfe.org eventJeroen Baten
2822Tue2019-05-28What\'s in the Box! Part 1NYbill
2823Wed2019-05-29Gentoo and why I use italdenp
2824Thu2019-05-30Gnu Awk - Part 15Dave Morriss
2825Fri2019-05-31More text to speech trialsKen Fallon
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 16 comments in total.

\n

Past shows

\n

There are 6 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 10 comments on 4 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-May/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Links

\n\n

Tags and Summaries

\n

Over the period tags and/or summaries have been added to 10 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2846,'2019-07-01','HPR Community News for June 2019',3364,'HPR Volunteers talk about shows released and comments posted in June 2019','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Shannon Wright.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2826Mon2019-06-03HPR Community News for May 2019HPR Volunteers
2827Tue2019-06-04Unscripted ramblings from my garage about my first CTF eventChristopher M. Hobbs
2828Wed2019-06-05Writing Web Game in Haskell - Science, part 2Tuula
2829Thu2019-06-06Discussion around fair use clips on HPRVarious Hosts
2830Fri2019-06-07HPR NYE Show 2018-2019 part 1Honkeymagoo
2831Mon2019-06-10Interview with Robbie FergusonYannick
2832Tue2019-06-11How I got started in LinuxShannon Wright
2833Wed2019-06-12Jeroen chats with Joep PiscaerJeroen Baten
2834Thu2019-06-13My favorite desktop and android applicationsChristopher M. Hobbs
2835Fri2019-06-14HPR NYE Show 2018-2019 part 2Honkeymagoo
2836Mon2019-06-17Interview with Wendy HillYannick
2837Tue2019-06-18parallax live desktops in androidoperat0r
2838Wed2019-06-19Why Haskell?Tuula
2839Thu2019-06-20Sample episode of the Distrohoppers Digest podcastKen Fallon
2840Fri2019-06-21HPR NYE Show 2018-2019 part 3Honkeymagoo
2841Mon2019-06-24How I got into Linux (and then some...)Christopher M. Hobbs
2842Tue2019-06-25What\'s in my Bag an update to hpr2065Tony Hughes AKA TonyH1212
2843Wed2019-06-26Afrikan Tähti (or Star of Africa)Tuula
2844Thu2019-06-27The Sony TC-222-A Portable Reel-To-Reel Tape RecorderJon Kulp
2845Fri2019-06-28HPR NYE Show 2018-2019 part 4Honkeymagoo
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 19 comments in total.

\n

Past shows

\n

There is 1 comment on\n1 previous show:

\n\n

This month\'s shows

\n

There are 18 comments on 8 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-June/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Issue with advanced RSS settings

\n

The page at https://www.hackerpublicradio.org/advanced_rss_settings.php describes a series of features that allow the specification of a tailored RSS feed.

\n

One of the features is \'gomax=1\' which includes shows in the queue scheduled for the future. For example, the following URL requests 30 OGG format shows including those scheduled for the future:

\n
https://hackerpublicradio.org/rss.php?format=ogg&gomax=1&limit=30
\n

However, there is a problem with this, caused by the way we direct downloads to archive.org. We usually upload the next week’s shows to archive.org, but not all future shows as they arrive. This means that the links to some future shows returned by the feed point to currently non-existent episodes.

\n

This has been the case ever since we moved to using archive.org in this way, in late 2017. We have not received any comments or complaints about it in that time, so the question is:

\n
\n

Does anyone use \'gomax=1\'?

\n
\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month: Tony Hughes

\n

Over the period tags and/or summaries have been added to 6 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2558,'2018-05-23','Battling with English - part 1',678,'Misunderstandings about English grammar, spelling, punctuation, etc.','

Battling with English - part 1

\r\n

Introduction

\r\n

This is the first episode of a series about the English language. In it I want to look at some of the problems people (including myself) have with it. I plan to do several episodes and I want to keep them short.

\r\n

The English language is old and has changed – evolved – in many ways over the years. It has come from a multitude of sources, and it\'s difficult to say what is correct in an absolute way.

\r\n

For example, when I was at school we were taught that "nice" should not be used in written material. At that time it was becoming common to see phrases like "I had a nice time" meaning pleasant (in a bland sort of way). In my "Concise Oxford Dictionary" from 1976 the 6th definition, "agreeable" is marked "colloquialism", whereas today this is a common usage.

\r\n

However, it\'s easy to use the wrong word in the wrong context. You might choose one that sounds similar for example. You might also have problems with the spelling of a chosen word. Spelling in English is not always logical. You might also find yourself confused about the use of punctuation – the correct use of apostrophes can be challenging for example.

\r\n

In this series I want to examine some of the problem areas and try to give you the means of remembering the right way.

\r\n

Note: I\'m not an authority on this stuff, but I have tried to teach myself not to make these mistakes over the years. I just wanted to share what I have learnt1 with some links to higher authorities.

\r\n

Long notes

\r\n

I have provided detailed notes as usual, and these can be viewed here.

\r\n

Links

\r\n\r\n
\r\n
\r\n
    \r\n
  1. One thing I have learnt is that "learned" and "learnt" are both correct and mean the same. However, "learnt" is more common in the UK, whereas "learned" is used both in the UK and the USA.

  2. \r\n
\r\n
',225,120,1,'CC-BY-SA','grammar,spelling,punctuation,word misuse,English',0,0,1), (2562,'2018-05-29','I bought a laptop',1292,'... in which clacke takes months (or years?) to buy a laptop, but comes out pretty pleased','

After months (or years?) of waffling and false starts I finally bought an ASUS X542U. The advertised specs say "up to", but I don’t have the "up to", I have the baseline 7th gen i3, 128GB SSD, 4 GB RAM.

\r\n

Here’s the rambling story of a laptop purchase and its various side quests.

\r\n

Some details that may or may not have made it in to the show (and the show has some that aren’t there) available on the Fediverse at https://pleroma.heldscal.la/notice/7204988 .

\r\n

Side quest to the side quest of making an episode about side quests:

\r\n

Why spend five minutes writing a simple Makefile when you can spend half an afternoon writing a simple default.nix instead?

',311,0,0,'CC-BY-SA','laptop, linux, ubuntu, nix, cryptocurrency',0,0,1), (2559,'2018-05-24','My Favourite Browser extension',1117,'In this episode I cover my favourite browser Add-on','

My contribution to List of requested shows “Your favourite browser extensions”

\r\n\r\n

On Android, I\'m lazy and just seem to have fallen into using the chrome browser. The Add-on I\'m going to talk about unfortunately isn\'t available for the Android operating system.

\r\n

On the Linux desktop, I use Firefox

\r\n

In the past, I\'ve dabbled with various browser add-ons but until very recently I\'ve been using no browser add-ons on the desktop.

\r\n

A browser add-on I did use and did miss was Tab groups

\r\n

Tab Groups was originally a feature built into Mozilla Firefox

\r\n

The feature was removed but maintained as an add-on until it was broken by changes in Firefox 57

\r\n\r\n

A colleague at work brought the One-Tab add-on to my attention https://www.one-tab.com/

\r\n

It\'s available for both the Chrome browser and Firefox

\r\n

No sign-up or registration required

\r\n

With Tab-group I found myself spending a lot of time arranging groups getting the size right naming them etc.

\r\n

One tab philosophy is a bit different and perhaps maybe not so intuitive, though I think now after some use I prefer it as it gets out of the way and can be used with the minimal of fuss.

\r\n

I highly recommend one-tab if you regularly find yourself dealing with a lot of open tabs in your browser.

\r\n',201,0,1,'CC-BY-SA','Internet, Research, Browser, Firefox, Plug-in, Add-On',0,0,1), (2560,'2018-05-25','General Data Protection Regulation (GDPR)',1117,'The GDPR becomes enforceable today and Ken gives an overview on what it is and how it effects you.','

Been getting a lot of updated policy changes lately ? Here\'s why !

\r\n\r\n

From Wikipedia

\r\n\r\nThe General Data Protection Regulation (GDPR) (EU) 2016/679 is a regulation in EU law on data protection and privacy for all individuals within the European Union. It also addresses the export of personal data outside the EU. The GDPR aims primarily to give control to citizens and residents over their personal data and to simplify the regulatory environment for international business by unifying the regulation within the EU. It was adopted on 14 April 2016, and after a two-year transition period, becomes enforceable on 25 May 2018.\r\n\r\n\r\n

The following information is taken from the Guide to the General Data Protection\r\nRegulation (GDPR) from the Information Commissioners Office in the UK, which is released under a Open Government Licence v3.0.

\r\n\r\n

Principles of the GDPR

\r\n

Under the GDPR, the data protection principles set out the main responsibilities for organisations.
\r\nArticle 5 of the GDPR requires that personal data shall be:

\r\n
\r\n
a) processed lawfully, fairly and in a transparent manner in relation to individuals;
\r\n
b) collected for specified, explicit and legitimate purposes and not further processed in a manner that is incompatible with those purposes; further processing for archiving purposes in the public interest, scientific or historical research purposes or statistical purposes shall not be considered to be incompatible with the initial purposes;
\r\n
c) adequate, relevant and limited to what is necessary in relation to the purposes for which they are processed;
\r\n
d) accurate and, where necessary, kept up to date; every reasonable step must be taken to ensure that personal data that are inaccurate, having regard to the purposes for which they are processed, are erased or rectified without delay;
\r\n
e) kept in a form which permits identification of data subjects for no longer than is necessary for the purposes for which the personal data are processed; personal data may be stored for longer periods insofar as the personal data will be processed solely for archiving purposes in the public interest, scientific or historical research purposes or statistical purposes subject to implementation of the appropriate technical and organisational measures required by the GDPR in order to safeguard the rights and freedoms of individuals; and
\r\n
f) processed in a manner that ensures appropriate security of the personal data, including protection against unauthorised or unlawful processing and against accidental loss, destruction or damage, using appropriate technical or organisational measures.
\r\n
\r\nArticle 5(2) requires that:\r\n
\r\n
the controller shall be responsible for, and be able to demonstrate, compliance with the principles.
\r\n
\r\n\r\n

What information does the GDPR apply to?

\r\n\r\n

Personal data

\r\n

The GDPR applies to ‘personal data’ meaning any information relating to an identifiable person who can be directly or indirectly identified in particular by reference to an identifier.

\r\n\r\n

Sensitive personal data

\r\n

Special category data is personal data which the GDPR says is more sensitive, and so needs more protection.

\r\n\r\n\r\n

Criminal offence data

\r\n

The Data Protection Bill deals with this type of data in a similar way to special category data, and sets out specific conditions providing lawful authority for processing it.

\r\n\r\n

What are the lawful bases for processing?

\r\n

You can only process personal information if you have:

\r\n
    \r\n
  1. Consent: the individual has given clear consent for you to process their personal data for a specific purpose.\r\n
  2. Contract: the processing is necessary for a contract you have with the individual, or because they have asked you to take specific steps before entering into a contract.\r\n
  3. Legal obligation: the processing is necessary for you to comply with the law (not including contractual obligations).\r\n
  4. Vital interests: the processing is necessary to protect someone’s life.\r\n
  5. Public task: the processing is necessary for you to perform a task in the public interest or for your official functions, and the task or function has a clear basis in law.\r\n
  6. Legitimate interests: the processing is necessary for your legitimate interests or the legitimate interests of a third party unless there is a good reason to protect the individual’s personal data which overrides those legitimate interests. (This cannot apply if you are a public authority processing data to perform your official tasks.)\r\n
\r\n\r\n

Individual rights

\r\n
    \r\n
  1. The right of access
  2. \r\n
  3. The right to rectification
  4. \r\n
  5. The right to erasure
  6. \r\n
  7. The right to restrict processing
  8. \r\n
  9. The right to data portability
  10. \r\n
  11. The right to object
  12. \r\n
  13. Rights in relation to automated decision making and profiling.
  14. \r\n
\r\n\r\n

Other Considerations

\r\n\r\n\r\n

Links

\r\n\r\n',30,74,0,'CC-BY-SA','GDPR,General Data Protection Regulation',0,0,1), (2561,'2018-05-28','A reluctant dog walk',1472,'A reluctant dog walk after some hand stripping','

An explanation of hand stripping https://www.petguide.com/petcare/dog/grooming-basics-all-about-hand-stripping/

\r\n

I chopped the recording down a bit as it was originally over an hour long I thought it would just be too monotonous.

\r\n

Listening back to the recording I can\'t believe it took me so long to get organised and get out the door.

\r\n

With all the rhythmic clinking sounds it sounds more like I\'m riding a horse than walking the dog, I think the supplied clip-on Dictaphone microphone is a bit on the sensitive side.

\r\n

As a responsible dog walker, one of the most important pieces of equipment I take with me on every dog walk is the “Toley Bone” mentioned around one minute point.

\r\n

Toley is a fine Scottish word, you can look it up if you are unfamiliar with it https://www.firstfoot.com/dictionary/t.html or alternatively just do a simple google search to be enlightened.

\r\n

An example can be found here. https://www.amazon.co.uk/Plastic-Holder-Dispenser-Carrying-Walking/dp/B01IW0YSM0/ref=sr_1_8?ie=UTF8&qid=1509280608&sr=8-8&keywords=dog+bag+bone

\r\n

Listen out for the crinkling sound around the halfway point where it is put to good use.

\r\n

The second most important piece of kit is a sweet, consumed around the 3 minute point.

\r\n

The main part of the walk was fairly uneventful and consisted of traffic noise, passing by the local bus terminus where the bus turns at the end of its route, a rather noisy motorbike and a brief encounter with a fellow dog walker on route.

\r\n

Finally ending with a treat and some light refreshment.

\r\n

Oh, and in case you\'re wondering yes the the scones mentioned near the end of the podcast made by Mrs X were wonderful.

\r\n

Oh and one final thing on listening back to the recording one more time I just realised that for some unknown reason just after the bus noise I started whistling very softly to myself, I don\'t remember doing that at all, I must have been doing it subconsciously. I could be wrong but it sounds to me like I\'m whistling the tune “The animals march in two by two” I guess it was just the right tempo to help me round my one hour walk.

\r\n',201,101,1,'CC-BY-SA','dog, walking',0,0,1), (2563,'2018-05-30','Action In Storytelling',1065,'Lostnbronx looks at different uses of action in storytelling.','

Lostnbronx contrasts what he calls "static action" with "story action", and looks at the functions of these techniques for storytelling in various media.

\r\n

A car chase is action-filled, but so might be a quiet Victorian drawing room, where, at least on the surface of it, nothing is happening.

\r\n

What actually constitutes action? What purpose does it serve? And how much of it do you really need?

',107,105,0,'CC-0','storytelling,action',0,0,1), (2564,'2018-05-31','Intro to Fossil',1991,'Klaatu talks about the Fossil version control system','

Some shownotes for fossil

\r\n\r\n

\r\nCreate a new fossil repository:\r\n

\r\n\r\n
  $ fossil new shownotes\r\n
\r\n\r\n

\r\n Add your work to the repository:\r\n

\r\n\r\n
  $ fossil add shownotes.html\r\n
\r\n\r\n

\r\n Commit your work:\r\n

\r\n\r\n
  $ fossil commit --comment \"added shownote HTML file\"\r\n
\r\n\r\n

\r\n As a fun exercise, destroy your work.\r\n

\r\n\r\n
  $ echo \"klaatu said this was perfectly safe\" > shownotes.html\r\n  $ cat shownotes.html\r\n  klaatu said this was perfectly safe\r\n
\r\n\r\n

\r\n And now revert it back to the\r\n last known good version:\r\n

\r\n\r\n
  $ fossil revert shownotes.html\r\n  REVERT shownotes.html\r\n  $ head -n1 shownotes.html\r\n  <p>Some shownotes for fossil<p>\r\n
\r\n\r\n

\r\n Did you accidentally revert? You can undo that.\r\n

\r\n\r\n
  $ fossil undo shownotes.html\r\n
\r\n\r\n

\r\n And then revert again.\r\n

\r\n\r\n
  $ fossil revert shownotes.html\r\n  REVERT shownotes.html\r\n  $ head -n1 shownotes.html\r\n  <p>Some shownotes for fossil<p>\r\n
\r\n\r\n

\r\nCheck your remote:\r\n

\r\n
  $ fossil remote-url\r\n
\r\n\r\n

\r\nClose a fossil repo:\r\n

\r\n\r\n
  $ fossil close\r\n
\r\n\r\n

\r\nSee the fancy browser-based UI of your repo:\r\n

\r\n
  $ fossil ui\r\n
\r\n\r\n',78,0,0,'CC-BY-SA','fossil,sqlite,svn,git,scm',0,0,1), (2567,'2018-06-05','Son of Hunky Punk',269,'I follow-up on my Frotz episode by covering Son of Hunky Punk, a Z-machine interpreter for Android.','

I follow-up on my Frotz episode by covering Son of Hunky Punk, a Z-machine interpreter for Android. I also test my copy of ZORK I to see if it works as well as it did on Frotz.

\r\n

Links:

\r\n\r\n

Contact:

\r\n\r\n',152,0,0,'CC-BY-SA','Interactive Fiction,interpreter,Android,Son of Hunky Punk,Hunky Punk',0,0,1), (2568,'2018-06-06','Personal finance',3282,'How to manage personal finances.','

Personal finances

\r\n

Problem

\r\n

People need to save for retirement. But how do we do that?

\r\n

Conventional wisdom in the USA says that Social Security is your retirement fund.

\r\n

There\'s no guarantee that will still be around when you retire, and it\'s entirely out of your hands. It maybe a good bonus, but possibly it isn\'t something to rely on.

\r\n

So how do we do it?

\r\n

They don\'t teach you this stuff in school

\r\n

People say you should save for retirement, but they forget to say how.

\r\n

Currently, there are two de facto methods of funding retirement in the USA:

\r\n\r\n

In other countries, there may be significant alternatives. For instance, Kiwisaver in New Zealand.

\r\n

These methods are OK, but difficult for you to interact with directly.

\r\n

There are two direct levels of investment:

\r\n
    \r\n
  1. At your bank: CDs and mutual funds
  2. \r\n
\r\n\r\n
    \r\n
  1. Stock market: your local market and the US market
  2. \r\n
\r\n\r\n',78,0,0,'CC-BY-SA','money, finance, life',0,0,1), (2569,'2018-06-07','Pandemic: Reign of Cthulu board game review',1140,'Klaatu reviews a board game','

Pandemic Reign of Cthulu\r\n

\r\nPandemic original edition\r\n

\r\n

Mods can be found online. For instance: fractuslearning.com/pandemic-board-game

\r\n\r\n',78,95,0,'CC-BY-SA','game,tabletop',0,0,1), (2571,'2018-06-11','Kill Dr. Lucky',1168,'Klaatu reviews a board game','

Details about Kill Doctor Lucky on Paizo.com.

',78,95,0,'CC-BY-SA','game,tabletop',0,0,1), (2570,'2018-06-08','Penguicon 2018 Report',987,'Penguicon 2018 took place on May 4-6, 2018 in Southfield, Michigan','

Penguicon 2018 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.

\r\n

Links:

\r\n\r\n',198,96,0,'CC-BY-SA','Penguicon 2018',0,0,1), (2573,'2018-06-13','Foundations of git rebase',1229,'Klaatu talks about git rebase','

A git rebase is like a git merge done through rose-coloured glasses.

\r\n\r\n

\r\nYou can see it for yourself by doing this little experiment. Assuming the alice directory is a valid git repository:\r\n

\r\n\r\n
$ cd alice\r\n$ echo \"foo\" >> rebase.episode\r\n$ git add rebase.episode ; git commit -m \'begin rebase episode\'\r\n$ git checkout -b monsters\r\n\r\n$ git branch\r\n* monsters\r\nmaster\r\n$ echo \"ghoul\" >> ghoul.txt\r\n$ git add ghoul.txt ; git commit -m \'ghoul\'\r\n$ git checkout master\r\n$ echo \"rogue\" >> rogue.txt\r\n$ git add rogue.txt ; git commit -m \'rogue\'\r\n\r\n$ git checkout monsters\r\n$ echo \"dragon\" >> dragon.txt\r\n$ git add dragon.txt ; git commit -m \'dragon\'\r\n\r\n$ git checkout master\r\n$ echo \"paladin\" >> paladin.txt\r\n$ git add paladin.txt ; git commit -m \'paladin\'\r\n
\r\n\r\n

\r\nYou have now emulated a bunch of activity on two separate branches of a git repository.\r\nCreate a copy of the repo so that you can perform two separate git actions.\r\n

\r\n\r\n
$ cd ..\r\n$ cp -r alice alice-merge\r\n$ cp -r alice alice-base\r\n
\r\n\r\n

\r\nDo an honest merge:\r\n

\r\n\r\n
$ cd alice-merge\r\n$ git checkout master\r\n$ git merge monsters\r\n
\r\n\r\n

\r\nThe log shows you an accurate representation what got merged, and how all those changes came to be:\r\n

\r\n\r\n
$ git log --oneline\r\n123456 Merged monsters into master\r\n789101 paladin\r\n112131 dragon\r\n415161 rogue\r\n718191 ghoul\r\n7ef217 begin rebase episode\r\n
\r\n\r\n

\r\nNow perform a rebase.\r\n

\r\n\r\n
$ cd ../alice-base\r\n$ git checkout master\r\n$ git rebase monsters\r\n
\r\n\r\n

\r\nThe log displays a different story than what really happened.\r\n

\r\n\r\n
123456 Merged monsters into master\r\n8e9122 paladin\r\n21d163 rogue\r\n912a3f dragon\r\n51c098 ghoul\r\n7ef217 begin rebase episode\r\n
\r\n\r\n

\r\nBetter? Worse? YOU DECIDE!\r\n

\r\n\r\n',78,81,0,'CC-BY-SA','git,rebase,merge',0,0,1), (2580,'2018-06-22','Diabetes',841,'This is the story of how I became diabetic and what I did about it.','

For the last 15 years or so Diabetes has been a central fact in my life, and I needed to learn what to do about it. I think I discovered a way I can live with it and still have a good quality of life

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Diabetes',0,0,1), (2574,'2018-06-14','Personal cash-only finance',1800,'Klaatu discusses the advantages and disadvantages of going [mostly] cash-only','

Klaatu discusses the advantages and disadvantages of going [mostly] cash-only

\r\n',78,0,0,'CC-BY-SA','money, finance, life',0,0,1), (2579,'2018-06-21','Ubuntu 18.04 Mate',620,'This is a short show on installing the latest Ubuntu 18.04 onto a laptop and desktop PC','

Ubuntu Mate 18.04

\r\n

Good day to all you HPR Listers. Sorry that its been a while since I recorded a show, but as they say life has got in the way over the last few months, and I\'ve spent quite a bit of it away from the home front.

\r\n

As it happens on one of those trips away my laptop running Mint Mate 18.3 LTS, based on Ubuntu 16.04LTS decided that it wouldn\'t boot as it didn\'t recognise my account, and as I had not created a Root account I could not sign in and fix the issue, which was a corrupted configuration file in the users folder.

\r\n

As luck would have it I had just downloaded the latest Ubuntu Mate 18.04 .iso to try it as a live disc, so I had a boot disc that I could use to boot the laptop and access the data to rescue all my important information which was mainly all my emails and my browser settings and bookmarks, as this is one of my travelling laptops not much of importance is permanently stored on it, so it didn\'t take long and I was ready to reinstall the OS to the PC. Just in case I had missed some important data on the current SSD, as I had a spare SSD with me in the bag, yes I\'m geeky enough to carry a spare SSD or 2 in the bag. So I dug it out and installed it into the PC, which by the way is a Dell Latitude E6540 with an i5 dual core mobile chip with hyper-threading. It\'s currently running 4Gig DDR3 RAM but can run up to 16Gig in the 2 slots it has.

\r\n

So I booted the laptop with the USB boot disc I had created and as with all recent Ubuntu releases you get a screen asking if you want to try or install the OS, as I needed a working PC I went straight to the install option. For those not familiar with Linux or Ubuntu, the installer is a joy to use and very friendly to new users. As this was a first install to this SSD the only option I had was a full install which I chose, then was asked if I wanted to do the default install which partitions the drive and installs the bootloader automatically without any further need for intervention or did I want to do a custom partition arrangement. As the default is adequate for my needs I chose this and clicked continue. During this process you also get the option of a minimal or full installation, the minimal installation gets you a running PC with the basic utilities and leaves you to chose what to install later, but as I use the software that would be omitted I chose the full install. You get asked a final time if you are sure you want to install, with a warning that all current data on the disc will be wiped, as I was happy I clicked proceed. At this point the install starts and you are taken through setting up your PC configuration for language, keyboard, and user account. By the time I had completed this, the install was half completed and the whole process took less than 15 minutes.

\r\n

After the install is complete you get the message to reboot the PC and eject the boot media to reboot into the new install, on first boot you will either be presented with the login screen or go straight to the desktop depending on the choices you made during the install. Once you are at the desktop for the first time you are presented with a wallpaper of the Ubuntu Mate logo and 2 panels one at the top and one at the bottom of the screen. The top one has for those more traditional Linux and Windows users all the information you would expect on the lower panel, such as the menu, notification area etc. As I\'m more traditional in my use of a PC I quickly set up the lower panel with the Advanced Mate Menu and other notification apps such as network, clock and calendar and then deleted the other panel, but obviously this is a personal preference - go with what you find comfortable.

\r\n

The next step after connecting to the local WiFi was to install any updates, which despite this release only being a few days old there were a few, but this didn\'t take long and in less than an hour, which included backing up and swapping out the SSD I had a fully working laptop running Ubuntu 18.04 Mate.

\r\n

So there are a few bits of software not included by default in Ubuntu which I use regularly, one of which is synaptic so I opened the terminal and a sudo apt install synaptic later I had the package manager on the PC. You may ask why, but the software Boutique doesn\'t seem to have all the software available in the repositories and I don\'t always know the appropriate name of software I\'m looking for to use the terminal all the time, so synaptic is a tool I use a lot. The next software that gets installed is Audacity as I use this for editing audio and sometimes extracting the audio stream from videos of the internet, most importantly for HPR listeners it is what I use to record and edit my HPR shows.

\r\n

So back to Ubuntu 18.04 Mate, I\'ve been running it for a month on the laptop and about 3 weeks on my main box and as you would expect from a LTS (long term support until 2023) it\'s very solid and stable, I had a glitch transferring my e mails into Thunderbird on my main box, it had worked flawlessly on the laptop, so I ended up having to reinstall from scratch and on the second install it went perfectly, I think it was down to the way I set up Thunderbird which screwed things up, not the OS, but it\'s all fine now and I didn\'t lose anything in the process. For me coming from Mint there are a couple of utilities the Mint developers have implemented that are not available in Ubuntu, but nothing I can\'t work around. Saying that, if there are any Ubuntu developers out there, the Mint USB drive formatter and USB boot disc creation utilities are nice and simple to use but not available in the Ubuntu repositories.

\r\n

Obviously I\'ve only had limited time to get to use the new OS but so far it doesn\'t seem too bad coming back to the mother ship so to speak from several years of using Mint Mate, virtually since its inception, but as I record this there has been nothing that has made me feel I need to rush and reinstall Mint, so I\'ll continue with Ubuntu Mate 18.04 at least until the new Mint19 based on this Ubuntu release comes out.

\r\n

https://ubuntu-mate.org/download/

\r\n',338,57,0,'CC-BY-SA','Linux, Ubuntu',0,0,1), (2576,'2018-06-18','My swedish and german podcasts part 1',335,'I\'m recommending 6 podcasts in swedish and german','',309,75,0,'CC-BY-SA','podcasts,swedish,german,language,media,europe',0,0,1), (2577,'2018-06-19','Emigration',1855,'Howto emigrate','

Confused about leaving your homeland for <strike>greener</strike> pastures? Maybe this episode will shed some light on the subject.

\r\n\r\n

Public domain music from archive.org. Can you find your national anthem? Do you know all the words to your national anthem? Either way, you should be ashamed of yourself.

',78,0,0,'CC-BY-SA','Emigration,visa,permanent residency,citizenship',0,0,1), (2575,'2018-06-15','Quick Tips June 2018',826,'I go over a few quick tips for June','',36,0,1,'CC-BY-SA','QuickTips',0,0,1), (2578,'2018-06-20','LinuxLUGcast 102 the lost episode',13976,'LinuxLUGcast episode 102. The lost episode.','

\r\nThis was episode 102 of the LinuxLUGcast.\r\n
\r\nSo the LinuxLUGcast is an open podcast/LUG that meets every first and third friday of the month using mumble. This method of running a podcast leaves it open to anyone showing up (which is what we want because it gets difficult for fiftyonefifty and I to come up with topics all the time). We have also gotten the reputation of being a safe for work podcast. This is why episode 102 is being posted here. Between the not safe for work language and the fact that after a few drinks during the podcast I get a little rambly we thought it best not to publish it on the regular LinuxLUGcast feed, but I thought there was some good conversation here that would be lost if it did not go somewhere. After some discussion we at the LinuxLUGcast decided that we would publish it here so that it could be heard by the HPR community.\r\n
\r\nWe have also done some website remodeling which has screwed up the .ogg feed, and wanted to let people know that we are still podcasting and to please check out\r\nhttps://www.linuxlugcast.com/ for the new .ogg feed.\r\n
\r\nEnjoy\r\n

\r\n

\r\np.s. please forgive my rambling\r\n

\r\n',269,0,1,'CC-BY-SA','linux, computing',0,0,1), (2585,'2018-06-29','Check to see if a Remote Control is working',99,'Yet another amazing life hack from Ken','

\r\nEver have a remote control that didn\'t seem to be working ? With this AMAZING LIFE HACK you can see the unseen

\r\n

\r\n\r\nOK all it is is looking at the remote using your camera - but still...\r\n\r\n

\r\n',30,0,1,'CC-BY-SA','remote control, life hack',0,0,1), (2581,'2018-06-25','My new 3D printer - impressions of the Creality Ender 3',1239,'I bought a Creality Ender 3 3D printer in June 2018. Here are my first impressions of it','

My new 3D printer - impressions of the Creality Ender 3

\r\n

Introduction

\r\n

I have been thinking of buying a 3D printer for a year or so. I had thought of getting a Prusa i3 MK3 in kit form, but although it\'s cheaper than the built form this printer is not cheap, and I doubted my ability to build it. I was also unsure whether there was a real need for the capabilities of a 3D printer in my life, and whether such a purchase was justified.

\r\n

I had noticed the Chinese Creality CR10 printer in the recent past, and wondered about buying one of these at about half the price of the Prusa. This is a good-sized printer which comes fully-assembled as I understand, and it has had many good reviews.

\r\n

When the Creality Ender 3 was released in April 2018 for around half the price of the CR10 it looked worth the risk to see if I really needed a 3D printer. So I bought one (from Amazon) in June.

\r\n

As I write this (2018-06-10) it\'s been less than a week since it was delivered, so this is a very preliminary look at the printer.

\r\n

Long notes

\r\n

For the rest of the notes for this episode look here.

\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','3D printer',0,0,1), (2582,'2018-06-26','3 Contribution case studies',2699,'How easy is it for your potential contributors to contribute?','

How easy is it for your potential contributors to contribute?\r\nKlaatu looks at three open source and open culture projects to determine how easy they make it for your potential contributors to contribute?\r\n

',78,0,0,'CC-BY-SA','FLOSS contributions',0,0,1), (2590,'2018-07-06','Blowing a PC Power Supply',229,'Just a short show on how I managed to blow the power supply on my desktop PC','

Greetings Hacker Public Radio listeners, Tony Hughes again coming all the way from Blackpool in the North West of the UK. Originally this show was going to be about some new kit that I have recently bought at my favourite computer auction. However as luck or actually bad luck should have it I fried the power supply on my Desktop machine yesterday as I was setting it up again after moving back to my office.

\r\n

The PC is a HP Compaq Elite 8300 micro Desk top tower with a i7 3rd generation 3770 3.4Ghz CPU and since upgrades now has 16Gig Ram and a Primary 256Gig SSD. This is my daily driver and I\'ve been running it for a couple of years since I bought it at the said auction. It is the best PC I\'ve ever owned; the full specifications are here:

\r\n

https://www.cnet.com/products/hp-compaq-elite-8300-cmt-core-i7-3770-3-4-ghz-4-gb-1-tb-b2d12utaba/specs/

\r\n

As I said I was re setting up my full rig after moving it back to the office upstairs after a temporary move while we had a house guest. As I was plugging in the power cable there was a flash and crack, and a few expletives were uttered, sure enough when I switched of the power at the plug and reconnected the power cable and then tried to power on the PC, it was dead. I was hoping that it was the power supply that had blown and as I had a spare I was not too concerned. However on investigation HP have done the dirty with the design of the motherboard and power supply and neither are standard ATX configuration, yes propriety hardware for this baby.

\r\n

I was lucky as a few months ago I had picked up a i3 HP using the same case, so I pulled out the power supply from this and fitted it into the i7 PC and luckily that did turn out to be the issue, and the PC sprang into life when I hit the power button. I’m now left with a PC that works, but another one that unless I can find a power supply to match is next to useless except for spares.

\r\n

Lessons learned, never connect the power cable when the socket is live, if your plug socket doesn\'t have a switch connect the kettle end to the PC first to reduce the risk of a short like mine. Also never assume that 2nd hand PC’s are standard case/motherboard format as you may have a problem sourcing spares if anything goes wrong as in my case. It’s not the first PC disaster I\'ve had over the years and I can as in this case usually get round them, although not when I bricked the BIOS on a Lenovo x200 one time trying to clear a BIOS password, again I was left with a box of spares which actually came in very handy.

\r\n

Well that\'s the end of my tale of woe. I’ll do another episode on the recent trip to the auction and my new laptops shortly. This is Tony Hughes for Hacker Public Radio signing off for now.

\r\n',338,57,0,'CC-BY-SA','Computers, Repair, safety',0,0,1), (2595,'2018-07-13','New laptop bargain?',252,'This is a short show about another trip to the computer auction and one of my purchases','

Greetings HPR listeners this is Tony Hughes again coming from Blackpool in the UK. Well, as you heard on my last episode I recently visited the computer auction I frequent here in the UK. If you want to drool over the catalogue at any time their website is here:

\r\n

https://www.realnorth.co.uk/

\r\n

So at the sale in June they had some really good 3-4 year old laptops for sale so I decided to take a trip and see if I could liberate a few bargains, and one of the items I came away with was 3 Toshiba Z30a Ultra Books of the i5 4th generation. The basic specs are:

\r\n\r\n

There will be a link in the show notes to the full specifications

\r\n

https://www.toshiba.co.uk/discontinued-products/portege-z30-a-1fd/

\r\n

I had also picked up some 240Gig SSD\'s and had planned to upgrade the storage but this is not possible with a 2.5 inch drive as it doesn\'t have a bay for this format. However it does support up to 128Gig High capacity SD cards so this could be an option if you don\'t want to go to the expense of upgrading the mSATA drive, however as luck would have it one of my other purchases had a 256Gig mSATA drive in a 2.5 inch caddy so that was quickly swapped out and both laptops got an upgrade. More of that in another show.

\r\n

So after doing the hardware upgrade I proceeded to install Ubuntu 18.04 MATE onto the PC. The install worked flawlessly and after completion and configuring the machine to my liking everything seems to be working just fine. The battery condition for a 4 year old laptop is excellent at over 90%, however a replacement can be had on Ebay for around £30 if needed and I always factor this into any second hand laptops I buy.

\r\n

Since I got it running I\'ve installed Windows 7 in a Virtual Machine, in this case Virtual Box as I have a preconfigured Virtual Box HDD image that makes it less of a hassle to install as I don’t have to spend days waiting for all the updates to come through. When this is running in the background it doesn\'t over tax the host machine, and for Linux users it does mean you have access to that occasional bit of light weight MS software that you may need without the need to lug around 2 PC\'s.

\r\n

So did I bag a bargain, well 4 years ago on release these laptops went for £1100+ in the UK and even today they fetch £160 in good order on the likes of Ebay for a model with the specification as I originally purchased it. I would never have been in the market to spend £1000+ on a laptop now or then so the only way I can enjoy these types of machines is after they have been pre loved by someone else. Lets just say £160 is quite a bit more than I paid but with the upgrade to 256Gig mSATA drive I have a better machine for a little less than that, I personally think I bagged a bargain which will do me good service in the coming months/years.

\r\n',338,57,0,'CC-BY-SA','computer auction,laptop',0,0,1), (2584,'2018-06-28','Plot Twists In Storytelling',719,'Lostnbronx examines plot twists, including the different types, and how they can be used.','

Plot twists come in several varieties, and can produce different effects in stories. They can be powerful tools, done correctly, but quickly become trite and predictable if over-used, or used poorly. What\'s the best way to include them? And when might it be a mistake to even try?

',107,105,0,'CC-0','storytelling,plot twists,lostnbronx',0,0,1), (2587,'2018-07-03','Cleaning out your Digital Gutters',1519,'Knightwise talks about being a geek and his quest to curate the library of his mind','

While cleaning out the gutters, Knightwise talks about cleaning out the digital gutters of his information consumption and looking for geeky ways to get his information fix.

\r\n',111,0,1,'CC-BY-SA','geek, life, lifestyle',0,0,1), (2588,'2018-07-04','Miniature painting',1740,'Tuula rambles about how to paint miniatures while painting some toy soldiers','

Tuula rambles about miniature painting while painting some ancient British units (horses for chariots to be specific) for De Bellis Antiquitatis.

\r\n',364,114,0,'CC-BY-SA','miniatures painting',0,0,1), (2583,'2018-06-27','Random Rant',917,'Rant on how US sound recordings copyright laws are weird & how I miss Juiced Penguin','

Citations

\r\n\r\n',354,0,1,'CC-BY-SA','Juiced Penguin,copyright,public domain',0,0,1), (2599,'2018-07-19','Fitting a 3.5mm adapter to a bluetooth receiver.',489,'Ken cobbles together a bluetooth adapter for any 3.5mm headphone','

\r\nThere was a time when the perfect lightweight podcast listening station was a sansa clip running Rockbox connected to a set of SHE3600/97 Philips In-Ear Headphones.

\r\n

\r\nAlas Philips stopped producing the SHE3600/97. SanDisk reduced the specs of the clips, so Rockbox is no longer supported. We\'re left without a flexible option to listening to podcasts.\r\n

\r\n

\r\nOn the other hand the price of Android phones have fallen to sub €50 range, and blue tooth headsets can be had for €25, there is a possibility to have the portability while keeping the cost low.\r\n

\r\n

\r\nI set out to convert the bluetooth headset to a accept generic 3.5mm sockets.\r\n

\r\n

\r\n
\r\nA new ear bud set with crappy in ear buds, and the hacked set.\r\n

\r\n

\r\n
\r\nPlays fine with large over ear headphones.\r\n

\r\n

\r\n
\r\nAlso with small in ear buds, complete with Patent Pending ear identifier\r\n

\r\n

\r\n
\r\nSomething to read Motherload\r\n

\r\n',30,0,1,'CC-BY-SA','life hack, earphone, bluetooth',0,0,1), (2589,'2018-07-05','Saving Money: a response to Klaatu\'s Personal Finance Series',867,'A response to Klaatu\'s very nice series about personal finance.','

Links

\r\n\r\n\r\n',238,0,0,'CC-BY-SA','personal finance, money, saving, retirement',0,0,1), (2593,'2018-07-11','Intro to De Bellis Antiquitatis',1648,'Short intro to tabletop wargame called DBA','

In this episode Tuula paints rambles about De Bellis Antiquitatis while painting more toy soldiers, so expect long pauses and missing thoughts as he tries to do two things at the same time.

\r\n

De Bellis Antiquitatis (or DBA for short): https://en.wikipedia.org/wiki/De_Bellis_Antiquitatis

\r\n

While the original site seems to be gone, WADBAG unofficial guide to DBA can be found at: https://www.wargames-romania.ro/wordpress/wargames/de-bellis-antiquitatis-dba/the-unofficial-guide-to-dba/

\r\n',364,95,0,'CC-BY-SA','tabletop gaming',0,0,1), (2591,'2018-07-09','International Troubleshooting',1815,'NYbill troubleshoots a DIY kit of Ken Fallon’s.','

NYbill troubleshoots a DIY kit of Ken Fallon\'s.

\r\n

The new toy:

\r\n

AmScope SE400-Z
\r\n(The microscope has a nice working height underneath it so you can get your hands and tools in there.)

\r\n

The offending chip:

\r\n

https://www.mccsemi.com/up_pdf/SRV05-4L(SOT23-6L).pdf

\r\n

Pics for the episode:

\r\n

https://media.gunmonkeynet.net/u/nybill/collection/international-troubleshooting/

\r\n',235,103,0,'CC-BY-SA','DIY, Kit, Electronics, Troubleshooting',0,0,1), (2605,'2018-07-27','The Eyes Have It',599,'My history with vision issues and how I have dealt with them.','

My history with vision issues started when I was 3 years old, and I am still dealing with some issues. Fortunately, things are well-controlled and I am doing well.

\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Eye Care, Vision',0,0,1), (2592,'2018-07-10','Tech Talk With Allison',3010,'This is a talk with Allison about webites, ruby, os design and other such things. ','

\r\n

\r\n\r\nCome join us and listen to Allison talk about her tech!!! This talk includes subjects like websites, ruby, os design and other such things.
\r\n

\r\n

Allison\'s email address: allison@isams.net

\r\n',115,0,0,'CC-BY-SA','os, ruby, webdev',0,0,1), (2615,'2018-08-10','Cancer',1043,'My history with cancer and how I have dealt with it.','

I had surgery for cancer in 2010, and family history of cancer, which means certain things have had to be done.

\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Cancer, Prostate, Colon, Lungs',0,0,1), (2598,'2018-07-18','Calculating planetary orbits in Haskell',1711,'Tuula talks about calculating planetary orbits','

Function signatures (it might or might not be helpful to have these at hand while listening):

\r\n\r\n
    radToDeg :: Floating a => a -> a\r\n    degToRad :: Floating a => a -> a\r\n    clamp :: Float -> Float
\r\n\r\n
    day :: Int -> Int -> Int -> Float -> Day Float
\r\n\r\n
    longitudeOfAscendingNode :: Orbit body center => body -> center -> Day d -> LongAscNode body center\r\n    inclinationToEcliptic :: Orbit body center => body -> center -> Day d -> InclToEcl body center\r\n    argumentOfPeriapsis :: Orbit body center => body -> center -> Day d -> ArgPeri body center\r\n    semiMajorAxis :: Orbit body center => body -> center -> Day d -> SemiMajor body center\r\n    eccentricity :: Orbit body center => body -> center -> Day d -> Ecc body center\r\n    meanAnomaly :: Orbit body center => body -> center -> Day d -> MeanAno body center
\r\n\r\n
    eccAnomaly :: MeanAno a b -> Ecc a b -> EccAnomaly a b\r\n    trueAnomaly :: EccAnomaly a b -> Ecc a b -> TrueAnomaly a b\r\n    dist :: EccAnomaly a b -> Ecc a b -> SemiMajor a b -> Distance a b
\r\n\r\n
    toEclCoord :: TrueAnomaly a b -> Distance a b -> LongAscNode a b -> ArgPeri a b -> InclToEcl a b -> EclCoord a b\r\n    toEqCoordinates :: EclCoord body Earth -> Day Float -> EqCoord body
\r\n

Some helpful links:

\r\n\r\n',364,107,0,'CC-BY-SA','haskell,astronomy',0,0,1), (2601,'2018-07-23','Liverpool Makerfest 2018',634,'This is an interview with Chris Dell','

This is the first in a series of interviews carried out at Liverpool Makefest 2018

\r\n

This first interview is with Chris Dell about EduBlocks

\r\n\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, EduBlocks',0,0,1), (2606,'2018-07-30','Liverpool Makefest 2018 - interview with Dan Lynch',520,'This is an interview with Dan Lynch one of this year\'s Makefest organisers','

Another interview from Liverpool Makefest 2018 this time with Dan Lynch of Linux Outlaws and Floss Weekly

\r\n\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, Dan Lynch, Linux Outlaws, Floss Weekly',0,0,1), (2871,'2019-08-05','HPR Community News for July 2019',3794,'HPR Volunteers talk about shows released and comments posted in July 2019','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n mightbemike.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2846Mon2019-07-01HPR Community News for June 2019HPR Volunteers
2847Tue2019-07-02earbudsoperat0r
2848Wed2019-07-03Random numbers in HaskellTuula
2849Thu2019-07-04HPR NYE Show 2018-2019 part 5Honkeymagoo
2850Fri2019-07-05NIST Cybersecurity FrameworkAhuka
2851Mon2019-07-08An introduction to the work of fire fightersJeroen Baten
2852Tue2019-07-09Gnu Awk - Part 16Dave Morriss
2853Wed2019-07-10Feeding the beastfolky
2854Thu2019-07-11Telling myself something In The MorningJezra
2855Fri2019-07-12HPR NYE Show 2018-2019 part 6Honkeymagoo
2856Mon2019-07-15Mint Mobile Security Rantoperat0r
2857Tue2019-07-16Creating CounterParty Collectible Tokens for the Bitcorn Gamemightbemike
2858Wed2019-07-17Vehicle designer for a space gameTuula
2859Thu2019-07-18HPR NYE Show 2018-2019 part 7Honkeymagoo
2860Fri2019-07-19Encryption and Quantum ComputingAhuka
2861Mon2019-07-22Safety Razorsoperat0r
2862Tue2019-07-23Art vs. Commerce In Storytellinglostnbronx
2863Wed2019-07-24Simplified application architectures for improved securityBeeza
2864Thu2019-07-25One weird trick to add a --help option to your awk scriptsklaatu
2865Fri2019-07-26The YouTube channels I really likeJeroen Baten
2866Mon2019-07-29Intro to Bitcoin for techiesmightbemike
2867Tue2019-07-30The Kenwood TS940S Automatic Tuning UnitMrX
2868Wed2019-07-31Custom data with PersistentTuula
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 13 comments in total.

\n

Past shows

\n

There are 2 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 11 comments on 4 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-July/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Ohio LinuxFest Conference CFP

\n

From Susan Rose, Social Media Manager for OLF:

\n
\n

Dear Open Source Fans, Students and Professionals:

\n

The 2019 Ohio LinuxFest is looking for presentations on Friday and Saturday, November 1 and 2. Please visit the CFP page https://ohiolinux.org/call-for-presentations/ for full details about submitting a proposal. The deadline is Friday, August 17, but the sooner you can submit a talk, the better.

\n

Started in 2003, the Ohio LinuxFest https://ohiolinux.org/ is an annual grassroots conference in Columbus, Ohio dedicated to open access for all. Presentations relating to any free and open source software, not just Linux, are welcome. Areas where we’ve had talks in the past include networking, system administration, development, and community building. A preliminary pdf brochure is attached.

\n

Our audience consists of people at all skill levels. Prior speaking experience is a plus, although we do try to provide opportunities for first-time speakers. If you have any questions, please contact us at speakers@ohiolinux.org. We look forward to hearing from you! Thank you for your kind attention and for sharing.

\n
\n

The PDF Brochure mentioned is available at https://hackerpublicradio.org/eps/hpr2871/olf2019.pdf.

\n

Problem with show 2855

\n

We upload all HPR shows to the Internet Archive (archive.org). Shows downloaded via the HPR RSS feeds actually come from there, though they are also available on the HPR site.

\n

Unfortunately, on Friday July 12th the archive.org copy of the show hpr2855 :: HPR NYE Show 2018-2019 part 6 was found to have been truncated and to consist only of the introduction and final part; no actual content.

\n

The problem was detected during the morning of Friday and was rectified during the afternoon (UK time). The RSS feeds were adjusted to ensure the show was re-downloaded and all podcatchers should have received the correct version the next time they checked the feed.

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month: Dave Morriss

\n

Over the period tags and/or summaries have been added to 11 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3991,'2023-11-20','YOU ARE A PIRATE ',1539,'I rant I think about piracy ','

XGP-save-extractor

\n

Python script to extract/backup savefiles out of Xbox Game Pass for\nPC games.

\n

When run, the script produces a ZIP file for each supported game save\nfound in the system.

\n

In most cases the files in the ZIP can be copied to the save\ndirectory of the Steam/Epic version of the game. To find out the save\nfile location, check PCGamingWiki.

\n

https://github.com/Z1ni/XGP-save-extractor/releases

\n',36,0,1,'CC-BY-SA','hacking, piracy ',0,0,1), (2891,'2019-09-02','HPR Community News for August 2019',2224,'HPR Volunteers talk about shows released and comments posted in August 2019','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2869Thu2019-08-01building a bike, following in John Kulp\'s footstepsBrian in Ohio
2870Fri2019-08-02Hierarchy of EvidenceAhuka
2871Mon2019-08-05HPR Community News for July 2019HPR Volunteers
2872Tue2019-08-06Shoe Lace TipsMrX
2873Wed2019-08-07Death Angel - Card gameTuula
2874Thu2019-08-08Repair of G.E. Variable Speed Cassette RecorderJon Kulp
2875Fri2019-08-09cutting up the framesBrian in Ohio
2876Mon2019-08-12Sausage OrzottoWindigo
2877Tue2019-08-13Using Zenity with PdmenuDave Morriss
2878Wed2019-08-14Type classes in HaskellTuula
2879Thu2019-08-15Describing how I listen to podcasts PART 1MrX
2880Fri2019-08-16Evaluating a StudyAhuka
2881Mon2019-08-19Automatically split album into tracks in AudacityKen Fallon
2882Tue2019-08-20ONICS Part 1: Basic CommandsGabriel Evenfire
2883Wed2019-08-21Pass the pigsTuula
2884Thu2019-08-22TASCAM Porta 02 MiniStudio 4-Track Cassette Recorder DemonstrationJon Kulp
2885Fri2019-08-23ONICS Part 2: Filtering and ExtractionGabriel Evenfire
2886Mon2019-08-26INFOSECONDoperat0r
2887Tue2019-08-27Stardrifter RPG Playtest Part 01lostnbronx
2888Wed2019-08-28Pattern matching in HaskellTuula
2889Thu2019-08-29Describing how I listen to podcasts PART 2MrX
2890Fri2019-08-30Penguicon 2019 ReportAhuka
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 7 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 17 comments on 7 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-August/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month: Dave Morriss

\n

Over the period tags and/or summaries have been added to 10 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2612,'2018-08-07','Liverpool Makefest 2018 - interview with Joe aka Concrete Dog',353,'An interview with Joe from Liverpool makefest','

In this episode I talk to Joe aka Concrete dog about amateur Rocketry

\r\n\r\n\r\n

\r\n
\r\n
\r\n
\r\n

\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018',0,0,1), (2616,'2018-08-13','Liverpool Makefest 2018 - interview with Josh - A.K.A - All About Code',310,'An interview with Josh recorded at Liverpool makefest','

This is another short interview recorded at this year\'s Liverpool Makefest, this time with Josh who developed EduBlocks.

\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, EduBlocks, computing, young coders',0,0,1), (2621,'2018-08-20','Liverpool Makefest 2018 - Chan\'nel Thomas a.k.a little pink maker',293,'In this episode I talk to Chan\'nel Thomas aka little pink maker','

In this episode recorded at Liverpool Makefest 2018 I talk to Chan\'nel Thomas aka little pink maker. Chan\'nel has an amazing web site; the link is below. I was going to include a couple of pictures taken on the day but they don\'t do her work the justice it deserves.

\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018,Making, hacking, creativity, inventions',0,0,1), (2626,'2018-08-27','Liverpool Makefest 2018 - interviews with Helen and Chris',510,'Interviews about Manchester Hackspace and Wirral Code Club','

In this episode I talk to Helen from Manchester Hackspace and Chris from Wirral Code Club

\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, computing, young coders, hackers, makers, crafts',0,0,1), (2632,'2018-09-04','Liverpool Makefest 2018 - interviews with Robert and Carl',376,'In this episode I talk to Robert from Roberts Workshop and Carl from Edgehill University','

In this episode I talk to Robert from Roberts Workshop and Carl from Edgehill University

\r\n

\r\n\r\n

\r\n\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, computing, young coders, hackers, makers, crafts',0,0,1), (2636,'2018-09-10','Liverpool Makefest 2018 - interviews with Noel from JMU FabLab',603,'In this episode I talk to Noel Baker from the JMU FabLab.','

In this episode I talk to Noel Baker from the JMU FabLab.

\r\n

\r\n\r\n

\r\n\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, Making, hacking, creativity',0,0,1), (2594,'2018-07-12','Using nmtui, the Network Manager Terminal User interface',638,'A use case for nmtui and general discussion about how to use it','

This is my first show and I am happy to be here!

\r\n

nmtui\'s documentation can be found here.

\r\n

You can reach me on the freenode irc network at blu3r4d0n.

',366,0,0,'CC-BY-SA','nmtui, networkmanager, linux',0,0,1), (2596,'2018-07-16','Battling with English - part 2',1282,'Misunderstandings about English grammar, spelling, punctuation, etc.','

Battling with English - part 2

\r\n

Further notes about \'then\' and \'than\'

\r\n

In the last episode I mentioned the confusion between then and than. I referred to the etymology of the two words, but I didn\'t go into detail.

\r\n

Reading the Online Etymology Dictionary, one interesting point in the page about than is that it was:

\r\n
\r\n

Developed from the adverb then, and not distinguished from it by spelling until c. 1700.

\r\n
\r\n

So, it would seem that the two words are related and historically were the same! However, I\'d guess that it is unlikely that people using them interchangeably now are making reference to usage in the 1700\'s.

\r\n
\r\n

Problems with apostrophes

\r\n

Let us now examine the apostrophe, which is a punctuation mark. It is used for:

\r\n\r\n

There are other uses but you can look at the Wikipedia article for them if you want to dig deeper. I may well revisit this topic in a later show in this series.

\r\n

Long notes

\r\n

I have provided detailed notes as usual, and these can be viewed here.

\r\n

Links

\r\n',225,120,1,'CC-BY-SA','grammar,spelling,punctuation,word misuse,English,apostrophe',0,0,1), (2641,'2018-09-17','Liverpool Makefest 2018 - interview with Rachel from the MicroBit Foundation',564,'This is a short interview recorded at this years Liverpool Makefest with Rachel from MicroBit','

In this episode I talk to Rachel Lancaster from the Micro:Bit foundation.

\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, computing, young coders, hackers, makers, crafts, microbit',0,0,1), (2646,'2018-09-24','Liverpool Makefest 2018 - Interview with Steve and Gerrard from the Liverpool Astronomical society.',355,'In this Episode I talk to Steve and Gerrard from the Liverpool Astronomical society.','

In this episode I talk to Steve and Gerard from the Liverpool Astronomical society.

\r\n\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, Astronomy, History, Science',0,0,1), (2597,'2018-07-17','How to Fix a Remote with Buttons that Don\'t Work',392,'A response to Ken Fallon\'s episode about how to check whether your remote is working or not.','

After listening to Ken Fallon’s episode about how to check whether your remote is working or not, I checked one of our remotes that had been giving us problems and found that only a couple of the buttons produced the light. Then I found a video on YouTube showing how to fix non-working buttons and this is my report.

',238,0,0,'CC-BY-SA','Repairs, Remote Controls, Fixing things, Cleaning',0,0,1), (2602,'2018-07-24','HPR Quick Tips July 2018',1474,'SpiderOAK Backup and Trekking the AT','

Don’t use GOOGLE DRIVE ! They flag personal content and backups as malware and will not let you download or share your own backups!!!!!

\r\n',36,0,1,'CC-BY-SA','SpiderOAK,Backups,DR,Trekking,Hiking',0,0,1), (2604,'2018-07-26','Restoration of a Fasco L55A Hassock Fan',1074,'I talk about my recent restoration project of a mid-century modern hassock fan','

The Fasco L55A Hassock Fan

\r\n\r\n

Click the image to view my Flickr slideshow of the restoration process.

\r\n\r\n

\"Fasco

\r\n\r\n

A video showing my restored fan in action!

\r\n\r\n\r\n\r\n

Links

\r\n\r\n\r\n',238,0,0,'CC-BY-SA','Fans, vintage stuff, restoration, staying cool, mid-century modern',0,0,1), (2608,'2018-08-01','BattleTech',1108,'Quick introduction to BattleTech tabletop game by Tuula','

Following links might help you to get more familiar with the game.

\r\n\r\n',364,95,0,'CC-BY-SA','BattleTech',0,0,1), (2600,'2018-07-20','Special episode on 2600, Blue Boxes, Phreaking',3173,'We celebrate the history of hackers, with a nod to the old skool phreak community.','

\r\n2600 Hz is a frequency in hertz (cycles per second) that was used by AT&T as a steady signal to mark currently unused long-distance telephone lines.
\r\nA blue box is an electronic device that generates the in-band signaling audio tones formerly used to control long-distance telephone exchanges.
\r\nPhreaking is a slang term coined to describe the activity of a culture of people who study, experiment with, or explore telecommunication systems, such as equipment and systems connected to public telephone networks. The term phreak is a sensational spelling of the word freak with the ph- from phone, and may also refer to the use of various audio frequencies to manipulate a phone system. Phreak, phreaker, or phone phreak are names used for and by individuals who participate in phreaking.
\r\n

\r\n

Radio FreeK America 1

\r\n

\r\n02/20/02 - Trashing live, dual was \"slammed,\" trouble with Qwest, Qwest releasing customer info then backing off, Rax discusses VOMIT and subsequent fun, start your own telco or isp, Onebox.com, Slingshot pre-paid Internet access, Kondor\'s Trios tribulations, fun with the phone, and more.\r\n

\r\n\r\n

Links

\r\n\r\n',30,0,1,'CC-BY-SA','2600, Blue Box, Phreaking, Radio FreeK America',0,0,1), (2603,'2018-07-25','Dummy shares a tip and a tip/rant about asking and answering questions',1503,'Those blasted rubber coffee mug seals and \"Let me Google that for you.\"','

A quick tip on using paper towel or dish rag to easily remove stubborn travel coffee mug rubber seals followed by a semi ranty discussion on asking and responding to questions in the context of “Let me google that for you.”

\r\n

As a bonus, this is part of a series-ish set of shows I’m going to do recording with different equipment to give you the feel of the quality of shows possible with low cost equipment by someone who doesn’t know how to edit audio or speak to audiences.

\r\n',151,0,1,'CC-BY-SA','travel mug seal,asking questions',0,0,1), (2607,'2018-07-31','Processing',1777,'Klaatu introduces Processing, a Java subset and IDE suitable for graphical programming projects','

Get Processing from processing.org. Download, extract, and launch. On Linux, just click the processing file.

\r\n

Processing requires that either OpenJDK or Java to be installed.

\r\n

Processing requires a void setup() function, which is a function that Processing expects whenever an application is launched. If you don\'t have a setup function, your application still launches, but with basic Processing defaults. Try this to start with:

\r\n
void setup() {\r\n    size(480,720);\r\n}
\r\n

Click the Run button in the top left corner to launch your [very simple] application: an empty window that is 480 pixels wide and 720 pixels tall.

\r\n

Draw a rectangle on your canvas by invoking Processing\'s void draw() function:

\r\n
void draw() {\r\n    rect(10,10,80,80);\r\n}
\r\n

Click the Run button in the top left corner to launch your application.

\r\n

Add some colour to your rectangle:

\r\n
void draw() {\r\n    fill(8,120,90);\r\n    rect(10,10,80,80);\r\n}
\r\n

Click the Run button in the top left corner to launch your application.

\r\n

Make a simple painting app:

\r\n
void setup() {\r\n    size(480,720);\r\n}\r\n\r\nvoid draw() {\r\n    if (mousePressed) {\r\n        fill(20,120,90);\r\n        ellipse(mouseX,mouseY,25,25);\r\n    } else {\r\n        fill(random(10,120),random(10,80),random(20,200));\r\n    }\r\n}
\r\n

More Processing tricks: you can export your application as a standalone Java app, or as an Android .apk as long as you have the Android SDK installed.

\r\n

Processing\'s documentation is excellent. It has examples for all functions, with pictures.

\r\n',78,25,0,'CC-BY-SA','java,processing',0,0,1), (2609,'2018-08-02','SparkleShare',1460,'Klaatu demonstrates SparkleShare','

\r\nClacke mentioned SparkleShare in episode 2542, and it occurred to me that not everyone knows what Sparkleshare is. So here's a show about it.\r\n

\r\n\r\n

\r\nTo setup SparkleShare, refer to SparkleShare.org. It\'s available for Linux, Windows, and Mac; great for cross-platform collaboration.\r\n

\r\n\r\n

\r\nThe Linux installer uses FlatPak, so you do need to install that.\r\n

\r\n\r\n

\r\nOnce installed, launch SparkleShare in the usual way. If you have no usual way, you can use this command:

\r\n\r\n
\r\n$ flatpak run org.sparkleshare.SparkleShare\r\n
\r\n\r\n

\r\nThe first screen asks for your name and email. This doesn't have to be your real name and email, but it is what SparkleShare will use when making commits on your behalf. This name and email will be visible to anyone who can see your online Git repository.\r\n

\r\n\r\n

\r\nThe next screen displays the Sync Remote Project screen. You use this screen any time you want to add another share to your sparkle.\r\n

\r\n\r\n\"image\r\n\r\n

\r\nIn this episode, I set up two projects: one brand new one using my home server as host, and one that mirrors an existing project on Gitlab.com.\r\n

\r\n\r\n

Adding a project from Gitlab

\r\n\r\n

\r\nThe first thing you must do is give SparkleShare permission to access Gitlab. To do this, click on the SparkleShare icon in your system tray > SparkleShare > Client ID and copy your ID to your clipboard.\r\n

\r\n\r\n\"image\r\n\r\n

\r\nNow go to your online Git host and add this "Client ID" to your approved SSH Keys. Where this is located depends on your Git host, but in Gitlab, it's located in the left column of the Settings screen. When your SSH Key has been added, Gitlab displays a key fingerprint (actually just a string of numbers) as confirmation.\r\n

\r\n\r\n

\r\nThe path to your remote Git repository is the part of an URL after the host. It usually starts with your username. For example, if I have a project on Gitlab located at gitlab.com/notklaatu/foo.git then the path that SparkleShare needs is notklaatu/foo.git\r\n

\r\n\r\n

\r\nClick the Add button to add the project to your local SparkleShare folder.\r\n

\r\n\r\n\r\n

Adding a project hosted on your own server

\r\n\r\n

\r\nThere are a lot more variables if you're hosting a Git repository on your own server. These are the things that you may need to account for:\r\n

\r\n\r\n\r\n\r\n

Using SparkleShare

\r\n\r\n

\r\nUse SparkleShare exactly as you would DropBox or the NextCloud Desktop Client: drag-and-drop a file to add it, drag it to the Trash to delete it. All SparkleShare folders sync\'d with any given project syncs automatically through the magickalfulness of Git hooks.\r\n

\r\n\r\n\r\n\r\n',78,104,0,'CC-BY-SA','git,sparkleshare',0,0,1), (2613,'2018-08-08','Quick Awk Tip',459,'This is a tip about awk scripts.','

\r\nThis is obvious, but it tripped me up a few times after listening to the excellent Awk series by Dave and B-yeezi, so I though I\'d share it here to save others the trouble.\r\n

\r\n\r\n

\r\nWhen moving from simple awk commands to proper awk scripts, you put a shebang line at the top of your script. It\'s pretty common to many of us, because we do it for Python and Bash all the time.\r\n

\r\n\r\n

\r\nBut if you just put:\r\n

\r\n\r\n
\r\n#!/usr/bin/awk\r\n
\r\n

\r\nThen your awk script won\'t work the way you expect.

\r\n\r\n

\r\nYou must provide the -f flag:\r\n

\r\n
\r\n#!/usr/bin/awk -f\r\n
\r\n\r\n

\r\nNow you can pipe things to your awk script as expected. \r\n

\r\n\r\n\r\n',78,94,0,'CC-BY-SA','tip,awk,shebang',0,0,1), (2614,'2018-08-09','My 1948 Truetone D1835 Tube Radio',657,'I talk about my \"new\" 1948 D1835 Tube-powered radio.','

The 1948 Truetone D1835 Tube Radio

\r\n\r\n

I recently bought a vintage tube powered radio at an estate sale and in this episode I talk about it and let you hear it. Click the image to view my Flickr pictures.

\r\n\r\n

\"1948

\r\n\r\n

Watch A video showing the radio in action!

\r\n',238,0,0,'CC-BY-SA','Vintage audio, legacy technology, radio, antiques',0,0,1), (2610,'2018-08-03','Gnu Awk - Part 12',2050,'Advanced use of arrays','

Gnu Awk - Part 12

\r\n

Introduction

\r\n

This is the twelfth episode of the “Learning Awk” series which is being produced by b-yeezi and myself.

\r\n

In this episode I want to continue with the subject I started in episode 10, an advanced-level look at arrays in Awk. This episode covers patsplit which can split a string into an array, the built-in array PROCINFO which can be used to control how awk sorts arrays, as well as asort and asorti, built-in functions for sorting arrays.

\r\n

In case it might be of interest I have also included a section describing a recent use I made of awk to solve a problem.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n',225,94,1,'CC-BY-SA','Awk utility, Awk Language, gawk, arrays, sorting',0,0,1), (2617,'2018-08-14','Exposing a Raspberry Pi database through a REST API',1219,'In this episode, I discuss how I used python to make my speedtest data available across my network','

Links from the episode

\r\n\r\n\r\n',300,0,0,'CC-BY-SA','python,development',0,0,1), (2618,'2018-08-15','Yesod - First Impressions',1385,'Tuula talking about their first impressions of Yesod web framework','

First place to start is probably Yesod’s web site at: https://www.yesodweb.com/

\r\n

Often recommended environment for developing Haskell programs is Stack: https://docs.haskellstack.org/en/stable/README/

\r\n

My road to Haskell started with Learn You a Haskell for Great Good: https://learnyouahaskell.com/ and going through lecture notes of CIS 194: https://www.seas.upenn.edu/%7Ecis194/spring13/lectures.html

\r\n',364,107,0,'CC-BY-SA','haskell,yesod,web',0,0,1), (2619,'2018-08-16','A Gentle Introduction to Quilt',1225,'Quilt - the patch manager. Introduction and tutorial.','

A gentle introduction to quilt

\r\n

Or, patch management for software.

\r\n

Speaker Intro

\r\n

Hi, I\'m bjb. I\'m a programmer.

\r\n

Motivation and topic intro

\r\n

I needed to learn how to use the software tool "quilt", so you get to listen to my podcast about an introduction to quilt.

\r\n

People collaborating on a project must edit the same set of source files. After one person commits some changes, then the other people must rebase their own changes on the new version of the shared files before they can push their changes.

\r\n

A minor fix for some old typo should not be in the same patch as a new feature; a comment correction should also be in its own patch. Essentially, two new features and some bug fixes should not all be smushed together in one patch. Each feature should be in its own patch (or patch series), and each bug fix should be in its own patch. This allows others to be able to review the proposed changes easily, and even lets them pick and choose which patches they want to apply. It becomes a chore to manage all these patches. That\'s where quilt comes in.

\r\n

Sadly, I hadn\'t learned quilt till this weekend ... well one way to ensure I learn it fairly well is to write a HPR episode about it! Here goes.

\r\n

I have written this episode to be understandable by anyone - you don\'t have to be a coder. You could use this tool to keep track of any plain-text files - recipes, todo lists, html, hpr show notes, poetry, what-have-you.

\r\n

Introduction

\r\n

First let\'s describe what a patch is. No, first let\'s describe what source code looks like. Source code is a plain text file full of computer instructions. It is a plain text file, as opposed to a word processing file. Plain text files do not have any formatting codes or styles in them (such as which font should be used, or what colour, and so on). They just contain the characters that make up words of the content.

\r\n

A key feature of these source code files is that a new section of the file starts on a new line. The source code is almost never "reflowed" like prose might be. It is sort of like poetry - the more formal poetry, not prose poetry. There are a lot of really small sections in source code files (called "statements" and "expressions"). Most of these sections fit on one line. This is useful for the tools we\'re going to discuss because when one line changes it does not affect the following lines, as it might when text is reflowed after a change.

\r\n

People have been coding with plain text files in various languages for decades. Thus a large set of tooling has grown around this format. One of those tools is called "diff" and another one is called "patch".

\r\n

Diff is a way to compare two text files. Typically it would be used to compare the "before" and "after" of a source code file undergoing changes. So you could find out what was done to the source code file by running diff on the before and after versions of that file.

\r\n

A diff file is a series of excerpts from the original and changed files. There are various kinds of diffs. Some of them show only the changed lines. Some of them show a few lines before and a few lines after in addition to the changed lines themselves. That second kind is called a "context diff" and helps the automated machinery (and humans too) find the correct part of the file to which the change must be applied.

\r\n

By default there are 3 lines of context before and after the changed lines.

\r\n

The changed part is represented by including the old AND new line. In order to distinguish which lines are old and which are the replacements, all the lines (context lines, removed lines and added lines) are shifted over to the right by one character. The context lines start with a space in the extra left-most character, the original removed lines have a minus sign in the left-most character and the new added lines have a plus sign.

\r\n

Thus if any character on a line in the source file has changed, been added or removed, then the whole line will be replaced with a new line in the new file. The diff will show both the removed line and the new one.

\r\n

The patch utility takes the "diff" output and applies it to the original file to produce the later version of that file. You can apply it in reverse mode to the later version to get the original version. So patch is also a really useful program, and these two tools, diff and patch, are the basis of most of the version control systems out there. It is the existence of these text-based diff and patch tools that makes revision control systems work really well on plain-text files that are naturally structured in a line-by-line format.

\r\n

A note about terminology: the diff program produces a diff. This diff is also called a patch. The patch program takes the diff (aka patch) and applies it to the original file to produce the changed file.

\r\n

So if you have a timeline of adding a few features and making a few fixes on a code-base, it can be fully described by the original file plus a set of patches that had been produced with diff. You can get the final source code by taking the original file, applying the patches one by one, and voila, the final version of the file has been recreated.

\r\n

Now we know enough to give a concise description of quilt:

\r\n

Quilt lets you work with patches, creating them, applying them, un-applying them, and moving some things from one patch to another with a minimum of effort.

\r\n

How to use quilt

\r\n

Now a tutorial on how to get started using quilt.

\r\n

This tutorial will start with a buggy program, create a few bad patches, and fix them up into good patches. I make no claims as to the quality of the final code though. The reason for starting with bad code and patches is to illustrate how to use quilt.

\r\n

Starting to use quilt on a project

\r\n

To start using quilt, create a directory called "patches" at the top of your code or just above.

\r\n
$ mkdir patches
\r\n

If you don\'t do this, quilt will create it for you. However, first it will look for a directory called "patches" in the current working directory, its parent, and all the way up ... if it finds one, it will use it. If not, it will create one in the current directory.

\r\n

So, to keep it from finding some unrelated directory with the name "patches", just create a patches directory yourself in the right place.

\r\n

Quilt first patch, including a new file!

\r\n

You must tell quilt before you make any changes to your source code. Then it can store the original versions of the files that will change, so it can produce the diffs that will become that patch once you change the files.

\r\n

Create a directory called example, and create a file in it like this, called hello.c (don\'t fix the errors):

\r\n
#include "stdio.h"\r\n\r\nint main (int argc, char *argv[], char *env[])\r\n{\r\n    print ("Hello, world!n")\r\n    return 0;\r\n}
\r\n

Now create a new patch - that is, give it a name - before you change any code. This will create (or find) a couple of directories, "patches" and ".pc", and populate them with some files to start.

\r\n
$ quilt new fix-typo
\r\n

And now you can fix the typo and generate the patch. First start by telling quilt that you want hello.c to be in the patch. Quilt saves a copy of it aside for comparing with the later versions:

\r\n
$ quilt add hello.c
\r\n

You can get quilt to tell you what files it knows about:

\r\n
$ quilt files
\r\n

Edit the file - add a semicolon at the end of the print line, and change the double-quotes on the #include line to angle brackets:

\r\n
#include <stdio.h>\r\nprint ("Hello, world!n");
\r\n

Save the file and exit the editor. Next generate the patch:

\r\n
$ quilt refresh
\r\n

The oddly named "refresh" command creates the patch itself. It is called "refresh" because it can also be used to update the patch.

\r\n

Now you can see the current set of patches by giving the command:

\r\n
$ quilt series
\r\n

The single patch is called fix-typo, and its name in the list is coloured brownish. That is because it is the "current" patch, and it is the one that will be updated if you "quilt refresh" again with more changes.

\r\n

One thing I did not find in the quilt documentation is how to add a new file. When adding a new file, there is no existing file that you can name in the quilt add command. Of course, the very first patch I wanted to manage with quilt, I had introduced a new file. It turns out that the quilt edit command can be used to add a file to the patch, even if the file does not yet exist:

\r\n
$ quilt edit header.h
\r\n

Add content to header.h (see below) using the plain-text editor that quilt has started up for you. Save the file.

\r\n
#ifndef HEADER_HH__\r\n#define HEADER_HH__\r\n\r\n#define NAME "bjb"\r\n\r\n#endif
\r\n

Regenerate the patch with the new changes:

\r\n
$ quilt refresh
\r\n

Now you can list the patch series again with quilt series. So far there is one patch. You can see what the patch consists of with the

\r\n
$ quilt diff
\r\n

command.

\r\n
$ quilt diff\r\nIndex: hello/hello.c\r\n===================================================================\r\n--- hello.orig/hello.c\r\n+++ hello/hello.c\r\n@@ -1,8 +1,8 @@\r\n-#include "stdio.h"\r\n+#include <stdio.h>\r\n\r\n int main (int argc, char *argv[], *env[])\r\n {\r\n-    print ("Hello, world!n")\r\n+    print ("Hello, world!n");\r\n     return 0;\r\n }\r\n\r\nIndex: hello/header.h\r\n===================================================================\r\n--- /dev/null\r\n+++ hello/header.h\r\n@@ -0,0 +1,7 @@\r\n+#ifndef HEADER_HH__\r\n+#define HEADER_HH__\r\n+\r\n+#define NAME "bjb\r\n+\r\n+#endif\r\n+\r\n$
\r\n

Quilt second patch

\r\n

Now it is time to make a second patch. First we tell quilt we are moving to a new patch:

\r\n
$ quilt new prototype\r\n$ quilt edit header.h
\r\n

Edit this file again - add a function prototype.

\r\n
int do_output(const char *name);
\r\n

Create the patch and look at the list of patches:

\r\n
$ quilt refresh\r\n$ quilt series
\r\n

Now when we give the quilt series command, we see two patches. The first one is green, meaning it has been applied, and the second one is brown, meaning this is the one that quilt refresh will change if you call it.

\r\n

Again you can see what latest diff looks like by giving the quilt diff command.

\r\n
$ quilt diff
\r\n

Now let\'s unapply the latest diff:

\r\n
$ quilt pop\r\n$ quilt series
\r\n

We see that the list of patches has the same patches in it, but now the second patch is white (meaning unapplied) and the first patch is brown (meaning it is the one that would change if we edited a file and typed quilt refresh.

\r\n
$ quilt files
\r\n

That first patch has two files in it, hello.c and header.h.

\r\n

Now unapply the first diff:

\r\n
$ quilt pop\r\n$ quilt series
\r\n

Both patches are listed, and both are shown as white.

\r\n

We can see what files quilt knows about before any patches are applied:

\r\n
$ quilt files
\r\n

No files.

\r\n

Apply all the patches at once:

\r\n
$ quilt push -a\r\n$ quilt series
\r\n

And look at what files quilt knows about:

\r\n
$ quilt files
\r\n

Now quilt reports on only one file, while in the first patch it knew about two files. You must be careful to "add" each file to each patch, or it will not put the changes in those files into the patch. Luckily, quilt edit will put the files in the patch for you, so if you always start your editor with quilt edit fname, then you will have your changed files added to your patches without having to take any other action. But, if you are adding an existing file to the patch, you can add it without having to open your editor with the quilt add command:

\r\n
$ quilt add fname
\r\n

In order to avoid forgetting to add a file in a patch as I was editing, I just added all the files in the directory each time I created a new patch, whether I edited them or not.

\r\n

Split a patch in two parts

\r\n

We are going to split the first patch in two parts. We had fixed a typo and added a new file in one patch. They should be two separate patches.

\r\n

First make the first patch current:

\r\n
$ quilt pop
\r\n

Then make a copy of that patch:

\r\n
$ quilt fork
\r\n

This makes a copy of the first patch called fix-typo-2. But, it removes the first patch fix-typo and puts fix-typo-2 in the series. We need to put the first patch back, and then edit each of the two fix-typo patches so each one contains one part of the original patch.

\r\n
# edit patches/series file and put the first patch back\r\n# The file should contain:\r\n\r\nfix-typo\r\nfix-typo-2\r\nprototype
\r\n

Now edit the first patch using a plain-text editor. It is in patches/fix-typo. Remove the part about the new file, header.h. It should now look like:

\r\n
Index: hello/hello.c\r\n===================================================================\r\n--- hello.orig/hello.c\r\n+++ hello/hello.c\r\n@@ -1,4 +1,4 @@\r\n-#include "stdio.h"\r\n+#include <stdio.h>\r\n\r\n int main (int argc, char *argv[], *env[])\r\n {
\r\n

Save this file. Now edit the second patch patches/fix-typo-2 using a plain-text editor. Remove the part about the file hello.c. It should now look like:

\r\n
Index: hello/header.h\r\n===================================================================\r\n--- /dev/null\r\n+++ hello/header.h\r\n@@ -0,0 +1,7 @@\r\n+#ifndef HEADER_HH__\r\n+#define HEADER_HH__\r\n+\r\n+#define NAME "bjb\r\n+\r\n+#endif\r\n+
\r\n

If you give a quilt series command now, you will see that fix-typo-2 is the current patch and quilt thinks fix-typo has been applied.

\r\n

We have to fix up quilts idea of reality.

\r\n

Pop the current patch. Things have changed under quilts feet so we have to force this with the -f option:

\r\n
$ quilt pop -f
\r\n

Now, because quilt thought the original state of fix-typo-2 is the unchanged file, quilt shows the series as being completely un-applied.

\r\n
$ quilt series\r\npatches/fix-typo\r\npatches/fix-typo-2\r\npatches/prototype
\r\n

Now we can push the patches:

\r\n
$ quilt push -a
\r\n

Rename a patch

\r\n

Here we rename a patch from fix-typo-2 to add-header. The quilt rename command acts on the current patch, so make fix-typo-2 current first:

\r\n
$ quilt pop fix-typo-2\r\n$ quilt rename add-header\r\n$ quilt series\r\n$ quilt push -a
\r\n

Reorder the patch series

\r\n

We will make a new patch, then move it earlier in the series:

\r\n

First make the new patch:

\r\n
$ quilt new printf\r\n$ quilt edit hello.c
\r\n

And change the print statement to:

\r\n
printf("Hello, world!n");
\r\n

Save the patch:

\r\n
$ quilt refresh
\r\n

Now to demonstrate the reordering.

\r\n

Unapply all the patches, edit the patches series file patches/series so the patches are in the order you like, and then re-apply the patches. If you are lucky, they will re-apply with no conflicts.

\r\n
$ quilt pop -a\r\n$ vi patches/series\r\n# move "printf" between fix-typo and add-header.\r\n# now all the bug-fixes are at the beginning of the series\r\n$ quilt push -a
\r\n

Merge two patches into one

\r\n

Make another new patch:

\r\n
$ quilt new output-function\r\n$ quilt edit hello.c
\r\n

Change the c file to this:

\r\n
#include <stdio.h>\r\n\r\nint do_output(const char *name)\r\n{\r\n    return printf("Hello, %s!n", name);\r\n}\r\n\r\nint main (int argc, char *argv[], char *env[])\r\n{\r\n    /* ignoring the return code for do_output */\r\n    do_output(NAME);\r\n    return 0;\r\n}
\r\n
$ quilt refresh
\r\n

Now, to merge two patches into one:

\r\n
$ quilt pop prototype\r\n$ quilt fold < patches/output-function
\r\n

We have merged the prototype and output-function patches, because they describe a related change.

\r\n

Save the patch.

\r\n
$ quilt refresh
\r\n

Throw away a patch

\r\n

Now we no longer need the last patch, output-function, as it has been included into the prototype patch. But we might want to rename the prototype patch.

\r\n
$ quilt delete output-function\r\n# we have to clean up a bit for quilt or the rename won't work\r\n$ rm patches/output-function\r\n$ quilt rename output-function
\r\n

Deleting will not work on a patch that has been applied before the current patch.

\r\n

You are ready to contribute your patches ... go forth and code.

\r\n

Summary

\r\n

We have seen that quilt can help you manage your contributions to any project that is written in plain-text files. It can generate patch files (usually needed for contributions to open source projects) and can help you manage and update them as the tip of the development branch moves forward with other peoples\' contributions.

\r\n

To use quilt successfully, you need to remember to add files to each patch with quilt add/or quilt edit before editing, and to generate the patch with quilt refresh once all the editing of each patch is done. The rest is easy.

\r\n

Commands that edit the patches:

\r\n
$ quilt new patch-name\r\n$ quilt add fname\r\n$ quilt edit fname\r\n$ quilt refresh\r\n$ quilt pop [-a]\r\n$ quilt push [-a]\r\n$ quilt rename [-P oldname] newname\r\n$ quilt delete [-P patchname]\r\n$ quilt fold < patch_to_merge
\r\n

Commands that view the state of the patches:

\r\n
$ quilt series\r\n$ quilt files\r\n$ quilt diff [-P patchname]\r\n$ quilt graph [--all]\r\n$ quilt patches fname\r\n$ quilt annotate fname\r\n$ quilt applied\r\n$ quilt unapplied
\r\n

HPR exhortation

\r\n

You\'ve been listening to Hacker Public Radio. Anyone can make a show -if I can do it, so can you.

\r\n',357,0,0,'CC-BY-SA','quilt, patch, diff, plain-text, editor',0,0,1), (2627,'2018-08-28','Home Phone Setup!!',1402,'This episode we set up a small phone system.','

I’m not sure what the echoing is about. It could be picked up from my cell phone’s speaker. Also, I call ftp “tiny ftp” It actually stands for “trivial ftp”

\r\n

\"https://theadesilva.com/hpr_phone1.jpg\" \"https://theadesilva.com/hpr_phone2.jpg\" \"https://theadesilva.com/hpr_phone3.jpg\" \"https://theadesilva.com/hpr_phone4.jpg\"

\r\n

tftp file for xinetd:

\r\n
service tftp\r\n{\r\n protocol = udp\r\n port = 69\r\n socket_type = dgram\r\n wait = yes\r\n user = nobody\r\n server = /usr/sbin/in.tftpd\r\n server_args = /tftpboot\r\n disable = no\r\n per_source = 11\r\n cps = 100 2\r\n flags = IPv4\r\n}
\r\n

voipbuster config files look like this:

\r\n
SIPDefault.cnf:\r\n  nat_enable: 1\r\n\r\nSIP<mac address>.cnf:\r\nproxy1_address: sip.voipbuster.com\r\nline1_name: outside\r\nline1_authname: <user>\r\nline1_displayname: outside\r\nline1_password: <password>
\r\n

github projects:

\r\n\r\n

scripts:

\r\n
=============================\r\nconst login = require("facebook-chat-api");\r\n\r\nlogin({email: "FB_EMAIL", password "FB_PASSWORD"}, (err, api) =>\r\n{\r\n  if(err) return console.error(err);\r\n  api.listen((err,message) => {\r\n   api.sendMessage(message.body, message.threadID);\r\n  });\r\n});\r\n\r\n=============================\r\n\r\n#!/bin/sh\r\nlame "$2" -o "$2".mp3\r\n\r\nscp "$2.mp3" planetearth.us:\r\nssh planetearth.us ./runner ""$2.mp3""\r\n\r\n==============================\r\n\r\n#!/bin/sh\r\n\r\necho "$@" | sed -e s/ /_/g > runner_tmp\r\ndoas mv "$1" /var/www/theadesilva.com/html/$cat runner_tmp)\r\nnode ./oo.js\r\n\r\n==============================\r\n\r\nfs= require('fs');\r\nlogin = require('facebook-chat-api');\r\n\r\nfs.readFile('runner_tmp', 'utf8', function (err, data) {\r\n login({email: "FB_EMAIL", password: "FB_PASSWORD"}) => {\r\n  if(err) return console.error(err);\r\n\r\n  api.sendMessage("New voicemail at 1109's front door "https://theadesilva.com/" + data + """ , THREAD_ID);\r\n });\r\n});\r\n\r\n===============================
\r\n',115,0,0,'CC-BY-SA','sip kamailio ',0,0,1), (2637,'2018-09-11','Convert it to Text',981,'This episode will make you want to TXT all the things.','

Why use plain text?

\n\n

Ranger for the win

\n\n
case "$extension" in\n    odt|odp)\n        try odt2txt "$path" && { dump | trim | fmt -s -w $width; exit 0; };;
\n

Tools in the toolset

\n\n

Bonus tools

\n\n',300,0,0,'CC-BY-SA','Unix,text,portability,ranger',0,0,1), (2628,'2018-08-29','UK Telephone Network Exploration',589,'I describe the process of finding interesting phone numbers on the UK telephone network.','

If you have any questions regarding the show. Please leave them on the show page, or email me at james@jamesdotcom.com or twitter @Xtrato.

\r\n

My PGP key can be found here: https://jamesdotcom.com/pub.txt

\r\n',368,0,0,'CC-BY-SA','UK telephone network,British Telecom,BT',0,0,1), (2630,'2018-08-31','Open Source Gaming: Revisiting Meridian 59',229,'Discussing the steam release of Meridian 59 (recorded before release)','\r\n',354,0,1,'CC-BY-SA','Meridian 59,Steam',0,0,1), (2633,'2018-09-05','Elm - First Impressions',1819,'My first impressions on Elm programming language','\r\n',364,0,1,'CC-BY-SA','elm, first impressions, programming language',0,0,1), (2634,'2018-09-06','Git tag and metadata',1149,'An intro to git tags and how to view metadata about your Git repository.','

Tag a commit:

\r\n\r\n
\r\n$ git tag 0.1\r\n$ git tag\r\n0.1\r\n
\r\n\r\n

\r\nDelete a tag:\r\n

\r\n\r\n
\r\n$ git tag -d 0.1\r\n
\r\n\r\n

\r\nGet the latest commit hash:\r\n

\r\n\r\n
\r\n$ git rev-list --tags --max-count=1\r\n94c5715694c5715687a962008dd71191460fc4e32370425a\r\n
\r\n\r\n

\r\nGet any tag on a commit:\r\n

\r\n\r\n
\r\n$ git describe --tags 94c5715\r\n0.1\r\n
\r\n\r\n',78,104,0,'CC-BY-SA','git',0,0,1), (2635,'2018-09-07','Running your own mainframe on Linux (for fun and profit)',3321,'This talk is about running your own mainframe on your own hardware.','

Yes, this talk is about running your own mainframe on your own hardware. Mainframes are old, yes, but they are still very much alive. New hardware is still being developed and there are a lot of fresh jobs in this area too. A lot of mainframes run COBOL workloads. COBOL is far from a dead language. It processes an estimated 85% of all business transactions, and 5 billion lines of new COBOL code are written every year. In this session the speaker will help you in take your first steps towards running your own mainframe. If you like then after this session you can continue to build your knowledge of mainframe systems using the links provided during the talk. Come on in and learn the basics of a completely different computer system! And it will take you less than an hour to do that!

',369,0,0,'CC-BY-SA','hercules,linux',0,0,1), (2660,'2018-10-12','Installing a bootloader on an Arduino',399,'Ken uses a Arduino Uno to load a bootloader on an Arduino Nano','

\r\nIn this show you will learn how to install a bootloader on an Arduino using another Arduino via In-Circuit Serial Programming (ICSP)\r\n

\r\n\r\n

\r\nAll credit goes to M-SHORT over at SparkFun for the excellent tutorial.\r\n

\r\n\r\n
    \r\n
  1. Arduino IDE > File > Examples > 11.ArduinoISP > ArduinoISP
  2. \r\n
  3. Tools > Board > {your board}
  4. \r\n
  5. Tools > Programmer > Arduino as ISP
  6. \r\n
  7. Tools > Burn Bootloader
  8. \r\n
',30,0,1,'CC-BY-SA','Arduino, Boot Loader, ISP, ICSP',0,0,1), (2620,'2018-08-17','Thoughts on language learning part 1',1471,'My thoughts on an approach to language learning which makes sense to me.','

This is the first part of a 3 part series in which I ramble on about my thoughts on language learning. I’m no expert and I barely know one language well. In a nutshell:

\r\n
    \r\n
  1. Teach as much as possible in the new language, focusing on vocabulary.
  2. \r\n
  3. Rather than starting with baby books, which might not be a bad idea, try to use a similar approach but assume the learners know a bit about how the world works.
  4. \r\n
  5. The goal is to get to about age 5-6 level in vocabulary so the learner can then switch to language books in the new language which already exist.
  6. \r\n
',151,0,0,'CC-0','spoken language learning',0,0,1), (2622,'2018-08-21','Raspberry Pi Temperaturator',272,'I invite my 6 year-old daughter on to discuss how we setup a temperature monitor on her pi','

Items used

\r\n\r\n',300,103,1,'CC-BY-SA','raspberry pi',0,0,1), (2625,'2018-08-24','My thoughts on language learning communication applications.',980,'I discuss some of my thoughts regarding using chat programs in language learning','

This is the second in the series of my thoughts on language learning. In this episode I talk about it might be useful to modify existing chat programs to use two spell checking databases, one for the native language and one for the new language and have words removed from the native language dictionary as the learner advances.

\r\n

I did forget to mention that something similar might be done with the grammar checkers, too.

\r\n',151,0,0,'CC-0','spoken language learning',0,0,1), (2647,'2018-09-25','More Quick Tips',1010,'More Quick Tips For July - Only Key and Nerf Guns','

https://onlykey.io/collections/all/products/onlykey-color-secure-password-manager-and-2-factor-token-u2f-yubikey-otp-google-auth-make-password-hacking-obsolete?variant=469626486828

\r\n

Nerf

\r\n\r\n',36,0,1,'CC-BY-SA','Nerf gun,dart,OnlyKey,password',0,0,1), (2652,'2018-10-02','Liverpool Makefest 2018 - Interview with Caroline and John',440,'This is the final interview from this years Liverpool Makefest','

This is the final interview from this years Makefest 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.

\r\n

https://lpoolmakefest.org/

\r\n',338,78,0,'CC-BY-SA','Liverpool Makefest 2018, computing, young coders, hackers, makers, crafts',0,0,1), (2629,'2018-08-30','Thoughts on language learning part 3 - game/story mode.',1564,'I discuss some of my thoughts on how games might help in language learning.','

This is the last of 3 parts on my thoughts on language learning. This one introduces my thoughts on how games might be used in language learning. More or less the same concepts from the first two episodes only applied to game/story design.

\r\n

NOTE: I’m not a game designer.

\r\n

On the off chance this sounds interesting to you, hpr2620 and hpr2625 are the other two.

',151,0,0,'CC-BY-SA','spoken language learning',0,0,1), (2623,'2018-08-22','Actors and Agents, Sprites and Fractals',3426,'In which I sit down with cwebber and try to keep it short, but end up with an hour of tangents','

Plugs:

\r\n\r\n

More information on the topics covered:

\r\n\r\n',311,0,0,'CC-BY-SA','flow-based, actors, fractalide, racket, ocap, mud, programming',0,0,1), (2624,'2018-08-23','Cycling through Brussels',1327,'On a hot day Knightwise rides his bike through Brussels.','

Cycling Through Brussels

\r\n\r\n',111,0,1,'CC-BY-SA','cycling,Brussels',0,0,1), (2638,'2018-09-12','Dirt cheap Magic',2410,'Magic the Gathering for cheapskates','

In this episode, Klaatu talks about playing Magic: The Gathering for cheap.\r\n

\r\n\r\n

\r\nSee rpggeek.com/thread/532036/how-build-deck-magic-gathering by Eric Jome for a good deck building formula.\r\n

',78,95,0,'CC-BY-SA','magic,mtg',0,0,1), (2639,'2018-09-13','Some ancillary Bash tips - 9',1305,'Making decisions in Bash (part 1)','

Some ancillary Bash tips - 9

\r\n

Making decisions in Bash

\r\n

This is my ninth contribution to the Bash Scripting series under the heading of Bash Tips. The previous episodes are listed below in the Links section.

\r\n

It seems to me that it would be worthwhile looking at how Bash can be used to make decisions, such as how many times a loop should cycle (looping constructs) or to choose between multiple choices (conditional constructs). Of course we need to look at some of the expressions used in conjunction with the commands that do these tasks – the tests themselves – and we’ll do this in this episode.

\r\n

This is a complex area which I had some trouble with when I first started using Bash, and there is a lot to say about it all. I have prepared a group of HPR shows about this subject, in order to do it justice, and this is the first of the group.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','Bash,test,true,false',0,0,1), (2649,'2018-09-27','More ancillary Bash tips - 10',1372,'Making decisions in Bash (part 2)','

More ancillary Bash tips - 10

\r\n

Making decisions in Bash

\r\n

This is my tenth contribution to the Bash Scripting series under the heading of Bash Tips. The previous episodes are listed below in the Links section.

\r\n

We are currently looking at decision making in Bash, and in the last episode we examined the tests themselves. In this episode we’ll look at the constructs that use these tests: looping constructs, conditional constructs and lists of commands.

\r\n

Note: this episode and the preceding one were originally recorded as a single episode, but because it was so long it was split into two. As a consequence the audio contains references to examples such as bash9_ex2.sh where the true name is bash10_ex1.sh. The notes have been updated as necessary but not the audio.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','Bash,test,while,until,if,case',0,0,1), (2659,'2018-10-11','Further ancillary Bash tips - 11',1702,'Making decisions in Bash (part 3)','

Further ancillary Bash tips - 11

\r\n

This is the eleventh episode in the Bash Tips sub-series. It is the third of a group of shows about making decisions in Bash.

\r\n

In the last two episodes we saw the types of test Bash provides, and we looked briefly at some of the commands that use these tests. Now we want to start examining the expressions that can be used in these tests, and how to combine them. We will also start looking at string comparisons in extended tests.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','Bash,test,conditional expression,string comparison,pattern',0,0,1), (2645,'2018-09-21','Blinking LED',1390,'In this live show, Ken sees if he can follow simple instructions','

\r\nDuring the New Year Show Ken soldered a component tester. Unfortunately this did not work. \r\n

\r\n

\r\nNYBill offered to fix it and he succeeded in his show hpr2591 :: International Troubleshooting. When he shipped it back he included two 555 timers with the message: Now, figure out how to make LED\'s blink\r\nwith those 555\'s! \r\n

\r\n

\r\n\r\nIn this show Ken uses the online guide FLASHING L.E.D. USING 555 TIMER By Trilesto to do this. \r\n

',30,103,1,'CC-BY-NC-SA','555, NYBill, pico, nano',0,0,1), (2640,'2018-09-14','Another Rambling Drive Into Work',835,'An second attempt at making a show on the way into work','

It’s been a while since I posted my first attempt at recording a show in my car, this attempt was recorded not that long after that but I’d forgotten to post it, hopefully, it’s not too boring.

\r\n

This is the previously mentioned dictation device I used
\r\nhttps://www.amazon.co.uk/HccToo-Multifunctional-Rechargeable-Dictaphone-Conversation/dp/B015H9JP6S/ref=sr_1_1?ie=UTF8&qid=1502381150&sr=8-1&keywords=dictation+machines

\r\n

An article that explains how to remove noise using Audacity, which was what dodddummy was talking about when he commented on my first show on HPR2377 https://www.podfeet.com/blog/recording/how-to-remove-noise-with-audacity/

\r\n

Link to Dave’s (thelovebug) page and the original John Kulp’s $2 microphone show that kicked all this off. Looking forward to getting a chance to catch up with Dave’s drive into work show. Refer to Dave’s episode HPR2400 and John Kulp’s original $2 microphone show HPR1812

\r\n

Link to the microphone originally recommended By John Kulp
\r\nhttps://www.amazon.co.uk/Neewer-3-5mm-Hands-Computer-Microphone/dp/B005DOTSM4/

\r\n

A link from StackExchange that details the wiring diagram for Kenwood style microphone used in many portable Amateur radios
\r\nhttps://ham.stackexchange.com/questions/1891/whats-the-pinout-for-kenwood-2-5mm-trs-3-5-mm-trs-connector

\r\n

This is a small article in Wikipedia that covers the Electret Microphone which is the type used in the microphone recommended by John Kulp, Dave (thelovebug) and now me.
\r\nhttps://en.wikipedia.org/wiki/Electret_microphone

\r\n',201,0,1,'CC-BY-SA','recording, podcasting, audio, microphone, car, Audacity',0,0,1), (2642,'2018-09-18','My swedish and german Podcasts Part 2',318,'I talk about 6 more podcasts in swedish and german. This time no radio network involved.','\r\n',309,75,1,'CC-BY-SA','podcast,swedish,german,ccc',0,0,1), (2916,'2019-10-07','HPR Community News for September 2019',4081,'HPR Volunteers talk about shows released and comments posted in September 2019','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2891Mon2019-09-02HPR Community News for August 2019HPR Volunteers
2892Tue2019-09-03Stardrifter RPG Playtest Part 02lostnbronx
2893Wed2019-09-04Whats in the box! Part 2NYbill
2894Thu2019-09-05Repairing a Musical Instrument CaseJon Kulp
2895Fri2019-09-06The work of fire fighters, part 2Jeroen Baten
2896Mon2019-09-09Orange PI Zero LTS versionJWP
2897Tue2019-09-10Stardrifter RPG Playtest Part 03lostnbronx
2898Wed2019-09-11Modeling people in space gameTuula
2899Thu2019-09-12Endeavour OSTony Hughes AKA TonyH1212
2900Fri2019-09-13Better Social Media 01 - IntroductionAhuka
2901Mon2019-09-16Describing how I listen to podcasts PART 3MrX
2902Tue2019-09-17Stardrifter RPG Playtest Part 04lostnbronx
2903Wed2019-09-18What is PMEMJWP
2904Thu2019-09-19DIY URL shorteningklaatu
2905Fri2019-09-20Two HPR hosts living in the same region finally meet up!Dave Morriss
2906Mon2019-09-23Feature Engineering for Data-Driven Decision Makingb-yeezi
2907Tue2019-09-24Stardrifter RPG Playtest Part 05lostnbronx
2908Wed2019-09-25Modeling opinions in space gameTuula
2909Thu2019-09-26ONICS Basics Part 3: Networking FundamentalsGabriel Evenfire
2910Fri2019-09-27Better Social Media 02 - PlusporaAhuka
2911Mon2019-09-30my internet connectionJezra
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 17 comments in total.

\n

Past shows

\n

There are 3 comments on\n3 previous shows:

\n\n

This month\'s shows

\n

There are 14 comments on 9 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-September/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month: windigo

\n

Over the period tags and/or summaries have been added to 1 show which was without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n

Change to the Missing Tags document

\n

The section of this document which lists all of the tags currently in the system has been made more accessible. If you know of a tag in the system and you want to find out how many instances there are and which shows use them you can construct a query of the form:

\n
https://hackerpublicradio.org/report_missing_tags.php#vim
\n

This would look for the tag \'vim\' and position the page at the relevant place.

\n

If the tag you are looking for contains spaces, you need to replace them with underscores. So to look for the tag \'vietnamese stringed instruments\' your query would have to be:

\n
https://hackerpublicradio.org/report_missing_tags.php#vietnamese_stringed_instruments
\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2936,'2019-11-04','HPR Community News for October 2019',2514,'Ken discusses last months shows and talks about OggCamp, FLOSS Weekly, FOSDEM, and Star Wars.','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Carl.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2912Tue2019-10-01Stardrifter RPG Playtest Part 06lostnbronx
2913Wed2019-10-02Windows, SDN, and FirewallsBeto
2914Thu2019-10-03Describing how I listen to podcasts PART 4MrX
2915Fri2019-10-04Intro - My Recording SetupCarl
2916Mon2019-10-07HPR Community News for September 2019HPR Volunteers
2917Tue2019-10-08Stardrifter RPG Playtest Part 07lostnbronx
2918Wed2019-10-09Selecting random item from weighted listTuula
2919Thu2019-10-10hosting software in HPR show notesJezra
2920Fri2019-10-11Better Social Media 03 - MeWeAhuka
2921Mon2019-10-14Geocaching with the familythelovebug
2922Tue2019-10-15Stardrifter RPG Playtest Part 08lostnbronx
2923Wed2019-10-16Describing how I listen to podcasts PART 5MrX
2924Thu2019-10-17Hacking an Alarm Clock to Make it QuieterJon Kulp
2925Fri2019-10-18LinuxLugCast\'s Memorial for FiftyOneFifty Honkeymagoo
2926Mon2019-10-21Full Circle MagazineTony Hughes AKA TonyH1212
2927Tue2019-10-22Stardrifter RPG Playtest Part 09lostnbronx
2928Wed2019-10-23Building markov chains with HaskellTuula
2929Thu2019-10-24Recovering Files from a Dead MacBook AirJon Kulp
2930Fri2019-10-25Better Social Media 04 - DiasporaAhuka
2931Mon2019-10-28Wallabag for on premises article aggregationb-yeezi
2932Tue2019-10-29Stardrifter RPG Playtest Part 10lostnbronx
2933Wed2019-10-30A walk through my PifaceCAD Python code – Part 1MrX
2934Thu2019-10-31Server Basics 106: Namespaces and containersklaatu
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 14 comments in total.

\n

Past shows

\n

There are 7 comments on\n5 previous shows:

\n\n

This month\'s shows

\n

There are 7 comments on 5 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-October/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

FLOSS Weekly

\n

Ken Fallon and Ahuka appeared on FLOSS Weekly Episode 553 on October 30th 2019 to talk about Hacker Public Radio.

\n

OggCamp 2019

\n

There was an HPR presence at OggCamp 2019. This was held at The Manchester Conference Centre during the weekend of October 19th and 20th 2019. We had an HPR table, which was manned by many HPR hosts and received many visitors. Ken recorded interviews which will be released later in November.

\n

FOSDEM 2020

\n

A request has been made to get a Podcasters table at FOSDEM 2020.

\n

HPR on podcast networks

\n

We need some help getting HPR on Google Podcasts, Stitcher, Soundcloud, etc.

\n

Ken versus espeak

\n

Which is preferable, the espeak show summary or Ken’s new reading of the information?

\n

Watching Star Wars for the first time

\n

A question: should it be watched in Episode or Production Order?

\n

Tags and Summaries

\n

There were no tag or summary updates in the past month.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2643,'2018-09-19','The Payoff In Storytelling',677,'A brief look at the emotional structure of story endings.','

Lostnbronx takes a quick look at how story endings need to be structured in order to be satisfying. Lots of endings are possible, but they don’t all require the same treatment. Some can be abrupt, some can be sad, but all of them need to meet certain emotional expectations.

\r\n',107,105,0,'CC-0','stories,storytelling,endings,lostnbronx',0,0,1), (2644,'2018-09-20','Error on show 2642',59,'Error error','

The right podcast is:

\r\n',309,75,0,'CC-BY-SA','podcast, swedish, correction',0,0,1), (2648,'2018-09-26','Explaining the controls on my Amateur HF Radio Part 1',1646,'I attempt to explain the controls on my Kenwood TS940S HF Amateur Radio.','

In this episode, I cover the transmit section controls.

\r\n\r\n\r\n

Further info and clarification

\r\n

Below I’ll cover some of the items I missed or didn’t understand when I recorded my off the cuff episode. If I miss something you may find it in the user manual link above.

\r\n

Full and Semi break-in mode is used when operating in CW mode (Morse Code). In full break-in mode the radio jumps back into receive the moment the mores key is released this way you can hear if the station is trying to contact in-between each press of the key. This is very demanding on the radio as it must switch very quickly back into receive mode it can also be distracting for the operator hearing hissing noise between each dot and dash. Semi break-in mode is a bit like using VOX mode in speech the radio goes silent between each dot and dash but will return to receive after the mores key is released for a predetermined time interval.

\r\n

The digital display used on the main display of the TS940S is apparently a Vacuum Fluorescent Display not the more usual LED of the time.

\r\n

The TS 940S was manufactured around 1986, so unbelievably that means my wonderful radio that to me looks fairly modern is around 30 years Old! I believe this HF radio was top of the line for Kenwood back then.

\r\n

The Auto and thru button is used to connect the auto tuner in line with the antenna. When AUTO is selected the radio is connected to the Auto internal tuner and then to the antenna. In THRU the radio bypasses the auto tuner and connects the radio directly to the antenna.

\r\n

The Speech Compressor

\r\n

During SSB operation it is desirable to increase the relative “talk power” of the transceiver by using speech processor circuitry. The speech processor control is set by using the in and out rotary control. The in control level is set by putting the meter into Comp and adjusting the in control to no more than 10 dB of compression. The out control level is set by putting the meter into ALC and adjusting the out control to ensure the meter stays within the ALC section of the meter.

\r\n

IC meter position indicates the power transistor collector current

\r\n

VC meter position indicates the power transistor collector voltage

\r\n

Noise Blanker 1 (NB1)
\r\nFor pulse type noise, such as generated by automatic ignition systems.

\r\n

Noise Blanker 2 (NB2)
\r\nFor long duration pulse noise, like the Russian woodpecker.

',201,43,1,'CC-BY-SA','Amateur, Radio, Ham',0,0,1), (2650,'2018-09-28','My Pocket Knife',505,'Shane talks about his pocket knife for a few minutes.','

\r\nThe pocket knife Shane talks about is the Number 6 knife made by the French company Opinel, It costs about $20 (Canadian). This version has a walnut handle.\r\n

\r\n

\r\n\r\n\"Opinel\r\n\r\n

\r\n',250,23,0,'CC-BY-SA','lock knife,Opinel knife',0,0,1), (2653,'2018-10-03','Using the EXACT Function in Excel',199,'Shane explains that he just learned a simple and useful Excel function.','

The function looks like =EXACT(A1,D1) and its purpose is to tell you if A1 contains the exact same value as D1 or not.

\r\n',250,0,0,'CC-BY-SA','Excel',0,0,1), (2654,'2018-10-04','Making Crepes',767,'Shane makes crepes from a simple recipe. ','

Crepe Recipe:

\r\n\r\n

Cinnamon Sugar Mixture Recipe:

\r\n\r\n',250,93,0,'CC-BY-SA','crepes, cooking, parenting',0,0,1), (2655,'2018-10-05','Sleep Apnea and Afib',705,'How Sleep Apnea and Atrial Fibrillation entered my life','

The last of my personal health issue shows covers two related issues, Sleep Apnea and Atrial Fibrillation. They are related because Sleep Apnea is a cause of Atrial Fibrillation. Fortunately both can be controlled if you follow medical directions.

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Apnea, Heart, Afib, Atrial Fibrillation',0,0,1), (2656,'2018-10-08','Explaining the controls on my Amateur HF Radio Part 2',844,'In this episode I cover the mode and frequency selection controls of my Kenwood TS 940S','

Radio Mode and frequency controls on Amateur HF Radio TS940S

\r\n\r\n

The “T-F Set” button is used to set the Transmit frequency when working in split mode. In split mode, you can set the radio to transmits on one frequency and receives on a different frequency.

',201,43,1,'CC-BY-SA','Amateur, Radio, Ham',0,0,1), (2665,'2018-10-19','Exercise and Diet',1041,'Exercise and Diet are primary to health','

The best things you can do to maximize your health are to watch what you eat and make sure you get exercise. These are some of the primary tools in my kit for staying healthy and living a long life.

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Exercise, Diet',0,0,1), (2675,'2018-11-02','YouTube Playlists',767,'How to solve a problem with following YouTube channels','

I am subscribed to a number of YouTube channels, and I found a need to be able to watch all of the videos in order for certain channels. This describes how to do it.

\r\n\r\n',198,0,0,'CC-BY-SA','YouTube, Channels, Playlists',0,0,1), (2685,'2018-11-16','Scientific and Medical Reports',854,'We need to be careful about evaluating news reports about medical studies','

We get bombarded with breathless news stories about medical breakthroughs that may not be as reliable as they are presented. This begins our look at what is reliable and what you need to watch out for.

\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Medical Studies, News Reports',0,0,1), (2695,'2018-11-30','Problems with Studies',798,'Some principles for evaluating medical studies','

All medical studies are not alike. Some are of higher quality than others, and the conclusions they reach need to be evaluated based on some principles of good research. Here we take a look at some warning signs of bad or unreliable studies.

\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Medical Studies, Evaluating Studies',0,0,1), (2705,'2018-12-14','Evidence-based Medicine',1013,'Medicine should be based on objective scientific evidence','

Basing medical care and treatment on the scientific evidence should be the norm, but frequently it is not. Doctors may treat based on how they have always done it, or how other doctors do it (i.e. best practices), but there is a movement now to reorient medicine to follow the best scientific guidelines.

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Medicine, Evidence, Science',0,0,1), (2669,'2018-10-25','Additional ancillary Bash tips - 12',1702,'Making decisions in Bash (part 4)','

Additional ancillary Bash tips - 12

\r\n

Making decisions in Bash

\r\n

This is the twelfth episode in the Bash Tips sub-series. It is the fourth of a group of shows about making decisions in Bash.

\r\n

In the last three episodes we saw the types of test Bash provides, and we looked briefly at some of the commands that use these tests. We looked at conditional expressions and all of the operators Bash provides to do this. We concentrated particularly on string comparisons which use glob and extended glob patterns.

\r\n

Now we want to look at the other form of string comparison, using regular expressions.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','Bash,test,regular expression',0,0,1), (2657,'2018-10-09','Why we are all going to shit in 30 years due to computers',1555,'Some thoughts about the increasing impact of automation','

Now, this is not a doom and gloom lecture.

\r\n

Actually it is a talk about what is going to happen in the next 30 years.

\r\n

It is a talk about what is called “postcapitalism”.

\r\n

It is a talk about how almost all jobs are going to disappear due to automation. But also how we are going to think about this this and come up with solutions.

\r\n

It talks about the three big challenges we need to face.

\r\n

And yes, this involves you as well!

\r\n',369,0,1,'CC-BY-SA','prediction,post-capitalism',0,0,1), (2658,'2018-10-10','Questions on podcast production',2784,'Al asks Dave questions about podcast production','

HPR Chat with Al

\r\n

Al asks Dave a number of questions about podcast audio recording and post-production.

\r\n

Al is thinking of doing National Podcast Post Month in November

\r\n

National Podcast Post Month (or NaPodPoMo) is a challenge in a similar vein to National Novel Writing Month (or NaNoWriMo) in which participants are challenged to produce and publish a piece of audio as a podcast, every day for the month of November.

\r\n

Bad podcast audio

\r\n

Audio quality is as important as the content that\'s being presented. Bad audio is going to be what causes new podcasters the most damage in subscriber numbers. An example of good audio is the true crime podcast, One Eye Open, which Dave started listening to a couple of weeks ago. He also picked up a couple of other true crime podcasts as a result of listening to One Eye Open where the audio quality is so bad, that they can\'t be heard!

\r\n

Loudness is a measurement of how loud something is perceived to be. Levelling is a process of ensuring that individual tracks in a podcasts are an an equivalent level, but also the podcast overall is at an equivalent level to other podcasts that have been levelled the same way.

\r\n

Our setups

\r\n

Al and Dave have a very similar microphone setup.

\r\n\r\n

What is a compressor

\r\n

The non-technical definition is that it brings up the quiet bits and brings down the louder bits so that your voice has less of a variance if you shout or whisper.

\r\n

Different microphone types

\r\n\r\n

Your level

\r\n

You can measure your own level in Audacity - make sure you stay in the green! If you stray into yellow or even red, either lower your level or move slightly away from the mic.

\r\n

Other people\'s levels

\r\n

Concentrate on your own, get others to manage theirs. If you\'re recording multiple tracks, it can be managed in post-production, but once it\'s been merged into a single track it\'s virtually impossible.

\r\n

File formats

\r\n\r\n

Record in a lossless format, and do your edits and post-production in a lossless format. Only transcode to a lossy format once you\'re ready to publish your final file.

\r\n

Monitoring

\r\n

If you\'re recording yourself, and you don\'t want to hear yourself through headphones, take the headphones off.

\r\n

If you\'re recording with someone else who is not in the same room, you are better off hearing yourself through your headphones at the same level as the person you\'re talking to.

\r\n

Post-production

\r\n\r\n

NaPodPoMo revisited

\r\n

This will be Al\'s first attempt at NaPodPoMo, but not for Dave. Dave wants to make sure that he plans for this year, so he doesn\'t run out of material on day 7!!

\r\n

Dave will interview another NaPodPoMo participant at least once a week during November. Looks like Al will be one of them!

\r\n\r\n

Dave\'s final thought

\r\n

Podcasting isn\'t rocket science. You don\'t need lots of expensive equipment to produce a podcast. You just need something to record into (e.g. a mobile phone or portable recorder) and somewhere to host it. You can host on your own website or on one of a number of free services, like Anchor, AudioBoom, or indeed Hacker Public Radio!

\r\n

The obligatory podcast plug

\r\n\r\n

Errata

\r\n\r\n',290,0,0,'CC-BY-SA','Admin Admin Podcast',0,0,1), (2661,'2018-10-15','My Music Production Setup',679,'ClaudioM shares his music production setup.','

Previous Music Production Setup

\r\n\r\n

Current Music Production Setup

\r\n\r\n

Notable Mentions

\r\n\r\n

Linux-oriented Links

\r\n\r\n',152,0,0,'CC-BY-SA','music, multimedia, audio, linux, musicproduction, foss, floss',0,0,1), (2679,'2018-11-08','Extra ancillary Bash tips - 13',2202,'Making decisions in Bash (part 5)','

Extra ancillary Bash tips - 13

\r\n

Making decisions in Bash

\r\n

This is the thirteenth episode in the Bash Tips sub-series. It is the fifth and final of a group of shows about making decisions in Bash.

\r\n

In the last four episodes we saw the types of test Bash provides, and we looked briefly at some of the commands that use these tests. We looked at conditional expressions and all of the operators Bash provides to do this. We concentrated particularly on string comparisons which use glob and extended glob patterns then we devoted an episode to Bash regular expressions.

\r\n

Now we want to look at the final topic within regular expressions, the use of capture groups.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','Bash,extended test,regular expression,capture group,BASH_REMATCH,back reference',0,0,1), (2690,'2018-11-23','A chat about the HiveMQ Broker',425,'Ken talks with Florian Raschbichler and Anja Helmbrecht-Schaar about HiveMQ','

\r\nI had the opportunity to chat with Florian Raschbichler and Anja Helmbrecht-Schaar from the company dc-square GmbH, who are developers of the HiveMQ Broker.\r\n

\r\n

\r\nIf you are new to MQTT they have the ultimate kickstart for MQTT beginners. They also maintain an MQTT Client Library Encyclopedia\r\n

\r\n\r\n\r\n

Links

\r\n',30,78,0,'CC-BY-SA','MQTT, HiveMQ, dc-square GmbH',0,0,1), (2662,'2018-10-16','Repairing a motherboard',196,'I repair a motherboard and get a old tower working again.','

Continued from hpr2549 :: DVD ripping using old hardware

\r\n

Acquired new user tower, replaced old tower with blown caps
\r\nDell Pentium 4 CPU 3.20GHz, 2Gb RAM

\r\n
sudo shred -n 5 -vz /dev/sdX\r\n\r\n  -n, --iterations=N \r\n  -v, --verbose\r\n    show progress \r\n  -z, --zero\r\n    add a final overwrite with zeros to hide shredding
\r\n

Used same Slackware USB from old tower

\r\n

Used soldering iron from Amazon - Weller WLC100 40-Watt Soldering Station
\r\nhttps://www.amazon.com/gp/product/B000AS28UC/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1

\r\n

https://photos.app.goo.gl/VpRxvZLBy49PCo5DA

\r\n',318,0,1,'CC-BY-SA','hardware, circuit board, repair',0,0,1), (2663,'2018-10-17','Short review on a 2.5 inch SSD/HDD caddy',202,'Tony reviews a Short review on a 2.5 inch SSD/HDD caddy from ebay','

Well Ken made another call for shows and as my recent interview series has come to an end by the time you listen to this here is a short review of a USB3 2.5inch HDD/SSD caddy I got from E-bay a few weeks ago.

\r\n

As many of you who have listened to my previous ramblings know I frequent a local Computer auction and recently they have had some cheap 128Gig SSD’s for sale and I managed to pick several up at a good price. After using some to upgrade some desktop PC’s to SSD I had a couple of these spare and as I have USB3 on my main laptop thought it would be good to be able to use one or two of these as portable storage or even for boot drives to test out odd Linux distro or 2.

\r\n

So I purchased a caddy off that font of all things techie E-bay for £5.50, link here:
\r\nhttps://www.ebay.co.uk/itm/USB-3-0-to-SATA-Hard-Drive-Enclosure-Caddy-Case-For-2-5-Inch-HDD-SSD-External/282930148654?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2648

\r\n

So after it arrived I plugged in one of the drives and tested it out. The first thing to notice is that SSD’s being 7mm in depth flop about a bit in the case but this is easily resolved by a bit of card under the drive to help it fit snug in the case and it does mean that the case will support the larger 9mm 2.5inch spinners if needed. I’ve not tested a larger older spinner but I suspect they will not fit as 9mm ones are very snug in the case.

\r\n

Anyway the drive was detected by the PC/Laptop and works flawlessly and as it is so quick to swap drives in the caddy means I can carry large data files and my music and video library when on the move with the advantage that it is less likely to be damaged if accidentally dropped or knocked off a surface, which is quite likely with a portable spinner HDD.

\r\n

I am very happy with this purchase and it has already become a regular part of my travelling tool kit/laptop bag.

\r\n',338,23,0,'CC-BY-SA','Computers, Tool Bag',0,0,1), (2668,'2018-10-24','Explaining the controls on my Amateur HF Radio Part 3',1090,'In this episode I cover the Main / sub displays meter memory and band keys of the TS940S.','\r\n

Sub Display

\r\n

Used either to display the time or in graph mode gives a representation of the receiver bandwidth setting when using CW or SSB.

\r\n

Memories and band keys

\r\n

Ten memory and band keys to switch either between ten stored memories or to switch between the ten pre-set amateur HF bands when in VFO mode. Up / Down step keys jumps in 1Mhz step.

\r\n

Antenna Tuner

\r\n

I tried and failed to find a simple explanation of an antenna tuner it’s a complicated topic, I can at least have a go at explaining how to use a simple manual antenna tuner, hope this makes some sense.

\r\n

A typical manual Antenna Tuner has two rotatable knobs both interact with each other. The Tuner is used to match a badly tuned antenna to your transmitter. The Tuner is placed in-between the transmitter and antenna. To use it you typically hold down the transmit key while looking at the VSWR meter and rotating one knob at a time in turn repeating this operation until the minimum VSWR is achieved.

\r\n

If you really want to dive into more detail feel free to follow this link in wikipedia. https://en.wikipedia.org/wiki/Antenna_tuner

\r\n',201,43,1,'CC-BY-SA','HF, Ham, Amateur Radio',0,0,1), (2674,'2018-11-01','Raspberry pi3 open media server',616,'JWP emails in this episode','\r\n',129,0,1,'CC-BY-SA','Raspberry Pi,open media,Etcher',0,0,1), (2664,'2018-10-18','My git workflow',495,'In this episode I talk about the workflow I use to contribute to opensource project using git','

My git workflow

\r\n

In this episode of HPR I present the workflow I use to contribute to opensource projects using git. I have no idea if this workflow is something that is commonly used, but it is working for me, so I thought I’d share it with the HPR community.

\r\n

The first thing I do is fork the project I want to contribute to. This is done on github most of the time, although this workflow can work on gitlab, bitbucket, or even some self hosted git platform.

\r\n

Once the project is forked, I clone it on my machine :

\r\n
$ git clone git://server/path/to/myproject.git
\r\n

Git automatically names my remote project origin.

\r\n

Then I add a reference to the original project :

\r\n
$ git remote add upstream https://server/path/to/originalproject.git
\r\n

Now my local repository references my fork under the name origin and the original project under the name upstream.

\r\n

In this workflow, I never work on the master branch. So, when I need to fix a bug for example, I create a new branch :

\r\n
$ git checkout -b bugfix
\r\n

I can then make changes, test my code, make sure everything is ok, stage and commit my changes :

\r\n
$ git add .\r\n$ git commit -m "commit message"
\r\n

Now I need to push this local branch to my repository on github :

\r\n
$ git push -u origin bugfix
\r\n

Since I forked the original project, github knows that origin and upstream are linked. If there are no conflicts, github will show me a big green button to create a pull request. Once the pull request is created, I just have to wait for the maintainer to merge it in upstream’s master branch. Then, I need to sync both my local copy and my fork on github with the original project. In order to do that, on my local copy, I checkout my master branch, fetch upstream’s changes, and merge them :

\r\n
$ git checkout master\r\n$ git fetch upstream\r\n$ git merge upstream/master
\r\n

Now my local master branch is ahead of origin’s master branch, so I push those changes to github :

\r\n
$ git push
\r\n

I don’t need the bugfix branches (the local one and the github one), so I can delete those :

\r\n
$ git branch -d bugfix\r\n$ git push origin -d bugfix
\r\n

And now, my local repository is even with both origin and upstream, and I can start again.

\r\n

To summarize, here’s the complete workflow :

\r\n
$ git checkout -b myawesomefeature\r\n$ git add .\r\n$ git commit -m "Awesome commit message"\r\n$ git push -u origin myawesomefeature
\r\n

Create a pull request, wait for the maintainer to merge it.

\r\n
$ git checkout master\r\n$ git fetch upstream\r\n$ git merge upstream/master\r\n$ git push\r\n$ git branch -d myawesomefeature\r\n$ git push origin -d myawesomefeature
\r\n',370,104,0,'CC-0','git,github,workflow',0,0,1), (2689,'2018-11-22','Bash Tips - 14',1688,'More about loops - the \'for\' loop, \'break\' and \'continue\'','

Bash Tips - 14 (Some auxiliary Bash tips)

\r\n

More about loops

\r\n

This is the fourteenth episode covering useful tips about using Bash. Episodes 9-13 covered Making Decisions in Bash and in these episodes we looked at while and until loops, but not for loops. This episode is making good this deficiency, and is also looking at break and continue which are very useful when using loops.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n',225,42,1,'CC-BY-SA','Bash,loop,for,break,continue',0,0,1), (2666,'2018-10-22','Slackware Post-Install',1826,'A quick and dirty guide to getting Slack up and running after it\'s installed.','

This episode started out as just some thoughts on why I decided to move back to Slackware after having been away from it for a few years, and wound up being a short set of notes on the post install configuration of Slackware 14.2

\r\n

This is by no means a definitive or exhaustive in its scope. It’s just a few thoughts and tips on the post-install process that might not be completely clear to a new user.

\r\n\r\n',325,0,1,'CC-BY-SA','Slackware, Slackware post-install',0,0,1), (2671,'2018-10-29','Algae farming with Desearcher',2379,'Desearcher edumacates us all on the benefits of algae farming.','

Apologies for the sound quality. We recorded in a small apartment with only one mic. :-

\r\n\r\n',325,0,1,'CC-BY-SA','Phytoplankton,algae,Nannochloropsis',0,0,1), (2678,'2018-11-07','Explaining the controls on my Amateur HF Radio Part 4',984,'In this episode I cover the first four Receiver section controls of the TS940S','

The three dual function controls covered are

\r\n

Squelch/Notch

\r\n\r\n

Pitch/AF Tune

\r\n\r\n

RIT/XIT

\r\n',201,43,1,'CC-BY-SA','HF, Ham, Amateur Radio',0,0,1), (2667,'2018-10-23','Create PDF bookmarks with Pdftk',1313,'Basic intro to a few pdftk functions','

\r\nPdftk is a command that lets you manipulate PDFs outside of a GUI PDF creation tool.\r\nThere are several GUI tools you can use to create PDFs with valid bookmarks and other fancy features, but pdftk is often more convenient.\r\n

\r\n\r\n

\r\nExtract pages 1 through 2, and pages 5-21, and page 261 from a big PDF into a new PDF:\r\n

\r\n
\r\n$ pdftk big.pdf cat 1-2 5-21 261 output small.pdf\r\n
\r\n\r\n

\r\nExtract bookmarks from original PDF:\r\n

\r\n\r\n
\r\n$ pdftk big.pdf dump_data output book.mark\r\n
\r\n\r\n

\r\nHere is what a bookmark file looks like:\r\n

\r\n\r\n
\r\nInfoBegin\r\nInfoKey: ModDate\r\nInfoValue: D:20181010181951-05\'00\'\r\nInfoBegin\r\nInfoKey: CreationDate\r\nInfoValue: D:20181010181934-05\'00\'\r\nInfoBegin\r\nInfoKey: Creator\r\nInfoValue: pdftk (Linux)\r\nInfoBegin\r\nInfoKey: Producer\r\nInfoValue: pdftk 2.02-x86_64\r\nPdfID0: d8deadbeeff34211ba60d80fda7611da\r\nPdfID1: 39186170c6134566884b79c0ffee7d59\r\nNumberOfPages: 261\r\nBookmarkBegin\r\nBookmarkTitle: Cover\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: 1\r\nBookmarkBegin\r\nBookmarkTitle: Credits\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: 2\r\nBookmarkBegin\r\nBookmarkTitle: Chapter One\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: 3\r\nBookmarkBegin\r\nBookmarkTitle: Foo Section\r\nBookmarkLevel: 2\r\nBookmarkPageNumber: 5\r\nBookmarkBegin\r\nBookmarkTitle: Bar Baz\r\nBookmarkLevel: 3\r\nBookmarkPageNumber: 7\r\nBookmarkBegin\r\nBookmarkTitle: Back cover\r\nBookmarkLevel: 1\r\nBookmarkPageNumber: 19\r\n
\r\n\r\n

\r\nApply the bookmark data back to the PDF:\r\n

\r\n\r\n
\r\n$ pdftk small.pdf update_info book.mark output final.pdf\r\n
\r\n\r\n',78,0,0,'CC-BY-SA','pdf',0,0,1), (2670,'2018-10-26','Character Arcs In Storytelling',893,'Lostnbronx looks character arcs, and their role in storytelling.','

Characters are intrinsic to stories of all types, and they often have journeys, referred to as arcs. What, exactly is the character arc? Does everybody in a tale have one? Do they even need one? How do arcs affect the plot, and vice-versa? Lostnbronx shares some off-the-cuff thoughts about this often misunderstood aspect of storytelling.

\r\n',107,105,0,'CC-BY-SA','stories,storytelling,character arcs,lostnbronx',0,0,1), (2672,'2018-10-30','Porteus',3477,'Installing Porteus and the cool things you can do with thumbdrive installation','

Porteus is a portable Live Linux distro, based on Slackware, intended for use on thumbdrives or optical media. It is, more or less, the new Slax, now that Slax has switched to Debian.

\r\n\r\n

Install

\r\n\r\n

The official means of installation is to burn Porteus to disc, and then (optionally) install Porteus onto a thumbdrive from within Porteus. To install Porteus to a thumbdrive, you need a thumbdrive with an EXT4 partition. You can try other filesystems and partition schemes, but EXT4 definitely works well.

\r\n

\r\nFrom either Porteus or Slackware (you can try other distros, but results will vary), you can do a manual install, and here are the correct commands (as of this writing, the docs on porteus.org are not accurate). Assuming you have discovered, using lsblk, that your target device (the thumbdrive) is /dev/sdx:\r\n

\r\n\r\n
$ sudo bash\r\n# mkdir -p /mnt/loop /mnt/drive\r\n# mount --options loop /path/to/Porteus*iso /mnt/loop\r\n# mount /dev/sdx1 /mnt/drive\r\n# rsync -av /mnt/loop/ /mnt/drive/\r\n# cd /mnt/drive/boot\r\n# chmod +x Porteus-installer-for-Linux.com\r\n# ./Porteus*com\r\n
\r\n\r\n

\r\nAlternately, you can use Porteus from a virtual machine and install to a thumbdrive, as long as your virtualisation software redirects USB. I have used virt-manager running on Fedora successfully for this.\r\n

\r\n\r\n

The other alternative, of course, is to run Porteus off of an optical disc. That means your system is unwritable, so nothing you do is persistent across reboots, but you can save your work to a thumbdrive. I\'ve worked with Slax this way before, and it\'s quite manageable.

\r\n\r\n

Boot

\r\n\r\n

\r\nBooting to Porteus depends a lot on the firmware of the computer you\'re booting. Almost every Linux distro in existence has accurate docs on the changes you may or may not need to make to your BIOS or [U]EFI in order to boot to Linux, so you can find more detail on this if you need. Here\'s some text I borrowed from Linux Mint:\r\n

\r\n\r\n

Insert your USB stick (or DVD) into the computer.

\r\n

Restart the computer.

\r\n

Before your computer boots your current operating system (Windows, Mac, Linux) you should see your BIOS or UEFI loading screen. Check the screen or your computer’s documentation to know which key to press and instruct your computer to boot on USB (or DVD). Most BIOS or UEFI have a special key you can press to select the boot device and all of them have a special key to enter a configuration screen (from which you can define the boot order). Depending on the firmware, these special keys can be Escape, F1, F2, F8, F10, F11, F12, or Delete. That information is usually briefly displayed on screen during the boot sequence.\r\n

\r\n

\r\nOn Macs, keep your finger pressed on the Alt or Option key after hearing the boot sound.\r\n

\r\n\r\n

Boot modes

\r\n\r\n

Porteus can boot to its default persistent modes: graphical or text. Both of these modes auto load any Porteus modules you\'ve installed and also read any changes you made since the previous boot.\r\n

\r\n

It can also boot to ephemeral modes: Copy to RAM and Always Fresh. These modes act as if you\'ve never booted into Porteus before, loading a completely fresh version of the file system. They also do not load Porteus modules automatically.

\r\n\r\n

Installing software

\r\n\r\n

Porteus modules are Slackware packages converted to .xzm files, a highly-compressed SquashFS filesystem. When a Porteus module is activated, the application and other files contained in the module appear in your environment. You can think of it as a layered filesystem.

\r\n\r\n

\r\nTo install software, you must sync up your package manager with upstream repositories:

\r\n\r\n
$ sudo usm -u all\r\n
\r\n\r\n

\r\nOnce everything is updated, you can search for packages using the -k (for keyword) option:

\r\n\r\n
$ sudo usm -k foo\r\n
\r\n\r\n

\r\nAnd then install it:

\r\n\r\n
$ sudo usm -g foo\r\n
\r\n\r\n

\r\nYou are prompted to either install or download the module. If you install it, then it becomes part of the filesystem. However, since changes to the filesystem are NOT read by the Copy to RAM or Always Fresh modes, this is probably not what you want. Instead, download the module so that you can have Porteus load it dynamically regardless of what mode you\'re running.

\r\n\r\n

\r\nModules are downloaded, by default, to /tmp/usm/ and then converted from their native format of .t?z to .xzm files. You can copy the .xzm files to an external device if you\'re running off of optical media, or into a persistent area on the thumbdrive running Porteus. Modules can be made permanently available in the /mnt/sdx1/porteus/modules or /mnt/sdx1/porteus/optianal directories.\r\n

\r\n\r\n

Modules in the ../modules path are loaded at boot in the Graphical and Text modes, and are available to load manually in the Copy to RAM and Always Fresh modes.

Modules in the ../optional path are never auto loaded.

\r\n\r\n

Modules can be activated or deactivated with this command:

\r\n\r\n
$ sudo activate foo\r\n
\r\n\r\n

Miscellany

\r\n\r\n

Flatpak works on Porteus, too. I have found this to be convenient for applications like GIMP and Inkscape and Kdenlive and many others that are complex enough to warrant special attention.\r\n

\r\n\r\n

\r\nFlatpak does require the glib-networking package. You will not be warned about this, because all upstream Slackware repositories assume a full install of Slackware (and glib-networking is included on Slackware, but not on Porteus). Once you install glib-networking, you can use flatpak as described, for instance, on the GIMP downloads page.\r\n

\r\n\r\n

\r\nOver-customizing the \"hard-coded\" parts of Porteus is unwise. For instance, keep the default user (guest), don\'t try to change the UID (I tried and failed), and so on. Treat the system, more or less, as if though you were a guest on someone else\'s multi-user system. Install and customise stuff locally and through modules when possible. That\'s what Porteus expects, and things can break if you try to treat it too much like a traditional Linux system.\r\n

\r\n',78,0,0,'CC-BY-SA','porteus,slax,installation,howto,tutorial,usbdrive,thumbdrive',0,0,1), (2673,'2018-10-31','Urandom - Ohio Linux Fest 2-18 Podcaster Roundtable',2043,'The Urandom crew gathers the podcasters at Ohio Linux Fest for a chat.','

Hosts: Lyle, Thaj, Kevin O’Brian (Ahuka), Tony Beamus, FiftyOneFifty

\r\n\r\n

** Record Scratch audio sample https://freesound.org/people/luffy/sounds/3536/

\r\n',270,0,1,'CC-BY-SA','Ohio Linux Fest,Urandom,Sunday Morning Linux Review,Linux Lug Cast',0,0,1), (2677,'2018-11-06','Thoughts on language learning part 4 - RPG.',1090,'I ponder the idea of an RPG with players not speaking the same language.','

I thought I was done with this topic, but got to thinking about bringing a game to life it occurred to me it was a lot of work. So I thought about it some more and hit upon the idea of an RPG probably mostly played online where a key point of the game is that the players needn’t know the same language.

\r\n

At first this seems like an odd thing for an RPG because the talking to each other is sort of a requirement. By now you’ve guessed that what I mean is that the game could be designed so that it assumes the players will have limited ability to communicate. And that drives how the game progresses.

\r\n

I see two kinds of approaches. One is that players sort of team up by the their native languages so you might have people knowing different native languages working in smaller teams while the whole game has the goal of everyone learning the new language.

\r\n

The other is that everyone could know a different native language and many or may nor cooperate with others but the goal of the game is everyone learning the same new language.

\r\n

Submitting this show mostly because I’m curious what the community thinks of the idea.

\r\n',151,0,1,'CC-0','spoken language learning',0,0,1), (2681,'2018-11-12','DerbyCon Interview - Hackers for Charity',273,'Xoke interviews the amazing Hackers for Charity people','

https://www.hackersforcharity.org/

',79,78,0,'CC-0','DerbyCon, Charity, Interview',0,0,1), (2684,'2018-11-15','Making a remote control visible',77,'Yet another amazing life hack !!!','

The problem

\r\n

\r\nA black remote control on a black couch.\r\n

\r\n

The solution

\r\n

\r\nCover it in Earth Insulating Tape.\r\n

\r\n

\r\n\r\n\"Remote\r\n\r\n

\r\n

\r\n\r\n\"Remote\r\n\r\n

\r\n\r\n

Links

\r\n\r\n',30,0,1,'CC-BY-SA','Life hacks',0,0,1), (2680,'2018-11-09','Some Additional Talk About Characters -- 01',746,'Lostnbronx takes a look at what sorts of characters work best for certain types of tales. Part 01.','

Some characters are simple, some are complex, and some are entirely unknowable. What sorts of characters work best for grand, sweeping good vs. evil tales? Which types work best for simple character dramas? And how do characters interact with the setting and story? Lostnbronx offers some off-the-cuff observations.

\r\n',107,105,0,'CC-0','stories,storytelling,characters,lostnbronx',0,0,1), (2682,'2018-11-13','(NOT) All About Blender',2753,'A meandering conversation to sooth the nerves, and warm the soul.','

The first part of what began a serious attempt to sit down and discuss Blender, a free and open-source piece of awesome, that slowly (rapidly) devolved into a meandering discussion. Mostly about video games.

\r\n\r\n

BloodPong

\r\n\r\n',325,0,1,'CC-BY-SA','Blender',0,0,1), (2686,'2018-11-19','(NOT) All About Blender - Part the Second',2413,'A meandering conversation to sooth the nerves, and warm the soul - part 2!!','

The second part of what began as a serious attempt to sit down and discuss Blender, a free and open-source piece of awesome, that slowly (rapidly) devolved into a meandering discussion. Mostly about video games.

\r\n\r\n

BloodPong

\r\n',325,0,1,'CC-BY-SA','Blender',0,0,1), (2688,'2018-11-21','Explaining the controls on my Amateur HF Radio Part 5',1039,'In this episode I cover the remaining Receiver section controls of the TS940S.','\r\n',201,43,1,'CC-BY-SA','HF, Ham, Amateur Radio',0,0,1), (2683,'2018-11-14','Using Open source tools to visualize the heartrate and blood oxygen saturation level of my stepchild',1911,'Using Open source tools to visualize the heartrate and blood oxygen saturation level of my stepchild','

Using Python, PHP, JQuery and Linux to visualize the heartrate and blood oxygen saturation level of my stepdaughter.

\r\n

Jeroen Baten talks about how he used his knowledge of a couple of open source tools to visualize the heartrate and oxygen saturation in the blood of one of his children and how this aided a pediatrician at the Wilhelmina childrens hospital to come to the right conclusion and treatment. This talk is a mix of tech and 43 surgery sessions on one single human being.

\r\n

Links

\r\n\r\n\r\n

\r\nEditor\'s Note
\r\nJeroen\'s link above was added after the show had been aired.
\r\n

\r\n',369,0,0,'CC-BY-SA','python, php, jquery, linux',0,0,1), (2687,'2018-11-20','Some Additional Talk About Characters -- 02',750,'Lostnbronx takes a look at what sorts of characters work best for certain types of tales. Part 02.','

What are some typical ways to create characters in your stories? Should you create the plot first, or the characters first? Should we think of characters in terms of heroes and villains, or protagonists and antagonists? What is the value of character depth, and is it the same as the character arc? Lostnbronx offers up even more off-the-cuff thoughts about this complicated subject.

\r\n',107,105,0,'CC-0','stories,storytelling,characters,lostnbronx',0,0,1), (2956,'2019-12-02','HPR Community News for November 2019',5211,'Dave, Jeroen and Ken talk about shows released and comments posted in November 2019','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n Nihilazo, \n Daniel Persson.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2935Fri2019-11-01The work of fire fighters, part 3Jeroen Baten
2936Mon2019-11-04HPR Community News for October 2019HPR Volunteers
2937Tue2019-11-05Lord D\'s Film Reviews: His Girl Fridaylostnbronx
2938Wed2019-11-06Naming pets in space gameTuula
2939Thu2019-11-07Submit a show to Hacker Public Radio in 10 easy stepsb-yeezi
2940Fri2019-11-08Better Social Media 05 - MastodonAhuka
2941Mon2019-11-11Server Basics 107: Minishift and container managementklaatu
2942Tue2019-11-12Why I love lispsNihilazo
2943Wed2019-11-13Music as Lifebrian
2944Thu2019-11-14ONICS Basics Part 4: Network Flows and ConnectionsGabriel Evenfire
2945Fri2019-11-15Saturday at OggCamp Manchester 2019Ken Fallon
2946Mon2019-11-18Sunday at OggCamp Manchester 2019Ken Fallon
2947Tue2019-11-19The Mimblewimble Protocolmightbemike
2948Wed2019-11-20Testing with HaskellTuula
2949Thu2019-11-21Grin and Beam: The 2 major mimblewimble blockchainsmightbemike
2950Fri2019-11-22NotPetya and Maersk: An Object LessonAhuka
2951Mon2019-11-25A walk through my PifaceCAD Python code – Part 2MrX
2952Tue2019-11-26Publishing your book using open source toolsJeroen Baten
2953Wed2019-11-27How I got started in LinuxArcher72
2954Thu2019-11-28Wrestling As You Like It episode 1TheDUDE
2955Fri2019-11-29Machine Learning / Data Analysis BasicsDaniel Persson
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 16 comments in total.

\n

Past shows

\n

There are 2 comments on\n1 previous show:

\n\n

This month\'s shows

\n

There are 14 comments on 8 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-November/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Stand at FOSDEM

\n

Our proposal for a “Free Culture Podcasts” stand at FOSDEM was accepted for the Sunday 2nd February. This is fantastic news as this is the largest FLOSS event in Europe and is absolutely thronged the whole day.

\n

https://fosdem.org/2020/news/2019-11-19-accepted-stands/

\n

Anyone going to FOSDEM, and who would like to help staff the booth on Sunday please get in touch.

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month: Dave Morriss

\n

Over the period tags and/or summaries have been added to 5 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2981,'2020-01-06','HPR Community News for December 2019',4671,'HPR Volunteers talk about shows released and comments posted in December 2019','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Paul Quirk.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2956Mon2019-12-02HPR Community News for November 2019HPR Volunteers
2957Tue2019-12-03Lord D\'s Film Reviews: Everlostnbronx
2958Wed2019-12-04Haskell modulesTuula
2959Thu2019-12-05Interview with Josh Clements about gpodder.net Ken Fallon
2960Fri2019-12-06Dehydrated FoodsAhuka
2961Mon2019-12-09Kubernetics / Cloud - TerminologyDaniel Persson
2962Tue2019-12-10Bespoke bike buildingBrian in Ohio
2963Wed2019-12-11A walk through my PifaceCAD Python code – Part 3MrX
2964Thu2019-12-12Bolos and Bowties: Neckwear for NerdsJon Kulp
2965Fri2019-12-13instant feedback for students in mathsbeni
2966Mon2019-12-16World of Commodore 2019 Episode 1: The InterviewsPaul Quirk
2967Tue2019-12-17Wrestling As You Like It Episode 2TheDUDE
2968Wed2019-12-18Life and Times of a Geek part 3Dave Morriss
2969Thu2019-12-19Crewing a spaceship in HaskellTuula
2970Fri2019-12-20The FediverseAhuka
2971Mon2019-12-23World of Commodore 2019 Episode 2: Hacking GeckOSPaul Quirk
2972Tue2019-12-24The foot of the ski slopeDave Morriss
2973Wed2019-12-25Introduction to Advent of CodeDaniel Persson
2974Thu2019-12-26Guitar Setup pt. 2NYbill
2975Fri2019-12-27SimpleScreenRecorder and VidcutterKen Fallon
2976Mon2019-12-30A walk through my PifaceCAD Python code – Part 4MrX
2977Tue2019-12-31World of Commodore 2019 Episode 3: Life after CommodorePaul Quirk
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 22 comments in total.

\n

Past shows

\n

There are 6 comments on\n6 previous shows:

\n\n

This month\'s shows

\n

There are 16 comments on 10 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2019-December/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

There were no tag or summary updates in the past month.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2691,'2018-11-26','DerbyCon Interview - John Strand',160,'John Strand talks about behavoural analytics and blockchain','

John Strand (https://twitter.com/strandjs) from Black Hills Information Security (https://www.blackhillsinfosec.com/)

\r\n

Download RITA (it’s free!) - Real Intelligence Threat Analytics - https://www.blackhillsinfosec.com/projects/rita/

',79,78,0,'CC-BY-SA','DerbyCon, Interview, Blockchain',0,0,1), (2699,'2018-12-06','Bash Tips - 15',1794,'Some of the pitfalls when using loops in Bash','

Bash Tips - 15 (More auxiliary Bash tips)

\r\n

Pitfalls for the unwary Bash loop user

\r\n

This is the fifteenth episode covering useful tips for Bash users. In the last episode we looked at the \'for\' loop, and prior to that we looked at \'while\' and \'until\' loops. In this one I want to look at some of the loop-related issues that can trip up the unwary user.

\r\n

Loops in Bash are extremely useful, and they are not at all difficult to use in their basic forms. However, there are some perhaps less than obvious issues that can result in unexpected behaviour.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n',225,42,1,'CC-BY-SA','Bash,loop,ls,pipe,pipeline,find,extglob',0,0,1), (2710,'2018-12-21','Youtube downloader for channels',844,'A followup to hpr2675 how you can download an entire youtube channel for local playout','

\r\nI had a very similar problem to Ahuka aka Kevin, in hpr2675 :: YouTube Playlists. I wanted to be able to download an entire youtube channel and store them so that I could play them in the order that they were posted.\r\n

\r\n

\r\nAdd the url\'s to a file called subscriptions.txt.\r\n

\r\n
\r\n#LASTRUN: 20181030\r\n# /home/ken/sourcecode/personal/bestofyoutube/youtube-channel-watcher.bash\r\n#\r\n# Big Clive \r\nhttps://www.youtube.com/channel/UCtM5z2gkrGRuWd0JQMx76qA	20181030\r\n# Essential Craftsman\r\nhttps://www.youtube.com/channel/UCzr30osBdTmuFUS8IfXtXmg\r\n
\r\n

\r\nThen run the script\r\n

\r\n
\r\n#!/bin/bash\r\n# Downloads videos from youtube based on selection from https://thebestofyoutube.com\r\n# (c) Ken Fallon https://kenfallon.com\r\n# Released under the CC-0\r\n\r\nsavepath=\"/mnt/media/Videos/channels\"\r\nsubscriptions=\"${savepath}/subscriptions.txt\"\r\nYOUNGERTHAN=\"20010101\"\r\nRUNDATE=$(date +%Y%m%d)\r\nyoutubedl=\"/home/ken/sourcecode/youtube-dl/youtube-dl\"\r\n#DRYRUN=\"echo DEBUG: \"\r\n\r\nif [ ! -e \"${subscriptions}\" ]\r\nthen\r\n	echo \"Cannot find subscription file \"${subscriptions}\"\"\r\n	exit 1\r\nfi\r\n\r\nif [ \"$(grep \"#LASTRUN: \" \"${subscriptions}\" | wc -l )\" -eq 0 ]\r\nthen\r\n	sed --follow-symlinks \'1s/^/#LASTRUN: n/\' -i \"${subscriptions}\"\r\nfi\r\n\r\n# Read the subscriptions\r\ncat \"${subscriptions}\" | grep -v \'#\' | while read channel_info\r\ndo\r\n	if [ \"$(echo \"${channel_info}\" | grep -P \'t\' | wc -l )\" -eq 0 ]\r\n	then\r\n		DATEAFTER=\"--dateafter ${YOUNGERTHAN}\"\r\n	else\r\n		DATEAFTER=\"--dateafter $(echo \"${channel_info}\" | awk \'{print $NF}\' )\"\r\n	fi\r\n	channel=\"$(echo \"${channel_info}\" | awk \'{print $1}\' )\"\r\n	echo \"Processing Channel \"${channel}\" since ${DATEAFTER}\"\r\n	${DRYRUN} ${youtubedl} ${DATEAFTER} --ignore-errors --no-mtime --restrict-filenames --format mp4 -o ${savepath}\'/%(uploader)s/%(upload_date)s-%(title)s⋄%(id)s.%(ext)s\' ${channel}\r\n	${DRYRUN} sed --follow-symlinks \"s,${channel}.*$,${channel}t${RUNDATE},g\" -i \"${subscriptions}\"\r\ndone\r\n\r\n${DRYRUN} sed --follow-symlinks \"s/#LASTRUN: .*$/#LASTRUN: ${RUNDATE}/\" -i \"${subscriptions}\"\r\n
\r\n',30,0,1,'CC-BY-SA','youtube, youtube-dl',0,0,1), (2720,'2019-01-04','Download youtube channels using the rss feeds',1447,'Ken shares a script that will allow you to quickly keep up to date on your youtube subscriptions','

\r\nI had a very similar problem to Ahuka aka Kevin, in hpr2675 :: YouTube Playlists. I wanted to be able to download an entire youtube channel and store them so that I could play them in the order that they were posted.
\r\nSee previous episode hpr2710 :: Youtube downloader for channels.\r\n

\r\n

\r\nThe problem with the original script is that it needs to download and check each video in each channel and it can crawl to a halt on large channels like EEEVblog.\r\n

\r\n

\r\nThe solution was given in hpr2544 :: How I prepared episode 2493: YouTube Subscriptions - update with more details in the full-length notes.\r\n

\r\n\r\n
    \r\n
  1. Subscribe:
    Subscriptions are the currency of YouTube creators so don\'t be afraid to create an account to subscribe to the creators. Here is my current subscription_manager.opml to give you some ideas.
  2. \r\n
  3. Export:
    Login to https://www.youtube.com/subscription_manager and at the bottom you will see the option to Export subscriptions. Save the file and alter the script to point to it.
  4. \r\n
  5. Download: Run the script youtube-rss.bash
  6. \r\n
\r\n\r\n

How it works

\r\n

\r\nThe first part allows you to define where you want to save your files. It also allows you to set what videos to skip based on length and strings in their titles.\r\n

\r\n
\r\nsavepath=\"/mnt/media/Videos/channels\"\r\nsubscriptions=\"${savepath}/subscription_manager.opml\"\r\nlogfile=\"${savepath}/log/downloaded.log\"\r\nyoutubedl=\"/mnt/media/Videos/youtube-dl/youtube-dl\"\r\nDRYRUN=\"echo DEBUG: \"\r\nmaxlength=7200 # two hours\r\nskipcrap=\"fail |react |live |Best Pets|BLOOPERS|Kids Try\"\r\n
\r\n\r\n

\r\nAfter some checks and cleanup, we can then parse the opml file. This is an example of the top of mine.\r\n

\r\n
\r\n<?xml version=\"1.0\"?>\r\n<opml version=\"1.1\">\r\n  <body>\r\n    <outline text=\"YouTube Subscriptions\" title=\"YouTube Subscriptions\">\r\n      <outline text=\"Wintergatan\" title=\"Wintergatan\" type=\"rss\" xmlUrl=\"https://www.youtube.com/feeds/videos.xml?channel_id=UCcXhhVwCT6_WqjkEniejRJQ\"/>\r\n      <outline text=\"Primitive Technology\" title=\"Primitive Technology\" type=\"rss\" xmlUrl=\"https://www.youtube.com/feeds/videos.xml?channel_id=UCAL3JXZSzSm8AlZyD3nQdBA\"/>\r\n      <outline text=\"John Ward\" title=\"John Ward\" type=\"rss\" xmlUrl=\"https://www.youtube.com/feeds/videos.xml?channel_id=UC2uFFhnMKyF82UY2TbXRaNg\"/>\r\n
\r\n\r\n

\r\nNow we use the xmlstarlet tool to extract each of the urls and also the title. The title is just used to give some feedback, while the url needs to be stored for later. Now we have a complete list of all the current urls, in all the feeds. \r\n

\r\n
\r\nxmlstarlet sel -T -t -m \'/opml/body/outline/outline\' -v \'concat( @xmlUrl, \" \", @title)\' -n \"${subscriptions}\" | while read subscription title\r\ndo\r\n  echo \"Getting \"${title}\"\"\r\n  wget -q \"${subscription}\" -O - | xmlstarlet sel -T -t -m \'/_:feed/_:entry/media:group/media:content\' -v \'@url\' -n - | awk -F \'?\' \'{print $1}\'  >> \"${logfile}_getlist\"\r\ndone\r\n
\r\n\r\n

\r\nThe main part of the script then counts the total so we can have some feedback while we are running it. It then pumps the list from the previous step into a loop which first checks to make sure we have not already downloaded it.\r\n

\r\n
\r\ncount=1\r\ntotal=$( sort \"${logfile}_getlist\" | uniq | wc -l )\r\n\r\nsort \"${logfile}_getlist\" | uniq | while read thisvideo\r\ndo \r\n  if [ \"$( grep \"${thisvideo}\" \"${logfile}\" | wc -l )\" -eq 0 ];\r\n  then\r\n
\r\n

\r\nThe next part takes advantage of the youtube-dl --dump-json command which downloads all sorts of information about the video which we store to query later.\r\n

\r\n
\r\n    metadata=\"$( ${youtubedl} --dump-json ${thisvideo} )\"\r\n    uploader=\"$( echo $metadata | jq \'.uploader\' | awk -F \'\"\' \'{print $2}\' )\"\r\n    title=\"$( echo $metadata | jq \'.title\' | awk -F \'\"\' \'{print $2}\' )\"\r\n    upload_date=\"$( echo $metadata | jq \'.upload_date\' | awk -F \'\"\' \'{print $2}\' )\"\r\n    id=\"$( echo $metadata | jq \'.id\' | awk -F \'\"\' \'{print $2}\' )\"\r\n    duration=\"$( echo $metadata | jq \'.duration\' )\"\r\n
\r\n

\r\nHaving the duration, we can skip long episodes.\r\n

\r\n
\r\n\r\n    if [[ -z ${duration} || ${duration} -le 0 ]]\r\n    then\r\n      echo -e \"nError: The duration \"${length}\" is strange. \"${thisvideo}\".\"\r\n      continue\r\n    elif [[ ${duration} -ge ${maxlength} ]]\r\n    then\r\n      echo -e \"nFilter: You told me not to download titles over ${maxlength} seconds long \"${title}\", \"${thisvideo}\"\"\r\n      continue\r\n    fi\r\n
\r\n

\r\nOr videos that don\'t interest us.\r\n

\r\n
\r\n\r\n    if [[ ! -z \"${skipcrap}\" && $( echo ${title} | egrep -i \"${skipcrap}\" | wc -l ) -ne 0 ]]\r\n    then\r\n      echo -e \"nSkipping: You told me not to download this stuff. ${uploader}: \"${title}\", \"${thisvideo}\"\"\r\n      continue\r\n    else\r\n      echo -e \"n${uploader}: \"${title}\", \"${thisvideo}\"\"\r\n    fi\r\n
\r\n

\r\nNow we have a filtered list of urls we do want to keep. These we also save the description in a text file with the video id if we want to refer to it later. \r\n

\r\n
\r\n    echo ${thisvideo} >> \"${logfile}_todo\"\r\n    echo -e $( echo $metadata | jq \'.description\' ) > \"${savepath}/description/${id}.txt\"\r\n  else\r\n    echo -ne \"rProcessing ${count} of ${total}\"\r\n  fi\r\n  count=$((count+1))\r\ndone\r\necho \"\"\r\n
\r\n

\r\nAnd finally we download the actual videos saving each channel in its own directory. The file names is first an ISO8601 date, then the title stored as ASCII with no space or ampersands. I then use a \"⋄\" as a delimiter before the video id.\r\n

\r\n
\r\n\r\n# Download the list\r\nif [ -e \"${logfile}_todo\" ];\r\nthen\r\n  cat \"${logfile}_todo\" | ${youtubedl} --batch-file - --ignore-errors --no-mtime --restrict-filenames --format mp4 -o \"${savepath}\"\'/%(uploader)s/%(upload_date)s-%(title)s⋄%(id)s.%(ext)s\'\r\n  cat \"${logfile}_todo\" >> ${logfile}\r\nfi\r\n
\r\n

\r\nNow you have a fast script that keeps you up to date with your feeds.\r\n

\r\n',30,0,1,'CC-BY-SA','youtube, youtube-dl, channels, playlists, xmlstarlet',0,0,1), (2693,'2018-11-28','Getting started with web based game in Haskell and Elm',1146,'First steps in writing 4x space exploration game','

Haskell Stack: https://docs.haskellstack.org/en/stable/README/

\r\n

Stack is a build tool for Haskell with focus on reproducible build plans, multi-package projects, and a consistent, easy-to-learn interface. With stack, one can create new project: stack new my-project yesod-sqlite (more in the quick start guide: https://www.yesodweb.com/page/quickstart)

\r\n\r\n

models is used to define shape of the data and Yesod uses it to generate datatypes and database for you. For example, to define a Star that has name, spectral type, luminosity class and link to StarSystem, one can write:

\r\n\r\n
\r\nStar json\r\n    name Text\r\n    starSystemId StarSystemId\r\n    spectralType SpectralType\r\n    luminosityClass LuminosityClass\r\n
\r\n\r\n

Custom types, like LuminosityClass, need mapping between datatype and database. In simple cases like this, Yesod can do that:\r\n\r\n

\r\ndata LuminosityClass = Iap | Ia | Iab | Ib | II | III | IV | V | VI | VII\r\n    deriving (Show, Read, Eq)\r\nderivePersistField \"LuminosityClass\"\r\n
\r\n\r\n

The \"derivePersistField\" part is template haskell call that will generate mapping needed.

\r\n\r\n

For those interested seeing some code, source is available at https://github.com/Tuula/deep-sky/ (https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18 is situation before lots of Elm related changes that I mentioned in passing in the episode)

\r\n\r\n',364,107,0,'CC-BY-SA','haskell, yesod',0,0,1), (2703,'2018-12-12','Fog of war in Yesod based game',1515,'How to implement fog of war system in turn based web game','

Duality of the universe: there\'s true state of the universe used in simulation and there\'s state the the players perceive. These most likely will always be in conflict. One possible solution is to separate these completely. Perform simulation in one system and record what players see in other.

\r\n\r\n

For every type of entity in the game, there\'s two sets of data: real and reported. Reports are tied to time and faction. Examples are given for planets. Thus, we have Planet, PlanetReport and CollatedPlanetReport. First is the real entity, second is report of that entity tied in time and faction. Third one is aggregated information a faction has of given entity. In database two first ones are:

\r\n\r\n
\r\nPlanet json\r\n    name Text\r\n    position Int\r\n    starSystemId StarSystemId\r\n    ownerId FactionId Maybe\r\n    gravity Double\r\n    SystemPosition starSystemId position\r\n    deriving Show\r\n\r\nPlanetReport json\r\n    planetId PlanetId\r\n    ownerId  FactionId Maybe\r\n    starSystemId StarSystemId\r\n    name Text Maybe\r\n    position Int Maybe\r\n    gravity Double Maybe\r\n    factionId FactionId\r\n    date Int\r\n    deriving Show\r\n
\r\n

Third one is defined as a datatype:

\r\n\r\n
\r\ndata CollatedPlanetReport = CollatedPlanetReport\r\n    { cprPlanetId :: Key Planet\r\n    , cprSystemId :: Key StarSystem\r\n    , cprOwnerId  :: Maybe (Key Faction)\r\n    , cprName     :: Maybe Text\r\n    , cprPosition :: Maybe Int\r\n    , cprGravity  :: Maybe Double\r\n    , cprDate     :: Int\r\n    } deriving Show\r\n
\r\n\r\n

Data from database need to be transformed before working on it. Usually it\'s 1:1 mapping, but sometimes it makes sense to enrich it (turning IDs into names for example). For this we use ReportTransform type class:

\r\n\r\n
\r\n-- | Class to transform a report stored in db to respective collated report\r\nclass ReportTransform a b where\r\n    fromReport :: a -> b\r\n\r\ninstance ReportTransform PlanetReport CollatedPlanetReport where\r\n    fromReport report =\r\n	CollatedPlanetReport (planetReportPlanetId report)\r\n			     (planetReportStarSystemId report)\r\n			     (planetReportOwnerId report)\r\n			     (planetReportName report)\r\n			     (planetReportPosition report)\r\n			     (planetReportGravity report)\r\n			     (planetReportDate report)\r\n
\r\n\r\n

To easily combine bunch of collated reports together, we define instances\r\n of semigroup and monoid for collated report data.\r\n Semigroup defines an associative binary operation (<>) and monoid defines a zero or empty item (mempty). My explanation about Monoid and Semigroup were a bit rambling, so maybe have a look at https://wiki.haskell.org/Monoid which explains it in detail.

\r\n\r\n
\r\ninstance Semigroup CollatedPlanetReport where\r\n    (<>) a b = CollatedPlanetReport (cprPlanetId a)\r\n				    (cprSystemId a)\r\n				    (cprOwnerId a <|> cprOwnerId b)\r\n				    (cprName a <|> cprName b)\r\n				    (cprPosition a <|> cprPosition b)\r\n				    (cprGravity a <|> cprGravity b)\r\n				    (max (cprDate a) (cprDate b))\r\n\r\ninstance Monoid CollatedPlanetReport where\r\n    mempty = CollatedPlanetReport (toSqlKey 0) (toSqlKey 0) Nothing Nothing Nothing Nothing 0\r\n
\r\n\r\n

In some cases there might be a list of collated reports that are about different entities of same type (several reports for every planet in solar system). For those cases, we need a way to tell what reports belong together:

\r\n\r\n
\r\n-- | Class to indicate if two reports are about same entity\r\nclass Grouped a where\r\n    sameGroup :: a -> a -> Bool\r\n\r\ninstance Grouped PlanetReport where\r\n    sameGroup a b =\r\n	planetReportPlanetId a == planetReportPlanetId b\r\n
\r\n\r\n

After this, processing a list of reports for same entity is short amount of very general code:

\r\n\r\n
\r\n-- | Combine list of reports and form a single collated report\r\n--   Resulting report will have facts from the possibly partially empty reports\r\n--   If a fact is not present for a given field, Nothing is left there\r\ncollateReport :: (Monoid a, ReportTransform b a) => [b] -> a\r\ncollateReport reports = mconcat (map fromReport reports)\r\n
\r\n\r\n

For reports of multiple entities is bit more complex, as they need to be sorted first, but the code is similarly general:

\r\n\r\n
\r\n-- | Combine list of reports and form a list of collated reports\r\n--   Each reported entity is given their own report\r\ncollateReports :: (Grouped b, Monoid a, ReportTransform b a) => [b] -> [a]\r\ncollateReports [] = []\r\ncollateReports s@(x:_) = collateReport itemsOfKind : collateReports restOfItems\r\n    where split = span (sameGroup x) s\r\n	  itemsOfKind = fst split\r\n	  restOfItems = snd split\r\n
\r\n\r\n

Final step is to either render reports as HTML or send them as JSON back to client. For JSON case we need one more type class instance (ToJSON) that can be automatically generated. After that handler function can be defined. After authenticating the user and checking that they are member of a faction, reports of specific planet (defined by its primary key) are retrieved from database, collated, turned into JSON and sent back to client:

\r\n\r\n
\r\n$(deriveJSON defaultOptions {fieldLabelModifier = drop 3} \'\'CollatedPlanetReport)\r\n\r\ngetApiPlanetR :: Key Planet -> Handler Value\r\ngetApiPlanetR planetId = do\r\n    (_, _, fId) <- apiRequireFaction\r\n    loadedPlanetReports <- runDB $ selectList [ PlanetReportPlanetId ==. planetId\r\n					      , PlanetReportFactionId ==. fId ] [ Asc PlanetReportDate ]\r\n    let planetReport = collateReport $ map entityVal loadedPlanetReports :: CollatedPlanetReport\r\n    return $ toJSON planetReport\r\n
\r\n\r\n

For those interested seeing some code, source is available at https://github.com/Tuula/deep-sky/ (https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18 is situation before lots of Elm related changes that I mentioned in passing in the previous episode)

\r\n\r\n',364,107,0,'CC-BY-SA','haskell, yesod',0,0,1), (2692,'2018-11-27','YouTube URL tricks',436,'URL tricks for YouTube to enhance viewing experience and an overview of my viewing methodology','

YouTube URL Tricks by Desearcher

\r\n
Recommended Episode
YouTube Playlists by Ahuka
\r\n
User Upload playlist
BEFOREhttps://www.youtube.com/channel/UCAL3JXZSzSm8AlZyD3nQdBA
AFTERhttps://www.youtube.com/playlist?list=UUAL3JXZSzSm8AlZyD3nQdBA
\r\n
Embeded Player
BEFOREhttps://www.youtube.com/playlist?list=UUAL3JXZSzSm8AlZyD3nQdBA
AFTERhttps://www.youtube.com/embed?list=UUAL3JXZSzSm8AlZyD3nQdBA
\r\n
Watch Later
NORMALhttps://www.youtube.com/playlist?list=WL
EMBEDhttps://www.youtube.com/embed?list=WL
\r\n
Show \"Remove Watched\" Button in Watch Later queue
https://www.youtube.com/playlist?list=WL&disable_polymer=true
\r\n
Chrome App trick to maximize viewing area
Watch Laterchrome -app=\"https://www.youtube.com/embed?list=WL\"
Playlistchrome -app=\"https://www.youtube.com/embed?list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr\"
\r\n
Play On TV
https://www.youtube.com/pair
\r\n
TCL Roku TV
Roku Product List
\r\n',371,0,0,'CC-BY-SA','YouTube,URL,Chrome,Roku,Smart TV',0,0,1), (2709,'2018-12-20','Bash Tips - 16',1440,'Arrays in Bash (part 1)','

Bash Tips - 16 (Further auxiliary Bash tips)

\r\n

Arrays in Bash

\r\n

This is the first of a small group of shows on the subject of arrays in Bash. It is also the sixteenth show in the Bash Tips sub-series.

\r\n

We have encountered Bash arrays at various points throughout this sub-series, and have even seen a number of examples, but the subject has never been examined in detail. This group of shows intends to make good this deficiency.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n\r\n',225,42,1,'CC-BY-SA','Bash,array,indexed array,associative array',0,0,1), (2713,'2018-12-26','Resources in 4x game',1252,'One way to implement data types for raw resources in Haskell','

Raw resources are integral part for most 4x games. Here’s one way of modeling them in Haskell. I wanted a system that is easy to use, doesn’t require too much typing and is type safe.

\r\n

RawResource is basic building block:

\r\n
newtype RawResource a = RawResource { unRawResource :: Int }\r\n    deriving (Show, Read, Eq)
\r\n

It can be parametrised with anything, but I’m using three different types:

\r\n
data Biological = Biological\r\ndata Mechanical = Mechanical\r\ndata Chemical = Chemical
\r\n

Example of defining harvest being 100 units of biological raw resources:

\r\n
  harvest :: RawResource Biological\r\n  harvest = RawResource 100
\r\n

Raw resources are often manipulated (added and subtracted mostly). Defining Num instance allows us to use them as numbers:

\r\n
instance Num (RawResource t) where\r\n    (+) (RawResource a) (RawResource b) = RawResource $ a + b\r\n    (-) (RawResource a) (RawResource b) = RawResource $ a - b\r\n    (*) (RawResource a) (RawResource b) = RawResource $ a * b\r\n    abs (RawResource a) = RawResource $ abs a\r\n    signum (RawResource a) = RawResource $ signum a\r\n    fromInteger a = RawResource $ fromInteger a
\r\n

For example, adding harvest to stock pile:

\r\n
  stock :: RawResource Biological\r\n  stock = RawResource 1000\r\n\r\n  harvest :: RawResource Biological\r\n  harvest = RawResource 100\r\n\r\n  newStock = stock + harvest
\r\n

Comparing size of two resource piles is common operation. Ord instance has methods we need for comparing:

\r\n
instance Ord (RawResource t) where\r\n    (<=) (RawResource a) (RawResource b) = a <= b
\r\n

One function is enough, as rest is defined in terms of it. Sometimes (usually for reasons of optimization), one might want to define other functions too.

\r\n

Another way to add bunch of resources of same type together is defining Monoid instance:

\r\n
instance Semigroup (RawResource t) where\r\n    (<>) a b = a + b\r\n\r\ninstance Monoid (RawResource t) where\r\n    mempty = RawResource 0
\r\n

For example, combining harvests of many fields can be achieved as:

\r\n
  harvests :: [RawResource Biological]\r\n  harvests = [RawResource 20, RawResource 50, RawResource 25]\r\n\r\n  total :: RawResource Biological\r\n  total = mappend harvests
\r\n

All these functions keep track of type of resources being manipulated. Compiler will emit an error if two different types of resources are being mixed together.

\r\n

Raw resources are often grouped together for specific purpose. This again uses phantom types to keep track the intended usage:

\r\n
data RawResources a = RawResources\r\n    { ccdMechanicalCost :: RawResource Mechanical\r\n    , ccdBiologicalCost :: RawResource Biological\r\n    , ccdChemicalCost :: RawResource Chemical\r\n    } deriving (Show, Read, Eq)\r\n\r\ndata ResourceCost = ResourceCost\r\ndata ConstructionSpeed = ConstructionSpeed\r\ndata ConstructionLeft = ConstructionLeft\r\ndata ConstructionDone = ConstructionDone\r\ndata ResourcesAvailable = ResourcesAvailable
\r\n

And in order to be able to combine piles of RawResources, we’ll define Semigroup and Monoid instances. Notice how both instances make use of Semigroup and Monoid instances of RawResource:

\r\n
instance Semigroup (RawResources t) where\r\n    (<>) a b = RawResources\r\n        { ccdMechanicalCost = ccdMechanicalCost a <> ccdMechanicalCost b\r\n        , ccdBiologicalCost = ccdBiologicalCost a <> ccdBiologicalCost b\r\n        , ccdChemicalCost = ccdChemicalCost a <> ccdChemicalCost b\r\n        }\r\n\r\ninstance Monoid (RawResources t) where\r\n    mempty = RawResources\r\n        { ccdMechanicalCost = mempty\r\n        , ccdBiologicalCost = mempty\r\n        , ccdChemicalCost = mempty\r\n        }
\r\n

For those interested seeing some code, source is available at https://github.com/Tuula/deep-sky/ (https://github.com/Tuula/deep-sky/tree/baa0807dd36b61fd02174b17c10013862af4ec18 is situation before lots of Elm related changes that I mentioned in passing in the previous episode)

\r\n',364,107,0,'CC-BY-SA','haskell',0,0,1), (2719,'2019-01-03','Bash Tips - 17',2056,'Arrays in Bash (part 2)','

Bash Tips - 17 (Additional auxiliary Bash tips)

\r\n

Arrays in Bash

\r\n

This is the second of a small group of shows on the subject of arrays in Bash. It is also the seventeenth show in the Bash Tips sub-series.

\r\n

In the last show we saw the two types of arrays, and learned about the multiple ways of creating them and populating them. We also looked at how array elements and entire arrays are accessed.

\r\n

Now we want to continue looking at array access and some of the various parameter expansion operations available.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n\r\n',225,42,1,'CC-BY-SA','Bash,array,indexed array,associative array',0,0,1), (2694,'2018-11-29','Bandit Update',699,'NYbill does a quick episode to mention there are new Over the Wire, Bandit levels out.','

(No Spoilers)

\r\n

NYbill does a quick episode to mention there are new Over the Wire, Bandit levels out.

\r\n

https://overthewire.org/wargames/bandit/bandit0.html

\r\n

Original Episode:

\r\n

https://hackerpublicradio.org/eps.php?id=2138

\r\n',235,0,0,'CC-BY-SA','Hacking, War games, Linux',0,0,1), (2697,'2018-12-04','The Linux Shutdown Command Explained',402,'A short pod cast about the linux shutdown command','

\r\nA short podcast about the shutdown command \r\n

\r\n

\r\nhttps://linuxhandbook.com/linux-shutdown-command/\r\n

',129,0,0,'CC-BY-SA','Linux,shutdown',0,0,1), (2698,'2018-12-05','XSV for fast CSV manipulations - Part 1',1837,'Written in Rust, xsv is my new favorite tool for manipulating csv files','

XSV for fast CSV manipulations - Part 1: Basic Usage

\r\n
\r\n

https://github.com/BurntSushi/xsv

\r\n
\r\n

Introduction

\r\n

xsv is a command line program for indexing, slicing, analyzing, splitting and joining CSV files. Commands should be simple, fast and composable:

\r\n
    \r\n
  1. Simple tasks should be easy.
  2. \r\n
  3. Performance trade offs should be exposed in the CLI interface.
  4. \r\n
  5. Composition should not come at the expense of performance.
  6. \r\n
\r\n

We will be using the CSV file provided in the documentation.

\r\n

Commands covered in this episode

\r\n\r\n',300,0,0,'CC-BY-SA','CSV,XSV',0,0,1), (2700,'2018-12-07','Episode 3000',26830,'We commemorate the 300 Today with a Techie and 2700 Hacker Public Radio shows','

\r\nOn the 19th of September 2005 a group of individuals got together to release their first show on the podcast network \"Today with a Techie\".\r\n

\r\n

\r\nThe idea was to share knowledge through podcasting. Now 13 years, 2 months, 19 days later the project is still going strong, and you dear listener are a part of it.\r\n

\r\n

\r\nToday marks the 2700th episode of \"Hacker Public Radio\" and coupled with the 300 shows from \"Today with a Techie\", marks the 3000th episode of this project.\r\n

\r\n

\r\nA big thanks goes out to all 354 individual hosts who together contributed 1452 hours of shows to the archive. \r\n

\r\n

\r\nThere is about 50 giga bytes of mp3 files alone. \r\n

\r\n

\r\nWhich played back to back gives 60 days 11 hours 40 minutes 21 seconds of continuous play. \r\n

\r\n

\r\nIf you started listening today and played the shows 24 x 7 you wouldn\'t be finished listening until Monday, February 5th, 2019.\r\n

\r\n

\r\nOf course by then there would be 39 additional shows released, so you still wouldn\'t be finished.\r\n

\r\n

\r\nDespite all this we still don\'t have a wikipedia page. If you can, please take the time to create one for us. There is plenty of supporting information in the \"In the Press\" section of our about page.\r\n

\r\n

\r\nSo to mark the 3000th episode we are going to do nothing more than list the shows, host and summary where available.\r\n

\r\n

\r\nJust doing that alone creates a whopping 7 and a half hour episode. \r\n

\r\n

\r\nAre you l33t enough to listen to it all ?\r\n

\r\n

\r\nLet\'s go.\r\n

',30,0,0,'CC-BY-SA','TWaT, HPR, 3000',0,0,1), (2701,'2018-12-10','First impressions of the Odroid-go',1926,'I ramble on about my first impressions of the odroid-go','

I ramble on about my impressions of the Odroid-go, a 32 USD handheld system similar to a gameboy built to run game system emulators and various other free software. It’s also built to be harcked.

\r\n

https://wiki.odroid.com/odroid_go/odroid_go

\r\n

The summary is this is an easy to put together kit requiring no soldering, and runs classic console emulators pretty well. Well worth the 32 USD plus shipping in my opinion. Claims 10 hours of game play and that seems about right so far for me.

\r\n

The systems emulated out of the box are:

\r\n

NES, Game Gear, Gameboy, Gameboy Color, Sega Master System, ColecoVision. Other systems of similar or earlier vintages have emulators that you have to install separately and boot into to run. I don’t think it will emulate newer systems. No Gameboy Advance emulator and I don’t see a Mame emulator. However, I do think this ‘might’ support Mame for some of the early arcade games like Asteroids and Space Invaders.

',151,103,0,'CC-0','Odroid-go',0,0,1), (2702,'2018-12-11','Audacity set up and response to episode 2658',107,'Just a quick response to Ep2658','

Hi Guys and Girls in HPR land.

\r\n

This is Tony Hughes in Blackpool in the UK back for another show. I normally talk about my own stuff but while it is related to what I have been doing lately this is a response to Al’s interview with Dave in Episode 2658 and how to setup Audacity to record and edit audio for best sound quality when podcasting.

\r\n

I’ve recently joined the mintCast podcast team and have been editing and doing the post production of the audio recording for the last couple of episodes. The information that Dave provided during the show was invaluable in helping me in this task, I also have to give a shout out to Rob the previous host who also spent an hour and a half giving a tutorial on his post production work flow, but the additional information given by Dave in this show was also a big help.

\r\n

I’ve now purchased a boom arm and pop filter for my mic to reduce any artefacts in the recording although as it is still attached to my desk I think I may need to invest in a shock mount although I’m not sure how it will attach to my current Boom arm. Ah well that’s a problem for another day.

\r\n

As I said this was just a shout out to Al and Dave to say thanks for the show and I will save it for another day to do a show on my new post production work flow on the mintCast audio.

\r\n

This is Tony Hughes saying goodbye for now.

\r\n

https://mintcast.org/about-the-authors/tonyh/
\r\nth@mintcast.org

\r\n

https://hackerpublicradio.org/eps.php?id=2658

',338,0,0,'CC-BY-SA','audio,Audacity',0,0,1), (2715,'2018-12-28','About ONAP',618,'The Linux foundations ONAP project all about it','

So I went to the open networking trade show sponsored by the Linux Foundation with Ken Fallon’s help.

\r\n

The first thing they talked about was ONAP.

\r\n

https://www.onap.org/
\r\nhttps://en.wikipedia.org/wiki/ONAP

\r\n',129,61,1,'CC-BY-SA','Networking,ONAP,Open Networking Automation Platform',0,0,1), (2722,'2019-01-08','RAID 6 a short description',150,'How Raid 6 works','

Raid 6 is a take of raid 5 but with support for 2 drive protection.

',129,0,1,'CC-BY-SA','Raid6',0,0,1), (2742,'2019-02-05','SAP Hana Certification Directory',1085,'How the SAP Hana certification works','

SAP Hana certification is a long and hard process covered at
\r\nhttps://www.sap.com/dmc/exp/2014-09-02-hana-hardware/enEN/index.html

',129,0,0,'CC-BY-SA','SAP HANA,certification',0,0,1), (3001,'2020-02-03','HPR Community News for January 2020',2649,'HPR Volunteers Dave and Ken talk about shows released and comments posted in January 2020','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
2978Wed2020-01-01GARAGE DOORoperat0r
2979Thu2020-01-02Bicycle Freewheel MaintenanceJon Kulp
2980Fri2020-01-03FLOSS Weekly 553 - Hacker Public RadioKen Fallon
2981Mon2020-01-06HPR Community News for December 2019HPR Volunteers
2982Tue2020-01-07World of Commodore 2019 Episode 4: Bare metal c64 Emulation on Raspberry PiPaul Quirk
2983Wed2020-01-08my phoneJezra
2984Thu2020-01-09RHEL 8 Workstation first looks JWP
2985Fri2020-01-10Firefox UpdateAhuka
2986Mon2020-01-13Onlykey Updatedoperat0r
2987Tue2020-01-14World of Commodore 2019 Episode 5: New games from Double Sided GamesPaul Quirk
2988Wed2020-01-15A tale of two hackers in the same systemsigflup
2989Thu2020-01-16Hacker Public Radio 2019-20 New Year Show Episode 1Kevin Wisher
2990Fri2020-01-17JDK14 - Wrap up editionDaniel Persson
2991Mon2020-01-20Fix yer fog machineoperat0r
2992Tue2020-01-21World of Commodore 2019 Episode 6: Introduction to C64 OSPaul Quirk
2993Wed2020-01-22Hacker Public Radio 2019-20 New Year Show Episode 2Kevin Wisher
2994Thu2020-01-23Wrestling As You Like It Episode 3TheDUDE
2995Fri2020-01-24ActivityPub Conference 2019 - ActivityPub: past, present, futureAhuka
2996Mon2020-01-27Spideroak Updateoperat0r
2997Tue2020-01-28World of Commodore 2019 Episode 7: Video Playback with 1541 UltimatePaul Quirk
2998Wed2020-01-29Hacker Public Radio 2019-20 New Year Show Episode 3Kevin Wisher
2999Thu2020-01-30SQRL - Secure Quick Reliable LoginDaniel Persson
3000Fri2020-01-31Chopin Free projectPaul Quirk
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 9 comments in total.

\n

Past shows

\n

There is 1 comment on\n1 previous show:

\n\n

This month\'s shows

\n

There are 8 comments on 6 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-January/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month: Windigo, Dave Morriss

\n

Over the period tags and/or summaries have been added to 9 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3021,'2020-03-02','HPR Community News for February 2020',3272,'Call for shows is open. Ken and eventually Dave discuss the shows, media and development plans.','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n monochromec.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3001Mon2020-02-03HPR Community News for January 2020HPR Volunteers
3002Tue2020-02-04World of Commodore 2019 Episode 8: Vote of thanksPaul Quirk
3003Wed2020-02-05Hacker Public Radio 2019 2020 New Year Show Episode 4Kevin Wisher
3004Thu2020-02-06Fixing simple audio problems with AudacityDave Morriss
3005Fri2020-02-07Is ActivityPub Paving The Way to Web 3.0?Ahuka
3006Mon2020-02-10Hijack Auxiliary Input of your car!operat0r
3007Tue2020-02-11Photography 101Paul Quirk
3008Wed2020-02-12Hacker Public Radio 2019-20 New Year Show Episode 5Kevin Wisher
3009Thu2020-02-13Linux Inlaws S01 E01monochromec
3010Fri2020-02-14FOSDEM first impressionsAndrew Conway
3011Mon2020-02-17Linux is HARD rant with Intel graphicsoperat0r
3012Tue2020-02-18Sample episode from WikipediapoddenKen Fallon
3013Wed2020-02-19Bash Tips - 21Dave Morriss
3014Thu2020-02-20A Headless Raspberry Pi Streaming RadioJon Kulp
3015Fri2020-02-21ActivityPub Conference 2019 - The Semantic Social NetworkAhuka
3016Mon2020-02-24Nixie tube clock and friends!operat0r
3017Tue2020-02-25Developing Black and White FilmPaul Quirk
3018Wed2020-02-26Encrypted editklaatu
3019Thu2020-02-27Linux Inlaws S01E02 FOSDEM shenanigansmonochromec
3020Fri2020-02-28Validating data in HaskellTuula
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 16 comments in total.

\n

Past shows

\n

There are 3 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 13 comments on 6 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-February/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nClaudio Miranda, Windigo, Dave Morriss

\n

Over the period tags and/or summaries have been added to 16 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2707,'2018-12-18','Steganalysis 101',864,'Steganalysis is the process of identifying the presence of, and decrypting, steganography.','

1. Introduction

\r\n

Hello and welcome to Hacker Public Radio, I’m Edward Miro and I’ve been a fan of HPR for a while now and really love its collaborative and random nature. It’s always been important for me to support the hacking community. I always take any opportunity to give back to this community who have given me so much throughout the years. I’ve also always subscribed to the idea that the best way to learn something is by teaching and I hope to do a good job for all you listeners. This talk is on mystical art of steganalysis which is the process of identifying the presence of and decrypting (hopefully) steganography.

\r\n

2. What is steganography?

\r\n

I’m into hacking, but I’m not a professional hacker. Usually I call myself a hobbyist. I like CTFs, crypto challenges, lots of stuff from Vulnhub or OverTheWire, things like that. I’ll provide some links in the end if anyone is interested, but for those who aren’t familiar a CTF, or Capture The Flag, it’s a kind of game that helps you get better at hacking. These days there are tons of VMs that are setup to be intentionally vulnerable to different techniques or attacks. You load the VM and pretend it’s a server you want to attack and follow your standard hacking protocols. Some are setup to be boot to root challenges where you ‘win’ when you get root and some are setup with flags that you can find hidden in the target worth points. There are in person and online CTFs and they’ve gotten pretty popular with the National Cyber League being a major competition. Some are easy, some are really hard and most have really good write-ups that can teach you so much about INFOSEC, penetration testing and actually let you practice the techniques in a relatively easy and legal way.

\r\n

Where steganography comes in to this discussion is that it’s an element you sometimes see used in the kinds of challenges I mentioned previously and also in alternate reality games, online recruitment challenges by national agencies/big tech companies and militarys. They are even used in real world espionage and intelligence work or super spooky secret challenges like Cicada 3301.

\r\n

Simply put steganography (and I’m pasting this straight out of Wikipedia): “is the practice of concealing a file, message, image, or video within another file, message, image, or video”. Steganography is used to hide secrets in plain sight. It’s a way to send a message, without anyone detecting that a message is even being sent.

\r\n

I’ll give you more examples in the next section, but imagine a letter that has a secret written in invisible ink. Only the sender and receiver should know about the invisible ink and any eavesdroppers should be none the wiser. This simple example has been used by countless prisoners whose mail is routinely read and examined. Terrorists and spies the world over also use steganography and are known to embed messages in an image and post it online. With how many image hosting sites there are, with millions of people posting to them billions of images day in and day out, you can see why steganography can be such a challenge to combat. Before I move on to some more specific examples I want to stress again that I’m not an expert on cryptography or steganography. While researching for this podcast it’s overwhelmingly clear that you could spend your whole career focused on only steganography. This talk is just a primer on the subject and only the tip of the iceberg.

\r\n

3. Examples (also from Wikipedia, the great repository of all knowledge)

\r\n\r\n

The possibilities are almost endless for how this technique can be applied.

\r\n

4. Why should we care?

\r\n

When we are doing a CTF or crypto challenge and are presented with an image or media file we are pretty well assured there’s something in there, though not every image you find while doing a challenge or CTF will utilize steganography so don’t overanalyze. I’ve known people who are really into alternate reality games spending 100s of hours doing spectrographic analysis and for our purpose(and the scope of this podcast), there should be some clue that steganography is being used. The challenge then becomes how we direct our work flow as to not waste any time and be the most efficient in cracking that particular part the puzzle. There are MANY stego tools out there, some of them homebrewed, and unless the designer of the challenge puts in a clue, you might spend hours trying different algorithms or tools. And even if you do, there’s no guarantee you’ll get anything at all. A lot of the tools that will be mentioned in the next section rely on fingerprinting how known algorithms process data. This is not only a big problem for hackers like us with our CTFs and games, but even more so for governments who are charged with keeping us safe. So if you’re looking at possible steganography, you need to build a good workflow and I noticed a post on Reddit a few weeks ago with a user asking about image forensics. There was a comment posted that was so good I forwarded it to my hacking friends and it inspired me to do this podcast. I’m using the comment as a potential framework for my own personal work with images and steganography. It helped me to develop my own protocol and I wanted to share it with you all and if anyone wants to expand on it or improve it please do so. Thank you /u/Alexeyan!

\r\n

5. Proposed work flow

\r\n

This is coming straight out of the post on Reddit. I thought about rewriting it, but it didn’t seem necessary and I will be giving the author full credit. I add a couple more tools on at the bottom and a few closing thoughts:

\r\n\r\n

Some other go to tools not mentioned above:

\r\n\r\n

Detecting steganography is hard work. There are computer scientists who do only this. While we aren’t at that level for the information being presented here, it will require a lot of digging and trying different tools. Hopefully following these steps will help identify the more common techniques in an easier way than trial and error.

\r\n

One last thing I want to mention is that part of how I see detecting steganography in CTFs or cyptochallenges is having a certain mindset and always looking at things in various layers. I try to look at everything within the challenge as if there could be something right in front of my eyes. I mentally flip through different layers and see the codes within the codes. And remember if you’re playing an alternate reality game, a CTF or a crypto challenge, generally speaking, the designers want you to play through the game. They will leave clues if you need them. They want the players to get to the end. Don’t overthink things.

\r\n

Well that’s all I’ve got for today. I hope you enjoyed this podcast and got something useful out of it. Like I said in the introduction, I’m Edward Miro. Have fun, and good luck!

\r\n

6. Sources

\r\n\r\n',372,0,0,'CC-BY-SA','Steganalysis, steganography',0,0,1), (2704,'2018-12-13','Intro to Scribus',2380,'Klaatu provides an overview of Scribus in part 1 of a mini-series about steganography','

Scribus is a page layout application. If you are familiar with common publishing industry tools, then Scribus will be very familiar to you, but if you\'re used to word processors or graphic applications, then Scribus will probably confuse you. In this episode, Klaatu talks about the workflow of page layout, and how to do some basic tasks in Scribus.\r\n

\r\n\r\n

The example files Klaatu produces in Scribus are available at https://slackermedia.info/tank/scribus-by-example.tar.gz

\r\n\r\n

Fair warning: this episode is actually \"about\" steganography. The key you need is OGG.

',78,74,0,'CC-BY-SA','design, steganography, scribus, layout',0,0,1), (2706,'2018-12-17','Why I love the IBM AS/400 computer systems',1714,'A short talk about how I came to love the IBM As/400 systems and why.','

This is a talk about my love for the IBM family of AS/400 computer systems.

\r\n

Although it’s a very hacker unfriendly system there is still much to admire and love.

\r\n

It’s completely different from anything else which makes it nice but also very likely to disappear in few years from now. To prevent that piece of computing history to vanish I started a small initiative called https://www.as400museum.org/. It’s just me, but it does show my intention with the system.

\r\n',369,0,1,'CC-BY-SA','as400, ibm, computing, midrange',0,0,1), (2708,'2018-12-19','Ghostscript',1351,'Klaatu talks about manipulating PDFs with gs and pdf-stapler','

\r\nGhostscript is the open source implementation of Postscript. You can read its docs online.\r\n

\r\n\r\n

\r\nTo compress a big PDF into something possibly smaller:\r\n

\r\n\r\n
\r\n$ gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dBATCH -sOutputFile=output.pdf example.pdf\r\n
\r\n\r\n

\r\nThat renders basically the same PDF with all images down-res\'d to 72 DPI. Other valid setting profiles are ebook, printer, and prepress.\r\n

\r\n\r\n

\r\nTo render a version of a PDF without any raster images in it, making it cheaper and faster to print:\r\n

\r\n\r\n
\r\ngs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dBATCH -dFILTERIMAGE -sOutputFile=output.pdf example.pdf\r\n
\r\n\r\n

\r\nThe FILTERIMAGE option drops raster images from the file. The FILTERVECTOR option filters vector images, and FILTERTEXT filters text.\r\n

\r\n\r\n

\r\nIf pdftk is not available for your OS, you can use pdf-stapler instead for cutting and concatenating PDF files. It doesn\'t deal with metadata as well as pdftk does, however.

It\'s worth noting that pdftk is available as a snap package https://snapcraft.io/pdftk.\r\n

\r\n\r\n

\r\nIt\'s also worth noting that this is actually episode 2 in a series about steganography.

\r\n\r\n',78,74,0,'CC-BY-SA','pdf, ebook, bloat, print',0,0,1), (2711,'2018-12-24','Raspberry Pi 3A+ Review',336,'In this episode of HPR, I will do a quick review of the Raspberry Pi 3A+.','

Raspberry Pi 3A+ review

\r\n

In this episode of HPR, I will do a quick review of the Raspberry Pi 3A+, the latest release of the Raspberry Pi foundation.

\r\n

\"Raspberry \"Raspberry

\r\n

Specs
\r\nThe Raspberry Pi 3A+ has almost the same hardware as its big brother/sister the 3B+ :

\r\n\r\n

The differences are :

\r\n\r\n

Size
\r\nThe Raspberry Pi 3A+ is 6.7 x 5.6 cm (2.6 x 2.2 in) and 11 mm high (.45 in). But if you plug a ribbon in the header, then it takes a lot of space.

\r\n

\"Raspberry

\r\n

In this case, it’s probably better to unsolder the header, and solder a right angle header in place, so the pins are pointing to the side of the board and not upwards

\r\n

\"Raspberry \"Raspberry

\r\n

With a bit of caution and the help of some desoldering wick, it’s not a complex operation, because there is no component near the GPIO header.

\r\n

Of course if you plan on using a HAT, then you’re better off using the straight header. The Raspberry Pi 3A+ is actually the same size than a standard HAT.

\r\n

\"Raspberry \"Raspberry

\r\n

Use case
\r\n

\r\n

Since the Raspberry Pi 3A+ doesn’t have an ethernet port, I think I will not use it for server stuff like Mosquitto or Pi-Hole, for which a good network connection is required. Also, those servers sometimes need a keyboard and a mouse, and with only one USB port, that’s not too practical.

\r\n

For me, the A+ will be used to upgrade projects currently using a Raspberry Pi ZeroW, and for which I need a little more power. The on board WiFi and the small form factor, combined with the extra power, makes the 3A+ an ideal replacement for the ZeroW.

\r\n

Credits
\r\n

\r\n

The sound used for the opening and closing sequence is Speaker X-Clash by Daniel H, and is released under a CC-BY-NC license.

\r\n',370,0,0,'CC-BY-SA','raspberry pi, review',0,0,1), (2712,'2018-12-25','Steganography',1290,'Klaatu wraps up his miniseries about steganography.','

Did you find the hidden message contained in Klaatu\'s previous two episodes?

\r\n

If not, Klaatu reveals how to find it in this one, how to duplicate it, and what makes good steganography.

',78,0,0,'CC-BY-SA','steganography,message,secret decoder ring',0,0,1), (2714,'2018-12-27','Airplane stalls and Angle of Attack',995,'A primer on why airplanes quit flying','

stalls, a primer on why aircraft fly, and don’t fly

\r\n

YouTube video of stall with narration (35 seconds)

\r\n

https://www.youtube.com/watch?v=SiOiVHUEYao

\r\n

AoA gauge from T-38 manual

\r\n

https://goo.gl/images/ZH5UYx

\r\n

Some definitions

\r\n\r\n

Things not mentioned

\r\n

This discussion pertained to subsonic speeds, super sonic flight introduces a whole other realm of issues.

\r\n

The wings of aircraft do not stall all at once. They are designed (usually) to stall from the wing root (where the wing is attached to the fuselage) towards the tips. This ensures good roll control at slow speed and into the stall. This stalling characteristic is achieved by designing twist in the wing (washout) allowing different parts of the wing to hit the critical angle of attack at different times.

\r\n

The most dangerous situation that you can find yourself in is a low altitude situation where one wing is stalled more than the other. The airplane then enters a spin. The dangerous part is the low altitude. Spins are fun, and the plane is still controllable, but you need altitude to recover. A wise man told me when turning low to the ground keep your nose down and speed up.

\r\n

Most light aircraft will shudder or buffet as you approach the critical angle of attack this happens because of the disturbed airflow hitting the aircraft’s fuselage or tail. In larger aircraft no (i.e. airliners) no feel is given naturally as the plane approaches a stalled condition so systems like stick shakers vibrate the control artificially as you approach the critical angle of attack as measured by the AoA sensors. DC-9 stick shaker, a big cell phone vibrator artificial stall warning is mandatory in fly-by-wire aircraft (i.e. Airbus, f-16) as well as pure hydraulic controls (i.e. Boeing 757)

\r\n

Author: Brian
\r\nCreated: 2018-12-01 Sat 07:34
\r\nEmacs 25.3.1 (Org mode 8.2.10)

\r\n',326,0,0,'CC-BY-SA','aircraft,flight,stall',0,0,1), (2760,'2019-03-01','What is VNF',445,'A topic from the Open Networking conference in Amsterdam','

A short basic info about VNF

\r\n

https://searchsdn.techtarget.com/definition/virtual-network-functions

',129,61,0,'CC-BY-SA','Virtual network function,VNF,network functions virtualization,NFV',0,0,1), (2785,'2019-04-05','What is uCPE',399,'A short talk on telco networking standards','',129,0,1,'CC-BY-SA','Network Function Virtualization,NFV,Universal customer premises equipment,uCPE',0,0,1), (2729,'2019-01-17','Bash Tips - 18',1898,'Arrays in Bash (part 3)','

Bash Tips - 18 (Extra auxiliary Bash tips)

\r\n

Arrays in Bash

\r\n

This is the third of a small group of shows on the subject of arrays in Bash. It is also the eighteenth show in the Bash Tips sub-series.

\r\n

In the last show we looked at ways of accessing elements with negative indices and how to concatenate arrays. We then launched into parameter expansion in the context of arrays.

\r\n

There are a few more parameter expansion operations to look at in this episode, then in the next episode we will look in more depth at the declare built in command and at some of the commands that assist with loading data into arrays.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n\r\n',225,42,1,'CC-BY-SA','Bash,array,indexed array,associative array,parameter expansion',0,0,1), (2724,'2019-01-10','Using a DIN Rail to mount a Raspberry Pi',549,'I created DIN rail fittings for attaching my RPi 3B+ and an SSD disk','

Overview

\r\n

A DIN Rail is a metal rail for mounting pieces of electrical equipment inside an equipment rack, for performing tasks in a building, in a machine, and so forth. It’s common to see DIN rails holding circuit breakers for example.

\r\n

See the Wikipedia article on the subject for full details.

\r\n

A number of people in the Maker Community have made use of these rails, and there are a number of freely available designs for stands that can be 3D printed on which you can mount these rails. There are also designs for mounts onto which devices like Raspberry Pis and disks can be fitted and attached to a rail.

\r\n

This show will recount my experiences with creating a compact mounting system for one of my Raspberry Pi systems. I had the help of my son and his girlfriend in 3D printing the parts for this project.

\r\n

Long notes

\r\n

I have provided detailed notes and pictures for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n',225,0,1,'CC-BY-SA','3D printing,DIN rail,Raspberry Pi',0,0,1), (2723,'2019-01-09','Using Elm in context of 4X game client',2671,'Tuula talks their decisions on structuring Elm application','

Original idea I had with my toy game project was to have Yesod render most of the user interface as static HTML and have as little client side scripting as possible. Later I realized that there would be parts with significant amount of client side code and it might be better if whole site was written in Elm.

\r\n

Couple goals I had in my mind when I started this:

\r\n\r\n

Backend is written in Haskell and front end in Elm. Communication between them is via REST interface and most of the data is in JSON. All JSON encoding / decoding is centralized (more or less), same with initiating requests to server.

\r\n

API Endpoints

\r\n

End points used for REST calls are defined in single data type that captures their name and parameters. These are used when initiating requests, meaning there’s smaller chance of typo slipping through.

\r\n
type Endpoint\r\n    = ApiStarDate\r\n    | ApiResources\r\n    | ApiStarSystem\r\n    | ApiStar\r\n    | ApiPlanet\r\n    | ApiPopulation PlanetId\r\n    | ApiBuilding PlanetId\r\n    | ApiConstructionQueue PlanetId\r\n    | ApiConstruction Construction\r\n    | ApiBuildingConstruction\r\n    | ApiAvailableBuildings
\r\n

For example, sending a GET request to retrieve all construction projects on a planet is done as:

\r\n
Http.send (ApiMsgCompleted << ConstructionsReceived) (get (ApiConstructionQueue planetId) (list constructionDecoder))
\r\n

GET Request is sent to ApiConstructionQueue endpoint and it has planetId as parameter. When server sends response, our program will parse content of it will be a list that is parsed with constructionDecoder and create “ApiMsgCompleted ConstructionsReceived” message with result of the parsing. Update function will process this and store list of constructions somewhere safe for further use.

\r\n

Update function

\r\n

Update function is in charge of reacting to messages (mouse clicks, page changes, responses from server). In a large program update function will quickly get big and unwieldy. Breaking it into smaller pieces (per page for example), will make maintenance easier. This way each page has their own message type and own update function to handle it. In addition there’s few extra ones (cleaning error display, processing API messages and reacting to page changes).

\r\n

Same way as API end points are encoded in a type, pages are too:

\r\n
type Route\r\n    = HomeR\r\n    | ProfileR\r\n    | StarSystemsR\r\n    | StarSystemR StarSystemId\r\n    | PlanetR StarSystemId PlanetId\r\n    | BasesR\r\n    | FleetR\r\n    | DesignerR\r\n    | ConstructionR\r\n    | MessagesR\r\n    | AdminR\r\n    | LogoutR\r\n    | ResearchR
\r\n

routeToString function is used to map Route into String, that can be placed in hyperlink. Below is an excerp:

\r\n
routeToString : Route -> String\r\nrouteToString route =\r\n    case route of\r\n        HomeR ->\r\n            "/home"\r\n\r\n        StarSystemR (StarSystemId sId) ->\r\n            "/starsystem/" ++ String.fromInt sId\r\n\r\n        PlanetR (StarSystemId sId) (PlanetId pId) ->\r\n            "/starsystem/" ++ String.fromInt sId ++ "/" ++ String.fromInt pId
\r\n

Because mapping needs to be bi-directional (Route used to define content of a href and string from a href used to define Route), there’s mapping to other direction too:

\r\n
routes : Parser (Route -> a) a\r\nroutes =\r\n    oneOf\r\n        [ map HomeR top\r\n        , map ProfileR (s "profile")\r\n        , map ResearchR (s "research")\r\n        , map StarSystemsR (s "starsystem")\r\n        , map StarSystemR (s "starsystem" </> starSystemId)\r\n        , map PlanetR (s "starsystem" </> starSystemId </> planetId)\r\n        , map BasesR (s "base")\r\n        , map FleetR (s "fleet")\r\n        , map DesignerR (s "designer")\r\n        , map ConstructionR (s "construction")\r\n        , map MessagesR (s "message")\r\n        , map AdminR (s "admin")\r\n        , map LogoutR (s "logout")\r\n]
\r\n

Result of parsing is Maybe Route, meaning that failure will return Nothing. Detecting and handling this is responsibility of the calling code, usually I just default to HomeR.

\r\n

Breadcrumbs

\r\n

Borrowing from Yesod, client uses recursive function to define breadcrumb path. This is hierarchical view of current location in the application, allowing user to quickly navigate backwards where they came.

\r\n

Breadcrumb path consists of segments that are tuple of (String, Maybe Route). String tells text to display and Route is possible parent route of the segment. This allows hierarchical definition: “Home / Star systems / Sol / Earth”. Because route has only (for example) PlanetId, we need to pass Model too, so that the data retrieved from server can be used to figure out what name such a planet has.

\r\n
{-| Build complete breadcrumb path and wrap it in enclosing HTML\r\n-}\r\nbreadcrumbPath : Model -> Html Msg\r\n\r\n{-| Recursively build list of breadcrumbs from segments\r\nLast one is plain text, while parents of it are links\r\n-}\r\nbreadcrumb : Model -> Bool -> Route -> List (Html Msg)\r\n\r\n{-| Get segment of given route in form of ( String, Maybe Route )\r\nString denotes text describing the segment, Maybe Route is possible parent\r\n-}\r\nsegment : Model -> Route -> ( String, Maybe Route )
\r\n',364,0,0,'CC-BY-SA','elm',0,0,1), (2803,'2019-05-01','Update on my Raspi 3 B OpenMedia Vault and Next Cloud instances',449,'A short podcast on how my little home servers are working or not','\r\n

I use a Toshiba 4TB non-powered drive external usb 3 drive.

\r\n',129,0,1,'CC-BY-SA','Raspberry Pi,NextCloud,openmediavault',0,0,1), (2716,'2018-12-31','Really Simple YouTube',441,'Thaj explains how he makes YouTube come to him using RSS feeds','

Here are the two links I mentioned that let you pull RSS feeds out of YouTube

\r\n\r\n',270,0,0,'CC-BY-SA','RSS, YouTube, PeerTube, TInyTinyRSS, Internet Video',0,0,1), (2739,'2019-01-31','Bash Tips - 19',1553,'Arrays in Bash (part 4)','

Arrays in Bash (Supplemental auxiliary Bash tips)

\r\n

This is the fourth and last of a small group of shows on the subject of arrays in Bash. It is also the nineteenth show in the Bash Tips sub-series.

\r\n

In the last show we continued with the subject of parameter expansion in the context of arrays. There are other aspects of this that could be looked at, but we’ll leave it for the moment and may revisit it in the future.

\r\n

In this episode we will look in more depth at the declare (typeset) built in command and at some commands that are related (readonly and local), We will also look at the commands that assist with loading data into arrays: mapfile (readarray) and read.

\r\n

Long notes

\r\n

As usual I have provided detailed notes and examples for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n\r\n',225,42,1,'CC-BY-SA','Bash,array,declare,typeset,local,readonly,read,mapfile,readarray',0,0,1), (2717,'2019-01-01','Mobile Device Security',621,'Cell phone cyber security 101','

Introduction

\r\n

Hello and welcome to Hacker Public Radio, I’m Edward Miro and for this episode I decided to address mobile device security. As with most of the research and articles I’ve written in the past, these are geared toward standard users in a business setting and are meant to be a jumping off point for further research and to be a foundation for cyber security 101 level training classes. If you like what I do, and want to have me come speak to your team, feel free to email me.

\r\n

As an information security researcher, I have noticed a trend in what potential clients lately have been interested in: cell phones. Almost everyone I have consulted for in the area of private investigations make this area their main priority. This makes sense as users have started to transition to using mobile devices more and more. Not only do cell phones represent the main conduit to the internet for a huge chunk of people, but many use them for work also. Many companies have smartly presented policies against this, but there are still many organizations that allow bring-your-own-device style implementations. In the following podcast I will try to define the threats, defense and considerations in very broad strokes.

\r\n

Cell phones differ from a standard hacking target in a few ways. For the most part, many of the same vectors are still valid. Remote code execution however is more rare, but not out of the question. I’m going to attempt to present these different vectors in an ascending list of what is most likely to be used as an attack, in my humble (and possibly ignorant) opinion.

\r\n

1. Passive Surveillance

\r\n

This vector is one many in the hacking world will already be familiar with and it is a major concern for mobile devices as well. Attackers can monitor an access point where the mobile device is connected and collect packets in all the usual ways. Open public WiFi is a treasure trove and tons of data that’s being sent in the clear can be collected, analyzed and leveraged by attackers.

\r\n

Defense here is a bit more complicated for the general user, but shouldn’t be too intrusive for most:

\r\n
    \r\n
  1. Use a VPN on your mobile devices.
  2. \r\n
  3. Switch to a DNS provider that provides secure DNSSEC.
  4. \r\n
  5. Implement proper encryption on access points.
  6. \r\n
\r\n

2. Spyware

\r\n

Many commercial spyware applications are readily available on both of the main app stores. The challenges for attackers lie in either gaining physical access to the unlocked device to install the spyware, or tricking the user into installing it themselves. Most often the target’s spouse or close contact does this. Some of these apps can be disguised to look like innocuous applications as a feature, but with devices that are rooted/jailbroken, they can be completely hidden from the user. I found a few surveys that state the average smart phone user has about 30 apps installed. I don’t think it’s unreasonable to suspect the average person wouldn’t notice a second calculator or calendar app. These apps feature the full gamut of what you’d expect from a spyware app.

\r\n

Defense against spyware is pretty simple:

\r\n
    \r\n
  1. Don’t allow unsupervised access to your device.
  2. \r\n
  3. Use a strong passcode or biometric lock.
  4. \r\n
  5. Remove unused applications and be aware of new apps that may pop up.
  6. \r\n
  7. Don’t root or jailbreak your device.
  8. \r\n
\r\n

3. Social Engineering

\r\n

The tried and true vector that has always worked and will continue to work is social engineering. It doesn’t matter what kind of device a target is using if you can get them to click a malicious link, open a malicious attachment, or disclose their password to the attackers. With a user’s password you can conduct a vast amount of surveillance through their Google or Apple account. Not to mention leverage their password into all their other accounts as most users still use the same password for everything. We can also callback to the previous section on spyware by mentioning that many users are already familiar with enabling the installation of 3rd party applications and can be tricked into installing a cleverly disguised spyware application.

\r\n

Basic OPSEC recommendations are applicable here:

\r\n
    \r\n
  1. Don’t click strange or unsolicited links or attachments on your devices.
  2. \r\n
  3. Never disclose your password to anyone through a text message or voice call.
  4. \r\n
  5. Don’t install 3rd party applications. I’ll extend this to say not to install any shady or questionable apps, even ones hosted by the app stores. There have been instances of vetted apps being malicious.
  6. \r\n
\r\n

4. IMSI catchers/Femtocells

\r\n

I refer to these as DIY Stingrays. Stingrays are devices used by law enforcement to track and surveil cell phone traffic. These devices emulate a cell tower or boost cell phone signals when used in a legitimate way. Mobile phones are designed to prefer using stations that are the closest and strongest. Any technically proficient attacker can DIY one of these devices for not a lot of money. When an attacker deploys one of these devices, the target’s phone usually has no idea that the device isn’t an official cell tower and happily connects and passes traffic through it. The rogue stations can then be configured to pass the traffic on to an authentic tower and the user will have no idea. These rogue towers can not only collect identifying information about the mobile device that can be used to track or mark a target, they can also monitor voice calls, data, and SMS, as well as perform man-in-the-middle attacks. Often they can disable the native encryption of the target’s phone as well.

\r\n

Defense against this vector is a bit more complicated:

\r\n
    \r\n
  1. As before, use a VPN.
  2. \r\n
  3. Use Signal or other encrypted communication apps.
  4. \r\n
  5. Avoid disclosing sensitive information during voice calls.
  6. \r\n
  7. There is software that has been developed to detect and notify the user when a rogue station has been detected, but this is not going to be super helpful for standard users. There are also maps online of known cell towers and it is possible to use software to identify your connected tower.
  8. \r\n
\r\n

5. Exploits

\r\n

Speaking very generally, this attack vector is for the most part less of a concern (depending on your particular threat level), but we all know that the chance of this happening in the wild is probably remote for most people. The technical implementations of exploits such as Rowhammer, Stagefright, and Blueborne are well outside the scope of this particular talk, but we would be incorrect to not mention them and what can be done to protect against them. And we should also pay special attention to more and more exploits being developed to attack mobile devices as attackers have started putting a lot of attention in this area. Even though many of these vulnerabilities are being patched, we all know many users are still using old versions of Android and iOS, and many devices are simply outside the support period offered by the manufacturers and will never be updated past a certain point. Couple that with the general idea that mobile devices (or any device running a non Windows based OS) are “safer” because less exploits exist for them is currently a very poor assumption. This will probably get worse as the cost of keeping up with new devices now being over $1000 and many users won’t be able to get devices that are constantly being patched.

\r\n

What we can do:

\r\n
    \r\n
  1. Keep your mobile devices updated with most current OS updates and carrier settings. Also keep applications updated. I don’t know how many times I’ve noticed friends or family with devices that are ready to be updated, but the notifications go ignored.
  2. \r\n
  3. If it’s possible, replace devices when they are outside the support period.
  4. \r\n
  5. Be paranoid, if it applies to you. What this means is when you use any computer or device, always remember that zero day exploits can exist for years before being disclosed. You could follow ALL the best OPSEC practices, and you could still be vulnerable to exploits that haven’t been disclosed and/or patched. This might not matter if you’re just a general user, but if you work for the government or do intelligence work, act as if.
  6. \r\n
\r\n

Well, thank you for taking the time to listen to my basic introduction to cell phone cyber defense. I know most of the information I provided is only the tip of the iceberg and if current trends hold up, this will only get worse in the future. If you want to add to or correct any mistakes I may have made, like I stated in the introduction, feel free to email me and let’s have a conversation. I don’t claim to know all there is to know and love feedback and any opportunities to learn more or collaborate with others in the field.

\r\n

Thanks again, and have a great 2019!

\r\n',372,0,1,'CC-BY-SA','Mobile Device Security',0,0,1), (2718,'2019-01-02','Genre In Storytelling',750,'Lostnbronx takes a look at the importance of genre in storytelling.','

Many people see genres as being largely interchangeable, but are they really? Why can some stories only be told in a particular genre? When are genre stories truly alike? And when are setting, character, and plot more important than genre? Lostnbronx takes a quick, rambling look at this complicated subject.

\r\n',107,105,0,'CC-BY-SA','stories,storytelling,genre,lostnbronx',1,0,1), (2725,'2019-01-11','The Illumos Shutdown Command Explained',812,'A short pod cast about the Illumos shutdown command','

In response to JWP\'s episode 2697 and ClaudioM\'s comment, this show covers the shutdown command as it appeared in Sun Solaris and OpenSolaris, and currently appears in both Oracle Solaris and OpenIndiana.\r\n\r\n

\r\nThe quick version:\r\n

\r\n\r\n\r\n\r\n

In practise, I don\'t even use the shutdown command. I use poweroff, which does a shutdown and poweroff.

\r\n\r\n

\r\nBoth shutdown and poweroff require root permission. On OpenIndiana, you can either use sudo bash or pfexec bash to get a root prompt.\r\n

\r\n\r\n

Some links:

\r\n

OpenIndiana handbook

\r\n

Sun Microsystem docs (with Oracle branding on it)

\r\n\r\n\r\n',78,0,0,'CC-BY-SA','sys admin,systems,unix,illumos',0,0,1), (2733,'2019-01-23','Writing Web Game in Haskell - News and Notifications',2837,'Tuula talks about the game they\'re writing in Haskell and convoluted news system they made.','

Intro

\r\n

News and notifications are used in the game to let the players know something noteworthy has happened. It could be discovery of a new planet or construction project finally finishing.

\r\n

All relevant information in the news is hyperlinked. If news mentions a planet, player can click the link and view current information of that planet.

\r\n

Server interface

\r\n

Server has three resources for news, although we’re concentrating only one here:

\r\n
/api/message           ApiMessageR      GET POST\r\n/api/message/#NewsId   ApiMessageIdR    DELETE\r\n/api/icon              ApiMessageIcons  GET
\r\n

First one is for retrieving all messages and posting a new one. Second one is for marking one read and third one is for retrieving all icons that players can attach to messages written by them.

\r\n

Database

\r\n

Database is defined in /config/models file. For news, there’s only one table:

\r\n
News json\r\n    content Text\r\n    factionId FactionId\r\n    date Int\r\n    dismissed Bool\r\nderiving Show Read Eq
\r\n

Content field contains the actual news article data as serialized JSON. This allows storing complex data, without having to have lots of columns or multiple tables.

\r\n

Domain objects

\r\n

There are many kinds of messages that players might see, but we’ll concentrate on one about discovering a new planet

\r\n

All different kinds of articles are of same type: NewsArticle. Each different kind of article has their own value constructor (PlanetFound in this particular case). And each of those value constructors has single parameter of a specific type that holds information particular to that certain article (PlanetFoundNews in this case). Adding a new article means adding a new value constructor and record to hold the data.

\r\n
data NewsArticle =\r\n    StarFound StarFoundNews\r\n    | PlanetFound PlanetFoundNews\r\n    | UserWritten UserWrittenNews\r\n    | DesignCreated DesignCreatedNews\r\n    | ConstructionFinished ConstructionFinishedNews\r\n\r\n\r\ndata PlanetFoundNews = PlanetFoundNews\r\n    { planetFoundNewsPlanetName :: Text\r\n    , planetFoundNewsSystemName :: Text\r\n    , planetFoundNewsSystemId   :: Key StarSystem\r\n    , planetFoundNewsPlanetId   :: Key Planet\r\n    , planetFoundNewsDate       :: Int\r\n    }
\r\n

Given a News object, we can turn it into NewsArticle. These are much nicer to deal with that densely packed News that is stored in database:

\r\n
parseNews :: News -> Maybe NewsArticle\r\nparseNews =\r\n    decode . toLazyByteString . encodeUtf8Builder . newsContent
\r\n

Because parsing arbitrary JSON might fail, we get Maybe NewsArticle, instead of NewsArticle. It is possible to write the same code in longer way:

\r\n
parseNews news =\r\n    let\r\n        content = newsContent news\r\n        utf8Encoded = encodeUtf8Builder content\r\n        byteString = toLazyByteString utf8Encoded\r\n    in\r\n        decode byteString
\r\n

Similarly there’s two other functions for dealing with Entities (primary key, data - pair really) and list of Entities. Note that parseNewsEntities filters out all News that it didn’t manage to turn into NewsArticle. They have following signatures:

\r\n
parseNewsEntity :: Entity News -> (Key News, Maybe NewsArticle)\r\n\r\nparseNewsEntities :: [Entity News] -> [(Key News, NewsArticle)]
\r\n

Writing JSON encoding and decoding is tedious, template Haskell can help us here:

\r\n
$(deriveJSON defaultOptions ''PlanetFoundNews)\r\n$(deriveJSON defaultOptions ''NewsArticle)
\r\n

Turning Articles into JSON

\r\n

News articles aren’t much use if they stay on the server, we need to send them to clients too. We can’t have multiple declarations of same typeclass for any type, so we declare complete new type and copy data there before turning it into JSON and sending to client (this is one way of doing this).

\r\n

First step, define our types (concentrating on planet found news here):

\r\n
data NewsArticleDto =\r\n    StarFoundDto StarFoundNewsDto\r\n    | PlanetFoundDto PlanetFoundNewsDto\r\n    | UserWrittenDto UserWrittenNewsDto\r\n    | DesignCreatedDto DesignCreatedNewsDto\r\n    | ConstructionFinishedDto ConstructionFinishedNewsDto\r\n    deriving (Show, Read, Eq)\r\n\r\ndata PlanetFoundNewsDto = PlanetFoundNewsDto\r\n    { planetFoundNewsDtoPlanetName :: Text\r\n    , planetFoundNewsDtoSystemName :: Text\r\n    , planetFoundNewsDtoSystemId   :: Key StarSystem\r\n    , planetFoundNewsDtoPlanetId   :: Key Planet\r\n    , planetFoundNewsDtoDate       :: Int\r\n    }\r\n    deriving (Show, Read, Eq)
\r\n

We need way to move data into dto and thus define a type class for that operation:

\r\n
class (ToJSON d) => ToDto c d | c -> d where\r\n    toDto :: c -> d
\r\n

For more information about functional dependencies, check following links: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extension-FunctionalDependencies and https://wiki.haskell.org/Functional_dependencies

\r\n

Writing instances for our type class:

\r\n
instance ToDto PlanetFoundNews PlanetFoundNewsDto where\r\n    toDto news =\r\n        PlanetFoundNewsDto { planetFoundNewsDtoPlanetName = planetFoundNewsPlanetName news\r\n                           , planetFoundNewsDtoSystemName = planetFoundNewsSystemName news\r\n                           , planetFoundNewsDtoSystemId = planetFoundNewsSystemId news\r\n                           , planetFoundNewsDtoPlanetId = planetFoundNewsPlanetId news\r\n                           , planetFoundNewsDtoDate = planetFoundNewsDate news\r\n                           }\r\n\r\ninstance ToDto NewsArticle NewsArticleDto where\r\n    toDto news =\r\n        case news of\r\n            (StarFound x) -> StarFoundDto $ toDto x\r\n            (PlanetFound x) -> PlanetFoundDto $ toDto x\r\n            (UserWritten x) -> UserWrittenDto $ toDto x\r\n            (DesignCreated x) -> DesignCreatedDto $ toDto x\r\n            (ConstructionFinished x) -> ConstructionFinishedDto $ toDto x
\r\n

Finally, we want to wrap our news into something that has all the common info (id and link to icon to show)

\r\n
data NewsDto = NewsDto\r\n    { newsDtoId    :: Key News\r\n    , newsContents :: NewsArticleDto\r\n    , newsIcon     :: Text\r\n    }\r\n    deriving (Show, Read, Eq)
\r\n

IconMapper knows how to turn NewsArticleDto (in this case) to corresponding link to the icon. Notice how our ToDto instance includes IconMapper in addition to Key and NewsArticle:

\r\n
instance ToDto ((Key News, NewsArticle), (IconMapper NewsArticleDto)) NewsDto where\r\n    toDto ((nId, article), icons) =\r\n        let\r\n            content = toDto article\r\n        in\r\n        NewsDto { newsDtoId = nId\r\n                , newsContents = content\r\n                , newsIcon = runIconMapper icons content\r\n                }
\r\n

Sideshow: IconMapper

\r\n

IconMapper is a function that knows how to retrieve url to icon that matches the given parameter (for example NewsArticleDto in this case):

\r\n
newtype IconMapper a =\r\n    IconMapper { runIconMapper :: a -> Text }
\r\n

One possible implementation that knows how to deal with NewsArticleDto. We have two levels of hierarchicy here, because UserNewsDto has special rules for figuring out which icon to use:

\r\n
iconMapper :: (Route App -> Text) -> IconMapper UserNewsIconDto -> IconMapper NewsArticleDto\r\niconMapper render userIconMapper =\r\n    IconMapper $ article ->\r\n        case article of\r\n            PlanetFoundDto _->\r\n                render $ StaticR images_news_planet_png\r\n\r\n            UserWrittenDto details ->\r\n                runIconMapper userIconMapper $ userWrittenNewsDtoIcon details\r\n    ...
\r\n

Back to JSON

\r\n

I wrote ToJSON and FromJSON instances by hand, because I wanted full control on how the resulting JSON looks like. It’s possible to configure how template Haskell names fields for example, but I think that writing these out couple of times is good practice and makes sure that I understand what’s going on behind the scenes if I use template Haskell later.

\r\n
instance ToJSON NewsDto where\r\n    toJSON (NewsDto { newsDtoId = nId\r\n                    , newsContents = contents\r\n                    , newsIcon = icon }) =\r\n        object [ "id" .= nId\r\n               , "contents" .= contents\r\n               , "tag" .= jsonTag contents\r\n               , "icon" .= icon\r\n               , "starDate" .= newsStarDate contents\r\n               ]\r\n\r\ninstance ToJSON PlanetFoundNewsDto where\r\n    toJSON (PlanetFoundNewsDto { planetFoundNewsDtoPlanetName = pName\r\n                               , planetFoundNewsDtoSystemId = sId\r\n                               , planetFoundNewsDtoPlanetId = pId\r\n                               , planetFoundNewsDtoSystemName = sName\r\n                               }) =\r\n        object [ "planetName" .= pName\r\n               , "systemName" .= sName\r\n               , "planetId" .= pId\r\n               , "systemId" .= sId\r\n               ]
\r\n

Time to put it all together

\r\n

Handler function authenticates user, check they’re member of a faction and then loads all the news:

\r\n
getApiMessageR :: Handler Value\r\ngetApiMessageR = do\r\n    (_, _, fId) <- apiRequireFaction\r\n    loadAllMessages fId
\r\n

Loading messages involves multiple steps:

\r\n\r\n
loadAllMessages :: Key Faction -> HandlerFor App Value\r\nloadAllMessages fId = do\r\n    loadedMessages <- runDB $ selectList [ NewsFactionId ==. fId\r\n                                         , NewsDismissed ==. False ] [ Desc NewsDate ]\r\n    let parsedMessages = parseNewsEntities loadedMessages\r\n    render <- getUrlRender\r\n    let userIcons = userNewsIconMapper render\r\n    return $ toJSON $ map (toDto . (flip (,) (iconMapper render userIcons))) parsedMessages
\r\n

\r\n\r\n

\r\n',364,107,0,'CC-BY-SA','haskell, yesod',0,0,1), (2726,'2019-01-14','Home Theater - Part 2 Software (High Level)',1249,'I go over a high level of my notes for the software on my Media box as it relates to TV/Movies/Music','

https://docs.google.com/document/d/1E1xAwWpq-C4vEh8LCRw7MD7jnaclX9Faf2L3dZWiqQY

\r\n\r\n\r\n

Local copy of the shownotes

',36,0,0,'CC-BY-SA','kodi, deluge,Sonarr,Plex,Subsonic,SpiderOakONE,Zoneminder,Borg Backup,rclone,Redshift,Audacity',0,0,1), (2727,'2019-01-15','Passwords',467,'How to do passwords better. ','

Introduction

\r\n

Hello and welcome to Hacker Public Radio, I’m Edward Miro and for this episode I decided to record an episode on the importance of good passwords. This will be part one in a series of podcasts I’m going to call “Information Security for Everyone”. As with most of the content I create in the world of infosec, my goal is to present the information in a way that a majority of people can get value from it and anyone can play this for a friend, colleague or family member and make it easy for the non-hackers in our lives to understand.

\r\n

Passwords

\r\n

One of the first things most people think about when it comes to online safety is their password. We all know that passwords are to our online accounts what keys are for our locks. Would you use the same key for your house, your car, your office and your safety deposit box? Of course not. And if you did, what would happen if a bad guy could get a copy of just that one key? They’d have access to everything. With so much of our personal, confidential, financial and medical information accessible from our various online accounts, what can we do to make things as safe as possible?

\r\n

For me personally I employ and advise a three faceted approach:

\r\n
    \r\n
  1. Complex passwords
  2. \r\n
  3. Unique passwords
  4. \r\n
  5. Two-factor authentication (where available)
  6. \r\n
\r\n

Clearly the solution is to use a unique password for each account and make them complicated enough that an attacker couldn’t guess it or crack it in an amount of time that would be actionable. One problem this presents to general users is the inconvenience and difficulty in remembering these passwords or storing them in a secure way. This leads into my first bit of advice:

\r\n

Password Managers

\r\n

My recommendation is to use a password manager. I’m going to make references to managers such as LastPass because that’s the one I’ve always used, but I’m not saying it’s the best or would be the best for you. There are many great options and I would rather people use the one that works the best for them and not merely the one I like best. Anyways. Applications like LastPass give you the ability to store all passwords in your encrypted “vault” and then request them through browser add-ons or standalone applications. They also have built in features that allow you to generate secure passwords at any length or complexity.

\r\n

When using a password manager, all you have to remember is your ONE master password. When you sign in, the manager can then decrypt all your saved passwords and let you use them. When I sign up for a website, I use LastPass to generate the longest and most complex password supported by the site and it gets stored in my vault safely for later use.

\r\n

There are various options online to choose from and I suggest you do some research and try a few different ones to see what is comfortable for you. One thing to consider when using a password manager is that the master password is your single point of failure and should be a long and complex password that you don’t use ANYWHERE else.

\r\n

If you’re wondering how to come up with a secure password that you can remember there are various strategies online, but I follow this:

\r\n

Take a poem, song lyrics or phrase that is easy for you to remember. For this example I’ll use the phrase:

\r\n
"The stars at night are big and bright. Deep in the heart of Texas."
\r\n

Then I take the first letters from each word and that gives me:

\r\n
TsanababdithoT.
\r\n

Then I swap out the vowels for some numbers/special characters. And that gives me:

\r\n
T5@n@b@bd1th0T
\r\n

I checked that password on Dashlane’s Password Strength Checker, and got the following results:

\r\n
It would take a computer about 204 million years to crack your password
\r\n

And that’s just an example of a very secure password that I thought up in just a few seconds that I probably won’t ever be able to forget it.

\r\n

2FA (two-factor authentication)

\r\n

Another very important recommendation I want to touch on in this episode is using two-step authentication. I use it for all accounts that offer it and it’s very easy to set-up and use. It works in tandem with an application on my mobile device called Google Authenticator(though there are others and like LastPass this is just the one I use) and it’s available for Android and iOS. After you install the app, you access the security settings for the account you want to protect and register it with your device.

\r\n

What it does is provide a “second” password when logging it that is only used one time. When you log in, the site will prompt for the two-step authentication code, you then open the Google Authenticator app and the code for the session will be listed. The codes are only available for a short time and are constantly changing. This makes someone gaining unauthorized access to your account VERY difficult.

\r\n

A few closing thoughts

\r\n

Some information security professionals see a password manager as insecure due to it being a single point of failure. I can understand this and would respond that although this might be true, having a complex master password and using the manager in conjunction with two-step authentication makes it a pretty safe and solid system. And even if there is a breach, none of my passwords are the same and changing them is incredibly fast and easy with a manager.

\r\n

Also, I usually don’t recommend keeping hard copies of passwords, but if you can guarantee the physical security of your password list, this in my opinion is preferable to using the same, insecure password for all your accounts.

\r\n

Please remember, if you’re like most people on the internet and you use an easy to crack password or the same password on all your sites, all it takes is one compromised account to give bad guys access to everything.

\r\n

I’m also including a list of links in the bottom of the show notes to everything I mentioned and also a link to the site Have I Been Pwned. This is a service that collects accounts that have been involved in hacks and lets anyone search for their email address and see if their information is already compromised. If it is, do this NOW:

\r\n
    \r\n
  1. Setup a password manager with a strong master password.
  2. \r\n
  3. Change all your passwords using the built in password generator in your password manager and save them in your vault as you go.
  4. \r\n
  5. In the future when breaches happen, it’s incredibly easy to change your password and you’ll also rest easy knowing that the password obtained can’t get them into anything else.
  6. \r\n
\r\n

I know this will take a long time. But it’s worth it. Then, you only have to remember one master password and you will be exponentially safer online.

\r\n

I also linked SplashData’s “The Top 100 Worst Passwords of 2018”. PLEASE don’t use anything on this list.

\r\n

Well, thank you for taking the time to listen to my basic introduction to passwords. I hope this will help any non-hackers in your life and like I say in all my podcasts, I don’t claim to know all there is to know and love feedback and any opportunities to learn more or collaborate with others in the field. As with most of the research and articles I’ve written in the past, these are geared toward standard users in a business setting and are meant to be a jumping off point for further research and to be a foundation for cyber security 101 level training classes. If you like what I do, and want to have me come speak to your team, or just wanna chat, feel free to email me.

\r\n

Thank you and have a safe 2019!

\r\n

Links:

\r\n\r\n',372,74,0,'CC-BY-SA','Information Security for Everyone',0,0,1), (2730,'2019-01-18','Resizing images for vcard on Android',688,'Automating the steps needed to get images formatted for VCard import into Android phones','

I have had problems importing vcards onto my Android phone. After a lot of troubleshooting, I tracked it down to embedded images in the card. The PHOTO;VALUE field to be precise.

\r\n\r\n

Some images worked and some didn\'t, and looking at the properties some that worked were larger than others that didn\'t. In the end I tracked down a post on stackoverflow that hinted that the aspect ratio was important. And sure enough it was.

\r\n\r\n
\r\n

starting with jelly bean (4.1), android now supports contact images that are 720x720.
before, starting with ICS (4.0), android has supported contact images that are 256x256.
and before that, contact photos had just a size of a thumbnail - 96x96.

\r\nStack exchange \r\n
\r\n\r\n\r\n

I tried a 720x720 on a few phones but decided to settle on 256x256 for now.

\r\n\r\n\r\n

To do image manipulation, I tend to use the GraphicsMagick tools instead of the more popular ImageMagick suite. You should be able to achieve the same result in either.

\r\n\r\n\r\n

My requirements were:

\r\n\r\n\r\n\r\n

To use an example I took the following image and saved it as Linus_Torvalds.jpg

\r\n\r\n\r\n

By Krd (photo)Von Sprat (crop/extraction) - File:LinuxCon Europe Linus Torvalds 03.jpg, CC BY-SA 4.0, Link

\r\n\r\n\r\n

Step one is to use the -size 256x256 option which you would think would do the scaling, but in fact it only reduces the file to 366x509 which is not what I expected.

\r\n\r\n
$ gm convert -size 256x256 \"Linus_Torvalds.jpg\" Linus_Torvalds_1.jpg
$ gm identify Linus_Torvalds_1.jpg\r\nLinus_Torvalds_1.jpg JPEG 366x509+0+0 DirectClass 8-bit 56.1Ki 0.000u 0m:0.000002
\r\n\r\n\r\n

\r\n\r\n\r\n

However it appears that the option is used when creating new files, and is also used by the processor to determine the intended target size. Which is why I left it in. So what we actually need is the -resize option.

\r\n\r\n
\r\n$ gm convert -size 256x256 \"Linus_Torvalds.jpg\" -resize 256x256 Linus_Torvalds_2.jpg\r\n$ gm identify Linus_Torvalds_2.jpg\r\nLinus_Torvalds_2.jpg JPEG 184x256+0+0 DirectClass 8-bit 47.7Ki 0.000u 0m:0.000001s\r\n
\r\n\r\n

\r\n\r\n

So this has done a good job at scaling the image down. It\'s now scaled correctly so that the biggest edge is scaled down to 256. In this case it was the height but the width is now shorter than what we need. We do want to maintain the aspect ratio so that we don\'t distort the image but 184x256 is not 1:1 aspect ratio nor is it the needed dimensions of 256x256.

\r\n\r\n

The solution to this is to use the -extent command.

\r\n\r\n
$ gm convert -size 256x256 \"Linus_Torvalds.jpg\" -resize 256x256 -extent 256x256 Linus_Torvalds_3.jpg\r\n$ gm identify Linus_Torvalds_3.jpg\r\nLinus_Torvalds_3.jpg JPEG 256x256+0+0 DirectClass 8-bit 48.0Ki 0.000u 0m:0.000001s
\r\n\r\n\r\n

\r\n\r\n\r\n

This gives us the correct size and a 1:1 aspect ratio, but the image is left justified. To fix this we need to use the -gravity command. That needs to be the first argument of the command. Finding the correct order of the commands took some trial and error.

\r\n\r\n
$ gm convert -gravity center -size 256x256 \"Linus_Torvalds.jpg\" -resize 256x256 -extent 256x256 Linus_Torvalds_4.jpg\r\n$ gm identify Linus_Torvalds_4.jpg\r\nLinus_Torvalds_4.jpg JPEG 256x256+0+0 DirectClass 8-bit 48.5Ki 0.000u 0m:0.000001s
\r\n\r\n

\r\n\r\n

Finally we remove all profile information using +profile which should make the image more generic.

\r\n\r\n
$ gm convert -gravity center -size 256x256 \"Linus_Torvalds.jpg\" -resize 256x256 -extent 256x256 +profile \"*\" Linus_Torvalds_5.jpg\r\n$ gm identify Linus_Torvalds_5.jpg\r\nLinus_Torvalds_5.jpg JPEG 256x256+0+0 DirectClass 8-bit 5.7Ki 0.000u 0m:0.000001s
\r\n\r\n

Putting it all together we get.

\r\n\r\n
gm convert -gravity center -size 256x256 \"big-image.jpg\" -resize 256x256 -extent 256x256 +profile \"*\" \"256x256_image.jpg\"\r\n
\r\n\r\n

\r\n\r\n

You should now be able to add these images to vcards without any problem.

\r\n\r\n

Here is a one liner to create 96x96 256x256 and 720x720 thumbnails of all the jpg images in a directory.

\r\n\r\n

 

\r\n\r\n
for image in *jpg;do for size in 96x96 256x256 720x720; do gm convert -gravity center -size ${size} \"${image}\" -resize ${size} -extent ${size} +profile \"*\" \"thumbnail-${size}-${image}\";done;done
\r\n\r\n

Also available here

\r\n',30,0,1,'CC-BY-SA','GraphicsMagick, ImageMagick, VCard, Android, LinageOS',0,0,1), (2728,'2019-01-16','The Unreliable Narrator In Storytelling',814,'Lostnbronx looks at unreliable narrators and narrative techniques in stories.','

In some stories, the narrator or dominating character can’t be trusted by the audience, creating opportunities for various storytelling effects. What makes for an unreliable narrator? What are some of the strengths and weaknesses of this technique? How can the underlying structure of a tale be similar to an unreliable narrator, even if the story doesn’t actually have one? Lostnbronx takes a rambling, off-the-cuff look at this interesting literary tool

\r\n',107,105,0,'CC-BY-SA','stories,storytelling,narration,lostnbronx',0,0,1), (2731,'2019-01-21','My 8 bit Christmas',1579,'I got a new, old computer for Christmas - an Acorn BBC microcomputer model B.','

For Christmas 2018 Santa – well, Mrs mcnalu – gave me a BBC Model B which was my first computer back in the early 1980s. This request was heavily implied in TuxJam 70 - Gift for Geeks.

\r\n

I can highly recommend the seller who, as you will hear, was extremely helpful when this 36 year old bundle of 8 bit loveliness became very poorly on Boxing Day. It came with a Turbo MMC installed and you can see it in action on another BBC Model B in this video.

\r\n

The noise you hear at the start - the beeeeee BEEP - is the sound of me turning on the BBC. I mention in the show that mode 0 of the Beeb, as it is affectionately known, has 80 columns and 40 rows. This isn’t quite right, there are only 32 rows in mode 0.

\r\n',268,0,0,'CC-BY-SA','retro,BBC,8-bit,assembler',0,0,1), (2734,'2019-01-24','Mashpodder',1139,'A poor rushed attempt at covering the excellent podcast client mashppoder','

After I recorded this episode I had a little look on the HPR site I found that Ken Fallon had already covered mashpodder, no doubt he did a better job than me as this was done in a bit of a rush.

\r\n

Hopefully somebody will find this of some use

\r\n

Related links below:-

\r\n\r\n',201,0,1,'CC-BY-SA','Podcast, ncurses, command-line',0,0,1), (2750,'2019-02-15','Windmill is on the Fritz',270,'Using Fritzing to help reverse engineer a circuit in a winter model village windmill','

\r\nIn this episode Ken uses Fritzing tool to keep track of how a winter model village windmill is wired together. Leading to identifying the problem component.\r\n

\r\n

\r\n\r\n

\r\nFritzing is an open-source initiative to develop amateur or hobby CAD software for the design of electronics hardware, to support designers and artists ready to move from experimenting with a prototype to building a more permanent circuit. It was developed at the University of Applied Sciences of Potsdam.\r\n
\r\nFrom https://en.wikipedia.org/wiki/Fritzing

',30,103,0,'CC-BY-SA','Fritzing, Reverse Engineering, LED',0,0,1), (2732,'2019-01-22','Storytelling formula compliance',1692,'Telling a story? want a reaction? USE THE FORMULA','

\r\nStorytelling has had a formula for yearsAndYears. Some people speak of it in disdain (\"it was too formulaïc\") and others (creative writing and intro film teachers, mostly) praise it. Everybody else (us) is a sucker for it.\r\n

\r\n\r\n

\r\nHere is the literal formula, in pseudo code:\r\n

\r\n\r\n
{A} \r\n{A} Reinforced\r\n\r\n{Z}\r\n\r\n{A} Returned\r\n\r\n{B...Y}\r\n\r\n{Z} Returned\r\n
\r\n\r\n

\r\nYou can (and should, because it\'s free and you can throw out your work if you don\'t like it) practise this formula by plugging in events to represent A and Z, where A and Z are polar opposites.\r\n

\r\n\r\n

\r\nReally obvious examples are any given romantic comedy:\r\n

\r\n\r\n
{A} Jack is A=\"single and free\"\r\n{A} Scene to reinforce that Jack is in relationships with no strings attached. Jack is {A}.\r\n\r\n{Z} Jack meets Jill, realises she makes him happy. He decides he\'s had enough of being {A} and want to be {Z=married}\r\n\r\n{A} Reunion with old school mate makes Jack question his resolve. He leaves Jill so he can be {A}\r\n\r\n{B...Y} Plot happens. Jack does stuff, Jill does stuff. Funny? Tragic? You decide!\r\n\r\n{Z} Jack realizes at last that he\'s only happy with Jill, and that being {Z} with Jill is the only way to be truly free.\r\n
\r\n\r\n

\r\nYou can also try it with the old Evil Empire plot line.\r\n

\r\n\r\n
{A} Jill is an {A=obedient citizen}. Loves her mama, loves Jesus and America, too.\r\n{A} Scene in which Jill witnesses a Rebel being mistreated unjustly, but does nothing to stand up for what is right, because she is {A}.\r\n\r\n{Z} Jill meets Jack, an outlaw and rebel against the Empire. He\'s in trouble, so she helps him evade the police.\r\n\r\n{A} Jill, horrified at her own rebellion, conforms all the more. She is dedicated to the Empire, and works diligently to hunt down Jack and his rag tag band of rebels.\r\n\r\n{B...Y} Plot happens. Action, laser guns, laser swords, nationalism, motorcycle gangs.\r\n\r\n{Z} Jill, seeing the devastation her allegiance has caused, realises that the Empire is actually Evil. She joins the rebels to fight for freedom.\r\n
\r\n\r\n

\r\nNow go practice this. Soon you will be telling stories, jokes, and anecdotes that have a clear beginning, a clear conflict, and a clear ending.\r\n

\r\n\r\n',78,99,1,'CC-BY-SA','story, character, plot, writing',0,0,1), (2735,'2019-01-25','Soffritto',138,'A short episode on a common cookery technique','

Hello and a belated Happy New Year to you all in HPR land, Ken has recently made a call for more shows as the queue is a little light at the moment so I was pondering what to waffle on about.

\r\n

You may know from a couple of my previous shows that as well as being into tech and Linux I’m also a keen Cook, and try and prepare as much of the food we eat at home from scratch as possible.

\r\n

One of the keys to good dishes is a base of sweated vegetables such as onion, celery carrot and garlic which when cooked in olive oil, is called a Soffritto in Italian cookery. In other parts of the Mediterranean and Latin America where Europeans settled this base to dishes may include other vegetables such as peppers, tomatoes and mushrooms, and have other names such as mirepoix (/mɪərˈpwɑː/ meer-PWAH); but the idea is the same to give a base flavour to soups, sauces, risotto and stew type dishes.

\r\n

Although not called the same thing this is also replicated in Asian cookery where spices and other aromatics are included such as ginger, lemon grass, chillies, cumin and coriander seeds.

\r\n

While it is not obligatory to start dishes in such a way if you do use a base of flavours like this when cooking you will find that the finished dish has a more complex and deep flavour at the end, so if you don’t do this give it a try.

\r\n

A simple starter is to make a tomato sauce for pasta using a base of finely chopped onion, celery, carrot and garlic soften all the vegetables in a pan with some olive oil, add a tin of tomatoes or jar of passata (sieved tomatoes) reduce for 10-15 minutes until all the flavours combine and use as a sauce over pasta with grated cheese.

\r\n

https://en.wikipedia.org/wiki/Sofrito

\r\n',338,93,0,'CC-BY-SA','Food, cookery, how to, food preparation',0,0,1), (2736,'2019-01-28','Response to show 2720',1104,'Some suggestions on how to improve a Bash script','

Introduction

\r\n

On January 4th 2019 Ken Fallon did a great show entitled hpr2720 :: Download youtube channels using the rss feeds where he presented a Bash script called youtube-rss.bash for managing YouTube downloads through RSS feeds.

\r\n

Ken said he welcomed constructive feedback

\r\n

When I see a Bash script these days I usually find myself looking for ways to rewrite it to make it fit in with what I have been learning while doing my Bash Tips sub-series. Either that or I find it’s got some better ideas than I’ve been using which I have to find out about.

\r\n

I also spend time going over my own old scripts (I was writing them in the 1990’s in some cases) and trying to incorporate newer Bash features.

\r\n

Suffice it to say that I spotted some areas for improvement in Ken’s script and thought this might be the way to share my thoughts about them. We’re low on shows as I write this, so that gave me more motivation to make a show rather than add a comment or send Ken an email.

\r\n

Apology: I’m still suffering from the aftermath of some flu-like illness so have had to edit coughing fits out of the audio at various points. If you detect any remnants then I’m sorry!

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n',225,42,1,'CC-BY-SA','Bash,ShellCheck',0,0,1), (2737,'2019-01-29','My Pioneer RT-707 Reel-to-Reel Tape Deck',1381,'An intro to more of my legacy audio equipment.','

I\'ve had this Pioneer RT-707 reel-to-reel tape deck for something like 10 years, but only recently started using it with enthusiasm. In this episode I talk about the tape deck, about the technology, and about my memories of using this kind of audio tape as a kid. I demonstrate playback of one of my parents\' mix tapes, and I also used this machine to record the last few minutes of the podcast onto a reel to reel tape, which of course I then had to transfer back to digital before submitting the show.

\r\n\r\n

Click image below to see a photo album relating to the tape deck.

\r\n\r\n\"Pioneer\r\n\r\n

Tape deck in action (video)

\r\n\r\n

\r\n\r\n

',238,0,0,'CC-BY-SA','audio, vintage audio, stereo components, audio tape, recording',0,0,1), (3046,'2020-04-06','HPR Community News for March 2020',4545,'HPR Volunteers talk about shows released and comments posted in March 2020','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n
crvs.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3021Mon2020-03-02HPR Community News for February 2020HPR Volunteers
3022Tue2020-03-03FOSDEM 2020 Stand InterviewsKen Fallon
3023Wed2020-03-04Critique My Script, Episode 1 - Qots-Crew-GenCarl
3024Thu2020-03-05A funny thing happened the other dayMrX
3025Fri2020-03-06Keep unwanted messages off the FediverseAhuka
3026Mon2020-03-09Hex Bug and Battle Botsoperat0r
3027Tue2020-03-10What is quantum computing and why should we care?mightbemike
3028Wed2020-03-11Monads and Haskellcrvs
3029Thu2020-03-12At Union Station with a train delayArcher72
3030Fri2020-03-13My new Samsung tabletMrX
3031Mon2020-03-16Daniel Persson - Me? Me!Daniel Persson
3032Tue2020-03-17piCore on a Raspberry Pi 1 Model BClaudio Miranda
3033Wed2020-03-1832 Bit Time Travelmonochromec
3034Thu2020-03-19How to bridge Freenode IRC rooms to Matrix.orgThaj Sara
3035Fri2020-03-20Decentralised Hashtag Search and Subscription in Federated Social NetworksAhuka
3036Mon2020-03-23WiiU is dead long live WiiU!operat0r
3037Tue2020-03-24Ambient recording at Union StationArcher72
3038Wed2020-03-25Solo Magicklaatu
3039Thu2020-03-26Making a Raspberry Pi status displayDave Morriss
3040Fri2020-03-27Why use GNU Autotoolsklaatu
3041Mon2020-03-30How to use GNU Autotoolsklaatu
3042Tue2020-03-31The COVID-19 Work From Home Stream - Day 0Thaj Sara
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 2 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 21 comments on 8 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-March/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\ncrvs, Windigo, Archer72, Dave Morriss

\n

Over the period tags and/or summaries have been added to 28 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2745,'2019-02-08','My YouTube Subscriptions #1',1262,'Part one of my list of subscribed channels','

I am subscribed to a number of YouTube channels, and I am sharing them with you

\r\n\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1), (2755,'2019-02-22','My YouTube Subscriptions #2',1329,'Part two of my list of subscribed channels','

I am subscribed to a number of YouTube channels, and I am sharing them with you

\r\n\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1), (2765,'2019-03-08','My YouTube Subscriptions #3',1329,'Part three of my list of subscribed channels','

I am subscribed to a number of YouTube channels, and I am sharing them with you

\r\n\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1), (2775,'2019-03-22','My YouTube Subscriptions #4',1198,'Part four of my list of subscribed channels','

I am subscribed to a number of YouTube channels, and I am sharing them with you

\r\n\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1), (2790,'2019-04-12','My YouTube Subscriptions #5',1206,'Part five of my list of subscribed channels','

I am subscribed to a number of YouTube channels, and I am sharing them with you

\r\n\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1), (2800,'2019-04-26','My YouTube Subscriptions #6',1169,'Part six of my list of subscribed channels','

I am subscribed to a number of YouTube channels, and I am sharing them with you

\r\n\r\n',198,106,0,'CC-BY-SA','YouTube, Channels, Subscriptions',0,0,1), (2738,'2019-01-30','My Applications',229,'just a short show on the applications I use on my Linux Mint Box','

Hi again, this is Tony Hughes from Blackpool in the UK. Ken is still short of shows so here is another quick show to help out with the queue.

\r\n

This one is going to be about the applications I use on my Linux Mint 19.1 install. I’ve been using Linux for over 10 years now and during that time have never felt that there was anything that was lacking in the software department for day to day productivity and general day to day use, so this is just a list of some of the things that I, and I suspect most computer users, need to make electronic life a reality.

\r\n

So for internet browsing I use Firefox, I’ve been using this since my Windows days and it was just natural that, as this is the default web browser in Linux Mint, that this is what I would continue to use when I moved over to Linux.

\r\n

Email – I have several web based accounts which means these are operating system agnostic, but for my Internet Service provider account I use Thunderbird to download and store my e-mail onto my main desktop PC. I can also use this to access my web based accounts and store emails for these off line as well if needed.

\r\n

Office productivity is provided for with LibreOffice which is a very mature and comprehensive office suite comprising of all the main tools needed such as a word processor, spreadsheet and presentation software. It also has a Database and drawing package, and for maths geeks an advanced maths formula creating program which I have never used, but could be very useful for students and scientists.

\r\n

For audio and video playback I use VLC which again is something I first used back in my windows days, it works with all the audio and video codecs you can throw at it, and if you have the Libdvdcss codecs installed will play proprietary DVD’s.

\r\n

For recording and editing audio including this podcast I use Audacity, which is again a cross platform programme and a very powerful piece of software, as myself and many others that use it will be able to tell you

\r\n

So that is a short list of the programmes that I use on a day to day basis. I hope you found it useful, if not it doesn’t matter as Ken still got a show out of me.

\r\n

Well that’s it for this one. This is Tony Hughes signing off for now.

\r\n',338,0,0,'CC-BY-SA','productivity software',0,0,1), (2740,'2019-02-01','Pop!_OS 18.10 (quick) review',438,'In this episode, Yannick does a quick review of Pop OS 18.10','

This episode is a re-edition of the review of Pop_OS! I did for TuxJam back in December 2018. Pop_OS! is published by System76.

\r\n',370,0,0,'CC-BY-SA','linux,distro,distribution,pop_os,system76,ubuntu',0,0,1), (2744,'2019-02-07','Yet Another Rambling Drive Into Work',2022,'Yet another rambling attempt at making a show on the way into work','

I came across this show sitting in my digital recorder I recorded it back in November 2017 but never posted it, my thoughts on some of the things I mention in this show have since evolved, I’ll stick these changed thoughts at the end of these notes and may also stick in an extra recorded section at the end of the show.

\r\n\r\n

Here are the changes since I recorded this show in November 2017, it is now October 2018.

\r\n

Think there was a £4,500 pound grant on new EV cars however it has been announced that this grant will in the near future will be cut to £3500.

\r\n

I think the Government and Nissan together had a £2000 contribution scheme when you traded in an old car for a 2nd hand leaf I think this is no longer available now that the leaf is more popular.

\r\n

Fuel costs have gone up and I may have miscalculated I think my true annual fuel bill is nearer to £2,000

\r\n

Nissan leaf road tax is free

\r\n

Because of supply and demand the depreciation situation has completely changed had I bought this leaf in November 2017 it would now be worth more today in October 2018. Only time will tell how it all pans out, things are changing rapidly.

\r\n

After further investigation it looks like battery degradation is less than I first thought and would likely still be in pretty good condition at 6 years old, particularly in a cooler country like here in the UK in Scotland.

\r\n

There has been some controversy about the new 40kw leaf which may also impact in the older leaf making the older leaf’s more appealing contributing further to the high demand for the older 30kw and 24kw leafs.
\r\nhttps://en.wikipedia.org/wiki/Nissan_Leaf#Criticism
\r\nhttps://www.greencarreports.com/news/1116139_2018-nissan-leaf-electric-car-is-there-a-fast-charging-problem

\r\n

With the increased popularity of the older 24 and 30Kw leafs Nissan may no longer be so keen to give you a no quibble test drive.

\r\n

I think it’s looking increasingly like I made the wrong decision.

\r\n',201,0,1,'CC-BY-SA','Podcast, Cars',0,0,1), (2746,'2019-02-11','My software part 2',326,'More about the software I use regularly on Linux ','

Good day to all in HPR land, this is Tony Hughes coming to you from Blackpool in the UK again. This is a second instalment about some of the software I use on Linux Mint 19.1, on a regular basis. So without further ado lets get on with the show.

\r\n\r\n

So that’s it for this episode. I’ll be back to talk about some of the utilities I use on Mint on another show. This is Tony Hughes signing off for now.

\r\n',338,0,0,'CC-BY-SA','Linux Mint 19.1,utilities',0,0,1), (2747,'2019-02-12','checking oil',317,'checking your oil may not be so simple','
\r\n

a 914 shows up…
\r\nit has a 911 engine…
\r\ni check the oil…
\r\nthe car lives…

\r\n
\r\n',329,0,1,'CC-BY-SA','automotive',0,0,1), (2748,'2019-02-13','Writing Web Game in Haskell - Special events',2645,'Tuula walks through implementation of special events in web based game','

Intro

\r\n

I was tasked to write kragii worms in the game and informed that they’re small (10cm / 4 inches) long worms that burrow in ground and are drawn to farming fields and people. They’re dangerous and might eat harvest or people.

\r\n

Special events build on top of the new system I explained in episode 2733. They are read from same API as regular news and need same ToJSON, FromJSON, ToDto and FromDto instances as regular news (for translating them data transfer objects and then into JSON for sending to client).

\r\n

Loading

\r\n

Starting from the API interface, the first real difference is when JSON stored into database is turned into NewsArticle. Two cases, where special news have available options added to them and regular news are left unchanged. These options tell player what choices they have when dealing with the situation and evaluated every time special event is loaded, because situation might have changed since special event got stored into database and available options might have changed.

\r\n
addOptions (key, article) = case article of\r\n                                Special news ->\r\n                                    (key, Special $ availableOptions news)\r\n                                _ ->\r\n                                    (key, article)\r\n\r\navailableOptions :: SpecialNews -> SpecialNews\r\navailableOptions x =\r\n    case x of\r\n        KragiiWorms event _ choice ->\r\n            KragiiWorms event (eventOptions event) choice
\r\n

eventOptions is one of the events defined in SpecialEvent type class that specifies two functions every special event has to have. eventOptions lists what options the event has currently available and resolveEvent resolves the event according to choice user might have made (hence Maybe in it).

\r\n

Type class is parametrized with three types (imaginatively named to a, b and c). First is data type that holds information about special event (where it’s happening and to who for example), second one is one that tells all possible choices player has and third one lists various results that might occur when resolving the event. In this example they’re KragiiWormsEvent, KragiiWormsChoice and KragiiResults.

\r\n
data KragiiWormsEvent = KragiiWormsEvent\r\n    { kragiiWormsPlanetId   :: Key Planet\r\n    , kragiiWormsPlanetName :: Text\r\n    , kragiiWormsSystemId   :: Key StarSystem\r\n    , kragiiWormsSystemName :: Text\r\n    , kragiiWormsDate       :: Int\r\n    }\r\n\r\ndata KragiiWormsChoice =\r\n    EvadeWorms\r\n    | AttackWorms\r\n    | TameWorms\r\n\r\ndata KragiiResults =\r\n    WormsStillPresent\r\n    | WormsRemoved\r\n    | WormsTamed\r\n    | CropsDestroyed (RawResource Biological)\r\n    | FarmersInjured
\r\n

Definition of the SpecialEvent type class is shown below. Type signature of resolveEvent is gnarly because it’s reading and writing database.

\r\n
class SpecialEvent a b c | a -> b, a -> c where\r\n    eventOptions :: a -> [UserOption b]\r\n    resolveEvent :: ( PersistQueryRead backend, PersistQueryWrite backend\r\n                    , MonadIO m, BaseBackend backend ~ SqlBackend ) =>\r\n                    (Key News, a) -> Maybe b -> ReaderT backend m (Maybe EventRemoval, [c])
\r\n

One more piece we need is UserOption. This records options in a format that is useful in the client side. Each option player has are given title and explanation that are shown on UI.

\r\n
data UserOption a =\r\n    UserOption { userOptionTitle :: Text\r\n               , userOptionExplanation :: [Text]\r\n               , userOptionChoice :: a\r\n               }
\r\n

Current implementation of eventOptions doesn’t allow database access, but I’m planning on adding that at the point where I need it. Example doesn’t show all different options, as they all have same structure. Only first option in the list is shown:

\r\n
eventOptions _ = [ UserOption { userOptionTitle = "Avoid the worms"\r\n                              , userOptionExplanation = [ "Keep using fields, while avoiding the worms and hope they'll eventually leave."\r\n                                                        , "50 units of biologicals lost"\r\n                                                        , "25% chance of worms leaving"\r\n                                                        ]\r\n                              , userOptionChoice = EvadeWorms\r\n                            }\r\n                   , ...\r\n                   ]
\r\n

Making choice

\r\n

putApiMessageIdR handles updating news with HTTP PUT messages. First steps is to check that caller has autenticated and retrieve id of their faction. News article that is transferred in body as JSON is parsed and checked for type. Updating regular news articles isn’t supported and is signaled with HTTP 403 status code. One more check to perform is to check that news article being edited actually belong to the faction player is member of. If that’s not the case HTTP 404 message is returned.

\r\n

If we got this far, news article is updated with the content sent by client (that also contains possible choice made by user). There’s no check that type of news article doesn’t change or that the option selected doesn’t change (I need to add these at later point). In the end, list of all messages is returned back to the client.

\r\n
putApiMessageIdR :: Key News -> Handler Value\r\nputApiMessageIdR mId = do\r\n    (_, _, fId) <- apiRequireFaction\r\n    msg <- requireJsonBody\r\n    let article = fromDto msg\r\n    _ <- if isSpecialEvent article\r\n            then do\r\n                loadedMessages <- runDB $ selectList [ NewsId ==. mId\r\n                                                     , NewsFactionId ==. fId ] [ Asc NewsDate ]\r\n                if length loadedMessages == 0\r\n                    then apiNotFound\r\n                    else runDB $ update mId [ NewsContent =. (toStrict $ encodeToLazyText article) ]\r\n            else apiForbidden "unsupported article type"\r\n    loadAllMessages fId
\r\n

Resolving event

\r\n

Special event occured, user made (or did not) a choice. Now it’s time to simulate what happens. Below is resolveEvent for kragii attack.

\r\n
resolveEvent keyEventPair (Just choice) =\r\n    runWriterT . runMaybeT $\r\n        case choice of\r\n                EvadeWorms ->\r\n                    chooseToAvoid keyEventPair\r\n\r\n                AttackWorms ->\r\n                    chooseToAttack keyEventPair\r\n\r\n                TameWorms ->\r\n                    chooseToTame keyEventPair\r\n\r\nresolveEvent keyEventPair Nothing =\r\n    runWriterT . runMaybeT $ noChoice keyEventPair
\r\n

runWriterT and runMaybeT are used as code being called uses monad transformers to add some extra handling. WriterT adds ability to record data (KragiiResult in this case) and MaybeT adds ability to stop computation early if one of the steps return Nothing value.

\r\n

Let’s walk through what happens when user has chosen to avoid kragii worms and keep working only part of the fields. First step is to load faction information. If faction couldn’t be found, we abort. Next amount of biological matter consumed and how much is left is calculated. Again, if calculation isn’t possible, we’ll abort. This step reaches into database and updates amount of biological matter stored by the faction (again, possibility to stop early). Final step is to check if kragii leave or not (again, chance of abort).

\r\n
chooseToAvoid :: ( MonadIO m, PersistQueryWrite backend\r\n                 , BaseBackend backend ~ SqlBackend ) =>\r\n                 (Key News, KragiiWormsEvent)\r\n                 -> MaybeT (WriterT [KragiiResults] (ReaderT backend m)) EventRemoval\r\nchooseToAvoid (_, event) = do\r\n    faction <- getFaction event\r\n    (cost, bioLeft) <- calculateNewBio (RawResource 50) (entityVal faction)\r\n    _ <- destroyCrops faction cost bioLeft\r\n    removeNews $ PercentileChance 25
\r\n

Loading faction has several step. Id is stored in the event is used to load planet. Planet might or might have an owner faction, depending on if it has been settled. This faction id is used to load faction data. Loading might fail if corresponding record has been removed from database and planet might not be settled at the given time. Any of these cases will result Nothing be returned and whole event resolution being aborted. I’m starting to really like that I don’t have to write separate if statements to take care of these special cases.

\r\n
getFaction :: ( MonadIO m, PersistStoreRead backend\r\n              , BaseBackend backend ~ SqlBackend ) =>\r\n              KragiiWormsEvent\r\n              -> MaybeT (WriterT [KragiiResults] (ReaderT backend m)) (Entity Faction)\r\ngetFaction event = MaybeT $ do\r\n    planet <- lift $ get $ kragiiWormsPlanetId event\r\n    let owner = join $ fmap planetOwnerId planet\r\n    res <- lift $ mapM getEntity owner\r\n    return $ join res
\r\n

Amount of biological matter in store is stored in faction information. If it’s zero or less, Nothing is returned as there’s nothing to do really. In other cases, amount of biological matter left is calculated and result returned in form of ( cost, biological matter left ). I’m carrying around the cost, as it’s later needed for reporting how much matter was removed.

\r\n
calculateNewBio :: Monad m =>\r\n                RawResource Biological -> Faction\r\n                -> MaybeT (WriterT [KragiiResults] m) ((RawResource Biological), (RawResource Biological))\r\ncalculateNewBio cost faction = MaybeT $ do\r\n    let currentBio = factionBiologicals faction\r\n    return $ if currentBio > 0\r\n                then Just $ ( cost\r\n                            , RawResource $ max 0 (currentBio - unRawResource cost))\r\n                else Nothing
\r\n

destroyCrops updates database with new amount of biological matter in store for the faction and records amount of destruction in CropsDestroyed. tell requires that we have Writer at our disposal and makes recording information nice and easy.

\r\n
destroyCrops :: ( MonadIO m, PersistQueryWrite backend, BaseBackend backend ~ SqlBackend ) =>\r\n                Entity Faction -> RawResource Biological\r\n                -> RawResource Biological -> MaybeT (WriterT [KragiiResults] (ReaderT backend m)) ()\r\ndestroyCrops faction cost bioLeft = MaybeT $ do\r\n    _ <- lift $ updateWhere [ FactionId ==. entityKey faction ]\r\n                            [ FactionBiologicals =. unRawResource bioLeft ]\r\n    tell [ CropsDestroyed cost ]\r\n    return $ Just ()
\r\n

Final step is to roll a percentile die against given odds and see what happens. In case of Success, we record that worms were removed and value of function will be Just RemoveOriginalEvent. If we didn’t beat the odds, WormsStillPresent gets recorded and value of function is Just KeepOriginalEvent. Return value will then be used later to mark special event handled.

\r\n
removeNews :: ( PersistStoreWrite backend, MonadIO m, BaseBackend backend ~ SqlBackend ) =>\r\n              PercentileChance -> MaybeT (WriterT [KragiiResults] (ReaderT backend m)) EventRemoval\r\nremoveNews odds = MaybeT $ do\r\nres <- liftIO $ roll odds\r\n    case res of\r\n        Success -> do\r\n            _ <- tell [ WormsRemoved ]\r\n            return $ Just RemoveOriginalEvent\r\n        Failure -> do\r\n            _ <- tell [ WormsStillPresent ]\r\n            return $ Just KeepOriginalEvent
\r\n

So result of this whole matter is:

\r\n
( [KragiiResults], Maybe EventRemoval )
\r\n

and whole lot of database activity.

\r\n

Handling events during simulation

\r\n

Pieces are now in place, time to put things in motion. When handling special events for a faction, first step is to load all unhandled ones and then call handleSpecialEvent for each of them.

\r\n
handleFactionEvents :: (BaseBackend backend ~ SqlBackend\r\n                       , PersistStoreWrite backend, PersistQueryRead backend\r\n                       , PersistQueryWrite backend, MonadIO m) =>\r\n                       Time -> Entity Faction -> ReaderT backend m [Key News]\r\nhandleFactionEvents date faction = do\r\n    loadedMessages <- selectList [ NewsFactionId ==. (entityKey faction)\r\n                                 , NewsSpecialEvent ==. UnhandledSpecialEvent ] [ Desc NewsDate ]\r\n    let specials = mapMaybe extractSpecialNews $ parseNewsEntities loadedMessages\r\n    mapM (handleSpecialEvent (entityKey faction) date) specials
\r\n

resolveEvent resolves event based on choice user maybe made (this is what we explored earlier in the episode). Depending on the result of resolveEvent, event gets marked to handled and dismissed. In any case, a news article spelling out what happend is created and saved.

\r\n
handleSpecialEvent :: (PersistQueryWrite backend, MonadIO m\r\n                      , BaseBackend backend ~ SqlBackend) =>\r\n                      Key Faction -> Time -> (Key News, SpecialNews) -> ReaderT backend m (Key News)\r\nhandleSpecialEvent fId date (nId, (KragiiWorms event _ choice)) = do\r\n    (removal, results) <- resolveEvent (nId, event) choice\r\n    _ <- when (removal /= Just KeepOriginalEvent) $\r\n                    updateWhere [ NewsId ==. nId ]\r\n                                [ NewsSpecialEvent =. HandledSpecialEvent\r\n                                , NewsDismissed =. True ]\r\n    insert $ report fId date event choice results
\r\n

Result article creation is abstracted by ResultReport type class. It has single function report that takes parameters: database key of the faction the event concerns of, current time, special event that was processed, choice that was made and list of records telling what happened during resolution. It will return News that is ready to be saved into database.

\r\n
class ResultsReport a b c | a -> b, a -> c where\r\nreport :: Key Faction -> Time -> a -> Maybe b -> [c] -> News
\r\n\r\n

Instance declaration is pretty long, because there’s many different cases to account for and by definition they’re all pretty verbose. I have included it in its entirity below, as it might be interesting to glance over and see different kinds of combinations that resolution might create.

\r\n
instance ResultsReport KragiiWormsEvent KragiiWormsChoice KragiiResults where\r\n    report fId date event choice results =\r\n        let\r\n            content = KragiiNews { kragiiNewsPlanetId = kragiiWormsPlanetId event\r\n                                 , kragiiNewsPlanetName = kragiiWormsPlanetName event\r\n                                 , kragiiNewsSystemId = kragiiWormsSystemId event\r\n                                 , kragiiNewsSystemName = kragiiWormsSystemName event\r\n                                 , kragiiNewsExplanation = repText\r\n                                 , kragiiNewsDate = timeCurrentTime date\r\n                                 }\r\n        in\r\n            mkNews fId date $ KragiiResolution content\r\n        where\r\n            repText = header choice <> " " <> removed choice (WormsRemoved `elem` results) <> " " <> injury <> " " <> destruction <> " "\r\n\r\n            header (Just EvadeWorms) = "Local farmers had chosen to work on their fields, while avoiding the kragii worms."\r\n            header (Just AttackWorms) = "Local farmers had decided to attack the worms with chemicals and burning."\r\n            header (Just TameWorms) = "Decision to try and tame the kragii had been taken."\r\n            header Nothing = "No decision what to do about worms had been taken."\r\n\r\n            removed (Just EvadeWorms) True = "After some time, there has been no new kragii sightings and it seems that the threat is now over."\r\n            removed (Just AttackWorms) True = "Attacks seem to have worked and there has been no new kragii sightings."\r\n            removed (Just TameWorms) True = "Kragii has been tamed and put into use of improving soil quality."\r\n            removed Nothing True = "Despite farmers doing nothing at all about the situation, kragii worms disappeared eventually."\r\n            removed (Just EvadeWorms) False = "Kragii are still present on the planet and hamper farming operations considerability."\r\n            removed (Just AttackWorms) False = "Despite the best efforts of farmers, kragii threat is still present."\r\n            removed (Just TameWorms) False = "Taming of the worms was much harder than anticipated and they remain wild."\r\n            removed Nothing False = "While farmers were debating best course of action, kragii reigned free and destroyed crops."\r\n\r\n            injury = if FarmersInjured `elem` results\r\n                        then "Some of the personnel involved in the event were seriously injured."\r\n                        else "There are no known reports of personnel injuries."\r\n\r\n            totalDestroyed = mconcat $ map (x -> case x of\r\n                                                    CropsDestroyed n -> n\r\n                                                    _ -> mempty) results\r\n            destruction = if totalDestroyed > RawResource 0\r\n                            then "In the end, " <> pack (show (unRawResource totalDestroyed)) <> " units of harvest was destroyed."\r\n                            else "Despite of all this, no harvest was destroyed."
\r\n

While there are still pieces left that need a bit work or are completely missing, the overall structure is in place. While this one took quite a bit of work to get working, I’m hoping that the next special event will be a lot easier to implement. Thanks for listening the episode.

\r\n

Easiest way to catch me nowdays is either via email or on fediverse where I’m Tuula@mastodon.social

\r\n',364,107,0,'CC-BY-SA','haskell, yesod',0,0,1), (2743,'2019-02-06','Character build in the d20 system',3949,'Klaatu and Lostnbronx build an RPG character in the d20 system of Starfinder','

Klaatu and Lostnbronx spend an hour building an RPG character at a leisurely, and hopefully informative, pace. While the build process here is technically specific to the sci-fi (or science fantasy, really) game Starfinder, the idea is to convey the generic process of stepping through a character build instruction, cross-referencing important rules, and generally learning how to build a character in an unfamiliar system.\r\n

',78,99,0,'CC-BY-SA','Starfinder,RPG,character,build',0,0,1), (2749,'2019-02-14','Lostnbronx and Klaatu commentary from episode 2743',890,'Thoughts about RPG character building, modern RPG play style compared to the Old School, and more','

\r\nOut-takes from episode 2743. This is commentary about modern RPG play style, the character build process, Starfinder as a system, and more.\r\n

\r\n

\r\nDid you know that Lostnbronx and Klaatu have a gaming blog? We do! You should go subscribe to it at mixedsignals.ml

\r\n\r\n

The blog features commentary about gaming, tech, geek culture, a podcast or two, and lots more.

',78,0,0,'CC-BY-SA','rpg, game, gaming',0,0,1), (2751,'2019-02-18','Battling with English - part 3',822,'Misunderstandings about English grammar, spelling, punctuation, etc.','

Battling with English - part 3

\r\n

Some word confusions

\r\n

In this episode, the third of this series, I’m looking at some words that are sometimes used in the wrong places, often being confused one with another. These words are often particularly difficult to differentiate by people for whom English is not their first language.

\r\n

Long notes

\r\n

As usual I have provided detailed notes and examples for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n',225,120,1,'CC-BY-SA','grammar,spelling,punctuation,word misuse,English',0,0,1), (3857,'2023-05-16','Yesterday I saw a solar flare',668,'An account of the first time I saw a solar flare with my own eyes.','

A solar flare is a huge release of energy at and near the surface of the Sun in the form of electromagnetic radiation and fast particles. On 19 January 2023 at around 11:00 UTC I was lucky enough to see a solar flare with my own eyes using a Coronado PST Solar Telescope that belongs to the Astronomical Society of Glasgow.

\n\n

This audio was recorded the day after I had seen it so the details remained fresh in my mind.

\n\n

A view of how the Sun appears through the Coronado PST Hα telescope taken with the main camera of Samsung Galaxy S9+ phone at the eyepiece, after much trial and error! This was taken on 20 January 2023 at 13:08 UTC the day after the flare. The enormous sun spot is still visible.

\n

\"Sunspot\"

\n\n\n

The X-ray flux from the Sun measured by the GOES satellite(s).

\n

\"X-ray

\n\n\n

A short movie of images covering the period from 10:01 UTC to 11:21 UTC observed by the SDO satellite\'s AIA instrument.

\n\n\n',268,0,0,'CC-BY-SA','solar,astronomy,telescopes,planes',0,0,1), (2752,'2019-02-19','XSV for fast CSV manipulations - Part 2',1359,'Part 2 of my introduction to the XSV tool','

XSV for fast CSV manipulations - Part 1: Basic Usage

\r\n
\r\n

https://github.com/BurntSushi/xsv

\r\n
\r\n

Introduction

\r\n

xsv is a command line program for indexing, slicing, analyzing, splitting and joining CSV files. Commands should be simple, fast and composable:

\r\n
    \r\n
  1. Simple tasks should be easy.
  2. \r\n
  3. Performance trade offs should be exposed in the CLI interface.
  4. \r\n
  5. Composition should not come at the expense of performance.
  6. \r\n
\r\n

We will be using the CSV file provided in the documentation.

\r\n

Commands covered in this episode

\r\n\r\n',300,0,0,'CC-BY-SA','csv,command-line,data',0,0,1), (2759,'2019-02-28','Cleaning the Potentiometers on a Peavey Bandit 65',1244,'I disassemble and clean the pots on my Peavey Bandit 65 to fix static in the knobs.','

Since my daughter has been learning a bit of guitar in the last several months, I\'ve actually gotten my old electric guitar and amplifier back out again after many years in the closet. The amp is a Peavey Bandit 65, which was a an affordable solid-state workhorse kind of amp back in the mid-80s and I\'ve had it since it was new. In this episode I talk through the process of removing the brains of the amp and cleaning the potentiometers to try to get rid of some of the static that\'s happening when I turn the knobs. I also discover belatedly that the reason I was not getting any distortion when I turned the saturation up was that the amp was stuck on the clean channel — shows how long it\'s been since I used the amp, I kind of forgot how the thing works!

\r\n\r\n

Click image below to view photo gallery

\r\n\r\n

\"Peavey

\r\n\r\n

Links

\r\n\r\n\r\n\r\n

Credits

\r\n\r\n',238,0,0,'CC-BY-SA','Guitars, electronics, amplifiers, maintenance, repair',0,0,1), (2753,'2019-02-20','Specific Settings In Storytelling',1027,'Lostnbronx looks at why you might choose specific settings for your tales.','

How does setting interact with plot or character? Why would you choose one type of setting over another? And how do certain specific settings become intrinsic aspects of the story itself?

\r\n

Lostnbronx takes a breezy, mostly incoherent stab at this rather complicated topic.

\r\n',107,105,0,'CC-BY-SA','stories, storytelling, setting, lostnbronx',0,0,1), (2758,'2019-02-27','Haskell - Data types and database actions',2566,'Brief summary of how to declare your own datatypes in Haskell and how to store data in database','

Intro

\r\n

I have been doing series about web programming in Haskell and realized that I might have skipped over some very basic details. Better later than never, I’ll go over some of them briefly (data types and database actions). Hopefully things will make more sense after this (like with my friend, whose last programming course was programming 101 and they said afterwards that now all that 3d and game programming is suddenly making sense).

\r\n

Data types

\r\n

Data here has nothing to do with databases (yet). This is how you can declare your own data types in Haskell. They’re declared with keyword data followed with type name, equals sign and one or more value constructors. Type name and value constructors have to start with uppercase letter.

\r\n

Simplest type is following:

\r\n
data Simple = One
\r\n

This declares a type called Simple that has single possible value: One.

\r\n

More interesting type is shown below. Colour has three possible values: Red, Green and Blue.

\r\n
data Colour =\r\n    Red\r\n    | Green\r\n    | Blue
\r\n

It’s possible to have parameters in value constructor. Following is Payment type that could be used to indicate how payment was done. In case of Cash amount is stored. In case of IOU free text is recorded.

\r\n
data Payment =\r\n    Cash Double\r\n    | IOU Text
\r\n

Fictional usage of the Payment is shown below. Function paymentExplanation takes a Payment as parameter and returns Text describing the payment. In case of cash payment, brief explanation of how much was paid is returned. In case of IOU slip the function returns explanation stored in IOU value.

\r\n

paymentExplanation :: Payment -> Text part is type declaration. It states that paymentExplanation takes argument of type Payment and returns result as Text.

\r\n
paymentExplanation :: Payment -> Text\r\npaymentExplanation payment =\r\n    case payment of\r\n        Cash amount ->\r\n            "Cash payment of " <> (show amount) <> " euros"\r\n        IOU explanation ->\r\n            explanation
\r\n

Parameters don’t have to be hard coded in the type definition. Parametrized types allows creating more general code. Maybe is very useful data type that is often used for data that might or might not be present. It can have two values: Nothing indicating that there isn’t value and Just a indicating that value is present.

\r\n
data Maybe a =\r\n    Nothing\r\n    | Just a
\r\n

a is type parameter that is filled in when declaring type. Below is a function that takes Maybe Payment as a parameter and if value of payment parameter is Just returns explanation of it (reusing the function we declared earlier). In case of Nothing "No payment to handle" is returned.

\r\n
invoice :: Maybe Payment -> Text\r\ninvoice payment =\r\n    case payment of\r\n        Just x ->\r\n            paymentExplanation x\r\n        Nothing ->\r\n            "No payment to handle"
\r\n

Alternatively one can omit case expression as shown below and write different value constructors directly as parameters. In both cases, compiler will check that programmer has covered all cases and emit a warning if that’s not the case.

\r\n
invoice :: Maybe Payment -> Text\r\ninvoice (Just payment) =\r\n    paymentExplanation payment\r\n\r\ninvoice Nothing =\r\n    "No payment to handle"
\r\n

Having several parameters gets soon unwieldy, so lets introduce records. With them, fields have names that can be used when referring to them (either when creating or when accessing the data). Below is Person record with two fields. personName is of type Text and personAge of type Age (that we’ll define in the next step).

\r\n
data Person = Person\r\n    { personName :: Text\r\n    , personAge :: Age\r\n    }
\r\n

To access data in a record, just use field as a function (there’s a bug, I’m turning 40, this month (today even, to be specific, didn’t realize this until I was about to upload the episode), but forgot such a minor detail when recording the episode):

\r\n
me = Person { personName = "Tuukka", personAge = 37 }\r\nmyAge = personAge me\r\nmyName = personName me
\r\n

New type is special type of record that can has only one field. It is often used to make sure one doesn’t mix similar data types (shoe size and age can both be Ints and thus mixed if programmer isn’t being careful). Compiler will optimize new types away during compilation, after checking that they’re being used correctly. This offers a tiny performance boost and makes sure one doesn’t accidentally mix different things that happen to look similar.

\r\n
newtype Age = { getAge :: Int }
\r\n

One can instruct compiler to derive some common functions for the data types. There are quite many of these, but the most common ones I’m using are Show (for turning data into text), Read (turning text into data) and Eq (comparing equality).

\r\n
data Payment =\r\n    Cash Double\r\n    | IOU Text\r\n    deriving (Show, Read, Eq)
\r\n

Database

\r\n

In case of Yesod and Persistent, database structure is defined in models file that usually located in config directory. It is read during compile time and used to generate data types that match the database. When the program starts up, it can check structure of the database and update it to match the models file, if migrations are turned on. While this is handy for development, I wouldn’t dare to use it for production data.

\r\n

Following definitions are lifted from the models file of the game I’m working.

\r\n
StarSystem\r\n    name Text\r\n    coordX Int\r\n    coordY Int\r\n    deriving Show Read Eq
\r\n

This defines a table star_system with columns id, name, coord_x, coord_y. All columns have NOT NULL constraint on them. It also defines record StarSystem with fields starSystemName, starSystemCoordX and starSystemCoordY.

\r\n
Star\r\n    name Text\r\n    starSystemId StarSystemId\r\n    spectralType SpectralType\r\n    luminosityClass LuminosityClass\r\n    deriving Show Read Eq
\r\n

This works in the same way and defines table star and record Star. New here is column star_system_id that has foreign key constraint linking it to star_system table. Star record has field starStarSystemId (silly name, I know, but that’s how the generated names go), which has type Key StarSystem.

\r\n

spectral_type and luminosity_class columns in the database are textual (I think VARCHAR), but in the code they’re represented with SpectralType and LuminosityClass data types. In order this to work, we have to define them as normal data types and use derivePersistField that generates extra code needed to store them as text in database:

\r\n
data SpectralType = O | B | A | F | G | K | M | L | T\r\n    deriving (Show, Read, Eq)\r\nderivePersistField "SpectralType"\r\n\r\ndata LuminosityClass = Iap | Ia | Iab | Ib | II | III | IV | V | VI | VII\r\n    deriving (Show, Read, Eq)\r\nderivePersistField "LuminosityClass"
\r\n

Final piece in the example is Planet:

\r\n
Planet\r\n    name Text\r\n    position Int\r\n    starSystemId StarSystemId\r\n    ownerId FactionId Maybe\r\n    gravity Double\r\n    SystemPosition starSystemId position\r\n    deriving Show Read Eq
\r\n

This introduces two new things: ownerId FactionId Maybe removes NOT NULL constraint for this column in the database, allowing us to omit storing a value there. It also changes type of planetOwnerId into Maybe (Key Faction). Thus, planet might or might not have an owner, but if it has, database ensures that the link between planet and faction (not shown here) is always valid.

\r\n

Second new thing is SystemPosition starSystemId position that creates unique index on columns star_system_id and position. Now only one planet can exists on any given position in a star system.

\r\n

Database isn’t any good, if we can’t insert any data into it. We can do that with a function shown below, that create a solar system with a single planet:

\r\n
createSolarSystem = do\r\n    systemId <- insert $ StarSystem "Solar system" 0 0\r\n    starId <- insert $ Star "Sol" systemId G V\r\n    planetId <- insert $ Planet "Terra" 3 systemId Nothing 1.0\r\n    return (systemId, starId, planetId)
\r\n

To use the function, we have to use runDB function that handles the database transaction:

\r\n
res <- runDB createSolarSystem
\r\n

There are various ways of loading data from database. For loading a list of them, selectList is used. Here we’re loading all planets that have gravity exactly 1.0 and ordering results by the primary key in ascending order:

\r\n
planets <- runDB $ selectList [ PlanetGravity ==. 1.0 ] [ Asc PlanetId ]
\r\n

Loading by primary key is done with get. It returns Maybe, because data might or might be present that match the primary key. Programmer then has to account both cases when handling the result:

\r\n
planet <- runDB $ get planetId
\r\n

Updating a specific row is done with update function (updateWhere is for multiple rows):

\r\n
_ <- runDB $ update planetId [ PlanetName =. "Earth" ]
\r\n

Finally, sometimes it’s nice to be able to delete the data:

\r\n
_ <- runDB $ delete planetId\r\n_ <- runDB $ deleteWhere [ PlanetGravity >. 2 ]
\r\n

While persistent is relatively easy to use after you get used to it, it lacks ability to do joins. In such cases one can use library called Esqueleto, that is more powerful and has somewhat more complex API.

\r\n

Extra

\r\n

Because functions are values in Haskell, nothing prevents storing them in data types:

\r\n
data Handler =\r\n    Simple (Int -> Boolean)\r\n    | Complex (Int -> Int -> Int)
\r\n

Handler type has two possible values: Simple has a function that turns Int into Boolean (for example odd used to check if given number is odd) and Complex that takes two values of type Int and returns Int (basic arithmetic for example, adding and subtracting).

\r\n

Hopefully this helps you to follow along as I work on the game.

\r\n

Easiest way to catch me nowadays is either via email or on fediverse where I’m Tuula@mastodon.social

\r\n',364,107,0,'CC-BY-SA','haskell, database',0,0,1), (2754,'2019-02-21','Craigslist Scam Catch',460,'Helped a client avoid being scammed on Craigslist and wanted to share some tips to HPR.','

Introduction

\r\n

Hello and welcome to Hacker Public Radio, I’m Edward Miro and for this episode I decided to record on a personal experience I had recently helping a client catch a Craigslist Scam. This will be part two in my series I’m calling “Information Security for Everyone”. As with most of the content I publish in the world of INFOSEC, my goal is to present the information in a way that a majority of people can get value from and anyone can play this for a friend, colleague or family member and make it easy for the non-hackers in our lives to understand. This particular episode shows a powerful way social-engineering can be implemented to steal money from unsuspecting victims and I will break down a few main points and red flags to look out for at the end.

\r\n

A couple weeks ago I was sitting with a client when she asked me offhandedly if I’d ever sent a Moneygram before. I told her I had and ask curiously why she wanted to know. She explained that she was very excited to be adopting a puppy from online and she needed to send $350 USD to the service that ships pets across the country. This immediately caused my hacker-sense to start tingling so I probed a bit more about the transaction.

\r\n

I asked if she had spoken to the seller on the phone, and she said she hadn’t. I said that seemed weird, but she assured me that the seller said it had to do with her religion. I wasn’t aware of any religious prohibitions to speaking on the phone that also allowed using Craigslist, but okay. I told her that that seemed a bit fishy to me. She asserted that she thought it did too at first, but she knew it was legit because she wasn’t sending the money to the seller, it was being sent to a third party pet transportation company that the seller had had contact her. She even showed the website of the company on her cell phone, which to be blunt, to my eyes looked extremely janky. I asked her if we could sit down for a few minutes and take a look at a few details before she sends anyone any money. She reluctantly agreed and really wanted this puppy.

\r\n

The first thing I asked to look at was the emails back and forth from the seller. I checked Google and all other major social media sites for the sellers name. No matches. Couldn’t Google the sellers email address due to the Craigslist email relay system. This in and of itself might be okay, we all use pseudonyms online sometimes and Craigslist is a site you might not wanna use your real name. Fine.

\r\n

She then showed me the email thread with the shipping company.

\r\n

The first strange thing I noticed from the emails was the link to the pet shipping company. The name didn’t match the URL in the link. You’d think a business would be able to get their own name right. I also saw that if you Googled the name given by the shipper, it’s extremely similar to a legitimate pet shipping company and indeed that legit company comes up as the first site found due to Google “fixing” our query. When you go to the link in the email however, the site itself was terrible to my eyes, but not to my client who is not as seasoned as I am at catching scams. I also showed her that the “company” didn’t have any social media presence. At all. No Facebook, Twitter, anything. Also the email address that was contacting her was reallylongcompanyname@outlook.com

\r\n

She also told me she had spoken to the shippers on the phone and I asked if she still had their number. She did, but she told me she couldn’t ever get through when she called them and they’d always have to call her back. I asked for the number and called it on my phone. It was a Google Voice number! Not only that it was set to screening mode. She also told me when he did call her, he was rude and tried to get her to hurry up and send the money. I told her I was 100% confident this was a scam and I advised her to not go through with the deal.

\r\n

At this point she was extremely unhappy, but felt it was still a legitimate transaction because she had pictures sent to her of not only the puppy, but of the puppy in the shipping crate at the shipping company waiting for payment to be shipped. She explained that it’s not like it was a person trying to sell dogs or from a puppy mill. It was a lady giving it away for free and the money was for was the shipping. She just didn’t see why a scammer would go to the trouble of doing that and felt the pictures were authentic. I asked her to save all the images to her device and then showed her a site she could use to do reverse image searches. Before she did it, I asked her if she agreed that if this wasn’t a scam those pictures wouldn’t exist anywhere on the internet. She agreed and each of the pictures was found at least 9 other places online. Her heart sank and she didn’t have any further rebuttals to my concerns. She knew it was a scam and I just saved her from losing at least $350 USD. Not to mention that the scammer would have also asked for more money later for “shots” and “insurance”. Who knows how far they might have gotten.

\r\n

So here are the main red flags:

\r\n\r\n

A few of the tricks used by the scammers in this scam to make it more successful:

\r\n\r\n

She was very thankful and I told her to be very careful when anyone from online ever asks her to send money. I told her in all likelihood this was probably one person the whole time, hence why the person adopting out the dog “couldn’t talk on the phone”. They were also probably not even in this country as we know many of these scams aren’t. She did say that the shippers English wasn’t good. I also told her to make she shares this experience with all her friends and family. I always feel the best way to handle someone getting caught in a scam is to be on their side and never shame them. We are all susceptible to scams and social engineering and the best way to proceed is to empower them to share what they’ve learned. I also sent her a link to an article on the BBB site about these very types of scams that I’ll also link below. She was shocked how similar her experience was to the ones explained on the article.

\r\n

Well, thank you for taking the time to listen to my experience helping a client avoid getting caught in the all too common Craigslist scam. I hope this will help any non-hackers in your life and like I say in all my podcasts, I don’t claim to know all there is to know and love feedback and any opportunities to learn more or collaborate with others in the field. As with most of the research and articles I’ve written in the past, these are geared toward standard users in a business setting and are meant to be a jumping off point for further research and to be a foundation for cyber security 101 level training classes. If you like what I do, and want to have me come speak to your team, or just wanna chat, feel free to email me.

\r\n

Thank you and have a great day!

\r\n

Links:

\r\n

https://www.bbb.org/article/investigations/14214-puppy-scams-how-fake-online-pet-sellers-steal-from-unsuspecting-pet-buyers-a-bbb-study

\r\n

https://www.rover.com/blog/internet-dog-puppy-scams/

\r\n',372,74,1,'CC-BY-SA','craigslist,scam,con,social engineering,puppy,dog,money,moneygram,infosec,cyber-security 101',0,0,1), (2756,'2019-02-25','Bash Tips - 20',1955,'Deleting arrays; positional and special parameters in Bash','

Tidying loose ends (Some collateral Bash tips)

\r\n

Deleting arrays

\r\n

I forgot to cover one thing on my list when doing the last show: I forgot to explain how to delete arrays and array elements. I’ll cover that topic in this episode.

\r\n

Positional and Special parameters

\r\n

I have also avoided talking much about the positional and special parameters in Bash: \'$1\', \'$2\', \'$#\' and the rest. I will cover (some of) these in this episode.

\r\n

Silly titles

\r\n

I stopped doing the weird episode titles by episode 14 because I thought the joke was getting tired. However, I think a few people missed them (and a certain HPR colleague was found vandalising my new titles as they were being posted ;-), so I have added them inside the notes on the older shows and am adding one here – as a homage to silliness.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n\r\n',225,42,1,'CC-BY-SA','Bash,array,delete,positional parameters',0,0,1), (2757,'2019-02-26','How to DM',2694,'Klaatu explains how to DM an RPG, and Lostnbronx demonstrates, step by step, how to build a dungeon','

Klaatu

\r\n

\r\nI\'ve gotten a lot of great feedback on the Interface Zero play-through and the episode about getting started with RPGs I did with Lostnbronx.\r\nPeople have told me that one of the biggest blockers to getting started is knowing what to do as GM.

\r\nNow, I\'ve read lots of rulebooks and GM guides, and it seems to me that most of them assume you\'ve either played an RPG before, and so you\'ve seen an example of a Game Master at play, or you\'ve seen one on Youtube or Twitch. It\'s a safe assumption, but it\'s easy to forget all of those great examples under pressure.\r\nSo in this episode, Lostnbronx and I are going to provide you with some clear and direct instructions on what exactly a GM does.\r\n

\r\nThe short version is this:

\r\n
  1. \r\nTell the players where they are and what they see around them.\r\n

  2. \r\nListen to the players when they tell you what they want to do.\r\n

  3. \r\nTell the players the outcome, based on your privileged knowledge of the game world or on a roll of the dice, of their actions.\r\n

\r\n

\r\nYou loop over that sequence, and you\'re game mastering!\r\n

\r\nBut that makes for a short episode, and anyway, there are details about the process that we can talk about to make you feel more comfortable with the prospect of deciphering a game world with your friends.\r\n

\r\nTo that end, Lostnbronx and I have started a website dedicated to gaming! You should check it out, subscribe to our feed. We discuss everything game-related there, plus a little tech and all manner of topics of interest to geeks.\r\n

\r\n\r\n

Lostnbronx

\r\n

\r\nRight off the bat, it\'s important to understand that every GM is different. No two styles of running a game match completely, nor should they. And while there\'s no one correct way to run a game, there are plenty of ways to do it poorly. The GM wears many hats, but in my opinion, the most important job is to make sure that everyone has a good time. Your players are giving you an evening out of their lives. Next week they\'ll probably give you another. It\'s your job to make sure that time isn\'t wasted.\r\n

\r\nBy definition, games, even role-playing games, are a form of entertainment -- like reading a book, watching a movie, or enjoying the circus. When you go to that, the GM is the ringmaster, presenting the show; while the players are both the audience, and the main attraction. The GM controls the world, the people, the monsters, the history, even the weather. The GM controls everything, in fact...except for the player characters. A game master presents the situation, but it\'s the players who decide what to do with that information.\r\n

\r\nNow, this is all pretty vague, and describing RPG\'s is far less informative than playing them. Considering this is a podcast, I encourage you to go back and listen to Klaatu\'s aforementioned \"Interface Zero\" episodes. These are excellent examples of actual game play. If you\'re having a hard time imagining how RPG\'s are presented and experienced, you\'ll appreciate those shows.\r\n

\r\nNow then, almost all games are divided into genre types: sword and sorcery; space opera; spies; super-heroes; and pretty much everything else. And I mean everything! If there\'s a genre of fiction and storytelling that you enjoy, chances are there\'s a game or game setting for it somewhere. The most popular style of RPG\'s out there are fantasy. Think \"Lord of the Rings\". Think \"Harry Potter\". Think of anything, in fact, because all of it is possible.\r\n

\r\nA staple of the high fantasy genre of gaming is the dungeon. Now, that term has two meanings in this sort of game: first, the usual meaning, of what amounts to the basement of a castle, with jails, interrogation rooms, storage rooms, and more. The other meaning refers specifically to a type of adventuring environment. Both of these are usually found underground, but an adventuring dungeon may have nothing to do with any castle. It might be a lost crypt, a cave system, an abandoned gold mine, or the lair of some dreaded beast that\'s been terrorizing the countryside. In the dungeon might be enemies, monsters, and treasure protected by deadly traps. Magic abounds. There might be puzzles, dark secrets, or a kidnapped prince to rescue.\r\n

\r\nAs a new GM, you can start off any way you want, but in my experience, the best way to get used to how the game works, and how the whole process of providing an evening\'s entertainment to your friends or family works in this context, is to create a dungeon and run your players through it.\r\n

\r\nDungeons generally require set-up time; that is to say, you have to design it in advance. Now, Klaatu and I are currently working on ways to ease that burden, with the ultimate goal of eliminating the pre-work entirely. But for now, let\'s talk about the traditional way to approach all this. What follows is a step-by-step process, but understand, it\'s only one of an infinite possible number of them.\r\n

\r\nSTEP 01 -- CREATE THE COUNTRYSIDE\r\nSome GM\'s say creating the world is the first step. Some say creating the godly pantheons of the world is the first. Some say it\'s the history, or the fantasy races. They\'re not wrong, but trust me, when you\'re just starting out, none of that stuff matters. In this example, you\'ll be running the players through a dungeon. That dungeon is out in the country, within the middle of a large forest.\r\n

\r\nNow, it will make the beginning and end of the adventure easier if you have a small village nearby where the player characters all live. We\'ll call it Forestdale for the lack of anything better. In Forestdale, there\'s an inn or tavern. This is where people get together, tell tall tales, and become inspired to go adventuring, so let\'s give it a name as well: \"The Prancing Unicorn\". That\'s home base. Every player character knows this place, and everyone in it knows them.\r\n

\r\nOne of the stories being swapped at \"The Unicorn\" lately is about a tribe of dangerous creatures living in an underground lair somewhere within the forest. They are led by an evil wizard, or so the tales go. They have been attacking farmers and merchants who travel through the roads and foot paths of the woods in order to sell their goods in Forestdale. One of the merchants says he saw them travel down the Western path near the Old Bridge. Something must be done, but who would be brave or foolhardy enough to even try?\r\n

\r\nAnd that\'s all you need to create for the world right now. Remember, this stuff is new; no one needs large amounts of detail just yet, least of all you. You\'ll have enough to juggle.\r\n

\r\n\r\n\r\nSTEP 02 -- CREATE THE DUNGEON FLOOR PLAN\r\nOne of the rumors to be heard at \"The Prancing Unicorn\" is that there\'s an underground cave system or labyrinth somewhere in the forest. Some say it\'s a myth, others say their cousin\'s uncle\'s sister\'s best friend came across it once. Either way, its existence is shrouded in mystery, and people are said to go in, but not always come out.\r\n

\r\nThis is your first dungeon. You don\'t want to do more work than you need to. Let\'s make this dungeon a single level. Later, you can add a secret panel somewhere that can reveal a set of stairs down to a second level (and from there, a third, fourth, tenth, or more). Right now, it\'s one level, hidden below the forest. It\'s dark, it\'s dangerous. It\'s plenty.\r\n

\r\nPutting a dungeon together can be difficult, but it doesn\'t have to be. The traditional way to create one of these is to use graph or hex paper and draw out the floor map. Each square of the graph paper is equal to ten feet, or, say, three meters. You make note of all rooms, caves, doors, hallways, stairs up or down, floor traps, hidden doors, and anything else you want in there. Be sure to put a set of stone stairs that lead from the forest above, down to this dank and gloomy dungeon.\r\n

\r\nThere are no standard symbols for the different things on the map, despite what anyone might tell you, but for now, let\'s turn the paper landscape style, and at the top of the page, now held that way, outline one square of the graph paper with a pencil. Inside the square, draw three or four small lines at an angle. This will represent a set of stairs. Next to the stairs, write the letter \"U\". This is the way to get to the forest above. Granted, it\'s how the player characters will come down here to begin with, but once they are here, they have to go up to leave, hence the \"U\". If that\'s confusing, you can write, \"To The Forest Above\", next to this square, maybe with a little arrow. You can write anything you want, but this is how the player characters will get in and out of your dungeon.\r\n

\r\n\r\n

\r\nWe\'re going to draw the floor plan from the top of the page down. The entire dungeon map will be on this one side of the paper. In the corner, draw an arrow pointing up, and put a letter \"N\" there. That\'s North. We\'ll be using compass directions from now on. Granted that when underground, it\'s hard to get your bearings without a compass, but for this first dungeon, we won\'t worry about that. North, South, East, West. It makes life easy.\r\n

\r\nOn the bottom of the page, to the South, draw a box in the middle of the page that\'s ten by ten squares in size. This is where the dungeon tunnels all will be leading, and where we\'ll have the biggest fight of the adventure. We\'re setting that up now, so we always know where we\'re heading. Now go back to the stairs at the top of the page.\r\n

\r\nDraw a long line from the lower edge of the stairs going West. Stop the line a square or two from the edge of the paper. Now do the same thing going East. Next, move down one square, and draw another line parallel to both of these, going entirely from one side of the page to the other, East to West. You\'ve just created a place for the players to explore, so imagine it for a moment: they come down some broken, forgotten stairs. Let\'s say they travel at least a hundred feet down, tripping over tree roots and walking through cobwebs, until the stairs deposit them in the middle of a dark tunnel, ten feet wide. It stretches to either side, running East and West out of sight (you know that it goes hundreds of feet in both directions, but you\'ll let them discover that for themselves). They listen, and can hear nothing but the scurrying of unseen vermin. At least, they hope that\'s what it is. Not a bad start.\r\n

\r\n\r\n

\r\nAlong this hallway, you\'ll draw little rectangles, like black bars, on random squares along the Southern side of the tunnel. Not too many, just a few here and there, with generous space in between. These are heavy wooden doors. Some may be locked. That\'s your choice. If they are, put a little symbol near them. It could be as simple as the letter \"L\", so let\'s go with that. Now you know where the all doors are in this particular tunnel, and you know which of them will be a challenge for the player characters to open.\r\n

\r\nThis is just the first tunnel of a larger complex. This complex can be as big or as small as you\'d like. Let\'s say it\'s moderately sized. Before we draw more tunnels, let\'s draw the rooms behind those doors. This will tell us how much map space we\'ll have for further tunnels. Some GM\'s like to draw all the tunnels first, and then fit in the rooms. You can do it however way you want later on; right now, let\'s just use this method. Pick a door. Draw a box behind it, three or four squares in size. That\'s the room. Do the same behind the other doors. Make the rooms different shapes and sizes, but not too big. Let the big room at the bottom be the star. When you\'re done, you have a huge tunnel, with several mysterious doors, behind which are some good-sized rooms.\r\n

\r\nOn the part of the tunnel that ends on the West side, draw a connecting tunnel South for five squares, and then turn the direction back to the East. Draw this tunnel going that way for ten squares. Put a door or two along here, and draw some rooms for them. Turn the tunnel South again, and go five or six squares, and turn it East again for four squares. Draw a door and room. Maybe it\'s locked, maybe not. Continue with this meandering, jagged floor plan, wandering East and then West, but always moving South. Add occasional doors and rooms as you go, until your tunnel finally ends on the Western side of the large ten by ten square room at the bottom of the page. Draw a door to get in there.\r\n

\r\n\r\n

\r\nNow go back up to the long tunnel at the top, and repeat this whole process on the Eastern side, eventually bringing that part of the tunnel to the Eastern edge of the big room at the bottom. Put a door there.\r\n

\r\n\r\n

\r\nNow, number your rooms on the map, starting at at the top, and working your way down, until you\'ve marked each one. Room numbers are essential, because you\'ll be keeping track of each one.\r\n

\r\n\r\n

\r\nThe floor plan to your first dungeon is complete. Now you need to put interesting things in it.\r\n

\r\n\r\nSTEP 03 -- POPULATE YOUR DUNGEON\r\nOkay, on a separate piece of paper, list the rooms of your dungeon. Start at #1, and go down. Beside the room number, you put in a brief description, along with any monsters, treasure, or other points of interest. You\'ll be consulting this list throughout the game, so write down everything you need to know, in order to minimize the amount of time you\'ll inevitably have your nose in the rulebook while playing. Monster statistics, including their weapons, and and the damage they do, should all be on this list, though there are ways to simplify the process, once of which I\'ll go into in a moment.\r\n

\r\n\r\n

\r\nWhen putting creatures and things into your dungeon, the first thing to remember is to not overload it. Each room does not need a monster. Not every room needs treasure. It might be helpful to think in terms of what you\'d like to see in the dungeon as a whole. Remember the stories of evil creatures, and possibly a wizard, which you heard at \"The Dancing Unicorn\"? We\'ll use that as our springboard. This is a starting dungeon, not just for you, but also for the player characters. Starting dungeons mean low-level monsters, so let\'s go with goblins.\r\n

\r\nGoblins are generally quite impressed with magic, so we\'re going to assume a wizard of dubious character has bullied a small tribe of them into being his thugs. They\'ve been waylaying passing merchants and farmers, stealing their wares, and carrying off food (along with the occasional peasant worker, as goblins love the taste of human flesh). Stupid, but dreadful creatures, they have displayed a level of tactical organization that\'s not normal for them. This, of course, is because the wizard\'s in charge. Look up the statistics for goblins, and understand what they\'re like. For this adventure, we\'re not going to worry about goblin captains, or goblin chiefs, both of which are tougher than your average goblin. No, all the creatures for this adventure have the same statistics. Don\'t drive yourself crazy writing them down, over and over. Write them once at the bottom of the room description page, and every time the player characters run into a goblin, consult them.\r\n

\r\nLet\'s say there are a total of fifteen goblins in this dungeon. They won\'t all be together; the player characters will encounter a few of them here and there, in various rooms, or maybe ust wandering the tunnels. The rooms themselves will have the spoils of all their raids, including barrels of wine, hams and sides of beef; furs, and a few copper, silver, and gold coins. If there\'s wine in one of the rooms, maybe the goblins there are drunk, fighting at a penalty to hit and damage. And remember, not all rooms need things in them. Maybe this was once a temple, and there\'s just broken furniture, and rotting religious robes in some of the rooms. In one, there might also be a tapestry against the wall, depicting a miracle of whatever god this place was once dedicated to. What you might not tell the player characters up front is that the tapestry could fetch a fair amount of gold coins in the market back in Forestdale. Too big to carry while exploring the dungeon, such a thing could always be rolled up and fetched on their way out. Not all treasure is found in wooden chests.\r\n

\r\nThen again, a lot of it is, so why not put one in the big room to the South? Of course, you have to defeat the evil wizard and his goblin cohorts, wh are hanging out in there. As a rule of thumb, you might want to sprinkle half the goblins throughout the dungeon, leaving the other half here, for the final fight. Stealth matters. Approaching the big room noisily, and kicking open one of the doors, is not stealthy. The player characters might be able to catch the wizard and his minions off-guard, if they move quietly.\r\n

\r\nIn order to be a credible threat to the player characters, this wizard should be of a slightly higher level, say 2nd or 3rd. He\'ll have some aggressive spells, and he\'ll have his goblins handy. You\'ll roll up the wizard the same way the players rolled up their characters, only you\'ll make him more experienced, and with more spells at his command. Maybe he even has a magic item of some sort. Should the players defeat this guy, this magic item will be part of the treasure; until then, it\'s something the wizard will use against them. Don\'t make it too tough. Maybe don\'t make it tough at all: a +1 Ring of Protection, maybe. Or perhaps, a +1 dagger. That might not sound like much, but it\'s more than the player character\'s have when they start.\r\n

\r\nNot enough excitement, maybe? Just add in a couple of giant rats in one of the rooms. Maybe some large spiders in another. Don\'t forget to put their statistics down in the room description. Judging how tough or easy a dungeon needs to be comes with experience. My suggestion is to err on the side of toughness, to put more challenges in there than maybe you feel comfortable with. If the player characters are looking depleted and injured, you can say the room is empty, instead of filled with spiders. Also, it doesn\'t hurt at all to remind the players now and then that it\'s okay to retreat. They can always come back another day when they\'re rested, and have made plans based on the knowledge they gained the first time around. It sets up a grudge match...the heroes vs. the evil wizard and his goblin hoard. You, as the GM, just repopulate the goblins, move them around a bit, so they\'re not all in the same rooms as before (though the big room should still be for the final fight), and //voila//! You\'ve just provided your players with two night\'s worth of entertainment, for the effort of only one.\r\n

\r\nAnd there you have it: a stocked dungeon that dovetails into the local lore of the countryside, ready for your players to explore.\r\n

\r\n\r\n\r\nSTEP 04 -- ROLLING UP CHARACTERS\r\nSome GM\'s will want a whole night just for this process. Others will just have the players arrive at the game with their characters ready to go, especially if they are experienced with the game. I won\'t go over the character creation process here, because each game is different, and some are VERY different. I mention this now, though, because the players need characters, and creating them comes before the adventure starts. If the game is as new to them as it is to you, take that whole night to help them create their characters. It\'s fun all on its own, and it allow\'s everyone to be familiar with the other characters -- something vital to party survival.\r\n

\r\nI\'m not going to go into detail about the process of rolling up characters, because, like you, Klaatu and I have dedicated an evening just to this process. In a previous episode in this mini-series, the two of us created a character from the ground up, so you can hear what\'s involved, and how you might want to approach the process with your own players.\r\n

\r\n

Klaatu

\r\n

\r\nIf designing your own custom dungeon seems intimidating to you, there is another way. And it\'s a time-honoured, legitimate way to play, and it\'s quite often the way I play: you go find an adventure that someone else has already written.\r\n

\r\nAn adventure is the scenario you and your players experience when you sit down at the table to play. It\'s arguably the *game* (the rulebooks are the game engine, or the mechanics). Wizards of the Coast, Paizo, Catalyst, Kobold Press, Frog God, and many others publish adventures (sometimes called \"modules\", \"scenarios\", or \"adventure paths\") written by professional game designers. Published adventures provide the story framework for your game.\r\n

\r\nNot all systems publish adventures, though, or you may choose not to use one. If that\'s the case, spend some time developing a story. Writing a good game is part science, part craft, and part magic, but if you and your players are up to the challenge, then running blindly through a story that\'s mostly being created spontaneously on the spot can be a lot of fun. If that sounds overwhelming, though, get a published adventure!\r\n

\r\nQuick tip: Free, small, or introductory adventures are often available from https://drivethrurpg.com, https://dmsguild.com, and https://www.opengamingstore.com\r\n

\r\nMany adventures have text blocks that provide you with introductory text for each part of the game, they explain clearly what the goal of the players is during that segment, and give you guidance on what players will find in the area and how those discoveries lead to the next plot point.\r\n

\r\nBroadly speaking, there are two types of published adventures: there are \"one-shots\" and there are \"modules\" or \"adventure paths\".\r\n

\r\nA one-shot adventure is analogous to a quest in a video game: it\'s a single, clearly-defined task with a very obvious and immediate result; for example, goblins are terrorizing the hapless citizens of the local village, so go to their cave and clear it out: if you do, you\'ll relieve the villagers of the horrors, and you get to keep any gold or weapons you find.\r\n

\r\nThe advantage is that it\'s designed to be a quick, one-time game session, so it\'s perfect for playing with friends you only see once in a while, or with someone who\'s never played before and just isn\'t sure if it\'s something they want to commit to. Don\'t be fooled by the page count of these small adventures: it may only be 5 to 10 pages long, sometimes less, but you\'ll be surprised at how long players can spend exploring a boundless world existing only in their imagination.\r\n

\r\nAdventure paths or modules or campaigns are bigger stories with\r\nloftier goals. You can think of them as lots of little one-shots\r\nstrung together so that once players accomplish all the tasks and\r\nsolve all the mysteries over the course of 200 pages, they have a\r\nfinal showdown with some Big Bad, and win themselves a place in the\r\nlegends of the game world. It\'s an epic poem instead of a short\r\nstory. It feels grander, it feels important. The losses along the way\r\nare more profound, and the victories sweeter. These campaigns take\r\nmonths to play through and usually expect a gaming group to meet\r\nweekly or fortnightly or at least monthtly to work their way through\r\nthe tale.\r\n

\r\nI should mention one more kind of book you might stumble across, and\r\nthose are source books. I mention this because I\'ve had friends go and\r\nbuy books more or less blindly, and then they bring them back home\r\ndisappointed that instead of a book of lore about dark elves, they\r\nbought an adventure set in the underdark. Or the other way round: they\r\nwanted an adventure and ended up with a rule book.\r\n

\r\nThis happens with the bigger systems that produce a lot of media, like\r\n{D&D, Shadowrun, Pathfinder, Warhammer}, so get clarity on what you\'re\r\nbuying before you make a purchase. If you come across a cool ShadowRun\r\nbook called RUN FASTER expecting a campaign to run with your friends,\r\nyou\'ll be surprised to find that you\'ve purchased a source book full\r\nof metatypes, expanded rules, and alternate character creation\r\nmethods: sort of a Shadowrun Core Rulebook part 2. Same goes for, say,\r\nVolo\'s Guide with D&D, or Ultimate Campaign in Pathfinder. It can be\r\noverwhelming and they\'re not aways labelled clearly (or if they are,\r\nthe label gets lost in the word cloud of RPG jargon that you\'re not\r\nused to yet), so do a little research first.\r\n

\r\nI\'ve played through dungeons that a GM created over his lunch break, and I\'ve played through adventures written by clever game designers, and I can confidently say that they\'re both great ways to RPG. But as a GM, if you feel overwhelmed by the idea of designing a dungeon, a published adventure is a great way to start. Aside from reading a chapter ahead before each game night, all the prep work is done for you, and there\'s very little thinking required.\r\n

\r\nAnother part of being GM is deciding when a die roll is necessary. Die rolls represent the chance of success or failure when a specific action is taken, but the confusing thing is: if you think hard enough about anything in the world you can find a chance of success or failure. As a GM, it\'s up to you to decide what\'s \"important\" enough for a roll. Strictly speaking, that\'s determined by the rules. The rules told you what requires a roll, and you\'re expected to know the rules well enough to make the call.\r\n

\r\nIn practise, however, you have a lot of stuff to track in you head, and remembering what requires a die roll, or deciding to request a die roll even though it may not be strictly required, can feel overwhelming for a new GM.\r\n

\r\nGood news: Players intuitively know when to roll dice. A player knows their character\'s skills (because they built the character and wrote it down on their character sheet), so sometimes the actions they choose to take are chosen because it falls within a category of a skill they happen to have. A thief probably wouldn\'t ever think to *look* for hidden door if the thief were a fighter (who would more likely think to pound on the wall rather than to slyly look for a hidden door). So if your player reaches for dice, let them roll because they\'re probably right.\r\n

\r\nI\'m sure it\'s possible to take it too far, but people like to roll dice. It\'s part of the fun of an RPG, the uncertainty of subjecting yourself to the whims of fate. So when in doubt, either make your players roll dice, or roll dice yourself. I use dice rolls to help me decide everything from NPC reactions to weather conditions. It\'s usually safe to default to rolling.\r\n

\r\nWorst case scenario is that die are only picked up for fights and a literal interpretation of skills: and that works because those are the rules as written.\r\n

Klaatu

\r\n

\r\nPlayers drive the story. In video game or movie terminology, they control the \"camera\". When players are exploring or investigating, let them ask questions or take actions (\"I look in the closet\"), and answer them as you see fit (\"You open the closest and see an array of fine garments.\")\r\n

\r\n\"I\'ll move the clothes aside and examine the walls, and the floor. I\'m looking for trap doors or hidden compartments, or anything suspicious.\"\r\n

\r\nAnd so on. Players can choose to investigate and explore for as much as they want. That\'s the beauty of a pen-and-paper RPG: the world is infinite. That said, you\'re the GM and you owe it to your players to keep the game moving. You don\'t to let your players spend 3 real hours searching a room that, in the end, has no bearing upon the plot whatsoever. That can be a delicate matter, because the nature of the game means that you know things that the other players don\'t, meaning much of the puzzle for players is what they don\'t know.\r\n

\r\nUsually I let players explore a space on their own until I feel that they\'ve explored the obvious parts of it, and then I remind them where the exits are, or I remind them how many other rooms there are to explore, or some subtle clue to say, without saying, that they\'ve secured an area.\r\n

\r\nIf players are especially suspicious of something, though, you certainly have the power to generate a subplot, and often times you should do that. It\'s fun for you and rewarding to players. For instance, if a player is convinced that there\'s a secret panel in a closet and spends a lot of time investigating, then you might decide that there IS a secret panel in the closet, and then roll on a random table to determine what could possible inside that compartment. Or you could leave the compartment empty, thereby creating a story hook to return to later...what used to be in that compartment? who took it, and why? What were the implications?\r\n

\r\nKeeping the gaming moving is an inexact, unscientific process, but usually it comes pretty naturally. When you start to get bored of the players exploring, you can bet that they\'re probably getting bored too, and that\'s when you know to urge them forward. If all else fails, you can always have something lure them from one space to another: a mysterious sound, an oncoming threat, or a supernatural or divine instinct.\r\n

\r\n',78,95,0,'CC-BY-SA','rpg,dm,gm,game master,dungeon master,dnd',0,0,1), (2762,'2019-03-05','What You Really Are',996,'Lostnbronx looks back at his early gaming days.','

I got into Dungeons & 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.

',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.','

\r\nKlaatu reads a phlog (gopher) post by Deepgeek explaining the practical uses of SPF records.\r\n

',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!','

\r\nTaxonomy of RPG-related books:\r\n

\r\n\r\n
    \r\n
  1. \r\nRulebooks tell you how to play the game.\r\n

  2. \r\n
  3. \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

  4. \r\n
  5. \r\nAdventures (formerly called \"modules\") provide game plots and locations, in the event that you have no interest in designing your own.\r\n

  6. \r\n
  7. \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

  8. \r\n
  9. \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

  10. \r\n
\r\n\r\n

\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

\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','

\r\nShownotes are on mixedsignals.ml\r\n

',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','

\r\nFull shownotes are on mixedsignals.ml\r\n

\r\n\r\n

\r\nYou can download Klaatu\'s update revision of the game materials here: https://mixedsignals.ml/download/deadearth-bundle-gfdl.7z\r\n

',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','

Intro

\r\n

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.

\r\n

Data types and Database

\r\n

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.

\r\n
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 "PlanetaryStatus"
\r\n

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 PlanetaryStatus is much more informative than String or Text.

\r\n

For database, we use following definition shown below in models file. It creates database table planet_status and respective Haskell data type PlanetStatus. 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.

\r\n
PlanetStatus json\r\n    planetId PlanetId\r\n    status PlanetaryStatus\r\n    expiration Int Maybe\r\n    deriving Show Read Eq
\r\n

expiration column doesn’t have NOT NULL constraint like all other columns in the table. This is reflected in PlanetStatus record where data type of planetStatusExpiration is Maybe Int instead of Int. So some statuses will have expiration time, while others might not. I originally chose to represent time as Int instead of own data type, but I have been recently wondering if that was really a good decision.

\r\n

Kragii attack, redux

\r\n

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 [Entity Planet] data that contains all planets that match the criteria.

\r\n
-- | Load planets that are kragii attack candidates\r\nkragiiTargetPlanets :: (MonadIO m, BackendCompatible SqlBackend backend\r\n                           , PersistQueryRead backend, PersistUniqueRead backend) =>\r\n                           Int -> Int -> Key Faction -> ReaderT backend m [Entity Planet]\r\nkragiiTargetPlanets pop farms fId = do\r\n    planets <- E.select $\r\n        E.from $ (planet `E.LeftOuterJoin` population `E.LeftOuterJoin` building `E.LeftOuterJoin` status) -> do\r\n            E.on (status E.?. PlanetStatusPlanetId E.==. E.just (planet E.^. PlanetId)\r\n                  E.&&. 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.&&. building E.?. BuildingType E.==. E.val (Just Farm)\r\n                      E.&&. 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, _, _) -> entityKey a == entityKey b) planets\r\n    let counted = catMaybes $ fmap farmAndPopCount grouped\r\n    let filtered = filter ((_, p, f) ->\r\n                                p >= pop\r\n                                || f >= farms) counted\r\n    let mapped = fmap ((ent, _, _) -> ent) filtered\r\n    return mapped
\r\n

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 planet_population table), have at least 5 farming complex (left outer join to building table) and don’t have on going kragii attack (left outer join to planet_status table). This is encapsulated in kragiiTargetPlanets 10 5 function in the kragiiAttack function shown below.

\r\n

Rest of the code deals with selecting a random planet from candidates, inserting a new planet_status row to record that kragii are attacking the planet and creating special event so player is informed about the situation and can react accordingly.

\r\n
kragiiAttack date faction = do\r\n    planets <- kragiiTargetPlanets 10 5 $ entityKey faction\r\n    if length planets == 0\r\n        then return Nothing\r\n        else do\r\n            n <- liftIO $ randomRIO (0, length planets - 1)\r\n            let planet = maybeGet n planets\r\n            let statusRec = PlanetStatus <$> fmap entityKey planet\r\n                                         <*> Just KragiiAttack\r\n                                         <*> Just Nothing\r\n            _ <- mapM insert statusRec\r\n            starSystem <- mapM (getEntity . planetStarSystemId . entityVal) planet\r\n            let event = join $ kragiiWormsEvent <$> planet <*> join starSystem <*> Just date\r\n            mapM insert event
\r\n

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).

\r\n

For example, in case of removing kragii attack status, code below serves as an example. The interesting part is deleteWhere that does actual database activity and removes all KragiiAttack statuses from given planet.

\r\n
removeNews event odds = MaybeT $ do\r\n    res <- liftIO $ roll odds\r\n    case res of\r\n        Success -> do\r\n            _ <- lift $ deleteWhere [ PlanetStatusPlanetId ==. kragiiWormsPlanetId event\r\n                                    , PlanetStatusStatus ==. KragiiAttack\r\n                                    ]\r\n            _ <- tell [ WormsRemoved ]\r\n            return $ Just RemoveOriginalEvent\r\n        Failure -> do\r\n            _ <- tell [ WormsStillPresent ]\r\n    return $ Just KeepOriginalEvent
\r\n

Removal of expired statuses is done based on the date, by using <=. operator to compare expiration column to given date.

\r\n
_ <- deleteWhere [ PlanetStatusExpiration <=. Just date]
\r\n

Other uses and further plans

\r\n

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 planet_status record is inserted into database with expiration to set some suitable point in future. System will then automatically remove the status after that date is reached.

\r\n

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).

\r\n

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).

\r\n

Easiest way to catch me nowadays is either via email or on fediverse where I’m Tuula@mastodon.social

\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.','

\r\nHere is a bash script to generate an org-mode word list matrix.\r\nIt requires at least one file ending in .list to be used as a source of words or strings.\r\n

\r\n\r\n
\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 >> \"${DEST}\" <<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 > 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 |\" >> \"${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 | \" >> \"${DEST}\"\r\n	n=$[$n+1]\r\n    done\r\n    echo \" \" >> \"${DEST}\"\r\n    c=$[$c+1]\r\ndone\r\n\r\n/usr/bin/rm tmp\r\n
\r\n\r\n

\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

\r\n\r\n

\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

\r\n\r\n

\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

\r\n\r\n

\r\n Here is a word list for testing:
\r\n https://hackerpublicradio.org/eps/hpr2764_wordlist.html\r\n

\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','

\r\nThe old way:\r\n

\r\n\r\n
\r\n$ ls /dev/sd*\r\n
\r\n\r\n

\r\nAnother old way:\r\n

\r\n\r\n
\r\n$ fdisk --list\r\n
\r\n\r\n

\r\nAn old way to see what you just plugged in:\r\n

\r\n\r\n
\r\n$ sudo dmesg | tail\r\n
\r\n\r\n

\r\nSome new tricks:\r\n

\r\n
\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
\r\n\r\n

\r\nUser-friendly udisks:\r\n

\r\n\r\n
\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
\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','

\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 web browser (search for djvujs in Firefox for an extension), the desktop ( Evince, Okular an BSD/Linux, and djview on BSD/Linux/Windows/Mac), and mobile devices.\r\n

\r\n\r\n

\r\nThe toolchain for encoding and decoding DjVu is \r\ndjvulibre\r\n

\r\n

\r\ndjvu.js is a Javascript library useful for online viewing.\r\n

\r\n\r\n

\r\ndjvu.org contains sample documents and specification documents.

\r\n\r\n

Creating a djvu file

\r\n\r\n

\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 cjb2 (part of the djvulibre distribution) works:\r\n

\r\n\r\n
\r\n$ cjb2 -dpi 300 foo.tiff\r\n$ ls\r\nfoo.tiff\r\nfoo.djvu\r\n
\r\n\r\n

\r\nIf you want to convert something more complex, then use c44 (also a part of the djvulibre distribution):\r\n

\r\n\r\n
\r\n$ c44 -dpi 300 bar.jpg bar.djvu\r\n$ ls\r\nbar.jpg\r\nbar.djvu\r\n
\r\n\r\n

\r\nTo put both of these files in a single DjVu container:\r\n

\r\n\r\n
\r\n$ djvm -c baz.djvu foo.djvu bar.djvu\r\n$ ls\r\nbar.djvu\r\nbaz.djvu\r\nfoo.djvu\r\n
\r\n\r\n

\r\nYou can add bookmarks, too.\r\nOpen a text file called book.marks (or any name you prefer) and enter:\r\n

\r\n\r\n

\r\n(bookmarks\r\n(\"Foo\" \"#1\")\r\n(\"Bar\" \"#2\")\r\n)\r\n
\r\n\r\n

\r\nAnd then apply it to your DjVu file:\r\n

\r\n\r\n
\r\n$ djvused -e \'set-outline book.marks\' -s baz.djvu\r\n
\r\n\r\n

\r\nThere\'s more you can do with DjVu, but this has been an overview of how I use it.\r\n

\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.','

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.

',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.','

NYbill does yet another inexpensive multimeter review. This time the AstroAI WH5000A. (Its time for a multimeter intervention!)

\r\n

The meter:

\r\n\r\n

Pics for the episode:

\r\n',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','

\r\nTo embed text into a Djvu file, you must create a djvused script detailing the page and bitmap location of one of: character, word, line, paragraph, or region.\r\n

\r\n\r\n

\r\nFor good measure, you should first list the contents of your Djvu bundle:\r\n

\r\n\r\n
$ 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
\r\n\r\n

\r\nThen define the location of text in a file called, for instance, content.dsed. Assume that my page is 1000 px by 1000 px:\r\n

\r\n\r\n
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
\r\n\r\n

\r\nApply this script to your Djvu file with dvjused:\r\n

\r\n\r\n
djvused -f ./content.dsed -s test.djvu\r\n
\r\n\r\n

Converting from PDF to Djvu

\r\n\r\n

\r\nYou can convert PDF files to Djvu with the djvudigital command. Due to license incompatibility, it does require you to compile a Ghostscript plugin, but it\'s an easy build. Get the gsdjvu code, and then follow its README instructions.\r\n

\r\n\r\n

\r\nOnce you\'ve built the Ghostscript driver, you can convert PDF to Djvu:\r\n

\r\n\r\n
djvudigital --words foo.pdf foo.djvu\r\n
\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','

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.

\r\n\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.','

This is my first time doing this sort of thing, so I’m sorry if it’s not very good.

\r\n',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.','

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?

\r\n

Story construction is a complicated topic; Lostnbronx tries (and largely fails) to make sense of this small part of it.

\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.','

Looking for a new laptop.

\r\n

Candidates

\r\n\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','

Hallo HPR listeners this is Tony Hughes again coming from Blackpool in the UK.

\r\n

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.

\r\n\r\n

And finally for this episode

\r\n\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','

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.

\r\n

Functor

\r\n

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.

\r\n

Functor type class is defined below. There’s one function fmap that takes two parameters: a function from a to b and structure f a. Result will be structure f b.

\r\n
class Functor f where\r\n    fmap :: (a -> b) -> f a -> f b
\r\n

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).

\r\n
-- | this really raises x to 2nd power and doesn't double it\r\ndouble x = x * x
\r\n

Given a list of Int we can raise them to power of two by using fmap:

\r\n
> fmap double [1, 2, 3, 4, 5]\r\n[1, 4, 9, 16, 25]
\r\n

Since function being applied to structure is type of (a -> b), we can change type of the value inside of the structure. Below is example of turning list of Int to list of Text.

\r\n
> fmap show [1, 2, 3, 4, 5]\r\n["1", "2", "3", "4", "5"]
\r\n

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, fmap, that takes function of type (a -> b) and structure f a and turns it into structure of f b. Details how this is actually done depend on the specific functor.

\r\n

Other common functor is Maybe that is often used in cases where data might or might not be present. Maybe a has two possible values Just a indicating that value a is present and Nothing indicating that there is no value present. When fmap is used in this context, Just a will turn to Just b and Nothing will stay as Nothing.

\r\n
> fmap (x -> x * x) $ Just 2\r\nJust 4\r\n> fmap (x -> x * x) Nothing\r\nNothing
\r\n

Either a b is sometimes used for value that can be correct or an error. It has two value constructors Right b indicates that value is correct, Left a indicates an error case. a and b don’t have to be of same type (and usually aren’t). For example, if we have Either Text Int, then we have value where error case is Text and correct value is Int.

\r\n
> fmap double $ Right 5\r\nRight 25\r\n> fmap double $ Left "distance calculation failed because of flux-capacitor malfunction"\r\nLeft "distance calculation failed because of flux-capacitor malfunction"
\r\n

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 fmap functions together like in the example below. Pay attention to in which order nested functors are defined as Maybe [Int] and [Maybe Int] are different things. Former is for case where list of Int 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.

\r\n
> (fmap . fmap) double (Just [1, 2, 3, 4])\r\nJust [1, 4, 9, 16]\r\n> (fmap . fmap) double Nothing :: Maybe Int\r\nNothing\r\n> (fmap . fmap) double [Just 1, Just 2, Nothing, Just 3]\r\n[Just 1, Just 4, Nothing, Just 9]
\r\n

There’s also infix operator, that does exactly same thing as fmap, called <$>. 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 fmap and sometimes <$>).

\r\n
> fmap show [1, 2, 3, 4, 5]\r\n["1", "2", "3", "4", "5"]\r\n\r\n> show <$> [1, 2, 3, 4, 5]\r\n["1", "2", "3", "4", "5"]
\r\n

There are many more functors, one place to check them is: https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor.html

\r\n

Applicative

\r\n

While functor works fine when function applied has only one parameter, we need applicative in cases of multiparameter functions. Calling fmap (+) [1, 2] 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.

\r\n
class Functor f => Applicative f where\r\n    pure :: a -> f a\r\n    (<*>) :: f (a -> b) -> f a -> f b
\r\n

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 (a -> b), applicative has f (a -> b).

\r\n

Below is an example of using list applicative to calculate all possible ways of summing two lists of Int.

\r\n
> (+) <$> [1, 2, 3] <*> [4, 5, 6]\r\n[5,6,7,6,7,8,7,8,9]
\r\n

Maybe Int works with the same pattern. First we use <$> to get started, this results Maybe containing a function that is waiting for second parameter. Then we use <*> to apply the second parameter so we get the result.

\r\n
> (+) <$> Just 2 <*> Just 5\r\nJust 7\r\n> (+) <$> Just 2 <*> Nothing\r\nNothing
\r\n

As long as there’s only Just a in play, result is Just, but as soon as there’s even single Nothing the end result will be nothing.

\r\n

If you have questions or comments, I would be delighted to hear about them. You can catch me on fediverse, where I’m Tuula@mastodon.social. Even better, you could record your own HPR episode.

\r\n

Ad astra!

\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','

Some ramblings about how we might replace HTTP with more robust, decentralized protocols.

\r\n',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','

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.

\r\n

My parts list for the server build:

\r\n\r\n

minnix at uymail dot com for help, questions, or just general chatter

\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.','

Shutdown.exe

\r\n\r\n

Links:

\r\n\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','

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.

\r\n

The first of these was:

\r\n\r\n

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.

\r\n

The next show I appeared on was an interview I did with Ken Fallon at my first OggCamp in the same year.

\r\n\r\n

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.

\r\n

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.

\r\n
    \r\n
  1. hpr2051 :: My Linux Journey
    \r\nReleased on 2016-06-13
    \r\nin this episode I talked about my journey in computing and starting to use Linux

  2. \r\n
  3. hpr2056 :: Interview with a young hacker
    \r\nReleased on 2016-06-20
    \r\nThis was my first of several interviews with @All_about_Code at my local Raspberry Jam

  4. \r\n
  5. hpr2065 :: Whats in My Bag
    \r\nReleased on 2016-07-01
    \r\nLooking at this show so tells me I have to redo this show as my bag is very different these days

  6. \r\n
  7. hpr2076 :: What Magazines I read Part 1
    \r\nReleased on 2016-07-18
    \r\njust what the title said, I talked about the magazines I was reading at that point in time.

  8. \r\n
  9. hpr2087 :: Magazines I read Part 2
    \r\nReleased on 2016-08-02
    \r\nThis was a follow up of the last show

  10. \r\n
  11. hpr2097 :: New Toys
    \r\nReleased on 2016-08-16
    \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

  12. \r\n
  13. hpr2101 :: What’s on my podcatcher
    \r\nReleased on 2016-08-22
    \r\nA show about the podcasts I listen to.

  14. \r\n
  15. hpr2144 :: An Interview with All About Code at Manchester BarCamp
    \r\nReleased on 2016-10-20
    \r\na follow up interview with Josh

  16. \r\n
  17. hpr2151 :: BarCamp Manchester part 2
    \r\nReleased on 2016-10-31
    \r\nAn interview with Claire, the organiser of BarCamp Manchester.

  18. \r\n
  19. hpr2157 :: BarCamp Manchester part 3
    \r\nReleased on 2016-11-08
    \r\nThis was an interview with Alan O’Donohoe who had started the Raspberry Jam movement

  20. \r\n
  21. hpr2257 :: Watt OS
    \r\nReleased on 2017-03-28
    \r\nAcer Aspire One Netbook – Review

  22. \r\n
  23. hpr2265 :: WattOS on Lenovo X61s
    \r\nReleased on 2017
    \r\nLenovo X61s – Review

  24. \r\n
  25. hpr2271 :: Raspberry Pi Zero W
    \r\nReleased on 2017-04-17
    \r\nReview Episode on the then New Pi Zero W

  26. \r\n
  27. hpr2280 :: Lenovo X61s Part 2
    \r\nReleased on 2017-04-28
    \r\nFollow up review after a SSD upgrade and using Linux Lite

  28. \r\n
  29. hpr2286 :: Surviving a Stroke
    \r\nReleased on 2017-05-08
    \r\nA very personal episode about my surviving a Stroke in February 2017

  30. \r\n
  31. hpr2295 :: MX Linux
    \r\nReleased on 2017-05-19
    \r\nA review episode using this OS on a Lenovo X230i after a hardware boot issue with Linux Mint and an SSD

  32. \r\n
  33. hpr2331 :: Liverpool Makefest 2017 Show 1
    \r\nReleased on 2017-07-10
    \r\nThe first of a number of interview shows from the 2017 Liverpool Makefest

  34. \r\n
  35. hpr2336 :: Liverpool Makefest 2017 Show 2
    \r\nReleased on 2017-07-17

  36. \r\n
  37. hpr2341 :: Liverpool Makefest 2017 Show 3
    \r\nReleased on 2017-07-24

  38. \r\n
  39. hpr2346 :: Liverpool Makefest 2017 Show 4
    \r\nReleased on 2017-07-31

  40. \r\n
  41. hpr2352 :: Liverpool Makefest 2017 Show 5
    \r\nReleased on 2017-08-08

  42. \r\n
  43. hpr2362 :: Raspbian X86 on Lenovo x61s
    \r\nReleased on 2017-08-22
    \r\nReview of Raspbian X86 on a Lenovo X61s

  44. \r\n
  45. hpr2366 :: Making Bramble Jelly
    \r\nReleased on 2017-08-28
    \r\nJust what it says on the tin I talk about making Bramble jelly,

  46. \r\n
  47. hpr2374 :: How to Make Sauerkraut
    \r\nReleased on 2017-09-07
    \r\nAnother food show on how to make Sauerkraut

  48. \r\n
  49. hpr2380 :: Raspbian X86 on P4 Tower
    \r\nReleased on 2017-09-15
    \r\nFollow up this time running Raspbian X86 on an old P4 Tower

  50. \r\n
  51. hpr2405 :: Nokia 6 Review
    \r\nReleased on 2017-10-20
    \r\nI reviewed my new phone

  52. \r\n
  53. hpr2432 :: Living with the Nokia 6 – an update to HPR 2405
    \r\nReleased on 2017-11-28
    \r\nFollow up update show having lived with the phone for a couple of months.

  54. \r\n
  55. hpr2442 :: The sound of Woodbrooke Quaker Study centre in the Spring
    \r\nReleased on 2017-12-12
    \r\nThis was a soundscape recording I made at Woodbrooke Quaker Study Centre in Birmingham UK while I was there in April 2017.

  56. \r\n
  57. hpr2579 :: Ubuntu 18.04 Mate
    \r\nReleased on 2018-06-21
    \r\nA review of the recently released Ubuntu 18.04 Mate

  58. \r\n
  59. hpr2590 :: Blowing a PC Power Supply
    \r\nReleased on 2018-07-06
    \r\nA show about how not to blow your PC power supply

  60. \r\n
  61. hpr2595 :: New laptop bargain?
    \r\nReleased on 2018-07-13
    \r\nA review on my recently purchased secondhand Toshiba Z30 laptop

  62. \r\n
  63. hpr2601 :: Liverpool Makerfest 2018
    \r\nReleased on 2018-07-23
    \r\nChris Dell

  64. \r\n
  65. hpr2606 :: Liverpool Makefest 2018 - interview with Dan Lynch
    \r\nReleased on 2018-07-30
    \r\nA podcast Legend

  66. \r\n
  67. hpr2612 :: Liverpool Makefest 2018 - interview with Joe aka Concrete Dog
    \r\nReleased on 2018-08-07
    \r\nAbout Rocketry

  68. \r\n
  69. hpr2616 :: Liverpool Makefest 2018 - interview with Josh - A.K.A - All About Code
    \r\nReleased on 2018-08-13.
    \r\nThis is another short interview recorded at Liverpool Makefest, with Josh talking about EduBlocks.

  70. \r\n
  71. hpr2621 :: Liverpool Makefest 2018 - Chan’nel Thomas a.k.a little pink maker
    \r\nReleased on 2018-08-20
    \r\nI talk to Chan’nel Thomas aka little pink maker.

  72. \r\n
  73. hpr2626 :: Liverpool Makefest 2018 - interviews with Helen and Chris
    \r\nReleased on 2018-08-27
    \r\nIn this episode I talk to Helen from Manchester Hackspace and Chris from Wirral Code Club

  74. \r\n
  75. hpr2632 :: Liverpool Makefest 2018 - interviews with Robert and Carl
    \r\nReleased on 2018-09-04
    \r\nIn this episode I talk to Robert from Roberts Workshop and Carl from Edgehill University

  76. \r\n
  77. hpr2636 :: Liverpool Makefest 2018 - interviews with Noel from JMU FabLab
    \r\nReleased on 2018-09-10

  78. \r\n
  79. hpr2641 :: Liverpool Makefest 2018 - interview with Rachel from the MicroBit Foundation
    \r\nReleased on 2018-09-17

  80. \r\n
  81. hpr2646 :: Liverpool Makefest 2018 - Interview with Steve and Gerrard from the Liverpool Astronomical society.
    \r\nReleased on 2018-09-24

  82. \r\n
  83. hpr2652 :: Liverpool Makefest 2018 - Interview with Caroline and John
    \r\nReleased on 2018-10-02 under a CC-BY-SA license.
    \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.

  84. \r\n
  85. hpr2663 :: Short review on a 2.5 inch SSD/HDD caddy
    \r\nReleased on 2018-10-17
    \r\nQuick hardware review

  86. \r\n
  87. hpr2702 :: Audacity set up and response to episode 2658
    \r\nReleased on 2018-12-11
    \r\nI post my response to show 2658 by Dave and Al

  88. \r\n
  89. hpr2735 :: Soffritto
    \r\nReleased on 2019-01-25
    \r\nAnother food show

  90. \r\n
  91. hpr2738 :: My Applications
    \r\nReleased on 2019-01-30
    \r\nThis and my 47th episode were about the applications I use in Linux

  92. \r\n
  93. hpr2746 :: My software part 2
    \r\nReleased on 2019-02-11

  94. \r\n
  95. hpr2772 :: My applications and software part 3
    \r\nA short show about the software I use in Linux Mint

  96. \r\n
  97. hpr2786 :: My YouTube Channels
    \r\nA short show about some of my YouTube channels inspired by Ahuka

  98. \r\n
\r\n

https://hackerpublicradio.org/correspondents/0338.html

\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','

In this episode I talk about the Yamaha Disklavier 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.

\r\n\r\n

Photo Album (click image)

\r\n\r\n

\"Yamaha

\r\n\r\n

Links

\r\n\r\n',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','

Background

\r\n

\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

\r\n

\r\nI run AFWall+ which is available from the F-Droid app store. It runs fine on LineageOS.\r\n

\r\n

\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

\r\n

\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 Wi-Fi Connected, no Internet message. \r\n

\r\n

\r\n\r\n

\r\n

\r\nI\'m not sure how this check is done but abqnm suggests at in the StackExchange question How does Android determine if it has an Internet connection? that it may be related to Google Cloud Messaging.\r\n

\r\n\r\n\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\r\n

\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 Hacker Public Radio about it.\r\n

\r\n\r\n

Giving Access

\r\n

\r\nNormally you will get a message saying that the Wi-Fi has no Internet access. \r\n

\r\n

\r\n\"Android\r\n

\r\n

\r\nIf you tap the message a popup will allow you to stay connected and will let you remember the choice.\r\n

\r\n

\r\n\"OpenWireless.Org.\r\n

\r\n

\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

\r\n

\r\nIn this case we can use Termux a Android Terminal emulator, to drop to a shell and fix the problem.\r\n

\r\n

\r\n\r\n

\r\n\r\n

\r\nI used su to get root access but you could also change to the user wifi.\r\n

\r\n

\r\nThe file you need to edit is /data/misc/wifi/wpa_supplicant.conf. It\'s probably best to edit this file with the wifi off.\r\n

\r\n
\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
\r\n

\r\nScroll down to the network that is giving you trouble and add disabled=1\r\n

\r\n
\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
\r\n

\r\nI ended up copying the file to the sdcard, and editing it there. I then copied it back as su and used chown wifi:wifi /data/misc/wifi/wpa_supplicant.conf to fix the permissions.\r\n

\r\n\r\n

\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 Open Wireless access point yourself.\r\n

\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 ?','

Links

\r\n\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','

Links

\r\n\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','

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.

\r\n

Recursion

\r\n

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.

\r\n

Simple recursive definition:

\r\n
fibs :: Integer -> Integer\r\nfibs 0 = 0\r\nfibs 1 = 1\r\nfibs n = fibs (n-1) + fibs (n-2)
\r\n

When called with 0 result is 0. When called with 1 result is 1. For all other cases, fibs is called with values n-1 and n-1 and the results are summed together. This works fine when n is small, but calculation gets slow really quickly with bigger values.

\r\n

Another way is to define list of all Fibonacci numbers recursively:

\r\n
allFibs :: [Integer]\r\nallFibs = 0 : 1 : zipWith (+) allFibs (tail allFibs)
\r\n

Here a list is constructed. First element is 0, second element is 1 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.

\r\n

Common pattern of processing elements in a list, producing a new list:

\r\n
addOne :: [Integer] -> [Integer]\r\naddOne [] = []\r\naddOne (x:xs) = x + 1 : addOne xs
\r\n

Two cases, when called with an empty list [], result is empty list. For all other cases, list is taken apart (x:xs), x contains first element of the list and xs is rest of the list. Body of the function creates a new list where head is x + 1 and tail is addOne xs. This processes whole list of Integer by adding one to each value. It also reverses the list.

\r\n

Second common pattern is processing a list and reducing it to a single value:

\r\n
sumAll :: Integer -> [Integer] -> Integer\r\nsumAll n [] = n\r\nsumAll n (x:xs) = sumAll (n + x) xs
\r\n

If given list is empty (the terminal case), result is n. Second case again takes list apart (x:xs), adds x and n together and recursive call sumAll with tail of the list.

\r\n

This common pattern is discarding some elements of a list:

\r\n
evenOnly :: [Integer] -> [Integer]\r\nevenOnly [] = []\r\nevenOnly (x:xs) = \r\n    if even x\r\n        then x : evenOnly xs\r\n        else evenOnly xs
\r\n

Again, result of empty list is just empty list. In all other cases we first check if x is even. If so, new list is constructed where head is x and tail is evenOnly xs. If x isn’t even, it’s discarded and evenOnly is called recursively with tail of the list.

\r\n

More tools

\r\n

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 evenOnly actually works as I thought it would). For that reason, there are tools that abstract these common patterns and given them names.

\r\n

First is map. It applies given function to each element of a list, thus producing a new list:

\r\n
> map (+1) [1..10]\r\n[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\r\n> map odd [1..10]\r\n[True, False, True, False, True, False, True, False, True, False]
\r\n

Second is fold. There is good article at https://wiki.haskell.org/Foldr_Foldl_Foldl%27 that talks about differences between different folds.

\r\n

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: sum.

\r\n
> foldr (+) 0 [1..10]\r\n55\r\n> foldl (+) 0 [1..10]\r\n55\r\n> sum [1..10]\r\n55
\r\n

scan is similar to fold, except for returning only the final value, it also returns intermediate ones. Here it’s easier to observe how scanr and scanl differ from each other:

\r\n
> scanr (+) 0 [1..10]\r\n[55,54,52,49,45,40,34,27,19,10,0]\r\n> scanl (+) 0 [1..10]\r\n[0,1,3,6,10,15,21,28,36,45,55]
\r\n

Last of the trifecta is filter that is used to select some of the elements in a list based on a supplied function.

\r\n
> filter odd [1..10]\r\n[1, 3, 5, 7, 9]\r\n> filter even [1..]\r\n[2, 4, 6, 8, 10, 12, 14, 16...]\r\n> take 5 $ filter even [1..] \r\n[2, 4, 6, 8, 10]
\r\n

Even more tools

\r\n

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.

\r\n

For example, constructing some lists:

\r\n\r\n

Finding tools

\r\n

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.

\r\n

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.

\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.','

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.

\r\n

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?

\r\n

Lostnbronx meanders for a while, often losing his way, and rarely making a coherent point regarding this complicated topic.

',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','

\r\nCreate an empty file of a predetermined size:\r\n

\r\n\r\n
$ fallocate --length 512M foo.img\r\n
\r\n

Create a LUKS container on it:

\r\n
$ cryptsetup --verify-passphrase luksFormat foo.img\r\n
\r\n

Set it up:

\r\n
$ sudo cryptsetup luksOpen foo.img foo\r\n$ ls /dev/mapper\r\nfoo\r\n$\r\n
\r\n

Make a file system on it:

\r\n
$ sudo mkfs.ext2 /dev/mapper/foo\r\n
\r\n

If you don\'t need it for anything now, you can close it:\r\n

\r\n
$ sudo cryptsetup luksClose foo\r\n$ ls /dev/mapper\r\n$\r\n
\r\n

Mount it as a usable filesystem:

\r\n
$ sudo mkdir /crypt\r\n$ sudo mount /dev/mapper/foo /crypt\r\n
\r\n

\r\nDepending on your system configuration, you may need to set up reasonable permissions:\r\n

\r\n
$ sudo mkdir /crypt/mystuff\r\n$ sudo chown klaatu:users /crypt/mystuff\r\n$ sudo chmod 770 /crypt/mystuff\r\n$ echo \"hello world\" >> /crypt/mystuff/file.txt\r\n
\r\n

\r\nWhen you\'re finished using your encrypted vault, unmount and close it:\r\n

\r\n
$ sudo umount /crypt\r\n$ sudo cryptsetup luksClose foo\r\n
\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','

If you want the full manuscript, that’s at gitlab: hpr2793_bash_coproc_manuscript.adoc. It’s almost a transcript, but I added spontaneous commentary while reading the examples, so that’s not in the manuscript.

\r\n

Episode errata:

\r\n\r\n

Example #1:

\r\n\r\n

More on command substitution in Dave’s hpr1903: Some further Bash tips.

\r\n

Example #2:

\r\n\r\n

You can also combine process substitution with redirection.

\r\n

Example #3:

\r\n\r\n

More on process substitution in Dave’s hpr2045: Some other Bash tips.

\r\n

For a description of a hack for creating bidirectional anonymous pipes in bash, see my Fediverse post on this, and I owe you a show.

\r\n

A coprocess in bash is a subshell to which you have access to two file descriptors: Its stdin and its stdout.

\r\n

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 hpr2709, hpr2719, hpr2729, hpr2739 and hpr2756.

\r\n

You create a coprocess using the coproc keyword, brand spanking new since bash 4 from 2009. I am filing issues to pygments and GNU src-highlite to support it.

\r\n

There are two ways to call coproc. The first way is to give coproc a simple command.

\r\n

Example #4:

\r\n\r\n

The other way is to give coproc an explicit name and a Command Grouping.

\r\n

Example #5:

\r\n\r\n

Slightly less contrived example #6:

\r\n
$ coproc GREP (grep --line-buffered pub); printf '%s\\n' hacker public radio >&${GREP[1]}; cat <&${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 )
\r\n

Here grep and cat wait forever for more input, so we have to kill them to continue our lesson.

\r\n

But we know that GREP 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.

\r\n

I’m glad I stumbled over that {YOURVARIABLE}>&- syntax for having a dereferenced variable as the left FD of a redirection. Originally I used an ugly eval.

\r\n

Example #7:

\r\n
$ coproc GREP (grep --line-buffered pub); printf '%s\\n' hacker public radio >&${GREP[1]}; head -n1 <&${GREP[0]}; exec {GREP[1]}>&-\r\n[1] 25706\r\npublic\r\n[1]+  Done                    coproc GREP ( grep --color=auto --line-buffered pub )
\r\n

There we go! Not the most brilliant example, but it shows all the relevant moving parts, and we covered a couple of caveats.

\r\n

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!

\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','

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.

\n

Overview of simulation

\n

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.

\n

In any case, current time is stored in database in table time. 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 2019.3 in game terms and stored as 20193 in database.

\n

Main processing is done in function called processTurn that is shown below. It advances time for one decimal month, removes all expired statuses as explained in episode 2768 and then loads all factions.

\n

After that, various steps of the simulation are carried out for all loaded factions. These include handling special events as explained in episode 2748 and doing observations and report writing in manner described episode 2703.

\n
processTurn :: (BaseBackend backend ~ SqlBackend,\n    BackendCompatible SqlBackend backend, PersistUniqueRead backend,\n    PersistQueryWrite backend,\n    PersistQueryRead backend, PersistStoreWrite backend, MonadIO m) =>\n    ReaderT backend m Time\nprocessTurn = do\n    newTime <- advanceTime\n    _ <- removeExpiredStatuses newTime\n    factions <- selectList [] [ Asc FactionId ]\n    _ <- mapM (handleFactionEvents newTime) factions\n    mapM_ handleFactionFood factions\n    mapM_ (handleFactionConstruction newTime) factions\n    _ <- 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's possible that they'll receive reports that are one\n    -- turn out of sync.\n    mapM_ (handleFactionObservations newTime) factions\n    return newTime
\n

More mapping

\n

Remember map and fmap that are used to run a function to each element in a list or general structure? mapM works in a similar way, but is used in monadic context. In processTurn function, we’re dealing with input and output and have IO monad present to allow us to do that (MonadIO m part of the type signature).

\n

If you step back a bit and squint a bit, then map :: (a -> b) -> [a] -> [b] and fmap :: (a -> b) -> f a -> f b and mapM :: Monad m => (a -> m b) -> t a -> m (t b) 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.

\n

The difference is that map works only for lists, fmap works for functors (that were covered in episode 2778) and mapM works for structures in monadic context.

\n

Best way to contact me nowadays is either by email or through fediverse where I’m Tuula@mastodon.social.

\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?','

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 ?

\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','

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?

\r\n

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.

\r\n

I’m saying mostly the things I wrote at https://loadaverage.org/conversation/10689347 but with some small updates from the last 9 months.

\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.','

Below the script I used to generate a bunch of wav files with different text to speech applications.

\r\n
#!/bin/bash\r\n\r\nstring="This is HPR episode 2792 entitled \\"Playing around with text to speech synthesis on Linux\\" and is part of the series \\"Sound Scapes\\". It is hosted by Yeroon Bahten and is about 20 minutes long and carries a clean flag."\r\necho "${string}" > text.txt\r\n\r\nespeak -w espeak.wav "${string}" \r\nespeak -w espeak-ng-v-mb-us1.wav -v mb-us1 "${string}"\r\nespeak -w espeak-ng-v-mb-us2.wav -v mb-us2 "${string}"\r\nespeak -w espeak-ng-v-mb-us3.wav  -v mb-us3 "${string}"\r\nespeak-ng "${string}"\r\nespeak-ng -v en-gb "${string}"\r\nespeak-ng -w espeak-ng-en-gb-scotland.wav -v en-gb-scotland "${string}"\r\nespeak-ng -w espeak-ng-en-us.wav  -v en-us "${string}"\r\n\r\nflite -o flite-voice-cmu_us_slt.wav -voice cmu_us_slt  "${string}"\r\n\r\necho "${string}"| festival --language english --tts # same as next line\r\necho "${string}"| 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 "(voice_${voice} )"  text.txt\r\ndone\r\n\r\n# Gnustep say, recorded with audio recorder.\r\nsay "${string}"\r\n\r\ntext2wave -o festival_voice_cmu_us_slt_arctic_hts.wav -eval "(voice_cmu_us_slt_arctic_hts )" text.txt\r\n\r\n# merlin https://github.com/CSTR-Edinburgh/merlin\r\n\r\n# marytts: https://github.com/marytts
\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','

Ubuntu, MATE.

\r\n

Two words which, taken separately, refer to great products.

\r\n

On one side, Ubuntu, one of the most popular, if not the most popular, linux distribution.

\r\n

On the other side, the MATE desktop environment, also very popular.

\r\n

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.

\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','

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.

\r\n

concrete types

\r\n

Simplest case is where types are spelled out definitely. Function add below takes two Integer parameters and produces Integer value. Note that types are written in upper case.

\r\n

add :: Integer -> Integer -> Integer

\r\n

It’s possible to not use concrete types. In following example a (note the lower case) can be anything. So function takes two values of a, a Boolea and produces a. This is useful technique for writing very general functions.

\r\n

choose :: a -> a -> Boolean -> a

\r\n

ad hoc polymorphism

\r\n

In previous example, we wouldn’t be able to do much at all with a 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.

\r\n

add :: (Num a) => a -> a -> a

\r\n

This version of add again takes two parameters, both being type a and produces value a. But (Num a) => part in the signature constraints a to be instance of Num. This type class (I’ll talk about these some other time) defines that each instance of it will have set of functions: +, -, *, negate, abs, signum and fromInteger. So now our add function can use those functions, regardless of what specific type a is.

\r\n

parametrized functions

\r\n

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: first :: [a] -> Maybe a

\r\n

first takes single parameter, list of a and returns Maybe a. Maybe is a type that is used to signify a value that might or might not be present and has following definition:

\r\n
data Maybe a =\r\n     Nothing\r\n     | Just a
\r\n

So our function would return Nothing when given an empty list and Just a when given a list of at least one element.

\r\n

using functions

\r\n

Function application in Haskell doesn’t require parentheses around arguments. Calling our add function is just add 1 2. If one of the values is result of another function call, we need to tell which parameters belong to which function. Using $ is one option: add 1 $ add 2 3, another option is to use parentheses: add 1 (add 2 3).

\r\n

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 addLots 5 will produce same value as add 1000 5:

\r\n
addLots = add 1000\r\naddLots 5
\r\n

Another contrived example of partial application:

\r\n
findPodcasts :: [Podcast] -> Text -> [Podcast]\r\nsearch = findPodcasts loadedPodcasts\r\nmyPodcasts = search "Tuula"
\r\n

functions as types

\r\n

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.

\r\n

Common example is filter, which has following signature: filter :: (a -> Bool) -> [a] -> [a]

\r\n

It takes two parameters, first one is function that has type a -> Bool and second one is list of a. Return value is list of a. You can produce a list of odd numbers between 1 and 10 with filter odd [1..10].

\r\n

anonymous functions

\r\n

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: filter (\\x -> odd x && x > 5) [1..10]. If you squint hard enough \\ looks almost like a lowercase greek letter λ.

\r\n

Easiest way to catch me is either email or fediverse where I’m Tuula@mastodon.social

\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','
    \r\n
  1. intro
  2. \r\n
\r\n

1.1 brian in ohio

\r\n

1.2 out from under my rock

\r\n
    \r\n
  1. motivation
  2. \r\n
\r\n

2.1 ken fallon bootloader episode

\r\n\r\n

2.2 still use arduino

\r\n\r\n

2.3 need to run an arduino board at lower frequency

\r\n\r\n
    \r\n
  1. needed supplies
  2. \r\n
\r\n

3.1 arduino ide

\r\n\r\n

3.2 avrdude

\r\n\r\n

3.3 arduino nano clone - un assembled

\r\n

\"hpr2799-bare-nano.jpg\"

\r\n\r\n

3.4 3 leds 3mm or smaller

\r\n

\"hpr2799-led.jpg\"

\r\n\r\n

3.5 3 resistors 200 ohm - small

\r\n\r\n

3.6 1 5-10 uF electrolytic capacitor

\r\n

3.7 3-4 inch long jumper wire

\r\n

3.8 2x3 female header

\r\n

\"hpr2799-2x3header.jpg\"

\r\n

3.9 some way to cut wire

\r\n

3.10 soldering supplies

\r\n
    \r\n
  1. howto
  2. \r\n
\r\n

4.1 upload arduino isp sketch to nano

\r\n

File→Examples→11.ArduinoISP→ArduinoISP

\r\n\r\n

4.2 solder on led’s

\r\n

\"hpr2799-led-on-board.jpg\"

\r\n\r\n

\"hpr2799-leds-done.jpg\"

\r\n

4.3 modify sketch and test leds

\r\n\r\n

4.4 clip jumper wire and attach

\r\n

\"hpr2799-reset-wire.jpg\"

\r\n\r\n

4.5 add capacitor

\r\n\r\n

4.6 2x3 header

\r\n
                         MISO -|o o|-+Vcc\r\n                          SCK -|o o|-MOSI\r\n Do not attach-Reset-|o o|-Gnd\r\n                                     -----
\r\n

\"hpr2799-header-mod.jpg\"

\r\n\r\n

\"hpr2799-header-soldered.jpg\"

\r\n
    \r\n
  1. how to use
  2. \r\n
\r\n

5.1 plug usb cable into programmer and your computer

\r\n

5.2 start the arduino ide

\r\n

5.3 plug programmer onto target board remember to plug the wire into the reset pin of the target

\r\n

5.4 in the tools folder of the ide make sure your usb port is selected

\r\n

Tools→Port"/dev/ttyUSBx"/dev/ttyUSBx

\r\n

5.5 and that in the programmer section you select arduino as isp not arduinoisp

\r\n

Tools→Programmer→Arduino as ISP

\r\n

5.6 at this point you can burn a bootloader as Ken described

\r\n

5.7 upload a program

\r\n

5.7.1 bring up the blink example sketch

\r\n

5.7.2 under tools make sure your target board type is selected

\r\n

Tools→Boards

\r\n

5.7.3 under the sketch menu you’ll see upload using a programmer

\r\n

Sketch→Upload Using Programer

\r\n

5.7.4 when you select that the blink sketch will be compiled and uploaded

\r\n
    \r\n
  1. at the command line
  2. \r\n
\r\n

6.1 check functionallity

\r\n
bash-4.3$ avrdude -p m328p -c arduino -P /dev/ttyUSB0 -b 19200
\r\n

6.2 output

\r\n
  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.
\r\n
    \r\n
  1. things to look out for
  2. \r\n
\r\n

7.1 permissions issues - arch wiki gentoo

\r\n

7.2 when you upload this way you overwrite bootloader

\r\n

7.3 arduino ide boards.txt has some fuse errors

\r\n

7.4 avrdude version 6.2 will not work

\r\n

7.5 baud rate using avrdude command line

\r\n

7.6 capacitor is non-optional, but makes uploading to that board non-trivial

\r\n
    \r\n
  1. conclusion
  2. \r\n
\r\n

8.1 upload via icsp vs usb serial

\r\n

8.2 do you need a bootloader?

\r\n

8.3 challenge to max out any 8bit microcontroller

\r\n\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.','

NYbill talks about setting up a guitar.

\r\n

Pics for the episode:

\r\n

https://media.gunmonkeynet.net/u/nybill/collection/guitar-set-up/

\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','

Basic usage

\r\n

Use the FIELDWIDTHS = "n1 n2 n3 ..." annotation in the BEGIN section of an awk command to specify the widths of the fields.

\r\n

For instance, the following file has widths of 20, 10, and 12 characters.

\r\n
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
\r\n

Below is an example of processing such a file:

\r\n
BEGIN  { FIELDWIDTHS = "20 10 12" }\r\nNR > 1 {\r\n    name = $1\r\n    state = $2\r\n    phone = $3\r\n    sub(/ +$/, "", name)\r\n    sub(/ +$/, "", state)\r\n    sub(/ +$/, "", phone)\r\n    printf("%s lives in %s. The phone number is %s.\\n", name, state, phone)\r\n}\r\n
\r\n

Then you can run the command:

\r\n
awk -f process_fixed_width.awk fixed_width.txt\r\n
\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','

https://en.wikipedia.org/wiki/Scope_%28computer_science%29

\r\n

In hpr2739, Dave talked briefly about local variables. But what are they?

\r\n

In most modern languages, especially in compiled languages, "local" 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.

\r\n

Languages like C and Python have lexical scope. Lexical scope means local variables are local in the text. The names are local.

\r\n

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 myvariable in my function is not the same variable, not the same place, as myvariable in your function.

\r\n

Languages like Bash and Elisp have dynamic scope. That means local variables are local in time. The names are global.

\r\n

What happens when you declare a variable local in bash is that the existing value of that variable is stowed away, to be brought back when your function exits.

\r\n
#!/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
\r\n
The scope is global\r\nThe scope is local\r\nThe scope is dynamic\r\nThe scope is global
\r\n

Perl has both, and it calls them local (dynamic scope, like bash) and my (lexical scope):

\r\n
#!/usr/bin/env perl\r\nuse v5.10;\r\n\r\nsub sayscope {\r\n    say "Dynamic scope is $whatsmyscope";\r\n}\r\n\r\nsub globalscope {\r\n    $whatsmyscope="global";\r\n}\r\n\r\nsub dynamicscope {\r\n    $whatsmyscope="dynamic";\r\n}\r\n\r\nsub lexicalscope {\r\n    my $whatsmyscope="lexical";\r\n    say "Lexical scope is $whatsmyscope";\r\n    sayscope;\r\n}\r\n\r\nsub localscope {\r\n    local $whatsmyscope="local";\r\n    sayscope;\r\n    dynamicscope;\r\n    sayscope;\r\n    lexicalscope;\r\n}\r\n\r\nglobalscope;\r\nsayscope;\r\nlocalscope;\r\nsayscope;
\r\n
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
\r\n

You almost never want to use local in Perl, it’s mostly there for historical reasons — lexical scope is a Perl 5 feature. https://perl.plover.com/local.html covers well the remaining few and narrow exceptions where local might be useful.

\r\n

As dynamic scope has some valid use, it’s available in some otherwise lexically scoped languages. For example, Common LISP has the special form, and several Schemes and Racket have parameter objects:

\r\n\r\n

To dig fully into the history and flora of dynamic and lexical scope merits another episode.

\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.','

NYbill opens a mystery box that arrived in the mail.

\r\n

No spoilers. But, it involves soldering…

\r\n

Pics for the episode:

\r\n

https://media.gunmonkeynet.net/u/nybill/collection/what-s-in-the-box/

',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.','

Thanks to norrist for suggesting I do this episode!

\r\n\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','

Introduction

\r\n

This is the fifteenth episode of the “Learning Awk” series which is being produced by b-yeezi and myself.

\r\n

This is the second of a pair of episodes looking at redirection in Awk scripts.

\r\n

In this episode I will spend some time looking at the getline command used for explicit input (as opposed to the usual implicit sort), often with redirection. The getline command is a complex subject which I will cover only relatively briefly. You are directed to the getline section of the GNU Awk User’s Guide for the full details.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n',225,94,1,'CC-BY-SA','Awk utility, Awk Language, gawk, redirection',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.','

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.

\r\n

I’m no legal expert, so take all of this as sort of a rough introduction to the license.

\r\n

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.

\r\n

However: just note that it has a feature, some would say bug, that might be a big deciding factor in whether you feel comfortable with it (listen for details)

\r\n

Nevertheless, I believe this license, or at least its style of language, will soon become extremely common.

\r\n

Further links:

\r\n\r\n

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 license terms, not authorship or credit. So for them an attribution requirement is a requirement to include the license terms with any distributed copies, not a requirement to give authorship credit to people.

\r\n

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!

\r\n\r\n

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.

\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','

This is mostly verbatim from my Fediverse post https://libranet.de/display/0b6b25a8-165c-9c7f-b55d-c7a077813050, with a few minor edits.

\r\n

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.

\r\n

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.

\r\n

They are heavily quoted in networks of pseudoscience, including anti-vaccine sites, right-wing "alternative facts" sites and Strålskyddsstiftelsen ("Swedish Radiation Protection Foundation"), 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.

\r\n

Strålskyddsstiftelsen received the 2013 "Misleader of the Year" award from the main Swedish scientific skeptics\' society, Vetenskap och Folkbildning ("Science and Public Education") for "[their fearmongering propaganda and biased reporting on the health effects of mobile telephony use and wireless networks]".

\r\n

https://www.vof.se/utmarkelser/tidigare-utmarkelser/aretas-forvillare-2013/ (in Swedish)

\r\n

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.

\r\n

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.

\r\n

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.

\r\n

I’m no cancer researcher, but neither is Rainer Nyberg, he’s a retired professor in pedagogy. He’s a concerned citizen. https://en.wikipedia.org/wiki/Lennart_Hardell is an actual oncologist and professor who has studied carcinogens, but his research results on the wireless/cancer connection have been dismissed as "non-informative", "post hoc", "barely statistically significant" and "flawed" by his peers. There is nothing there.

\r\n

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.

\r\n

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.

\r\n

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.

\r\n

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 "alarmingly small amount of information about its potential health effects" is available, "The established health effects associated with non-ionizing radiation are limited to thermal effects" and "these scanners operate at outputs well below those required to produce tissue heating", that is, we currently don’t know of a way millimeter waves might be harmful: https://www.sciencedirect.com/science/article/pii/S1687850714000168 (https://doi.org/10.1016/j.jrras.2014.02.005)

\r\n

For a guide on how to spot pseudoscience and how to read scientific papers, see ahuka’s excellent hpr2695: Problems with Studies.

\r\n

https://en.wikipedia.org/wiki/Betteridge%27s_Law_of_Headlines

',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','

Background

\r\n

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.

\r\n

There’s three types of research: engineering, natural sciences and social sciences. Research costs points that are produced by various buildings.

\r\n

Implementation

\r\n

There’s three database tables, which are defined below:

\r\n
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
\r\n

Data types

\r\n

Technology 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.

\r\n
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)
\r\n

All research belong to one of the top categories that are shown below:

\r\n
data TopResearchCategory =\r\n    Eng\r\n    | NatSci\r\n    | SocSci\r\n    deriving (Show, Read, Eq, Ord)
\r\n

ResearchCategory is more fine grained division of research. Each of the categories is further divided into sub-categories. Only EngineeringSubField is shown below, but other two are similarly divided.

\r\n
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)
\r\n

ResearchScore is measure of how big some research is. It has type parameter a that is used to further quantify what kind of ResearchScore we’re talking about.

\r\n
newtype ResearchScore a = ResearchScore { unResearchScore :: Int }\r\n    deriving (Show, Read, Eq, Ord, Num)
\r\n

TotalResearchScore 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.

\r\n
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)
\r\n

Following singleton values are used with ResearchScore and TotalResearchScore to quantify what kind of value we’re talking about.

\r\n
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)
\r\n

Finally there’s Research, which is a record that uses many of the types introduced earlier. It describes what Technology 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.

\r\n
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)
\r\n

Tech tree

\r\n

Putting all this together, we can define a list of Research. 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. Map in other programming languages is often known as dictionary, associative array or hash map. It stores key-value - pairs. In our case Technology is used as key and Research as value. We define it based on the list previously defined:

\r\n
techMap :: Map.Map Technology Research\r\ntechMap = Map.fromList $ (\\x -> (researchType x, x)) <$> unTechTree techTree
\r\n

Next time we’ll look into how to actually use all these types and data that were defined.

\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','

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.

',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','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n DanNixon.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3043Wed2020-04-01How I record for HPRArcher72
3044Thu2020-04-02mocp snooze tipMrX
3045Fri2020-04-03OSS compliance with privacy by default and designAhuka
3046Mon2020-04-06HPR Community News for March 2020HPR Volunteers
3047Tue2020-04-07The COVID-19 Work From Home Stream - Day 1Thaj Sara
3048Wed2020-04-08Alternatives to toilet paperklaatu
3049Thu2020-04-09What computers taught me about realityklaatu
3050Fri2020-04-10Linux Inlaws S01E04 What\'s in a namemonochromec
3051Mon2020-04-13The COVID-19 Work From Home Stream - Day 2Thaj Sara
3052Tue2020-04-14Locating computers on a networkKen Fallon
3053Wed2020-04-15AudioBookClub 17 - Blood WitnessHPR_AudioBookClub
3054Thu2020-04-16Coronavirus ThoughtsAhuka
3055Fri2020-04-17Advice to new Fediverse administrators and developersAhuka
3056Mon2020-04-20Jitsioperat0r
3057Tue2020-04-21Formal verification with CoqTuula
3058Wed2020-04-22The COVID-19 Work From Home Stream - Day 3Thaj Sara
3059Thu2020-04-23A quick intro to SnapcastDanNixon
3060Fri2020-04-24Running a local imap serverKen Fallon
3061Mon2020-04-27Parental Controls With Mike Ivyoperat0r
3062Tue2020-04-28Vassal: How to play board games while remoteclacke
3063Wed2020-04-29Pens, pencils, paper and ink - 1Dave Morriss
3064Thu2020-04-30How I got started in ElectronicsArcher72
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 4 comments on\n3 previous shows:

\n\n

This month\'s shows

\n

There are 20 comments on 9 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-April/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nDave Morriss, Windigo

\n

Over the period tags and/or summaries have been added to 17 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\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','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3065Fri2020-05-01The case for the unattributed messageAhuka
3066Mon2020-05-04HPR Community News for April 2020HPR Volunteers
3067Tue2020-05-05Getting my Python3 code working in Python2MrX
3068Wed2020-05-06Keeping track of downloads in ElmTuula
3069Thu2020-05-07Linux Inlaws S01E05 Porn and Skynetmonochromec
3070Fri2020-05-08making vim xdg compatiblecrvs
3071Mon2020-05-11Bash snippet - quotes inside quoted stringsDave Morriss
3072Tue2020-05-12The joy of pip-tools and pyenv-virtualenvclacke
3073Wed2020-05-13Matchbox and Diecast RestorationTony Hughes AKA TonyH1212
3074Thu2020-05-14For your consideration - Escape PodKen Fallon
3075Fri2020-05-15Federated Blogging with WriteFreelyAhuka
3076Mon2020-05-18Keep calm and VirionDave Morriss
3077Tue2020-05-19Video conference Push to TalkDanNixon
3078Wed2020-05-20Coronavirus Update 2020-05-07Ahuka
3079Thu2020-05-21Linux Inlaws S01E06 Porn and Trumpmonochromec
3080Fri2020-05-22Ansible pingKen Fallon
3081Mon2020-05-25Why do formal verification?Tuula
3082Tue2020-05-26RFC 5005 Part 1 – Paged and archived feeds? Who cares?clacke
3083Wed2020-05-27Mumbling while on lockdownDave Morriss
3084Thu2020-05-28AudioBookClub 18 - Star Trek: The Continuing MissionThaj Sara
3085Fri2020-05-29Architectures of Robust OpennessAhuka
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 8 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 21 comments on 11 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-May/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nDave Morriss

\n

Over the period tags and/or summaries have been added to 9 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\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','

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.

',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?','

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!!!!

\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','

\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

\r\n\r\n

\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 Inter-Client Communication Conventions Manual defines three X Selection states: Primary, Secondary, and Clipboard.\r\nThe Secondary is rarely (if ever?) used, so I don\'t cover it here.\r\n

\r\n\r\n

Primary

\r\n\r\n

\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

\r\n\r\n

\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

\r\n\r\n\r\n

Clipboard

\r\n\r\n

\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 > Copy or a selection of Edit > Copy.\r\nWhen another application is told to paste from the clipboard, it pastes data from the Clipboard Selection.\r\n

\r\n\r\n

Both

\r\n\r\n

\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

\r\n\r\n

xsel

\r\n\r\n

\r\nThe xsel command allows you to retrieve the contents of an X Selection.\r\n

\r\n\r\n
\r\n$ xsel --primary\r\ndungeons\r\n$ xsel --clipboard\r\ndragons\r\n
\r\n\r\n

Clipboard managers

\r\n\r\nClipboard managers such as Klipper, CopyQ, Parcellite, 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

\r\n\r\n

GPM

\r\n\r\n

\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

\r\n\r\n

GNU Screen and Tmux

\r\n\r\n

\r\nScreen and tmux are "window managers for text consoles".\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

\r\n\r\n
    \r\n
  1. \r\nPress Ctrl+A to get out of insert mode.\r\n

  2. \r\n
  3. \r\nPress left-square_bracket to enter copy-mode\r\n

  4. \r\n
  5. \r\nMove your text to the position you want to start selecting and press Enter or Return\r\n

  6. \r\n
  7. \r\nArrow to the position at which you want to end your selection and press Enter or Return again\r\n

  8. \r\n
\r\n\r\n

\r\nTo paste your selection:\r\n

\r\n\r\n
    \r\n
  1. \r\nPress Ctrl+A to get out of insert mode.\r\n

  2. \r\n
  3. \r\nPress right-square_bracket to paste\r\n

  4. \r\n
\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','

Introduction

\r\n

This is the fourteenth episode of the “Learning Awk” series which is being produced by b-yeezi and myself.

\r\n

In this episode and the next I want to start looking at redirection within Awk programs. I had originally intended to cover the subject in one episode, but there is just too much.

\r\n

So, in the first episode I will be starting with output redirection and then in the next episode will spend some time looking at the getline command used for explicit input, often with redirection.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\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','

Hacker Public Radio New Years Show episode 1

\r\n

Welcome to the 7th Annual Hacker Public Radio show. It is December the 31st 2018 and the time is 10 hundred hours UTC.

\r\n\r\n

\"we should have bought stock\"

\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!','

Based on https://libranet.de/display/0b6b25a8-125c-a71f-c7ae-f1a686792961.

\r\n

It’s pretty short, less than 4 minutes, but I think it’s important.

\r\n

Who defines whether you are successful, or whether your project is successful, and does it matter?

',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','

Intro

\r\n

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.

\r\n

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.

\r\n

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.

\r\n

Server API

\r\n

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.

\r\n
/api/research/available     ApiAvailableResearchR       GET\r\n/api/research/current       ApiCurrentResearchR         GET POST DELETE\r\n/api/research/production    ApiResearchProductionR      GET
\r\n

Simulation

\r\n

Simulation of research is done by handleFactionResearch, 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 completed_research table. Final step is updating what research will be available in the next turn.

\r\n
handleFactionResearch date faction = do\r\n    production <- totalProduction $ entityKey faction\r\n    current <- selectList [ CurrentResearchFactionId ==. entityKey faction ] []\r\n    let updated = updateProgress production <$> current\r\n    _ <- updateUnfinished updated\r\n    _ <- handleCompleted date updated $ entityKey faction\r\n    _ <- updateAvailableResearch $ entityKey faction\r\n    return ()
\r\n

Research point production

\r\n

Research points are produced by buildings. So first step is to load all planets owned by the faction and buildings on those planets. Applying researchOutput function to each building yields a list of TotalResearchScore, which is then summed up by mconcat. We can use mconcat as TotalResearchScore is a monoid (I talked about these couple episodes ago).

\r\n
totalProduction fId = do\r\n    pnbs <- factionBuildings fId\r\n    let buildings = join $ fmap snd pnbs\r\n    return $ mconcat $ researchOutput . entityVal <$> buildings
\r\n

researchOutput 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 ResearchComplex, while second one is for ParticleAccelerator. Final case uses underscore to match anything and indicate that we’re not even interested on the particular value being matched. mempty is again from our monoid definition. It is empty or unit value of monoid, which in case of TotalResearchScore is zero points in all research categories.

\r\n
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
\r\n

Updating progress

\r\n

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.

\r\n

updateProgress 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.

\r\n

Perhaps the most interesting part is use of lenses. For example, line entityValL . currentResearchProgressL +~ engResearch $ curr means that curr (which is Entity CurrentResearch) is used as starting point. First we reach to data part of Entity and then we focus on currentResearchProgress and add engResearch to it. This results a completely new Entity CurrentResearch being constructed, which is otherwise identical with the original, but the currentResearchProgress has been modified. Without lenses we would have to do this destructuring and restructuring manually.

\r\n
updateProgress :: TotalResearchScore ResearchProduction -> Entity CurrentResearch -> Entity CurrentResearch\r\nupdateProgress prod curr =\r\n    case researchCategory <$> research of\r\n        Just (Engineering _) ->\r\n            entityValL . currentResearchProgressL +~ engResearch $ curr\r\n\r\n        Just (NaturalScience _) ->\r\n            entityValL . currentResearchProgressL +~ natResearch $ curr\r\n\r\n        Just (SocialScience _) ->\r\n            entityValL . currentResearchProgressL +~ socResearch $ curr\r\n\r\n        Nothing ->\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
\r\n

Writing unfinished research back to database is short function. First we find ones that hasn’t been finished by filtering with (not . researchReady . entityVal) and then we apply replace to write them back one by one.

\r\n
updateUnfinished updated = do\r\n    let unfinished = filter (not . researchReady . entityVal) updated\r\n    mapM (\\x -> replace (entityKey x) (entityVal x)) unfinished
\r\n

Handling finished research starts by finding out which ones were actually completed by filtering with (researchReady . entityVal) and their research type with currentResearchType . entityVal. Rest of the function is all about database actions: creating entries into completed_research and adding news entries for each completed research, then removing entries from current_research and available_research.

\r\n
handleCompleted date updated fId = do\r\n    let finished = filter (researchReady . entityVal) updated\r\n    let finishedTech = currentResearchType . entityVal <$> finished\r\n    insertMany_ $ currentToCompleted date . entityVal <$> finished\r\n    insertMany_ $ researchCompleted date fId . (currentResearchType . entityVal) <$> finished\r\n    deleteWhere [ CurrentResearchId <-. fmap entityKey finished ]\r\n    deleteWhere [ AvailableResearchType <-. finishedTech\r\n                , AvailableResearchFactionId ==. fId ]
\r\n

Available research

\r\n

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 g <- liftIO getStdGen gets us a new random number generator that is seeded by current time.

\r\n

updateAvailableResearch starts by loading available research and current research for the faction and initializing a new random number generator. g 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. getR is helper function I wrote that uses random number generator to pick n entries from a given list. n in our case is hard coded to 3, but later on I’ll add possibility for player to research technologies that raise this limit. newAvailableResearch (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 <> operator and written into database with rewriteAvailableResearch.

\r\n
updateAvailableResearch fId = do\r\n    available <- selectList [ AvailableResearchFactionId ==. fId ] []\r\n    completed <- selectList [ CompletedResearchFactionId ==. fId ] []\r\n    g <- 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 <> natCand <> socCand
\r\n

newAvailableResearch 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:

\r\n\r\n

and complete definition of the function is shown below:

\r\n
newAvailableResearch selector limit available completed =\r\n    if ResearchLimit (length specificCategory) >= 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 -> researchType x `notElem` knownTech) unlockedResearch\r\n        unlockedResearch = filter (antecedentsAvailable knownTech) $ unTechTree techTree\r\n        knownTech = completedResearchType . entityVal <$> 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
\r\n

Final step of the simulation of research is to update database with new available research. mkUniq is helper function that removes duplicate elements from a list. It’s used in rewriteAvailableResearch 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.

\r\n
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 <-. cats ]\r\n        insertMany_ $ researchToAvailable fId <$> res
\r\n

Now everything is ready for next round of simulation.

\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','

I got really good comment on episode 2778 - Functor and applicative in Haskell from Beeza that I’m including below:

\r\n
\r\n

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.

\r\n
\r\n
\r\n

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?”

\r\n
\r\n

In this episode, I’m trying to answer to that from my point of view.

\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','

Hacker Public Radio New Years Show episode 2

\r\n\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','

Hacker Public Radio New Years Show episode 3

\r\n

Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019

\r\n\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','

Hacker Public Radio New Years Show episode 4

\r\n

Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019

\r\n\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','

\r\nA supplementary show to Jeroens episode HPR2792 :: Playing around with text to speech synthesis on Linux.\r\n

\r\n

\r\nI found two addional options. The first is mimic\r\n

\r\n
\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
\r\n\r\n

\r\nAnd the second is gTTS which is a interface to the google TTS api.\r\n

\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','

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.

\r\n

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.

\r\n

First part to the puzzle is type class RandomGen:

\r\n
class RandomGen g where\r\n    next :: g -> (Int, g)\r\n    genRange :: g -> (Int, Int)\r\n    split :: g -> (g, g)
\r\n

next produces tuple, where first element is random Int and second element is new random generator. genRange returns tuple defining minimum and maximum values this generator will return. split produces tuple with two new random generators.

\r\n

Using RandomGen to produce random values of specific type or for specific range requires a bit of arithmetic. It’s easier to use Random that defines functions for that specific task:

\r\n
class Random a where\r\n    randomR :: RandomGen g => (a, a) -> g -> (a, g)\r\n    random :: RandomGen g => g -> (a, g)\r\n    randomRs :: RandomGen g => (a, a) -> g -> [a]\r\n    randoms :: RandomGen g => g -> [a]\r\n    randomRIO :: (a, a) -> IO a\r\n    randomIO :: IO a
\r\n\r\n

In short, RandomGen is source of randomness and Random is datatype specific way of generating random values using random generator RandomGen.

\r\n

Final part of the puzzle is where to get RandomGen? One could initialize one manually, but then it wouldn’t be random. However, there’s function getStdGen that will seed RandomGen using OS default random number generator, current time or some other method. Since it has signature of getStdGen :: IO StdGen, one can only call it in IO monad.

\r\n

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 RandomGen in effectful function and pass it to pure function.

\r\n

Example

\r\n
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 > length of list, all items of the list will be returned\r\ngetR :: RandomGen g => g -> Int -> [a] -> [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 <- getStdGen\r\n    return $ getR g 4 [1..10]
\r\n

In closing

\r\n

Pseudo randomness doesn’t require IO, only seeding the generator does. Simple computation that don’t require many calls to random are easy enough. If you need lots of random values, MonadRandom is better suited. It takes care of carrying implicit RandomGen along while your computation progresses.

\r\n

Best way to catch me nowadays is either email or fediverse where I’m Tuula@mastodon.social

\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.','

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.

\r\n

Links:

\r\n\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.','

I visited the vcfe.org event in Munich, Germany.

\r\n

Below you will find some urls for the projects that I came across.

\r\n\r\n

If you like these things, the next exhibition will be in September in Berlin (you can find more info on vcfb.de).

\r\n

Regards, Jeroen Baten

',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','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3086Mon2020-06-01HPR Community News for May 2020HPR Volunteers
3087Tue2020-06-02Phonetic alphabetklaatu
3088Wed2020-06-03Matchbox Restoration Part 2Tony Hughes AKA TonyH1212
3089Thu2020-06-04For my EntertainmentArcher72
3090Fri2020-06-05Locating Computer on a Enterprise Networkoperat0r
3091Mon2020-06-08fuguservZen_Floater2
3092Tue2020-06-09Pens, pencils, paper and ink - 2Dave Morriss
3093Wed2020-06-10Response to Linux Inlaws S01E06 (hpr 3079) on NeXTClaudio Miranda
3094Thu2020-06-11Holy crud! I have a kinesis advantage 2 keyboard!sigflup
3095Fri2020-06-12Intro to GIMPAhuka
3096Mon2020-06-15Unscripted ramblings on a walk: PC Building.Christopher M. Hobbs
3097Tue2020-06-16Linux Inlaws S01E07 The Big Blue Buttonmonochromec
3098Wed2020-06-17Matchbox Restoration Part 3Tony Hughes AKA TonyH1212
3099Thu2020-06-18Linux Inlaws S01E08 The review of the reviewmonochromec
3100Fri2020-06-19For your consideration - Makers CornerKen Fallon
3101Mon2020-06-22MetricsAndrew Conway
3102Tue2020-06-23RFC 5005 Part 2 – Webcomics, subscribers and feed readersclacke
3103Wed2020-06-24A warning about browser extensions and add-ons.Ken Fallon
3104Thu2020-06-25HPR AudioBook Club 19 - Tincture: An Apocalyptic PropositionHPR_AudioBookClub
3105Fri2020-06-26Akaso EK7000 ProAhuka
3106Mon2020-06-29Linux Inlaws S01E09 Postgresmonochromec
3107Tue2020-06-30Generating comfortable passwordscrvs
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 6 comments on\n5 previous shows:

\n\n

This month\'s shows

\n

There are 17 comments on 11 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-June/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Error feedback from show notes

\n

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.

\n

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.

\n

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.

\n

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.

\n

Making changes to shows after upload

\n

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:

\n
    \n
  1. There\'s a limit on how much text a comment can hold
  2. \n
  3. The comment form has a nasty habit of stripping backslashes, so code corrections can be messed up
  4. \n
  5. We don\'t put comments on the show\'s page on archive.org, so such corrections will not be seen by people reading the notes there
  6. \n
\n

The HPR admins would prefer changes to be sent in the form of emails to admin at hackerpublicradio.org. They will then be applied to the show notes and the archive.org version updated in step.

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nWindigo

\n

Over the period tags and/or summaries have been added to 10 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\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.','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3108Wed2020-07-01Fuguita as a DesktopZen_Floater2
3109Thu2020-07-02Matchbox Restoration Part 4Tony Hughes AKA TonyH1212
3110Fri2020-07-03Finding an Android phone to run LineageOSKen Fallon
3111Mon2020-07-06HPR Community News for June 2020HPR Volunteers
3112Tue2020-07-07finishing the frame on the long wheelbase recumbentBrian in Ohio
3113Wed2020-07-08OpenJDK 15 - Unsafe GarbageDaniel Persson
3114Thu2020-07-09Using the Akaso EK7000 ProAhuka
3115Fri2020-07-10Pest Controloperat0r
3116Mon2020-07-13Unscripted ramblings on a walk: Crisis at The ManorChristopher M. Hobbs
3117Tue2020-07-14The joy of retro computingknightwise
3118Wed2020-07-15Linux Inlaws S01E10 The Python Bumper Part 1monochromec
3119Thu2020-07-16Converting to FFS2Zen_Floater2
3120Fri2020-07-17How open are roleplaying games?Andrew Conway
3121Mon2020-07-20Opposing Views on TattoosWindigo
3122Tue2020-07-21Devuan review - and commentaryZen_Floater2
3123Wed2020-07-22Arduino controlled Christmas lightsArcher72
3124Thu2020-07-23Matchbox Restoration Part 5Tony Hughes AKA TonyH1212
3125Fri2020-07-24GIMP: The CanvasAhuka
3126Mon2020-07-27Metrics part IIAndrew Conway
3127Tue2020-07-28HPR AudioBook Club 20 - Quarter ShareHPR_AudioBookClub
3128Wed2020-07-29Linux Inlaws S01E11 The Python Bumper Part 2monochromec
3129Thu2020-07-30Followup on HPR3122Zen_Floater2
3130Fri2020-07-31More Quick Tipsoperat0r
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 5 comments on\n3 previous shows:

\n\n

This month\'s shows

\n

There are 28 comments on 12 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-July/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nWindigo, Daniel Persson

\n

Over the period tags and/or summaries have been added to 81 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\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.','

Knightwise, in HPR 2798, 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.

\r\n

Links:

\r\n',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','

Hacker Public Radio New Years Show episode 5

\r\n

Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019

\r\n\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','

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.

\r\n

Links:

\r\n',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?','

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.

\r\n

Links:

\r\n',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.','

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.

\r\n

Links

\r\n',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!','

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

\r\n

Links

\r\n',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','

Hacker Public Radio New Years Show episode 6

\r\n

Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019

\r\n',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.','

This is just a brief intro into my introduction to Linux.

\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','

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.

\r\n

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.

\r\n

Links

\r\n\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','

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.

\r\n

Well, someone took that matter into their own hands, and made NEMS. What is NEMS, how can it help us, and what infrastructure does it require? Those are a few of the questions I asked Robbie Ferguson, the maintainer of NEMS, who joined me on Easter week-end for a little chat.

\r\n

Links

\r\n\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 ! ','

parallax live desktops in android

\r\n\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','

Request for comments

\r\n

Hi All,

\r\n

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.\"

\r\n

This we got by accident because \"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.\"

\r\n

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.\"

\r\n

This violates the HPR upload policy.

\r\n

\"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.\"

\r\n

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.\"

\r\n

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.

\r\n

Under the current HPR rules I am allowed to reject this submission.

\r\n

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.

\r\n

Regards,

\r\n

Ken.

\r\n\r\n

The discussion thread remains open and is open to all by joining the Maillist.

',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.','

Unscripted ramblings about an upcoming CTF event.

\r\n

Hak5 items mentioned (hak5.org):

\r\n\r\n

Software mentioned:

\r\n\r\n

My info:

\r\n\r\n

Links

\r\n\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','

In this show an Interview with Joep Piscaer, recorded during the recent Loadays conference in Antwerpen, Belgium.

\r\n

Schedule of recent Loadays event: https://cfp.loadays.org/2019/schedule/

\r\n

I mention the \"Cut the crap podcast\", made by Ryan Caligiuri.

\r\n

And specifically episode 145 as an excellent example of his podcast quality:

\r\n

https://player.fm/series/the-cut-the-crap-show/ep-145-stronger-develop-the-resilience-you-need-to-succeed-with-dr-george-everly

\r\n

At the end of the podcast I a refer to the \"Follow your Gift\" talk, by Steve Harvey.

\r\n

You can find a recording of this talk on YouTube at https://www.youtube.com/watch?v=3x3rEg2qvcQ

\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.','

Desktop:

\r\n\r\n

Android

\r\n\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','

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.

',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','

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 performing research.

\r\n

Major parts

\r\n

Two major parts about vehicle designer are components and chassis.

\r\n

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 ComponentId and ComponentLevel. If you know these two values, you’ll be able to find out details of the component. ComponentId tells what component it is and ComponentLevel 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.

\r\n

Full definition of component is show below:

\r\n
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)
\r\n

Two particularly interesting fields are componentSlot and componentType. componentSlot has type of ComponentSlot 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. componentType has type of ComponentPower, which defines what component does in general. It could be sensor or provide supplies for the vehicle for example.

\r\n

Technology requirements are defined by function: componentRequirements :: ComponentId -> Maybe Technology. It defines which technology unlock a given component. Part of the definition is show below. Each and every ComponentId has to be handled.

\r\n
componentRequirements ShipLongRangeSensors = Just HighSensitivitySensors\r\ncomponentRequirements ShipBridge = Nothing\r\ncomponentRequirements VehicleWheeledMotiveSystem = Nothing\r\ncomponentRequirements VehicleHoverMotiveSystem = Just HoverCrafts\r\n...
\r\n

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. type with type of ChassisType 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.

\r\n
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
\r\n

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.

\r\n

This data is stored in required_component table and represented as RequiredComponent data. Both are generated from the definition show below:

\r\n
RequiredComponent json\r\n    chassisId ChassisId\r\n    componentType ComponentType\r\n    level ComponentLevel\r\n    amount ComponentAmount\r\n    deriving Show Read Eq
\r\n

Designing a vehicle

\r\n

With all that data, we can now design a vehicle. Process is roughly the following:

\r\n\r\n

Completed design is saved in two different tables. First one design holds info like name of the design, faction that design belongs to and used chassis. planned_component holds info about which components are planned to be installed and in what quantity.

\r\n
Design json\r\n    name Text\r\n    ownerId FactionId\r\n    chassisId ChassisId\r\n    deriving Show Read Eq
\r\n

and

\r\n
PlannedComponent json\r\n    designId DesignId\r\n    componentId ComponentId\r\n    level ComponentLevel\r\n    amount ComponentAmount\r\n    deriving Show Read Eq
\r\n

As a little teaser, below is an screenshot of what the vehicle designer currently looks like.

\r\n

\"Screenshot

\r\n

Finally

\r\n

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 Tuula@mastodon.social.

\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','

Hacker Public Radio New Years Show episode 7

\r\n

Welcome to the 7th Annual Hacker Public Radio New Years Show. 2018-2019

\r\n\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','

Hello HPR land, this is Tony Hughes again coming to you from Blackpool in the UK.

\r\n

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.

\r\n

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:

\r\n\r\n

Recently I have moved more to Dell laptops and the Dell E7440 is a great compromise of portability and usability with its 14" 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" screen.

\r\n

But all the others have their place in the bag, for demonstrating Linux Distros at events or at my LUG.

\r\n

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.

\r\n

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.

\r\n

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.

\r\n

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.

\r\n

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.

\r\n

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.

\r\n

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: All good things come to an end.

\r\n

Well that’s it for this episode, this is Tony Hughes signing off for Hacker Public Radio.

\r\n\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','

operat0r discusses his trials with earbuds and custom setups.

',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 ','

\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

',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','

Links

\r\n\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','

\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

',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','

Links

\r\n',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','

\r\nThis is a sample episode of the new Creative Commons tech podcast. It\'s brought to us by Moss and our own Tony Hughes. From the blurb:\r\n

\r\n\r\n\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\r\n\r\n

Links

\r\n',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','

In this episode I talk about my new 1969 Sony TC-222-A portable reel-to-reel tape recorder. I found it about 3 weeks ago at Hand-Up Thrift store 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.

\r\n\r\n

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 Open Goldberg Variations and Open Well-Tempered Clavier 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 sox command:

\r\n\r\n
\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
\r\n\r\n

It worked! Well. The script and sox 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.\")

\r\n\r\n

Photo Album (click image)

\r\n\r\n

\"Sony

\r\n\r\n

Links

\r\n\r\n',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','

For more information about the game and history behind it, have a look at the following links:

\r\n\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 ','

Some general basic knowledge of fire fighting. Also an invitation to ask questions in the comments.

',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','

Podcast episode is about two things, serializing custom data with Persistent and IsString typeclass.

\r\n

I’m using Persistent in conjunction with Yesod (web framework). Process in short is that data is defined in /config/models 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.

\r\n

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.

\r\n

For example, following piece defines enumeration BuildingType that is mapped in varchar field in database. Enumeration is thus stored as text.

\r\n
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 "BuildingType"
\r\n

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.

\r\n

Our example is for StarDate, which is just glorified Int. I’m using newtype to make StarDate distinct from any other Int, even when it behaves just like Int.

\r\n
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 "Failed to deserialize"\r\n\r\n\r\ninstance PersistFieldSql StarDate where\r\n    sqlType _ = SqlInt64
\r\n

One more trick, that doesn’t directly relate to Persistent is IsString type class. Instead of having to specify all the time what type text literal is, one can let compiler to deduce it from usage.

\r\n

For example, if I had a newtype like:

\r\n
newtype PlanetName = PlanetName { unPlanetName :: Text }
\r\n

I can turn on OverloadedStrings pragma and create IsString instance:

\r\n
instance IsString PlanetName where\r\n    fromString = PlanetName . fromString
\r\n

Now I can write: placeName = "Earth" instead of placeName = PlanetName "Earth" and compiler can deduce correct type based on how the placeName is used.

\r\n

Thanks for listening, if you have any questions or comments, you can reach me via email or in the fediverse, where I’m Tuula@mastodon.social.

\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','

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.

\r\n

Links

\r\n\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','

Introduction

\r\n

This is the sixteenth and final episode of the \'Learning Awk\' series which is being produced by b-yeezi (BY) and Dave Morriss (DM).

\r\n

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.

\r\n

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.

\r\n

Topics Discussed

\r\n\r\n\r\n\r\n\r\n\r\n\r\n

Links

\r\n\r\n\r\n\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','',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','

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.

\r\n

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.

\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.','

In this final episode of \"Random Elements of Storytelling\", Lostnbronx looks at the question of art vs. commerce.

\r\n

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?

\r\n

Lostnbronx wanders over hill and dale, and likely fails to adequately explain anything at all.

\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.','

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. https://www.zwilnik.com/?page_id=1025

\r\n

Links:

\r\n\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.','

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. https://www.zwilnik.com/?page_id=1027

\r\n

Links:

\r\n\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.','

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. https://www.zwilnik.com/?page_id=1030

\r\n

Links:

\r\n\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.','

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. https://www.zwilnik.com/?page_id=1032

\r\n

Links:

\r\n\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.','

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. https://www.zwilnik.com/?page_id=1034

\r\n

Links:

\r\n\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.','

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.

\r\n

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.

\r\n

Modern computers do not have those same resource constraints yet we are still developing applications using the principles that applied 3 decades ago.

\r\n

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++)

\r\n

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?

\r\n

…And may a move to new (or is it old) architectures deliver a big win for open source software?

\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','

\r\nThe first method is in Awk itself.\r\n

\r\n\r\n
\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
\r\n\r\n

\r\nThe disadvantage to this is that it only provides a help message if no option is provided. If you actually type --help, then you get Awk\'s help message, which is not useful in this context.\r\n

\r\n\r\n

\r\nThe shell script wrapper method uses the shell to parse options, which are then passed to an embedded Awk script:\r\n

\r\n\r\n
\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
\r\n

\r\n\r\n

\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

\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','

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.

\r\n

We’re also going to avoid going deep into forks, fungibility, mining or the math of Bitcoin.

\r\n

In this episode we introduce these fundamental Bitcoin topics:

\r\n\r\n

I hope this is accessible and informative and look forward to doing more in the future.

',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','

For more information, have a look at BoardGameGeek: https://boardgamegeek.com/boardgame/71721/space-hulk-death-angel-card-game

\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','

Background

\r\n

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.

\r\n

Equality

\r\n

In Haskell there’s no default equality, it has to be defined.

\r\n

There’s two parts to the puzzle. First is type class Eq that comes with the standard library and defines function signatures for equality and non-equality comparisons. There’s type parameter a in the definition, which is filled by user when they define instance of Eq for their data. In that instance definition, a is filled with concrete type.

\r\n
class  Eq a where\r\n  (==) :: a -> a -> Bool\r\n  (/=) :: a -> a -> Bool\r\n\r\n  x /= y = not (x == y)
\r\n

Definition above can be read as “class Eq a that has two functions with following signatures and implementations”. In other words, given two a, this function determines are they equal or not (thus Bool as return type). /= is defined in terms of ==, 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).

\r\n

If we define our own Size type, like below, we can compare sizes:

\r\n
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
\r\n

And here’s couple example comparisons.

\r\n
> Small == Small\r\nTrue\r\n> Large /= Large\r\nFalse
\r\n

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 deriving (Show, Read, Eq).

\r\n
data Size = Small | Medium | Large\r\n    deriving (Show, Read, Eq)
\r\n

Hierarchy between type classes

\r\n

There can be hierarchy between type classes, meaning one requires presence of another. Common example is Ord, which is used to order data.

\r\n
class Eq a => Ord a where\r\n    compare :: a -> a -> Ordering\r\n    (<) :: a -> a -> Bool\r\n    (>=) :: a -> a -> Bool\r\n    (>) :: a -> a -> Bool\r\n    (<=) :: a -> a -> Bool\r\n    max :: a -> a -> a\r\n    min :: a -> a -> a
\r\n

This definition can be read as “class Ord a, where a has instance of Eq, with pile of functions as follows”. Ord has default implementation for quite many of these, in terms of others, so it’s enough to implement either compare or <=.

\r\n

For our Size, instance of Ord could be defined as:

\r\n
instance Ord Size where\r\n    Small <= _ = True\r\n    Medium <= Small = False\r\n    Medium <= _ = True\r\n    Large <= Large = True\r\n    Large <= _ = False
\r\n

Writing generic code

\r\n

There’s lots and lots of type classes in standard library:

\r\n\r\n

Type classes allow you to write really generic code. Following is contrived example using Ord and Show:

\r\n
check :: (Ord a, Show a) => a -> a -> String\r\ncheck a b =\r\n    case compare a b of\r\n        LT ->\r\n            show a ++ " is smaller than " ++ show b\r\n        GT ->\r\n            show a ++ " is greater than " ++ show b\r\n        EQ ->\r\n            show a ++ " and " ++ show b ++ " are equal"
\r\n

Check takes two parameters that are same type and that type has to have Ord and Show instances. Ord is for ordering and Show 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: Size, Int and [Int].

\r\n
> check Medium Small\r\n"Medium is greater than Small"\r\n> check Small Large\r\n"Small is smaller than Large"\r\n> check 7 3\r\n"7 is greater than 3"\r\n> check [1, 2] [1, 1, 1]\r\n"[1, 2] is greater than [1, 1, 1]"
\r\n

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.

\r\n

In closing

\r\n

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 Tuula@mastodon.social.

\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','

For more information, have a look at https://boardgamegeek.com/boardgame/2593/pass-pigs

\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','

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.

\r\n

Links:

\r\n\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','

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.

\r\n

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.

\r\n

There’s plenty of data about people, spread over several entities and database tables. Main one is Person, which stores name, gender, sex, date of birth and some stats (and then some more).

\r\n

There are lots of various ways of naming people and I chose to model three for the starters:

\r\n
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)
\r\n

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.

\r\n

Sex and gender I’m modeling with simple system of two enumerations, sex can be Female, Male or Intersex, while gender has values Man, Woman, Agender and Nonbinary. System is coarse, but should be enough to get started with the game. Later on, this can be expanded to more nuanced system.

\r\n

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.

\r\n

Relations are modeled as PersonRelation and thus stored in person_relation table:

\r\n
Relation json\r\n    originatorId PersonId\r\n    targetId PersonId\r\n    type RelationType\r\n    visibility RelationVisibility\r\n    deriving Show Read Eq
\r\n

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 RelationVisibility, 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.

\r\n

Intel is modeled as HumanIntelligence and stored in human_intelligence table:

\r\n
HumanIntelligence json\r\n    personId PersonId\r\n    ownerId PersonId\r\n    level PersonIntel\r\n    deriving Show Read Eq
\r\n

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.

\r\n

Different types of intels are listed as PersonIntel:

\r\n
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)
\r\n

Person related data is sent back to client in PersonReport record (I’m not copying it here as it’s relatively large). We can have a look on how one field is processed.

\r\n

For example, in case of traits. PersonReport has field personReportTraits :: !(Maybe [TraitReport]). 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.

\r\n

Report creating (high level):

\r\n
personReportTraits = if Traits `elem` targetIntel\r\n                        then Just $ traitReport <$> targetTraits\r\n                        else Nothing
\r\n

That first checks that Traits 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.

\r\n

Comments, questions and feedback are welcome. Best way to catch me nowadays is email or fediverse where I’m Tuula@mastodon.social.

\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','

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.

\r\n\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','\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','

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.

\r\n

First example is a function that takes a Bool and returns a respective String:

\r\n
boolToString :: Bool -> String\r\nboolToString n =\r\n    if n\r\n        then "True"\r\n        else "False"
\r\n

Nothing too fancy, just an if expression inside a function. We can move that if out of there though and define exactly same functionality, but with patterns:

\r\n
boolToString :: Bool -> String\r\nboolToString True =\r\n    "True"\r\n\r\nboolToString False =\r\n    "False"
\r\n

There’s one definition for boolToString, but two different patterns used.

\r\n

Second example is bit more complex, this time we have Maybe Int that is being turned into String. Maybe has two value constructors Nothing and Just a. We have two cases for Just, specific one for when it’s Just 1 and more general one Just n that takes care of rest of the cases.

\r\n
isBig :: Maybe Int -> String\r\nisBig Nothing =\r\n    "Not at all"\r\n\r\nisBig (Just 1) =\r\n    "Just perfect"\r\n\r\nisBig (Just n) =\r\n    if n < 10\r\n        then "Just slightly"\r\n        else "Definitely is"
\r\n

Some example usage:

\r\n
> isBig Nothing\r\n"Not at all"\r\n> isBig $ Just 0\r\n"Just perfect"\r\n> isBig $ Just 50\r\n"Definitely is"
\r\n

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:

\r\n
data Customer = Customer\r\n    { customerName :: String\r\n    , customerDiscountPct :: Double\r\n    , vipCustomer :: Bool\r\n    }\r\n\r\ntotalFee :: Double -> Customer -> 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
\r\n

There’s two cases of totalFee function. First one is for when passed in Customer has vipCustomer field True. Second one takes care of general case. In the first case we’re using @ to bind Customer as a whole to cust name.

\r\n

Lists can be matched too. The basic idea is exactly the same:

\r\n\r\n

Underscore _ 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.

\r\n

Next example is recursively counting amount if items in a list using pattern matching:

\r\n
count :: [a] -> Int\r\ncount [] =\r\n    0\r\n\r\ncount (x:xs) =\r\n    1 + count xs
\r\n

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…

\r\n

To calculate number in series, we can write following code (this is extremely slow way of calculating them by the way):

\r\n
fibonacci :: Int -> 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)
\r\n

Last trick in our sleeve for now is case 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:

\r\n
fibonacci :: Int -> Int\r\nfibonacci n =\r\n    case n of\r\n        0 ->\r\n            0\r\n\r\n        1 ->\r\n            1\r\n\r\n        n ->\r\n            fibonacci (n - 1) + fibonacci (n - 2)
\r\n

Questions, comments and feedback are welcome. Best way to catch me nowadays is either email or in fediverse where I’m Tuula@mastodon.social

\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','\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','

In this episode I give some shoe lace tips

\r\n\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.','

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.

\r\n\r\n

\"G.E.

\r\n\r\n

Links to Stuff Mentioned in the Episode

\r\n\r\n\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','

Drawings

\r\n

https://sites.google.com/site/recycledrecumbents/ez-clone-drawings

\r\n

Pictures

\r\n

\"picture01-one-of-the-donors.jpg\"
\r\nOne of the donors

\r\n

\"picture02-dross.jpg\"
\r\nDross

\r\n

\"picture03-the-gold.jpg\"
\r\nThe gold

\r\n

\"picture04-first-cut.jpg\"
\r\nFirst cut

\r\n

\"picture05-cutting-tubes.jpg\"
\r\nCutting tubes

\r\n

\"picture06-workmate.jpg\"
\r\nWorkmate

\r\n

\"picture07-frame2-parts.jpg\"
\r\nFrame 2 parts

\r\n

\"picture08-frame1-parts.jpg\"
\r\nFrame 1 parts

\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.','

This recipe has been heavily adapted from one I received from Hello Fresh - credit where credit\'s due!

\r\n

Ingredients:

\r\n\r\n
    \r\n
  1. 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.
  2. \r\n
  3. Preheat oven to 500 F
  4. \r\n
  5. 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.
  6. \r\n
  7. 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.
  8. \r\n
  9. 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.
  10. \r\n
  11. 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.
  12. \r\n
  13. Drain excess liquid from the zucchini and sausage.
  14. \r\n
  15. Mix sausage & zucchini into orzo mixture, with 1 tbsp of butter. Season with salt & pepper, if you want.
  16. \r\n
  17. 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" works for me.
  18. \r\n
  19. Cover the mixture in mozzarella cheese and panko breadcrumbs - in that order!
  20. \r\n
  21. Place dish in the oven for 2-3 minutes, until the breadcrumbs are toasted.
  22. \r\n
\r\n

Note: If these metric measurements seem crazy, they probably are.

\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','

Overview

\r\n

I use pdmenu a lot to help me do work on my main desktop PC. I did an HPR show on pdmenu on 13 December 2017 and the author Joey Hess responded in show 2459.

\r\n

In the intervening time I have also integrated Zenity into my menus. This is a GUI tool which generates a number of different pop-up windows known as dialogs, which can display information, or into which information can be typed. The capabilities provided by pdmenu are a little too basic to enable me to do what I need to do.

\r\n

I thought it might be of interest to show some examples of how I use this tool with pdmenu.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n',225,42,1,'CC-BY-SA','zenity,Bash scripting,pdmenu,GTK+',0,0,1), (2879,'2019-08-15','Describing how I listen to podcasts PART 1',1877,'This episode badly covers the console audio player moc.','

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 moc.

\r\n\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','

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!

\r\n\r\n

\"TSACAM

\r\n\r\n

Links to info about stuff I mentioned

\r\n\r\n\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','

\r\nIn this show Ken, recalls hpr1771 :: Audacity: Label Tracks by Jon Kulp to add Labels to an large audio file.\r\n

\r\n\r\n',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','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Cedric De Vroey.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3131Mon2020-08-03HPR Community News for July 2020HPR Volunteers
3132Tue2020-08-04Keeping track of where I amMrX
3133Wed2020-08-05Quick tip - Using MPV with Youtube linksArcher72
3134Thu2020-08-06Tomorrowland 2020Daniel Persson
3135Fri2020-08-07Quick Tips for May 20 20operat0r
3136Mon2020-08-10Matchbox Restoration Part 6Tony Hughes AKA TonyH1212
3137Tue2020-08-11Coronavirus Update 2020-07-30Ahuka
3138Wed2020-08-12Linux Inlaws S01E12: Reminiscing in FLOSS Weeklymonochromec
3139Thu2020-08-13MIDI Sysexklaatu
3140Fri2020-08-14GIMP: Selection ToolsAhuka
3141Mon2020-08-17Lessons learnt from Magic the Gathering game designklaatu
3142Tue2020-08-18tcshklaatu
3143Wed2020-08-19LibreOffice 7.0 Released!Ahuka
3144Thu2020-08-20Pentesting: Insecure Object ReferenceCedric De Vroey
3145Fri2020-08-21A light bulb moment, part 1MrX
3146Mon2020-08-24Help Me Help you with HPR eps!operat0r
3147Tue2020-08-25NIST\'s Quantum Cryptography UpdateAhuka
3148Wed2020-08-26Why Open Source matters (to me)Paul Quirk
3149Thu2020-08-27HPR AudioBook Club 21 - The Terrible Business of Salmon and DuskHPR_AudioBookClub
3150Fri2020-08-28GIMP: Paint ToolsAhuka
3151Mon2020-08-31How I listen to podcastsDaniel Persson
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 2 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 21 comments on 8 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-August/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nWindigo, Dave Morriss

\n

Over the period tags and/or summaries have been added to 12 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\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','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3152Tue2020-09-01My Pocket KnivesDave Morriss
3153Wed2020-09-02Fixing eBooks with Calibre and pdfcropKen Fallon
3154Thu2020-09-03Make NextCloud your next cloudPaul Quirk
3155Fri2020-09-04LastPass Security DashboardAhuka
3156Mon2020-09-07HPR Community News for August 2020HPR Volunteers
3157Tue2020-09-08Compostklaatu
3158Wed2020-09-09Fingerprint access control? LOL... Cedric De Vroey
3159Thu2020-09-10Vivaldi - The Four SeasonsPaul Quirk
3160Fri2020-09-11GIMP: Transform ToolsAhuka
3161Mon2020-09-14How I manage podcast listeningDave Morriss
3162Tue2020-09-15Introduction to Ansibleklaatu
3163Wed2020-09-16Linux Inlaws S01E13: The road to communism and freedommonochromec
3164Thu2020-09-17I\'m Learning SpanishAhuka
3165Fri2020-09-18Spanish Tools ContinuedAhuka
3166Mon2020-09-21Using Ansible to mirror a Git repoklaatu
3167Tue2020-09-22A ramble with the Pentland Squires (part 1)Dave Morriss
3168Wed2020-09-23FreeBSD Jails and iocagenorrist
3169Thu2020-09-24Ludwig van Beethoven with a hint of ChopinPaul Quirk
3170Fri2020-09-25GIMP: Color ToolsAhuka
3171Mon2020-09-28A Week On Soylentlostnbronx
3172Tue2020-09-29A ramble with the Pentland Squires (part 2)Dave Morriss
3173Wed2020-09-30Manage your Raspberry Pi fleet with AnsibleKen Fallon
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 2 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 13 comments on 6 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-September/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nWindigo

\n

Over the period tags and/or summaries have been added to 7 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\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.','

Short Summary

\r\n

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.

\r\n\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','

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.

\r\n

Intro

\r\n

One person’s opinion of another is expressed as OpinionScore that ranges from -100 to 100.

\r\n

Computing the score is based on intelligence player has available to them. Internally we have ReportResult that tracks score, reasons for the score and confidence level about the results. It’s defined as:

\r\n
data ReportResult =\r\n    FeelingLevel OpinionScore\r\n    | ReasonsLevel OpinionScore [OpinionReason]\r\n    | DetailedLevel OpinionScore [OpinionReason]\r\n    deriving (Show, Read, Eq)
\r\n

We’re going to be adding up these results quite a bit, so we define SemiGroup and Monoid 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:

\r\n
instance Semigroup ReportResult where\r\n    (FeelingLevel s1) <> (FeelingLevel s2) = FeelingLevel (s1 <> s2)\r\n    (FeelingLevel s1) <> (ReasonsLevel s2 _) = FeelingLevel (s1 <> s2)\r\n    (FeelingLevel s1) <> (DetailedLevel s2 _) = FeelingLevel (s1 <> s2)\r\n    (ReasonsLevel s1 _) <> (FeelingLevel s2) = FeelingLevel (s1 <> s2)\r\n    (ReasonsLevel s1 r1) <> (ReasonsLevel s2 r2) = ReasonsLevel (s1 <> s2) (r1 <> r2)\r\n    (ReasonsLevel s1 r1) <> (DetailedLevel s2 r2) = ReasonsLevel (s1 <> s2) (r1 <> r2)\r\n    (DetailedLevel s1 _) <> (FeelingLevel s2) = FeelingLevel (s1 <> s2)\r\n    (DetailedLevel s1 r1) <> (ReasonsLevel s2 r2) = ReasonsLevel (s1 <> s2) (r1 <> r2)\r\n    (DetailedLevel s1 r1) <> (DetailedLevel s2 r2) = DetailedLevel (s1 <> s2) (r1 <> r2)\r\n\r\n\r\ninstance Monoid ReportResult where\r\n    mempty = DetailedLevel mempty mempty
\r\n

Opinion based on traits

\r\n

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 traitPairOpinion function, which definition I’m omitting as it’s rather long and not too interesting. It’s signature is: traitPairOpinion :: TraitType -> TraitType -> Maybe (OpinionScore, OpinionReason). So, given two traits, tells how that pair affects to opinion and reasoning for it.

\r\n

In order to have nicer format for out data, we introduce a helper function:

\r\n
traitPairScore :: TraitType -> TraitType -> (OpinionScore, [OpinionReason])\r\ntraitPairScore a b =\r\n    case traitPairOpinion a b of\r\n            Nothing ->\r\n                mempty\r\n\r\n            Just (s, r) ->\r\n                (s, [r])
\r\n

This is because (OpinionScore, OpinionReason) isn’t monoid, but (OpinionScore, [OpinionReason]) is, which means we can combine them with <>.

\r\n

Actual score calculation based on traits, we do it like this:

\r\n
traitScore :: [TraitType] -> [PersonIntel] -> [TraitType] -> [PersonIntel] -> ReportResult\r\ntraitScore originatorTraits originatorIntel targetTraits targetIntel =\r\n    if (Traits `elem` originatorIntel) && (Traits `elem` targetIntel)\r\n        then DetailedLevel score reasons\r\n        else FeelingLevel score\r\n    where\r\n        (score, reasons) = mconcat $ traitPairScore <$> originatorTraits <*> targetTraits
\r\n

The interesting part is mconcat $ traitPairScore <$> originatorTraits <*> targetTraits. Function traitPairScore expects two TraitType values as parameters, but we’re calling it with two lists of such values. First step is to use <$> and list of values, which produces a list of partially applied functions. Second step is to use <*> to call each and every of those functions with values from second list. Result is a list of results that were obtained by calling traitPairScore with every combination of elements from two lists. Final step is to take this list of ReportResult values and combine them to single result with mconcat.

\r\n

Finally, based on available intel, ReportResult of correct level is created.

\r\n

Opinion based on relations

\r\n

Score based on relations is similar, but a bit convoluted (or rather, a lot more).

\r\n

Intel here has two dimensions. One of them is relationship visibility (is it public, family relation or secret relation), another is level of detail: BaseOpinionIntel, ReasonsForOpinions and DetailedOpinions.

\r\n

relationScore is the entry point for calculation:

\r\n
relationScore :: [PersonIntel] -> [Relation] -> ReportResult\r\nrelationScore intel relations =\r\n    mconcat $ (relReport oIntel score) <$> visibilities\r\n    where\r\n        score = mconcat $ (relationTypeScore . relationType) <$> relations\r\n        visibilities = mkUniq $ relationVisibility <$> relations\r\n        oIntel = mkUniq $ mapMaybe (\\case\r\n                                        Opinions x ->\r\n                                            Just x\r\n\r\n                                        _ ->\r\n                                            Nothing)\r\n                                   intel
\r\n

Code has to take into account of what level of intel we have about opinions and on what detail: oIntel. On the other hand, visibilities is unique relation visibilities that exists in relations in this particular case and score is computed based on relations.

\r\n

Function relReport creates final report. It takes into account on what level of intel we have, by doing: matching = safeHead $ reverse $ sort $ filter (\\x -> opinionIntelVisibility x == visibility) intel. This finds highest level intel we have about this particular relationship visibility. Based on the highest level of available intel ReportResult is created with correct confidence level. Ie. if there’s no specific intel, we get FeelingLevel report. If there’s intel about why particular person has certain opinion, we get ReasonsLevel report. Whole definition of function is below:

\r\n
relReport :: [OpinionIntel]\r\n    -> (OpinionScore, [OpinionReason])\r\n    -> RelationVisibility\r\n    -> ReportResult\r\nrelReport intel (score, reasons) visibility =\r\n    case matching of\r\n        Nothing ->\r\n            FeelingLevel score\r\n\r\n        Just (BaseOpinionIntel _) ->\r\n            FeelingLevel score\r\n\r\n        Just (ReasonsForOpinions _) ->\r\n            ReasonsLevel score reasons\r\n\r\n        Just (DetailedOpinions _) ->\r\n            DetailedLevel score reasons\r\n    where\r\n        matching = safeHead $ reverse $ sort $ filter (\\x -> opinionIntelVisibility x == visibility) intel
\r\n

Opinion report

\r\n

To pull all this together, we combine results of these two functions. Based on given information, it’ll compute traitsRep and relationsRep. These two are combined with <> as explained earlier in episode:

\r\n\r\n
opinionReport :: [TraitType]\r\n    -> [PersonIntel]\r\n    -> [TraitType]\r\n    -> [PersonIntel]\r\n    -> [Relation]\r\n    -> OpinionReport\r\nopinionReport originatorTraits originatorIntel targetTraits targetIntel targetRelations =\r\n    reportResultToOpinionResult $ traitsRep <> relationsRep\r\n    where\r\n        traitsRep = traitScore originatorTraits originatorIntel targetTraits targetIntel\r\n        relationsRep = relationScore originatorIntel targetRelations
\r\n

Finally ReportResult is transformed to OpinionReport, which can be sent to client.

\r\n

OpinionReport has three levels:

\r\n\r\n
data OpinionReport =\r\n    BaseOpinionReport OpinionFeeling\r\n    | OpinionReasonReport OpinionFeeling [OpinionReason]\r\n    | DetailedOpinionReport OpinionScore [OpinionReason]\r\n    deriving (Show, Read, Eq)
\r\n

Actual transformation is shown here:

\r\n
reportResultToOpinionResult :: ReportResult -> 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
\r\n

Note about incorrectness

\r\n

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.

\r\n

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.

\r\n

In closing

\r\n

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 Tuula@mastodon.social.

\r\n

ad astra!

\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','

What is persistent memory?

\r\n

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.

\r\n

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.

\r\n

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.

\r\n

Persistent Memory Benefits

\r\n

Persistent memory in the data center allows applications to run without incurring the latency penalty of going out to storage.

\r\n

The main advantages of persistent memory include:

\r\n\r\n
    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    /
\r\n

Persistent Memory Vs. NVRAM

\r\n

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.

\r\n

PMEM or NVDIMM-N can also be backed up by battery. It resides only on the memory bus.

\r\n

Where PMEM is going

\r\n

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.

\r\n

Drawbacks of PMEM

\r\n\r\n

Reference Notes

\r\n\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','

Background

\r\n\r\n

Installing

\r\n\r\n
    $ 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
\r\n\r\n
    $ make uninstall\r\n
\r\n\r\n

Documentation

\r\n\r\n
    $ man onics\r\n
\r\n

XPKT Format

\r\n\r\n

First Programs

\r\n\r\n
    $ sudo tcpdump -i eth0 -c 5 -w file1.pcap\r\n
\r\n\r\n
    $ sudo pktin eth0 > file2.xpkt\r\n
\r\n\r\n
    $ sudo chown myname file1.pcap file2.xpkt\r\n
\r\n\r\n
    $ tcpdump -r file1.pcap\r\n    $ xpktdump file2.xpkt\r\n
\r\n\r\n
    $ pc2xpkt file1.pcap file1.xpkt\r\n      or\r\n    $ pc2xpkt file1.pcap > file1.xpkt\r\n      or\r\n    $ pc2xpkt < file1.pcap > file1.xpkt\r\n      or\r\n    $ cat file1.pcap | pc2xpkt > file1.xpkt\r\n
\r\n\r\n
    $ xpktdump file1.xpkt\r\n
\r\n

Something we can\'t do w/ tcpdump

\r\n\r\n
    $ cat file1.xpkt file2.xpkt > merged.xpkt\r\n    $ xpktdump merged.xpkt\r\n
\r\n\r\n
    $ cat file1.xpkt file2.xpkt | xpktdump\r\n
\r\n

Convert back to pcap:

\r\n\r\n
    $ xpkt2pc file2.xpkt file2.pcap\r\n      or\r\n    $ xpkt2pc < file2.xpkt > file2.pcap\r\n      or\r\n    $ xpkt2pc file2.xpkt > file2.pcap\r\n      or\r\n    $ cat file2.xpkt | xpkt2pc > file2.pcap\r\n
\r\n\r\n
    $ tcpdump -r file2.pcap\r\n
\r\n\r\n
    $ xpkt2pc file2.xpkt | tcpdump -r -\r\n
\r\n\r\n
    $ cat file1.xpkt file2.xpkt | xpkt2pc | tcpdump -r | less\r\n
\r\n

Sending packets:

\r\n
    $ sudo tcpdump -i eth0  # in one terminal\r\n    $ sudo pktout -i eth0 file1.xpkt\r\n      or\r\n    $ sudo pktout -i eth0 < file1.xpkt\r\n      or\r\n    $ cat file1.xpkt | sudo pktout -i eth0\r\n
\r\n

Summary

\r\n\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.','

\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

\r\n

\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

\r\n

\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

\r\n

\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n

\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.','

\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

\r\n

\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

\r\n

\r\nIn this part, we continue to go over the rules of the game, and discuss them in some detail.\r\n

\r\n

\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n

',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.','

\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

\r\n

\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

\r\n

\r\nIn this part, we continue to go over the rules of the game, and then start into the adventure!\r\n

\r\n

\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n

',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.','

\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

\r\n

\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

\r\n

\r\nIn this part, the characters have a job prospect...but is it legitimate, or are they being conned?\r\n

\r\n

\r\nSpecial thanks to my playtesters: Klaatu, Thaj, Mark (who was playing Brinn), and Brian!\r\n

',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.','

\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

\r\n

\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

\r\n

\r\nIn this part, the characters take on a contract to deal with some...hippies?\r\n

\r\n

\r\nSpecial thanks to my playtesters: Klaatu, Thaj, and Mark (who was playing Brinn)\r\n

',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.','

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.

\r\n

Counting Packets

\r\n\r\n
   $ mkdir /tmp/packets\r\n   $ cd /tmp/packets\r\n   $ cp /path/to/onics/tests/data/packets/sample.xpkt .\r\n
\r\n\r\n
   $ pcount sample.xpkt\r\n\r\n   90 total packets and 19082 total bytes.\r\n
\r\n\r\n

Scanning Packet Flows

\r\n\r\n
   $ nftrk -dt sample.xpkt | grep END\r\n
\r\n

and get:

\r\n
   |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
\r\n\r\n
   $ nftrk -dt sample.xpkt | grep START | wc -l\r\n
\r\n

and that tells us that there are 10 flows in the trace.

\r\n

Basic Filtering

\r\n\r\n
   $ 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
\r\n\r\n
   $ pflt tcp sample.xpkt |\r\n     pcount -p |\r\n     nftrk -t 2>/tmp/flows > tcponly.xpkt &&\r\n     echo -n "Number of flows " &&\r\n     grep END /tmp/flows | wc -l &&\r\n     rm -f /tmp/flows\r\n
\r\n\r\n
   $ 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
\r\n

Shows that the server ports are 22 and 80 for the two connections. That\'s SSH and HTTP.

\r\n\r\n
   $ man onics_proto\r\n
\r\n

Extracting Ranges of Packets

\r\n\r\n
   $ pxtr 3,6 sample.xpkt pkts-3-to-6.xpkt\r\n
\r\n\r\n
   $ pxtr "7,{tcp}" sample.xpkt | xpktdump\r\n
\r\n\r\n
   $ pxtr 1,4 sample.xpkt > not-5-to-10.xpkt\r\n   $ pxtr 11,NONE sample.xpkt >> not-5-to-10.xpkt\r\n
\r\n\r\n

Differences Between Traces

\r\n\r\n
   $ pdiff sample.xpkt not-5-to-10.xpkt | less\r\n
\r\n\r\n
   $ pdiff -v not-5-to-10.xpkt sample.xpkt | less\r\n
\r\n

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.

\r\n

Conclusion

\r\n\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','

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.

\r\n\r\n

See the Flickr photo album that accompanies this show by clicking the image below.

\r\n\r\n

\"Dan

\r\n\r\n

Links

\r\n\r\n\r\n\r\n

Credits

\r\n\r\n',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','

Continued general basic knowledge of fire fighting.
\r\nAlso an extended invitation to ask questions in the comments.
\r\nps: I started making podcasts one year ago! o/

',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','

Hi to all you out there in HPR land, this is a quick show to help out with the current summer shortage of shows.

\r\n

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.

\r\n

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.

\r\n

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.
\r\nMy full review is on the Distrohoppers Blog as is a link to the Audio of the show.

\r\n

That’s it for this time, this is Tony Hughes saying goodbye until next time.

\r\n

https://distrohoppersdigest.blogspot.com/

\r\n

https://endeavouros.com/

\r\n

https://www.archlinux.org/

\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.','

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.

\r\n

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.

\r\n

In this part, the characters fly out to the derelict (though hardly empty) spaceship, and find a way to sneak aboard.

\r\n

Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!

\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.','

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.

\r\n

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.

\r\n

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!

\r\n

Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!

\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.','

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.

\r\n

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.

\r\n

In this part, the characters reevaluate their life choices, and decide that negotiation is the better part of valor!

\r\n

Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!

\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1), (2927,'2019-10-22','Stardrifter RPG Playtest Part 09',1584,'Lostnbronx and friends playtest a new, original RPG system.','

This episode is Part 9 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.

\r\n

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.

\r\n

In this part, the characters agree to join someone else’s treasure hunt, with the success (or failure) of their own mission in the balance!

\r\n

Special thanks to my playtesters: Thaj, Mark (who was playing Brinn), and X1101!

\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1), (2893,'2019-09-04','Whats in the box! Part 2',727,'NYbill finishes a guitar pedal kit Timttmy sent him. ','

In this short follow up episode NYbill troubleshoots the Tremlo guitar kit Timttmy sent him.

\r\n

Here is a hint, there were two problems, not just one.

\r\n

Pics for the episode:

\r\n

https://media.gunmonkeynet.net/u/nybill/collection/whats-in-the-box-part-2/

\r\n',235,103,0,'CC-BY-SA','guitar, pedal, tremlo, kit, DIY, soldering',0,0,1), (2932,'2019-10-29','Stardrifter RPG Playtest Part 10',3255,'Lostnbronx and friends playtest a new, original RPG system.','

This episode is Part 10 of the Stardrifter role-playing game playtest. The series is composed of two playtest sessions, held earlier this year. They were recorded and chopped into manageable bites, then edited down into separate episodes.

\r\n

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.

\r\n

It’s not unusual for a game master to have two sets of maps for an adventure: one is for the players, which only has the sort of information on it that their characters might reasonably have access to; the other is NOT for the players, as it shows all the special information they shouldn’t know about (at least, not all at once). This is where you’d make note of secret doors, hidden objects or enemies, and/or, as in the case of this playtest, the physical condition of the ship as it stands at the moment.

\r\n

\"Player
\r\nPlayer Map

\r\n

\"Game
\r\nGame Master Map

\r\n

Additionally, here’s a zip file containing the adventure, the maps, the floor plan descriptions, some miscellaneous non-player characters, and the Stardrifter RPG rules in EPUB format. Again, these are no longer the LATEST version of the rules, but they are what we used for these episodes.

\r\n

Stardrifter-RPG-Playtest_Squatters-Rights.zip

\r\n

In this final part of the mini-series, the players provide their hard-working game designer with some valuable feedback, observations, and general opinions!

\r\n

Special thanks to my playtesters in this episode: Thaj, Mark (who was playing Brinn), and X1101!

\r\n',107,95,1,'CC-0','rpg, gaming, stardrifter, game construction, playtest',0,0,1), (2896,'2019-09-09','Orange PI Zero LTS version',737,'A general overview of the Orange PI Zero LTS','\r\n',129,0,0,'CC-BY-SA','Raspberry PI, OrangePI, Armbian, Hobby Computing, VNC',0,0,1), (2901,'2019-09-16','Describing how I listen to podcasts PART 3',835,'In this episode I cover the 1st add-on board I purchased for one of my raspberry pi\'s','

In this series I cover how I listen to podcasts and how the process has changed over the years. In this episode I cover the 1st add-on board I purchased for one of my raspberry pi’s I then go on to explain what I do with it.

\r\n\r\n
    sudo apt-get install python{,3}-pifacedigitalio
\r\n

\"Picture
\r\nPicture 1, shows the Piface Digital IO board installed on top of my raspberry pi

\r\n

\"Picture
\r\nPicture 2, shows the extension board I built. The extension board increases the number of available LED’s and switches. The board is attached via a ribbon cable with the ends of the wire inserted into the green and orange screw down chocolate blocks attached to the Piface Digital IO board.

\r\n\r\n

Explanation of how to read a binary display

\r\n

The board I built which attaches to the Piface Digital board has a total of 8 LED’s. I use the 8 LED’s to display a number in binary format. In binary each LED has only two values either on or off, with 1 LED you can count to 1 with two LED’s you can count to 3. This may seem confusing if you’ve never dealt with binary before. Starting from the right each subsequent LED represents double the value of the previous one so the 1st LED has a value of 1 the 2nd LED has a value of 2, the third LED has a value of 4 and so on. See below

\r\n
LED Number   8   7   6   5  4  3  2  1\r\nLED VALUES 128, 64, 32, 16, 8, 4, 2, 1
\r\n

LED on represents 1, LED off represents 0

\r\n

[Example 1] 0 0 0 0 0 0 0 1 [Represented value 1]
\r\n1st LED on value = 1

\r\n

[Example 2] 0 0 0 0 0 0 1 1 [Represented value 3]
\r\n1st and 2nd LED on, LED VALUE 1 + 2 = 3

\r\n

[Examples 3] 0 0 0 0 1 0 1 0 [Represented value 10]
\r\n2nd and 4th LED on, LED VALUE 2 + 8 = 10

\r\n

With practice it gets easy to convert from binary to decimal, at my work we still have a very old computer which contains a front panel with LED’s and binary switches. To load the computer instructions must be loaded in binary using flip switches and LED’s with practice it becomes second nature.

\r\n

Links

\r\n\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, hardware, electronics, Raspberry Pi',0,0,1), (2918,'2019-10-09','Selecting random item from weighted list',1604,'How to selected random item from weighted list using Haskell','

Intro

\r\n

We’re going to have a look how to select random item from weighted list. There isn’t that much code this time, but it certainly took many tries to get it working and looking nice.

\r\n

Analogy

\r\n

Imagine stack of building blocks of different heights stacked on top of each other. Height of the each block is chance of how often it will be selected. Selection is done by chopping a stick so that its length at maximum is height of the stack. Place stick next to the stack and select the block that stick reaches at.

\r\n

Explanation of algorithm

\r\n

We have list of items and associated weight, defined as Frequency a = Frequency Int a.

\r\n

Total is sum of all the weights and we select a random number n between 1 and total.

\r\n

pick function has signature of [Frequency a] -> n -> Maybe a. Empty list will result Nothing. When picking item, if n is equal or less than weight of the first item, return that item. Otherwise, drop the first item, subtract weight of that first item from n and try again. Eventually we either arrive to item which weight is greater than n or to empty list.

\r\n

Quick detour on random number generators

\r\n

Haskell functions are pure, meaning that with same input, you are guaranteed to get the same output (safe for some specific cases). Which makes concept of random numbers at first glance to be impossible. This is solved by passing in a random number generator, which can supply you a random value a new random number generator. Using this new random number generator to generate a value yields you a yet another value and yet another random number generator.

\r\n

Passing these random number generators around in code gets tedious, but there’s different solution: MonadRandom. Using it will thread along generators automatically behind the scenes, ensuring that you always have access to a fresh generator. There’s several functions that can be used to generate random values, but we’re using this one: getRandomR :: Random a => (a, a) -> m a. Given a lower and upper bound, it will return you a random value wrapped in context that carries that new random number generator.

\r\n

In the end, we need to take our computation (that can be complex and use multiple calls to random number generator) and turn that m a into a. This is done with runRand :: RandomGen g => Rand g a -> g -> (a, g). We give it our computation and a RandomGen g that can generate random values and receive (a, g) where a is our result and g new random number generator. In cases where we aren’t going to use the new generator, we can use evalRand :: RandomGen g => Rand g a -> g -> a, which discards it and returns just a.

\r\n

Actual implementation with explanation

\r\n

First, Frequency for expressing weight of individual item. It’s parametrized, so can be used with any data.

\r\n
data Frequency a = Frequency Int a\r\n    deriving (Show, Read, Eq)
\r\n

Next, determining which item to choose, based on stack and measuring stick. In case a value outside of valid range has been selected, we end up with Nothing, otherwise with Just a. First case is for empty list (either we called this originally with empty list or picked number that is greater than total sum of weights), second one either picks the first item of list or recursive calls itself removing first item.

\r\n
pick :: [Frequency a] -> Int -> Maybe a\r\npick [] _ = Nothing\r\n\r\npick (Frequency x item:xs) i\r\n    | i <= x = Just item\r\n    | otherwise = pick xs (i - x)
\r\n

Finally, function for calculating total of weights and choosing random number. We’re using that Rand g (Maybe a) I explained earlier. First case is for empty list again and latter case for list with at least one item.

\r\n
choose :: RandomGen g => [Frequency a] -> Rand g (Maybe a)\r\nchoose [] =\r\n    return Nothing\r\n\r\nchoose items = do\r\n    let total = sum $ fmap (\\(Frequency x _) -> x) items\r\n    n <- getRandomR (1, total)\r\n    return $ pick items n
\r\n

Notice how we can get random number by n <- getRandomR (1, total), without talking about generators. MonadRandom is handling generators and making sure that there’s always a fresh generator available and new generator is stored ready to be used.

\r\n

And that’s all the code this time (I told the amount of code is small this time).

\r\n

In closing

\r\n

This probably sounds a lot more complicated than it actually is. I arrived to the result after quite many detours, but the end result looks pretty nice.

\r\n

Next time we’re going to have a look where to use our choose function.

\r\n

In the meantime, questions, comments and feedback are welcomed. Best way to reach me is email or fediverse where I’m Tuula@mastodon.social. Or even better, record your own Hacker Public Radio episode.

\r\n',364,107,0,'CC-BY-SA','haskell, random, monad',0,0,1), (2904,'2019-09-19','DIY URL shortening',738,'Quick tip on how to shorten an URL without a silly SaaS','

\r\nMake a directory to house your shortened URLs.\r\n

\r\n\r\n
\r\n$ ssh example.com mkdir public_html/u\r\n
\r\n\r\n

\r\nOn demand, create a subdirectory for the shortened URL you want to create.\r\n

\r\n\r\n
\r\n$ ssh example.com mkdir public_html/u/hpr\r\n
\r\n\r\n

\r\nCreate an HTTP redirect in an index.html file.\r\n

\r\n\r\n
\r\n$ ssh example.com echo \"\"<html><title>Shortened URL</title><head><meta http-equiv=\'refresh\' content=\'0; URL=http://hackerpublicradio.org/correspondents/0078.html\' /></head></html>\"\" > www/u/hpr/index.html\r\n
\r\n\r\n

\r\nYour shortened URL is example.com/u/hpr\r\n

\r\n',78,0,0,'CC-BY-SA','html, url shortner',0,0,1), (2928,'2019-10-23','Building markov chains with Haskell',1798,'How to build markov chains with Haskell','

Intro

\r\n

Last time we built a weighted list, this time we’re using that to build markov chains. Wikipedia states that “A Markov chain is a stochastic model describing a sequence of possible events in which the probability of each event depends only on the state attained in the previous event.” and that they’re named after the Russian mathematician Andrey Markov.

\r\n

Configuration

\r\n

We’re after generic system, hence parametrized data types.

\r\n

First part is Configuration a that lists possible starting elements of chain and elements that can follow a particular element.

\r\n
data Config a = Config\r\n    { configStarts :: ![Item a]\r\n    , configContinuations :: !(Map a [Item a])\r\n    } deriving (Show, Read, Eq)
\r\n

Second part is Item a, that just holds single item that could appear in chain and relatively frequency for its appearance.

\r\n
data Item a =\r\n    Item (Frequency (Maybe a))\r\n    deriving (Show, Read, Eq)
\r\n

We’re using Maybe a as in some cases there’s chance of element being last element in chain. Thus, Nothing will represent end of chain.

\r\n

In previous episode, we implemented choose, but later on I decided to rename it to chooseM. So when you see chooseM, it’s just different name for what we implemented previously.

\r\n

Building a chain

\r\n

Since building a configuration depends on the case quite a bit, we’re just going to assume that we have one at hand.

\r\n

Our chains are built by chainM :: (Ord a, RandomGen g) => Config a -> Rand g [a]. Given a config, it creates computation that when run will return list of a, which is our chain.

\r\n

Implementation is fairly straightforward:

\r\n
chainM config = do\r\n    starter <- chooseM (itemToFreq <$> configStarts config)\r\n    case join starter of\r\n        Nothing ->\r\n            return []\r\n\r\n        Just h -> do\r\n            t <- tailOfChain config h\r\n            return $ h : t
\r\n

First we select item from starting elements. In case there isn’t one, result will be a empty list. Otherwise we use tailOfChain to compute rest of the list and return a list of starter element followed by that tail.

\r\n

For tail we need to figure out first what possible elements there are that can follow a given element. This is done by candidates function. lookup finds a possible list of elements in configContinuations. We use itemToFreq to turn this list into frequencies. Since items might be Nothing (in case where there aren’t any suitable continuations present) and any continuation in the list might be Nothing (in case where this is possibly terminating element), we have to use (fmap . fmap) to apply itemToFreq to each possible element. Moreover, concat turns our Maybe [Frequency (Maybe a)] into [Frequency (Maybe a)], if we have Nothing at this stage, result will be an empty list [].

\r\n
candidates :: (Ord a) => Config a -> a -> [Frequency (Maybe a)]\r\ncandidates config x =\r\n    concat $ (fmap . fmap) itemToFreq items\r\n    where\r\n        items = lookup x (configContinuations config)
\r\n

That concat part could have been written as:

\r\n
    case (fmap . fmap) itemToFreq items of\r\n        Nothing ->\r\n            []\r\n\r\n        Just x ->\r\n            x
\r\n

and the end result would be identical.

\r\n

Now that we know how to figure our possible continuation elements, we can implement computing tail of chain:

\r\n
tailOfChain :: (Ord a, RandomGen g) => Config a -> a -> Rand g [a]\r\ntailOfChain config c = do\r\n    item <- chooseM (candidates config c)\r\n    case join item of\r\n        Nothing ->\r\n            return []\r\n\r\n        Just x -> do\r\n             xs <- tailOfChain config x\r\n             return $ x : xs
\r\n

Function first select item from candidates. If there isn’t suitable item or item is Nothing, result will be an empty list. Otherwise function recurses, computes tail starting from selected element and constructs chain starting by selected item and followed by tail.

\r\n

join item at the start of case analysis collapses two nested Maybes together:

\r\n\r\n

In the end we have list that is sort of like: h : chooseM (candidates config h) : chooseM (candidates config h\') : chooseM (candidates config h\'\') : ... : []

\r\n

Extra

\r\n

For convenience we define two other functions. First one is for when we don’t want to use Rand g a. It’s done by applying runRand function with our chainM function, config and RandomGen.

\r\n
chain :: (Ord a, RandomGen g) => Config a -> g -> ([a], g)\r\nchain config g =\r\n    runRand (chainM config) g
\r\n

More interesting is chains which builds infinite list of chains:

\r\n
chains :: (Ord a, RandomGen g) => Config a -> g -> [[a]]\r\nchains config g =\r\n        c : chains config g'\r\n    where\r\n        (c, g') = chain config g
\r\n

This uses chain function to create starting element (which is markov chain) and new generator g\'. Then it builds a list where that first chain is followed by list of chains that is created by calling chains with that new random generator. Since there’s no termination case in the function, it will compute infinitely long list of markov chains. This works because elements are computed only when needed. For all intents and purposes for program using this infinite list, items are there when needed.

\r\n

Closing

\r\n

Hardest part working with markov chains (at least in my opinion) is building suitable configuration. When you have that configuration at hand, building chains from it requires relatively small amount of code. In the next episode we’re going to use this chains for our space game.

\r\n

Questions, comments and feedback are always welcome. Best way to reach me is by email or in fediverse where I’m Tuula@mastodon.social.

\r\n',364,107,0,'CC-BY-SA','markov chains, Haskell',0,0,1), (2905,'2019-09-20','Two HPR hosts living in the same region finally meet up!',1145,'Dave Morriss and MrX meet up and record a conversation','

Introduction

\r\n

Two HPR hosts who live in the Edinburgh locality in Scotland met on Saturday 24th August for a chat.

\r\n

The hosts are:

\r\n\r\n

Some of the meeting was recorded and is presented here.

\r\n

Recording information

\r\n

We were both recording this chat. Dave was using his Zoom H2n (with the microphones in XY mode) and MrX had left his small Dictaphone-like recorder on the table.

\r\n

Most of the audio here was from the Zoom, but at one point it switches to MrX’s recorder for comparison. The sample is at about 18 minutes into the recording (hard to judge since an intro sequence will have been added on the HPR site). A “chirp” effect has been added at the start and end of this sample to help with identification.

\r\n

The Zoom track had noise reduction applied to it, using a noise sample from the start as a reference. The sample from MrX’s recorder also had noise reduction applied, and both tracks were amplified.

\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','HPR,hosts,meeting,Dave Morriss,MrX',0,0,1), (2906,'2019-09-23','Feature Engineering for Data-Driven Decision Making',1006,'In this episode, I explain feature engineering, and how it can be used to make decisions','

Example of the input data

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Client nameDate ordered
Client 12019-01-01
Client 12019-01-01
Client 32019-01-01
Client 32019-01-01
\r\n

Example of the engineered features

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Client namevolumelast order datefirst order datedays since last order
Client 12922019-09-032015-03-0410
Client 2182019-09-092019-09-044
Client 33002019-08-162016-11-1528
\r\n

Links

\r\n
    \r\n
  1. Feature Engineering
  2. \r\n
  3. Feature
  4. \r\n
\r\n',300,0,0,'CC-BY-SA','data',0,0,1), (2909,'2019-09-26','ONICS Basics Part 3: Networking Fundamentals',3031,'This show discusses basic principles of networks and how to send data using ONICS','

Theory

\r\n

In this episode I decided to take a slight diversion into networking fundamentals. As before, if you want to learn more about installing the ONICS tool suite, go back and listen to HPR 2882.

\r\n

There are three key concepts to understand about modern networks. They are:

\r\n\r\n

My Setup

\r\n\r\n

More Terminology

\r\n\r\n

Standard UNIX Commands

\r\n\r\n

ONICS Commands in this Episode

\r\n\r\n

Sending an Ethernet Packet to the Destination

\r\n\r\n
    $ sudo pktin wlo1 |\r\n      pflt "not ip and eth.dst == 6c:88:14:7c:2e:14" |\r\n      x2hpkt\r\n
\r\n\r\n
    $ echo "hello world" |\r\n      rawpkt |\r\n      ethwrap "eth.dst = 6c:88:14:7c:2e:14; "\r\n              "eth.src = 00:22:fa:a7:69:90; "\r\n              "eth.ethtype = 12;" |\r\n      sudo pktout wlan0\r\n
\r\n

Note that while I broke up the field setting commands into multiple lines in ethwrap, they can all be part of a single quoted string if desired. To store the packet to a file rather than send it instead do something

\r\n
$ echo ... | rawpkt | ethwrap ... > outfile.xpkt\r\n
\r\n

One can then dump the packet by running:

\r\n
$ xpktdump outfile.xpkt\r\n
\r\n

or send the packet by running:

\r\n
$ sudo pktout outfile.xpkt wlan0\r\n
\r\n

Sending an IP Packet to the Destination over the Local Network

\r\n\r\n
    $ sudo pktin wlo1 |\r\n      pflt "ip and ip.proto == 255" |\r\n      x2hpkt\r\n
\r\n\r\n
    $ echo "hello world" |\r\n      rawpkt |\r\n      ipwrap "ip.saddr = 192.168.0.4;"\r\n             "ip.daddr = 192.168.0.248;"\r\n             "ip.len = 32;"\r\n             "ip.ttl = 64;"\r\n             "ip.proto = 255;" |\r\n      ethwrap "eth.dst = 6c:88:14:7c:2e:14; "\r\n              "eth.src = 00:22:fa:a7:69:90; "\r\n              "eth.ethtype = 0x800;" |\r\n      sudo pktout wlan0\r\n
\r\n

Note that while I broke up the field setting commands into multiple lines in ipwrap and ethwrap, they can all be part of a single quoted string if desired. Also note that it is not actually necessary to set the \'ip.len\' and \'eth.ethtype\' fields: the tools will do that automatically.

\r\n

Sending an IP Packet to the Destination via IP

\r\n\r\n
    $ sudo pktin wlo1 |\r\n      pflt "ip and ip.proto == 255" |\r\n      x2hpkt\r\n
\r\n\r\n
    $ echo "hello world" |\r\n      rawpkt |\r\n      ipwrap "ip.saddr = 192.168.0.4;"\r\n             "ip.daddr = 192.168.0.248;"\r\n             "ip.ttl = 64;"\r\n             "ip.proto = 255;" |\r\n      ethwrap "eth.dst = 00:0d:b9:23:f2:51; "\r\n              "eth.src = 00:22:fa:a7:69:90; " |\r\n      sudo pktout wlan0\r\n
\r\n

Challenge

\r\n

There are several differences between the packets that arrive at the destination machine when sending directly over the local network versus sending via an IP gateway (router). I\'ve mentioned how the Ethernet header is different. Can you find the other differences? What causes these differences?

\r\n

TIP: instead of sending the pktin command to x2hpkt, send it to a file. Do this for both local network send and for sending via the router saving each to different files. Then run pdiff on the two files to highlight the differences.

\r\n',259,61,0,'CC-BY-SA','command-line, networking, basics',0,0,1), (2911,'2019-09-30','my internet connection',655,'a bloviated harang with a smattering of spewed expetives, while describing available ISPs','

Any notes for this episode should probably contain links to the ISPs mentioned in the show. Since I do not wish to harm any listeners, I have opted to not include links to evil ISPs.

',243,0,1,'CC-BY-SA','internet service, satellite',0,0,1), (2938,'2019-11-06','Naming pets in space game',1236,'How to use markov chains to generate names','

Intro

\r\n

In the two previous episodes we built a weighted list and used that to build markov chains. This time we’re going to use them to generate some names based on examples. I’m skipping over a lot of uninteresting code in this episode, concentrating only the parts that deal with names.

\r\n

Idea

\r\n

Person in game might hear scurrying sounds inside walls of their quarters. Then they have option of getting a cat, taming a rat or letting someone else deal with the problem. Depending on their choice, they might end up with a cat or a rat, that of course needs a name. Game offers 3 different options of names that haven’t been used before and person can always opt for completely random one.

\r\n

Config

\r\n

While we’re not going to dig very deep into making configurations for markov chains, we can have look at the overall process.

\r\n

We have list of names to serve as examples and three functions, which implementation I won’t delve into:

\r\n\r\n

addName function is used to add single name into config:

\r\n
addName :: Int -> Text -> Config Text -> Config Text\r\naddName n s config =\r\n    links pairs $\r\n            end elements $\r\n            start elements config\r\n    where\r\n        elements = chunksOf n s\r\n        pairs = zip elements (safeTail elements)
\r\n

First s (name) is split into strings of length n. These elements are then combined into pairs, where consecutive elements form a pair. Final step is to add start and ending elements into config, followed by links between elements of pairs.

\r\n

We can then fold a list of examples into config:

\r\n
nameConfig :: [Text] -> Int -> Config Text\r\nnameConfig xs n =\r\n    foldr (addName n) emptyConfig xs
\r\n

This starts with emptyConfig and calls addName repeatedly until all elements of list containing examples have been processed.

\r\n

Implementation

\r\n

Now that we have configuration, we can start generating names. As usual, I like to keep things specific and generate PetName instead of just Text. I happened to have list of ancient greek names at hand, so I used that. Later on we’ll have to add more cultures, like Romans, Parthians, Persians, Germans, Phoenicians and so on.

\r\n

General implementation of generating infinite list of strings of specific kind is shown below:

\r\n
names :: (RandomGen g, Eq b) => (Text -> b) -> Config Text -> g -> [b]\r\nnames t config g =\r\n    nub $ (t . toTitle . concat) <$> chains config g
\r\n

It’s easier to read if you start from right. chains config g generates infinite list of markov chains with given configuration. Next we create a new function (t . toTitle . concat), which uses concat to combine list of Text into single Text, toTitle to capitalize is correctly and t to transform it to something (PetName in our case). <$> is then used to apply this function to each element of our infinite list. Finally nub is used to remove duplicate entries.

\r\n

With names we can then define petNames:

\r\n
petNames :: (RandomGen g) => g -> [PetName]\r\npetNames =\r\n    names MkPetName greekNameConfig
\r\n

MkPetName is value constructor that turns Text into PetName (this is t used by names function).

\r\n

Pets

\r\n

Pets are currently very much work in progress. They have few attributes and there can be two different kinds of pets:

\r\n
Pet json\r\n    name PetName\r\n    type PetType\r\n    dateOfBirth StarDate\r\n    dateOfDeath StarDate Maybe\r\n    ownerId PersonId\r\n    deriving Show Read Eq
\r\n
data PetType\r\n    = Cat\r\n    | Rat\r\n    deriving (Show, Read, Eq, Ord, Enum, Bounded)
\r\n

The actual beef is namingPetEvent function. When applied with Entity Person, Entity Pet and StarDate, it will create News that can be saved into database and later on showed to player. While the code is shown below, I’m not going to go over it line by line:

\r\n
namingPetEvent :: (PersistQueryRead backend, MonadIO m,\r\n    BaseBackend backend ~ SqlBackend) =>\r\n    Entity Person -> Entity Pet -> StarDate -> ReaderT backend m News\r\nnamingPetEvent personE petE date = do\r\n    pets <- selectList [ PetOwnerId ==. (entityKey personE)\r\n                       , PetDateOfDeath ==. Nothing\r\n                       ] []\r\n    let names = (petName . entityVal) <$> pets\r\n    g <- liftIO getStdGen\r\n    let availableNames = take 3 $ filter (\\x -> not (x `elem` names)) $ petNames g\r\n    let content = NamingPet (NamingPetEvent { namingPetEventPersonId = entityKey personE\r\n                                            , namingPetEventPetId = entityKey petE\r\n                                            , namingPetEventPetType = (petType . entityVal) petE\r\n                                            , namingPetEventDate = date\r\n                                            , namingPetNameOptions = availableNames\r\n                                            })\r\n                            [] Nothing\r\n    return $ mkPersonalSpecialNews date (entityKey personE) content
\r\n

General idea is to use selectList to load living pets of given person and then extract their names. With random generator g, we create a infinite list of PetNames, remove already used names from it and take 3 first ones. These names are then used to create NamingPetEvent.

\r\n

In closing

\r\n

Names are probably one of the most common applications of markov chains in games. Same technique can be used to generate nonsense books and articles that look realistic on a glance.

\r\n

Questions, comments and feedback is welcomed, best way to reach is email or in fediverse where I’m Tuula@mastodon.social. Or even better, record your own episode for Hacker Public Radio.

\r\n

ad astra!

\r\n',364,107,0,'CC-BY-SA','haskell, markov chains',0,0,1), (2913,'2019-10-02','Windows, SDN, and Firewalls',2483,'Being a Windows User for the past 3 years, Information on SDN, and a DIY approach to a home Firewall','
\r\nIntro\r\n\r\nLast Upload was hpr1468 March 19, 2014 \r\n\r\npython\r\n\r\n>>> print (D.today() - D(2014, 3, 19)).days\r\n\r\n1999\r\n\r\n>>> 2000/365\r\n\r\n5\r\n
\r\n\r\n

https://unix.stackexchange.com/questions/24626/quickly-calculate-date-differences

\r\n

In the last 5 years:

\r\n\r\n

Let\'s Start The Show off in the wrong direction

\r\n

Windows

\r\n\r\n

Sublime Text 3

\r\n\r\n

Summary:

\r\n\r\n

Web Stuff

\r\n\r\n

Home Hacks

\r\n\r\n

Firewalls

\r\n\r\n',231,61,1,'CC-BY-SA','Windows, Firewalls, SDN',0,0,1), (2914,'2019-10-03','Describing how I listen to podcasts PART 4',526,'In this episode I cover my 2nd add on board for the raspberry pi','\r\n

Pictures 01, 02 and 03 show how the PiFace Control and Display board and raspberry pi fit into the case
\r\n\"Picture-01.JPG\"
\r\n\"Picture-02.JPG\"
\r\n\"Picture-03.JPG\"

\r\n

Pictures 04 and 05 shows the piece of plastic used to transfer the light from the LED’s on the Pi board to the holes in the casing. This is supposed to allow you to monitor the PI LED’s. I held it in place using a piece of Blu Tack.
\r\n\"Picture-04.JPG\"
\r\n\"Picture-05.JPG\"

\r\n\r\n

Picture 6 shows the completed box
\r\n\"Picture-06.JPG\"

\r\n

Pictures 7 and 8 show the project in operation and mounted on a spare Anker tablet stand that I had lying about.
\r\n\"Picture-07.JPG\"
\r\n\"Picture-08.JPG\"

\r\n

This is an example of the Anker stand I used. I use it to hold my project at a 45 degree angle so I can see it from around the room, it is intended to be used as a tablet stand.
\r\nAnker stand for my Nexus 7, pictures, links

\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Raspberry Pi, hardware, electronics, projects',0,0,1), (2915,'2019-10-04','Intro - My Recording Setup',1248,'My first HPR episode. A bit of an intro and then a description of my recording setup.','

I discuss loading Fedora on various bits of older hardware and devise a plan to turn one of those bits of older hardware into a dedicated headless audio processor using its firewire port to keep yet another older piece of hardware alive: a Yamaha GO46 audio interface.

\r\n

Having done that and finding that it all performs admirably, I illogically decide to replace it with newer (but not new) hardware and buy yet another different model firewire audio interface: a Focusrite Saffire Pro 24.

\r\n

I record the end of the show on audio interface #3: a USB based Steinberg UR22mkII, which one could argue that I should have been using all along, leaving the firewire gear in the last decade where it belongs (?).

',380,0,0,'CC-BY-SA','Fedora, Firewire, Audio Interface',0,0,1), (2919,'2019-10-10','hosting software in HPR show notes',626,'boats are awesome, but might lead to hosting software in the HPR show notes ','
#!/usr/bin/env python\r\nimport urllib.request\r\nimport json\r\nimport re\r\nimport subprocess\r\n\r\n# see https://www.weather.gov/documentation/services-web-api\r\n\r\n#where are we? GPS coordinates\r\nlat = 39.275235\r\nlon = -120.9199507\r\n#what is the user agent string?\r\nagent = "Jezra's fun lil script"\r\n#minimum wind speed in mph?\r\nmin_speed = 9\r\n\r\ndef get_api_data(endpoint):\r\n  print(endpoint)\r\n  #prepare the connection with custom headers\r\n  request = urllib.request.Request(endpoint, headers={"User-Agent":agent})\r\n  #create a handler for the request\r\n  handler = urllib.request.urlopen(request)\r\n  #get the text\r\n  text = handler.read()\r\n  #parse the json text to a python object\r\n  obj = json.loads(text)\r\n  return obj\r\n\r\ndef wind_is_good(s):\r\n  #use regex to find the matches\r\n  matches = re.findall("[0-9]+",s)\r\n  for match in matches:\r\n    #convert string to int\r\n    m = int(match)\r\n    #is the speed good?\r\n    if(m>=min_speed):\r\n      return True\r\n  #if we get here, there is no match :(\r\n  return False\r\n\r\nstart_url = "https://api.weather.gov/points/{0},{1}".format(lat,lon)\r\n#get the json response from the start_url as a python object\r\nobj = get_api_data(start_url)\r\n\r\n#get the forecast url from the returned data\r\nforecast_url = obj['properties']['forecast']\r\n\r\n# process the forecast url\r\nforecast = get_api_data(forecast_url)\r\n\r\n#loop through the forcast periods\r\nfor period in forecast['properties']['periods']:\r\n  #put name and windspeed into easier to handle variable names\r\n  name= period['name']\r\n  wind = period['windSpeed']\r\n  print (name, wind)\r\n  #check the wind speed\r\n  if wind_is_good(wind):\r\n    subprocess.call(["textjezra","{0}: {1}".format(name,wind)])\r\n
\r\n',243,25,0,'CC-BY-SA','canoe, ptython, api, weather',0,0,1), (2921,'2019-10-14','Geocaching with the family',2916,'Dave and his family take a wander around a wood looking for Geocaches','

In this episode, Dave and his family wander the paths of Sandall Beat Wood in Doncaster to participate in the game of Geocaching. During this time, which demonstrates an unusual level of failure in us playing the game, we try and explain what the game is all about.

\r\n

No, not The Game...

\r\n

As I explain at the beginning of the episode, this is a fairly long episode which hasn\'t been edited down much, so there are a lot of ambient pauses and heavy breathing to be enjoyed.

\r\n

Recorded in the field on my Olympus DM-3 voice recorder.

\r\n

Caches explored

\r\n\r\n

Links

\r\n\r\n',314,0,0,'CC-BY-SA','geocaching, outdoors, family',0,0,1), (2948,'2019-11-20','Testing with Haskell',2560,'Introduction on HSpec and QuickCheck','

Intro

\r\n

I have liked writing automated tests for a long time, so it’s not a surprise that I end up writing them in Haskell too. This is very broad topic, so this episode only scratches the surface.

\r\n

HSpec

\r\n

HSpec is testing framework that automatically detects tests, like most of the modern systems. It supports hierarchies, so one can organize tests by feature for example.

\r\n
spec :: Spec\r\nspec = do\r\n    describe "Very important feature" $ do\r\n        it "Execution should be error free" $ do\r\n            ...\r\n\r\n        it "Flux capacitors can be charged" $ do\r\n            ...\r\n\r\n    describe "Somewhat less important feature" $ do\r\n        ...
\r\n

Unit test

\r\n

Unit test tests a single case with fixed set of inputs. With pure functions these are a pleasure to write as they’re really just data in, data out, verify results. Below is two examples:

\r\n
spec :: Spec\r\nspec = do\r\n    describe "Markov chain configuration" $ do\r\n        it "Adding new starting element to empty configuration creates item with frequency of 1" $ do\r\n            let config = addStart ("AA" :: DT.Text) emptyConfig\r\n            config ^? (configStartsL . _head . itemFreqL) `shouldBe` Just 1\r\n            config ^? (configStartsL . _head . itemItemL . _Just) `shouldBe` Just "AA"\r\n\r\n        it "Adding same element twice to empty configuration creates item with frequency of 2" $ do\r\n            let config = addStart "AA" $\r\n                         addStart ("AA" :: DT.Text) emptyConfig\r\n            config ^? (configStartsL . _head . itemFreqL) `shouldBe` Just 2\r\n            config ^? (configStartsL . _head . itemItemL . _Just) `shouldBe` Just "AA"
\r\n

Both are for testing configuring markov chains. First one checks that adding a starting element in empty configuration results correct item with correct weight being added. Second checks that adding same starting element twice results weight of 2.

\r\n

Both tests use lenses for reading nested data structure. Episode doesn’t cover them much at all, as it’s enough to know that (configStartsL . _head . itemFreqL) focuses on starting elements of configuration, selects first item of the list and then selects frequency of that item. Lenses can also be used for modifying data and they don’t have to focus on only one element.

\r\n

Unit tests are easy enough to write, they verify single thing about the unit being tested and are usually super fast to run and not error prone.

\r\n

Property based test

\r\n

Property based tests are used to check that a certain property holds with randomly generated input parameters. I’m using HSpec as testing framework and QuickCheck as tool for generating test data:

\r\n
spec :: Spec\r\nspec = do\r\n    describe "planets" $ do\r\n        describe "food" $ do\r\n            it "food requirement for positive amount of population is more than zero" $ do\r\n                forAll positivePopulation $ \\x -> foodRequirement x  > RawResource 0\r\n\r\n            it "food base production for farms is equal or greater than their amount" $ do\r\n                forAll someFarms $ \\x -> (sum (fmap foodBaseProduction x)) > (RawResource $ length x)
\r\n

Above we have two tests. First one checks that with any non-zero population, foodRequirement is greater than 0. Second one check that with any positive amount of farm, foodBaseProduction is greater than amount of the farms.

\r\n

positivePopulation is Generator, that is used by QuickCheck to generate random data for testing. Its definition is shown below:

\r\n
singlePopulation :: Gen PlanetPopulation\r\nsinglePopulation = do\r\n    let aPlanetId = toSqlKey 0\r\n    let aRaceId = toSqlKey 0\r\n    aPopulation <- arbitrary `suchThat` \\x -> x > 0\r\n    return $ PlanetPopulation aPlanetId aRaceId aPopulation\r\n\r\npositivePopulation :: Gen [PlanetPopulation]\r\npositivePopulation = do\r\n    k <- arbitrary `suchThat` \\x -> x > 0\r\n    vectorOf k singlePopulation
\r\n

Generated data can be really simple or very complex. Generating complex data is often convenient to break into smaller steps and write generators for them.

\r\n

Property based tests are somewhat harder to write than unit tests, but they can potentially cover edge cases that might otherwise not been discovered.

\r\n

Working with database

\r\n

All tests shown so far have been testing pure code, that is, code that is data in, data out. When database is introduced, things get more complicated. Suddenly there’s much more possibilities for errors. Below is an example of such a test:

\r\n
spec :: Spec\r\nspec = withApp $ do\r\n\r\n    describe "Status handling"  $ do\r\n        describe "Planet statuses"  $ do\r\n            it "Expired planet statuses are removed and news created" $ do\r\n\r\n                sId <- runDB $ insert $ StarSystem\r\n                        { starSystemName = "Aldebaraan"\r\n                        , starSystemCoordX = 10\r\n                        , starSystemCoordY = 20\r\n                        , starSystemRulerId = Nothing\r\n                        }\r\n\r\n                fId <- runDB $ insert $ Faction\r\n                        { factionName = "Star lords"\r\n                        , factionHomeSystem = sId\r\n                        , factionBiologicals = 10\r\n                        , factionMechanicals = 10\r\n                        , factionChemicals = 10\r\n                        }\r\n\r\n                pId1 <- runDB $ insert $ Planet\r\n                        { planetName = "New Earth"\r\n                        , planetPosition = 3\r\n                        , planetStarSystemId = sId\r\n                        , planetOwnerId = Just fId\r\n                        , planetGravity = 1.0\r\n                        , planetRulerId = Nothing\r\n                        }\r\n\r\n                _ <- runDB $ insert $ PlanetStatus\r\n                        { planetStatusPlanetId = pId1\r\n                        , planetStatusStatus = GoodHarvest\r\n                        , planetStatusExpiration = Just 20201\r\n                        }\r\n\r\n                let status = Simulation 20201\r\n                _ <- runDB $ insert status\r\n\r\n                news <- runDB $ removeExpiredStatuses (simulationCurrentTime status)\r\n\r\n                statuses <- runDB $ selectList [ PlanetStatusPlanetId ==. pId1 ] []\r\n                loadedNews <- runDB $ selectList [] [ Asc NewsDate ]\r\n\r\n                liftIO $ statuses `shouldSatisfy` (\\x -> length x == 0)\r\n                liftIO $ news `shouldSatisfy` (\\x -> length x == 1)\r\n                liftIO $ loadedNews `shouldSatisfy` (\\x -> length x == 1)
\r\n

There’s a lot more code that had to be written for this test and majority of it is for setting up database state. The test if for ensuring that when good harvest boost expires, it is removed from database and respective news article is created.

\r\n

These kinds of tests have a lot more code and are much more slower to run because of the communication with a database. There’s also more cases where something can go wrong. But in the end, these kinds of tests are needed if one wants to verify that interaction with database is working as planned.

\r\n

Testing API

\r\n

Last example is about testing REST API. There are two tests, where the first one is checking that proper access control is in place and second one checks that pending messages are correctly retrieved.

\r\n
spec :: Spec\r\nspec = withApp $ do\r\n    describe "Message handling" $ do\r\n        it "unauthenticated user can't access messages" $ do\r\n            _ <- get ApiMessageR\r\n            statusIs 401\r\n\r\n        it "pending messages are loaded" $ do\r\n            (pId, fId) <- setupPerson\r\n            _ <- runDB $ insert $ researchCompleted 25250 fId HighSensitivitySensors\r\n            user <- createUser "Pete" (Just pId)\r\n            authenticateAs user\r\n            _ <- get ApiMessageR\r\n            resp <- getResponse\r\n            let jsonM = join (decode <$> simpleBody <$> resp) :: Maybe Value\r\n\r\n            assertEq "message tag"\r\n                     (jsonM ^? (_Just . _Array . _head . key "tag" . _String))\r\n                     (Just "ResearchCompleted")\r\n            assertEq "star date"\r\n                     (jsonM ^? (_Just . _Array . _head . key "starDate" . _Integer))\r\n                     (Just 25250)\r\n            assertEq "technology"\r\n                     (jsonM ^? (_Just . _Array . _head . key "contents" . key "Technology" . _String))\r\n                     (Just "HighSensitivitySensors")\r\n\r\n            statusIs 200
\r\n

Here extra complication is created by the fact that many features of the system are behind authentication and authorization. Luckily Yesod comes with helper function authenticateAs, that allows code to authenticate when system is running in development mode.

\r\n

These test are even slower than any of the previous ones, but on the other hand, they test whole chain from user interaction to database and back.

\r\n

In closing

\r\n

There’s lots of things that I couldn’t cover in such a short time, like various types of tests: UI testing, performance testing, security testing, long running testing…, the list goes on and on. But hopefully this episode gave you ideas what kinds of tests one can write and how to get started doing so using Haskell.

\r\n

Best way to reach me is email or at fediverse, where I’m Tuula@mastodon.social.

\r\n',364,107,0,'CC-BY-SA','haskell, testing, HSpec, QuickCheck',0,0,1), (2924,'2019-10-17','Hacking an Alarm Clock to Make it Quieter',365,'I talk about installing a resistor in the speaker wire of an alarm clock so it won\'t be so loud','

The alarm clock on my bedside table had a very loud alarm—so loud that it scared me and made my heart race when it went off. I know you\'re thinking I should just use an alarm on my phone, but for whatever reason I wanted to use the alarm clock. In this episode I talk about installing a resistor in the speaker wires of the alarm clock so that it won\'t be so loud when it goes off. It\'s all good now. Loud enough to wake me up, but not so loud that it scares everyone.

\r\n\r\n

\"Alarm

\r\n',238,0,0,'CC-BY-SA','clocks, electronics, decibels, noise levels, alarm clocks, alarms',0,0,1), (2937,'2019-11-05','Lord D\'s Film Reviews: His Girl Friday',2937,'Lostnbronx reviews an old screwball comedy.','

Ignore the address for the film that I give in the review. Here’s a MUCH better copy than the one I watched. It’s another upload on Archive.org:

\r\n

https://archive.org/details/HisGirlFriday-1940

\r\n

Boy, I wish I’d found this one first!

\r\n',107,109,0,'CC-0','review, film, lord d',0,0,1), (2933,'2019-10-30','A walk through my PifaceCAD Python code – Part 1',871,'In this series a do whirl wind tour of the Python code I developed for my PifaceCAD board','

In this series a do whirl wind tour of the Python code I developed to control my PifaceCAD raspberry pi add on board. I this use to control a music player running on a remote raspberry pi upstairs.

\r\n

In this episode I cover my use of global variables.

\r\n

List of global variables along with associated comments explaining what they are used for

\r\n
# GLOBAL VARIABLES\r\n\r\nRemoteDevice = "pi@192.168.1.13"\r\n# Username and ip address of the remote device to control\r\n\r\nSeekMin = -6\r\n# Sets the minimum value of the variable SeekPosition\r\n\r\nSeekMax = 6\r\n# Sets the maximum value of the variable SeekPosition\r\n\r\nSeekPosition = 0\r\n# stores seek menu position,\r\n\r\nSeekMenu = False\r\n# used to track seek menu state, ie are we in seek menu or not\r\n\r\nFirstPass = True\r\n# Used to track 1st time button 5 (backlight toggle) is pushed, turns off blinkstick\r\n\r\nLcdLightOn = False\r\n# used to track toggle sate of backlight button 5\r\n\r\nMenuMin = 0\r\n# Sets the minimum value of variable "Menu"\r\n\r\nMenuMax = 2\r\n# Sets the maximum value of variable "Menu"\r\n\r\nMenu = 0\r\n# global variable used to keep trak of selected menu\r\n\r\nIrActive = False\r\n# used to track toggle state of active infrared buttons, when false disables\r\n# all buttons on the remote control except the blue button.\r\n\r\nStoredTime = 0\r\n# Stores curent time in seconds when a button is pushed, used by double button tap feature\r\n\r\n#GET_IP_CMD = "hostname –all-ip-addresses"\r\n# Debian 7 wheezy, Command to get IP adress\r\n\r\nGET_IP_CMD = "hostname --all-ip-addresses | cut -d' ' -f1"\r\n# Debian 8 jessie, Command to get IP adress\r\n\r\n#GET_ESSID_CMD = "iwconfig wlan0 | grep 'ESSID:' | cut -d':' -f2"\r\n# Debian 7 wheezy, Command to get wifi ESSID\r\n\r\nGET_ESSID_CMD = "/sbin/iwconfig wlan0 | grep 'ESSID:' | cut -d':' -f2"\r\n# Debian 8 wheezy, Command to get wifi ESSID\r\n\r\nGET_WIFI_STRENGTH_CMD = "/sbin/iwconfig wlan0 | grep 'Link Quality=' | awk '{ print $2 }'"\r\n# Command to get wifi signal strength
\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1), (2923,'2019-10-16','Describing how I listen to podcasts PART 5',1750,'In this episode I cover how I use my 2nd add on board the PiFace Control and Display','

Below are examples of messages shown on the screen during operation

\r\n

System Up (Unfortunately I didn’t get a picture of this message)

\r\n

\"Picture
\r\nShows the unit waiting to get a wi-fi connection and get given an IP address.

\r\n

\"Picture
\r\nUnit goes to the HPR site and gets the number of days to free slot in the show queue. At the time when I took the picture the queue had a healthy 22 shows!

\r\n

Links to three previous shows I did that mention the Blinkstick

\r\n
    \r\n
  1. Solving a problem I had with my Blinkstick
    \r\nhttps://hackerpublicradio.org/eps.php?id=2089

  2. \r\n
  3. Tracking the HPR queue using python and a Blinkstick
    \r\nhttps://hackerpublicradio.org/eps.php?id=2340

  4. \r\n
  5. Follow on to HPR2340 (Tracking the HPR queue in Python)
    \r\nhttps://hackerpublicradio.org/eps.php?id=2344

  6. \r\n
\r\n\r\n

\"Picture \"Picture
\r\nMenu 0 Podcasts screens

\r\n
0 [PODCASTS]\r\n0 1 <|| PLAY/PAUSE (Toggles moc between play and Pause)\r\n0 2 <<  INFORMATION(Displays information about the current track)\r\n0 3 <<  (Move to previous track in playlist)\r\n0 4 <<  (Move to next track in playlist)\r\n0 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Seek forward or back in current track)
\r\n

\"Picture \"Picture
\r\nMenu 1 Audiobooks screens

\r\n
1 [AUDIOBOOKS]\r\n1 1 <|| PLAY/PAUSE (Toggles moc between play and Pause)\r\n1 2 <<  INFORMATION(Displays information about the current track)\r\n1 3 <<  (Move to previous track in playlist)\r\n1 4 <<  (Move to next track in playlist)\r\n1 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Seek forward or back in current track)
\r\n

\"Picture \"Picture
\r\nMenu 2 System screens

\r\n
2 [SYSTEM]\r\n2 1 Sys Information (System information)\r\n2 2 WiFi (Displays WiFi inofrmation such SSID & signal strength)\r\n2 3 HPR (Displays the number days to the next free slots on FPR que)\r\n2 4 Not shown, (Not in use)\r\n2 5 LIGHT (Toggle back-light on LCD screen)\r\nPUSH IN TOP TOGGLE BUTTON (Shut-down the Raspberry Pi)
\r\n

Infra-red Sensor

\r\n\r\n

\"Picture
\r\nInfra-red sensor turned on

\r\n

\"Picture
\r\nInfra-red sensor turned off

\r\n\r\n

\"Picture
\r\n\"Picture
\r\nExample of a message being sent to the unit telling me that a backup is complete. The bright pink LED on the Blinkstick lets me know at a glance that a message has been sent to the display.

\r\n\r\n

\"Picture
\r\n\"Picture
\r\n\"Picture
\r\nA flavour of what information is shown when the information button 2 is pushed. The picture showing the title scrolling from right to left was blurred so I didn’t include this.

\r\n

\"Picture
\r\nThe menu displayed during seek, this in initiated by pushing and releasing the toggle button while either in the Podcasts main menu 0 or Audio book main menu 1.

\r\n

\"Picture
\r\nThe shut-down menu this in initiated by pushing and releasing the toggle button while in the System main menu 2.

\r\n',201,0,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1), (2925,'2019-10-18','LinuxLugCast\'s Memorial for FiftyOneFifty ',7541,'We are here tonight to share memories of our friend Donald Grier aka FiftyOneFifty.','

LinuxLugCast Memorial

\r\n\r\n

We are here tonight to share memories of our friend Donald Grier aka FiftyOneFifty

\r\n

Fifty was involved with many podcast over the years

\r\n\r\n

Shared thoughts and memories:
\r\nKen Fallon

\r\n

I was in the back room pottering away when espeak notified me that 5150
\r\nhad passed away. I went back to the computer and read the announcement
\r\nin the IRC Logs and confirmed the news. Some dude I had never met, never
\r\nseen in my life, and didn’t even know his real name, was gone and I was
\r\nin the back room crying my eyes out.

\r\n

Crying for the loss of a friend.

\r\n

When had he become a friend ?

\r\n

People have been socializing since the dawn of humans, be it at the camp
\r\nfire, the forge, pub, hairdresser, sports club, church, or wherever.

\r\n

For us it was via Linux podcasting. You are there because you share a
\r\ncommon interest. If you were into Linux podcasting then you could not
\r\nhelp but get to know fiftyonefifty. The guy turned up everywhere if not
\r\non the podcasts themselves he was commenting on them. I have 619
\r\nmessages from him about HPR alone.

\r\n

He submitted his first show back in 2010 and has been a regular since
\r\nthen. At some point after that I knew that he was on my “special list”
\r\nof people who I could rely upon to fill the queue if needed.

\r\n

And as I sat there crying I realized that he had also sneaked onto my
\r\nlist of friends.

\r\n

I’ve not always been a fan of the New Year Show, but now I am glad for
\r\nit. While I may never get to share a beer with him any more, or take him
\r\nup on his promise to let me fire off some rounds on his farm, I did at
\r\nleast get to shoot the breeze with him for many a happy hour.

\r\n

Goodbye old friend you will be missed

\r\n

Anonymous
\r\nA Ramble for FiftyOneFifty: King of Ramblers

\r\n

I am writing a Ramble for a man I knew only as FiftyOneFifty.  I never knew his real name,
\r\nnor do I know if he knew mine.  In many things, Names do not matter, People, Actions, and
\r\nfeeling do.   We podcasted together off and on, over several years.  I don’t recall exactly
\r\nhow many.   It doesn’t matter now, since they are all that there will ever be.  We grew to be
\r\ngood friends.  I never met him in person, online life is like that.  I only know my life would be
\r\nmuch poorer, if I had not known him.  Hearing he died, shattered me.  This Ramble is my try
\r\nat putting most the pieces back in place.  Of course, nothing can replace the largest piece,
\r\nthe Man Himself.  My heart and prayers go out to those friends and family dealing with his loss.

\r\n

His death is a harsh, unchangeable, fact.  I shall focus on his life, and things better remembered
\r\nthan the wall we all will hit one day.  Fifty was a man if Life, Joy, and passions.  That is how I shall
\r\nwrite of him.  I had a far too short time, to learn about him, and from him.  It will also  warm my heart,
\r\nwhere he live yet, and has for a long time.  I learned this fact, only after I could no longer talk with him.

\r\n

I found him easy to talk with, and listen to.  He was also “Vaccinated with a Victrola Needle ”  as
\r\nmy relatives might say.  He could ramble on for hours. enjoyably.  He virtually always made sense,
\r\neven when in his cups.  He shared himself, his hobbies, experience, and his travels with us, on our
\r\npodcasts.  While he went to Linux events, he never limited himself to just linux topics.  He reported the
\r\nnon Linux features of events.  This great for choosing family trips to them.   He included accommodations, restaurants, and pubs in the area.  I don’t travel, or drive, so these second hand visit were a delight.

\r\n

His research and Linux activities made up much of his contribution to our podcasts.  He life also
\r\nflowed in, to entertain and inform us.  He lived in the country, farming, cows, trouble getting Internet
\r\nservice were included.  My parents can off farms, so he even kept my ties to that life alive.  Firearms, cars, especially his beloved Hearse were shared interests.  tale from his tech support work, for businesses and schools enlightened me.  Farmers are natural pack rats, so gathering all sorts of discarded computer gear was natural.   Unfortunately he lost most of it in the fire which destroyed his house.   Losing his house, and even his dear father, never seemed to blight his spirit or life, in the long run.  It would be natural to keep such private matters from more distant friends, as I was.  Nor did his long illness color the side of him I saw.  it got in his way, sometimes,  as I recall, but never in his spirit.  I wish I had been closer, to offer myself more to the man I miss dearly.  I must just try to use his independent example, in my own life.  Anyone could do much, worse.   His quiet touch helped heal me in ways I am only now realizing.

\r\n

I started the day in tears, still aching from losing a rare, true friend.  Then I recalled a song from Toby Keith, called “Cryin’ for Me (Wayman’s Song ) written about he loss of his close friend, Wayman Tisdale.  Toby found about his friends passing on Friday.  On Sunday Toby was driven to write the memorial song.  In it he says his tears are not for his lost friend, who is now in Heaven, but for Toby himself, and all those family, and friends, Wayman left behind.  I believe Fifty is in Heaven, with his Dad, and those who have gone before.  He will see things from the Good Seats.  He can enjoy all the Holidays, and never feel the cold.  I was driven to write like Toby, to handle my own shock and grief.  We Cry and Mourn, those left behind in the Mortal world, for our loss and pain.  Our dear One is beyond pain, perhaps for the first time in years.  He has earned his time in Grace.  He as paid as we pay now, for life beyond grief, with those who have gone ahead.   I hope my words and memories may help  the ones he left behind.  Pain is a Mortal thing. It need not be deadly, or poisonous.  Fifty’s Life is a great example of this and many other things.  I hope we can go forward, with his example helping heal our loss of him.    God Bless You, Fifty, and those you touched in turn.

\r\n',269,0,1,'CC-BY-SA','LinuxLugCast, FiftyOneFifty, Memorial, Syndication',0,0,1), (2929,'2019-10-24','Recovering Files from a Dead MacBook Air',482,'I talk about recovering the files from my wife\'s dead MacBook Air using an Ubuntu Live CD.','

I talk about becoming a household hero by recovering my wife\'s files from her dead MacBook Air. Her laptop would not boot, shutting down seconds into the process each time she tried to start it up. I used an Ubuntu Live CD (DVD), with the commands fdisk and fsck to repair the damaged filesystem on the Mac. It still wouldn\'t boot even with the repaired filesystem, but I was able to mount the drive and copy her files to a USB drive.

\r\n\r\n

Links

\r\n\r\n\r\n',238,0,0,'CC-BY-SA','Ubuntu,Mac OS X,File Recovery,Filesystem Repair',0,0,1), (2931,'2019-10-28','Wallabag for on premises article aggregation',690,'In this episode, I describes my trials and eventual triumph in installing Wallabag','

Addendum

\r\n

I forgot to mention that Wallabag is also offered as a service for a small fee. Check out the website for more information.

\r\n

Links

\r\n\r\n',300,0,0,'CC-BY-SA','self-hosted, docker',0,0,1), (2939,'2019-11-07','Submit a show to Hacker Public Radio in 10 easy steps',601,'This is a 10 step walkthrough of submitting a show to HPR','

Steps

\r\n
    \r\n
  1. Record your episode
  2. \r\n
  3. Go to https://hackerpublicradio.org
  4. \r\n
  5. Click on "Give Shows"
  6. \r\n
  7. Click on "Calendar" (the link is not obvious, so use your browser\'s find functionality to search for the word "Calendar").
    \r\nEdit: Please use the ⇧Upload⇧ link in the menu bar\r\n
  8. \r\n
  9. Choose a slot
  10. \r\n
  11. Submit your email address
  12. \r\n
  13. Click the link in the confirmation email
  14. \r\n
  15. Create your profile (if new), then fill in the form with title, summary and show notes
  16. \r\n
  17. Attach your episode and submit (wait for long upload process)
  18. \r\n
  19. Receive your confirmation email, and enjoy your episode!
  20. \r\n
\r\n',300,45,0,'CC-BY-SA','podcast, hpr, how-to',0,0,1), (2926,'2019-10-21','Full Circle Magazine',181,'Just a short show to request support for one of the Linux communities longest standing Magazines','

Hi Everyone in HPR land this is Tony Hughes coming to you from Studio B at Woodbrooke Quaker Study Centre in Birmingham in the UK, where I am currently staying for a week of voluntary work.

\r\n

The reason for this short episode is to talk about a community magazine that I have been reading since I started to use Ubuntu Linux back in 2007. Full Circle magazine actually produced a pilot issue in April of 2007 and issue one was issued in June 2007. All issues are published as a free pdf download and all the content is under a Creative Commons licence.

\r\n

Free Circle Magazine initially started as an Ubuntu (and official spins of Ubuntu) magazine but over the years while still being officially about Ubuntu or Linux Distributions based on Ubuntu, many of the articles are applicable to those across the Linux community.

\r\n

Over the years, as well as printing one off articles about individuals’ journey to using Linux, reviews and letters from readers, there have been regular series on topics such as Inkscape, Python programming, Open/LibreOffice, Virtualisation and much more.

\r\n

Sadly after over 12 years of producing a regular monthly magazine for the Linux community some of the regular article series are coming to an end and due to ill health at least one regular writer is not able to contribute at the moment, and this is leaving the magazine short of content and in danger of possibly coming to an end.

\r\n

As a podcast community that is used to the idea of crowd sourced content, many of whom are also Linux users, could I ask that some of you that have read Full Circle, but never contributed, consider sending in some content. It could be an article on how you started using Linux, about some Linux software that you think the readers may be interested in learning more about, or just a letter to Ronnie to say thanks for all his efforts putting out a magazine every month for the last 12+ years.

\r\n

Like many things we often don’t miss them until they are gone, and I would hate to think that Full Circle Magazine is one of those things that I will miss in the future. I have put my money where my mouth is and in coming issues you may see me in print, talking about podcasting. You could even use any writing you do as the base for a HPR show, and achieve two goals in one go.

\r\n

All the best for now.

\r\n

Links

\r\n\r\n',338,0,0,'CC-BY-SA','Full Circle Magazine, Ubuntu, Linux, Free Magazine, Creative Commons',0,0,1), (2934,'2019-10-31','Server Basics 106: Namespaces and containers',2033,'Klaatu talks about the unshare and lxc commands','

\r\nNamespaces provide context and constraints for processes on a Linux system.\r\nThey are utilised by the infrastructure of \"the cloud\" to create distinct \"containers\", in which processes may run without awareness of the system they are actually running upon.\r\n

\r\n\r\n
\r\n// prove you are not running some process\r\n\r\n$ pidof tcsh\r\n// nothing\r\n\r\n$ sudo pidof tcsh\r\n// nothing\r\n\r\n// launch tcsh in a new namespace with unshare:\r\n\r\n$ sudo unshare --fork --pid --mount-proc tcsh\r\n\r\n// from within that session:\r\n\r\n# pidof tcsh\r\n1\r\n\r\n// wait what??\r\n// yes tcsh is the first pid of its own namespace\r\n\r\n// from another term\r\n$ ps 1\r\ninit\r\n\r\n$ pidof tcsh\r\n26814\r\n\r\n// from inside the namespace, pid is seen as 1\r\n// from outside, pid is normal\r\n\r\n$ ps tree | less\r\n// search for tcsh\r\n\r\n// See evidence of namespaces:\r\n\r\n$ ls /proc/*/ns\r\n\r\n$ ls /proc/26814/ns\r\nipc net pid user uts [...]\r\n
\r\n\r\n

\r\nTo see this in action for a slightly more pragmatic purpose, you can use the lxc command.\r\nThe LXC system uses namespaces and cgroups to create functional containers that act, more or less, like a Virtual Machine, except that they are built in containers so that they do not have to emulate hardware.\r\n

\r\n

If your system doesn\'t have LXC installed, first install it:\r\n

\r\n\r\n
\r\n$ sudo dnf install lxc lxc-templates lxc-doc\r\n\r\n// on Ubuntu or Debian:\r\n\r\n$ apt install lxc\r\n\r\n
\r\n\r\n

\r\nYou also need to create a network bridge so that your container and your host system (that\'s the computer you\'re sitting in front of right now) can communicate.\r\n

\r\n\r\n
\r\n$ sudo ip link add br0 type bridge\r\n$ sudo ip addr show br0\r\n7: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc\r\n   noop state DOWN group default qlen 1000\r\n   link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff\r\n
\r\n

\r\nNow give your bridge device an IP address that doesn\'t conflict with any existing IP address on your network:\r\n

\r\n
\r\n$ sudo ip addr add 192.168.168.168 dev br0\r\n$ sudo ip link set br0 up\r\n
\r\n\r\n

\r\nCreate a configuration for your container.\r\nYou can base this on the samples provided by lxc (located in /usr/share/docs/lxc or similar).\r\nEverything but veth, br0, and up is arbitrary. You can make up all the values.\r\n

\r\n\r\n
\r\nlxc.utsname = hackerpublicradio\r\nlxc.network.type = veth\r\nlxc.network.flags = up\r\nlxc.network.link = br0\r\nlxc.network.hwaddr = 4a:49:43:49:79:bd\r\nlxc.network.ipv4 = 192.168.168.1/24\r\nlxc.network.ipv6 = 2003:db8:1:0:214:c0ff:ee0b:3596\r\n
\r\n\r\n

\r\nNow install an OS into your container.\r\nOS templates are provided by LXC in /usr/share/doc/lxc/templates or a similar location.\r\n

\r\n\r\n
\r\n$ ls -m /usr/share/lxc/templates/\r\nlxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos [...]\r\n
\r\n\r\n

\r\nChoose a template and install.\r\nI use Alpine in the recorded show, because it\'s supposed to be really small.\r\nI don\'t necessarily recommend Alpine. I recommend Slackware, of course.\r\n

\r\n\r\n
\r\n$ sudo lxc-create --name slackware --template slackware\r\n
\r\n\r\n

\r\nOnce the install is done, start your container:\r\n

\r\n\r\n
\r\n$ sudo lxc-start --name slackware\r\n--rcfile ~/mycontainer.conf\r\n
\r\n\r\n

\r\nNow attach to the container:\r\n

\r\n\r\n
\r\n$ sudo lxc-attach --name slackware\r\n#\r\n
\r\n\r\n

\r\nRun a command.\r\n

\r\n\r\n
\r\n# uname -av\r\nLinux hackerpublicradio 5.3.0.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\r\n
\r\n\r\n

\r\nThis is the technology that Docker and OCI projects use to create containers.\r\nAnd when a bunch of containers start swarming around on a bunch of hosts, you eventually end up with a cloud.\r\nHow do you manage all of these things?\r\nThat will be the topic for the next entry in this series, I\'ll bet.\r\n

\r\n',78,0,0,'CC-BY-SA','server,container,docker,serverless,cloud,sys admin,kubernetes',0,0,1), (2935,'2019-11-01','The work of fire fighters, part 3',1807,'The continued introduction into the work of fire fighters','

Continued general basic knowledge of fire fighting.

\r\n

Talking about large water system, breathing gear, “the walk”, flash-over and back-draft.

\r\n',369,0,0,'CC-BY-SA','fire fighting, fire brigade',0,0,1), (2941,'2019-11-11','Server Basics 107: Minishift and container management',2331,'Klaatu introduces Minishift, a local test environment for a single-node cloud','

Learn \"the OS of the cloud\" with minishift or minikube\r\n

',78,0,0,'CC-BY-SA','server,container,docker,serverless,cloud,sys admin,kubernetes',0,0,1), (2943,'2019-11-13','Music as Life',582,'quantum harmony','\r\n

Background sounds provided by some road noise, and a train.

\r\n',329,0,1,'CC-BY-SA','science',0,0,1), (3196,'2020-11-02','HPR Community News for October 2020',5375,'Dave and Ken review the months happenings, and try various pronunciations of Cedric De Vroeys name.','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3174Thu2020-10-01Linux Inlaws S01E14: The big programming language panelmonochromec
3175Fri2020-10-02International KeyboardAhuka
3176Mon2020-10-05HPR Community News for September 2020HPR Volunteers
3177Tue2020-10-06Zero cost VPNnorrist
3178Wed2020-10-07Finishing the Recumbent BicycleBrian in Ohio
3179Thu2020-10-08MakeMKV to back up media, and a QuestionArcher72
3180Fri2020-10-09GIMP: Miscellaneous ToolsAhuka
3181Mon2020-10-12RealVNC cloud offeringJWP
3182Tue2020-10-13Yo-ho-ho, and a bottle of CholecalciferolDave Morriss
3183Wed2020-10-14Don\'t trust zipfilesCedric De Vroey
3184Thu2020-10-15Linux Inlaws S01E15: IT Security and stick insectsmonochromec
3185Fri2020-10-16Pandemics In HistoryAhuka
3186Mon2020-10-19A light bulb moment, part 2MrX
3187Tue2020-10-20Ansible for Dynamic Host Configuration Protocolnorrist
3188Wed2020-10-21Thrift store quick fixArcher72
3189Thu2020-10-22How the Dutch dig GravesKen Fallon
3190Fri2020-10-23GIMP BrushesAhuka
3191Mon2020-10-26Swedish Corona ExperienceDaniel Persson
3192Tue2020-10-27A light bulb moment, part 3MrX
3193Wed2020-10-28Meet AntithesisPaul Quirk
3194Thu2020-10-29Linux Inlaws S01E16: The count and the questionsmonochromec
3195Fri2020-10-30For your Consideration - the ideal Ham Radio setupArcher72
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 14 comments in total.

\n

Past shows

\n

There is 1 comment on\n1 previous show:

\n\n

This month\'s shows

\n

There are 13 comments on 9 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-October/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Call for shows

\n\n

Question

\n\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nDave Morriss

\n

Over the period tags and/or summaries have been added to 6 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3221,'2020-12-07','HPR Community News for November 2020',2948,'HPR Volunteers talk about shows released and comments posted in November 2020','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Padraig Jeroen Fallon.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3196Mon2020-11-02HPR Community News for October 2020HPR Volunteers
3197Tue2020-11-03Pens, pencils, paper and ink - 3Dave Morriss
3198Wed2020-11-04Income Life insurance and then ChopinPaul Quirk
3199Thu2020-11-05Bad Audio Weed Eater Bugs Sprinkler and Bubbles !operat0r
3200Fri2020-11-06Better Social Media 17 - OcapPubAhuka
3201Mon2020-11-09A small intro to 3D printingJeroen Baten
3202Tue2020-11-10A big QuestionPadraig Jeroen Fallon
3203Wed2020-11-11The Paul Quirk show: Retro ComputingPaul Quirk
3204Thu2020-11-12Getting Started in 3D PrintingThaj Sara
3205Fri2020-11-13Backups of your Backups of Backupsoperat0r
3206Mon2020-11-16Dungeons and Dragons for the blindklaatu
3207Tue2020-11-17Fireside chat with E NigmaKen Fallon
3208Wed2020-11-18The Paul Quirk show: Wacom with Pinebook, and thoughts on the DMCA takedownPaul Quirk
3209Thu2020-11-19Linux Inlaws S01E17: Nextcloudmonochromec
3210Fri2020-11-20GIMP: Patterns and GradientsAhuka
3211Mon2020-11-23Chainsawsoperat0r
3212Tue2020-11-24A Pi Model 3B as your daily driver? You must be joking.Beeza
3213Wed2020-11-25Electrical SafetyPaul Quirk
3214Thu2020-11-26Rant about websitesoperat0r
3215Fri2020-11-27Why I Gave Away a 3-D PrinterAhuka
3216Mon2020-11-30Buying a second home in FranceJeroen Baten
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 13 comments in total.

\n

Past shows

\n

There are 7 comments on\n6 previous shows:

\n\n

This month\'s shows

\n

There are 6 comments on 5 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-November/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

There were no tag or summary updates in the past month.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2942,'2019-11-12','Why I love lisps',509,'A very wooden and scripted episode about why I love the lisp programming language family','

Syntax example

\r\n
(define (fib-rec n)\r\n  (if (< n 2)\r\n      n\r\n      (+ (fib-rec (- n 1))\r\n         (fib-rec (- n 2)))))\r\n
\r\n

Structured Editing

\r\n

Parinfer: https://shaunlebron.github.io/parinfer/

\r\n

Paredit: https://www.emacswiki.org/emacs/ParEdit

\r\n

Clojure libraries

\r\n

core.match (adds pattern matching): https://github.com/clojure/core.match

\r\n

core.logic (prolog-like stuff): https://github.com/clojure/core.logic

\r\n

overtone: https://github.com/overtone/overtone

\r\n

Other stuff

\r\n

Clojure macro explanation: https://learnxinyminutes.com/docs/clojure-macros/

\r\n

Books

\r\n

The little schemer: https://mitpress.mit.edu/books/little-schemer-fourth-edition

\r\n

Clojure for the brave and true: https://www.braveclojure.com/

\r\n',381,0,0,'CC-BY-SA','lisp, programming',0,0,1), (2955,'2019-11-29','Machine Learning / Data Analysis Basics',1293,'We talk about different machine learning techniques','

In this episode, I talk about different techniques that we can use to predict the outcome of some question depending on input features.

\r\n

The different techniques I will go through are the ZeroR and OneR that will create a baseline for the rest of the methods.

\r\n

Next up, we have the Naive Bayes classifier that is simple but powerful for some applications.

\r\n

Nearest neighbor and Decision trees are next up that requires more training but is very efficient when you infer results.

\r\n

Multi-layer perceptron (MLP) is the first technique that is close to the ones we usually see in Machine Learning frameworks used today. But it is just a precursor to Convolutional Neural Network (CNN) because of the size requirements. MLPs have the same size for all the hidden layers, which makes it unfeasible for larger networks.

\r\n

CNNs, on the other hand, uses subsampling that will shrink the layer maps to reduce the size of the network without reducing the accuracy of the predictions.

\r\n

Links

\r\n',382,0,0,'CC-BY-SA','machine learning, basics, theory',0,0,1), (2944,'2019-11-14','ONICS Basics Part 4: Network Flows and Connections',989,'I try to add a bit more basic networking info while writing a quick script for Dave Morris','

Terminology

\r\n\r\n

The topflow.sh Script

\r\n
#!/bin/sh\r\n\r\n# Start a capture in the background that drops the packets\r\n# and just reports the flow events\r\npktin $1 | nftrk -d -f /tmp/flows.txt &\r\nPID=$!\r\n\r\n# On CTRL-C clean kill the capture and clean up\r\ntrap "kill $PID ; rm -f /tmp/flows.txt /tmp/topflows.txt /tmp/namecache.txt ; exit 0" INT TERM\r\n\r\n# Once per second do\r\n#   look at the last 100 flows\r\n#   sort them by 5-tuple\r\n#   remove duplicates\r\n#   convert ports, protocols and addresses to names\r\n#   sort by data usage per flow in reverse order (highest first)\r\n#   a little more pretty printing\r\n#   only take the top 20 lines\r\n#   clear the screen and print the result\r\nwhile [ 1 ] ; do\r\n    tail -100 /tmp/flows.txt |\r\n            sort -s -t '|' -k 3,3 |\r\n            awk -f uniqflows.awk  |\r\n            awk -f prflow.awk  |\r\n            sort -s -t ',' -k 3 -r |\r\n            awk -f columns.awk |\r\n            head -20 > /tmp/topflows.txt\r\n    clear\r\n    cat /tmp/topflows.txt\r\n    sleep 1\r\ndone\r\n
\r\n

You can find the complete code at: https://gitlab.com/onics/onics-examples

\r\n',259,61,0,'CC-BY-SA','command line networking',0,0,1), (2945,'2019-11-15','Saturday at OggCamp Manchester 2019',2225,'Interviews and chat from the UK\'s largest FLOSS event.','

\r\nOggCamp is an unconference celebrating Free Culture, Free and Open Source Software, hardware hacking, digital rights, and all manner of collaborative cultural activities and is committed to creating a conference that is as inclusive as possible.
\r\nThis year a team of HPR volunteers hit the show.\r\n

\r\n

\r\n
\r\nKen\'s recording kit and some of the stickers.\r\n

\r\n

\r\n
\r\nDave, Andrew Conway/mcnalu and Timttmy getting the booth ready.\r\n

\r\n

\r\n
\r\nOnly HPR hosts can sign the booth.\r\n

\r\n

\r\n
\r\nYannick signs the booth.\r\n

\r\n

\r\n
\r\nTimttmy\'s script to turn an Android phone into a webcam. Two versions of the script to take a screenshot and post it to the web.\r\n

\r\n

\r\n
\r\nSurveillance state ?\r\n

\r\n

\r\n
\r\nOur latest host Nihilazo signs the booth.\r\n

\r\n

\r\n
\r\nAn Interview with Ban Parsons from the Matrix An open network for secure, decentralized communication\r\n

\r\n

\r\n
\r\nAn Interview with mystorm.uk makers of the open FPGA. An FPGA chip is a re-programmable piece of silicon hardware, it can be reconfigured or programmed to a logic circuit of your own design.\r\n\r\n
\r\nIn 2016 we decided to setup up the myStorm project in order to build OpenSource FPGA hardware. Several years later we are building the 5th generation of BlackIce Development boards. BlackIce Mx the latest generation of our hardware has been built using BlackEdge open hardware standard which enable the \'Core\' Board IceCore to be separated from its carrier board which provides MixMod and Pmod hardware add-ons. Please take a look at the myStorm forum to ask questions and participate in our community. \r\n\r\n

\r\n

\r\n
\r\n

\r\n

\r\n
\r\n

\r\n

\r\n
\r\nAn Interview with Erik Grun of the Free Software Foundation Europe about their campaign for Public Money? Public Code!\r\n

\r\n',30,78,0,'CC-BY-SA','OGGCamp, FSFE, Matrix, BlackEdge, mystorm, blackice, fswebcam, android, sshpass',0,0,1), (2946,'2019-11-18','Sunday at OggCamp Manchester 2019',3378,'Interviews and chat from the UK\'s largest FLOSS event.','

\r\n
\r\nbeni, Andrew Conway/mcnalu, Timttmy, and Dave at the HPR booth.\r\n

\r\n

\r\n
\r\nMichael from Electric Flap Jack Custom Built Guitars, and author of Fretboard Template Generator available on GitHub\r\n

\r\n

\r\n
\r\nPerspex template for carving the body and neck.\r\n

\r\n

\r\n
\r\nA work in progress.\r\n

\r\n

\r\n
\r\nTools for making guitar, including the tool to round the frets.\r\n

\r\n

\r\n
\r\nAnd of course you need a guitar stand.\r\n

\r\n

\r\n
\r\nFretboard Template Generator available on GitHub\r\n

\r\n

\r\n
\r\nTai Kedzierski hanging out with \"Grumpy\" Mike Cook.\r\n

\r\n

\r\n
\r\nMike produces electronic musical instruments for people with accessibility issues.\r\n

\r\n

\r\n
\r\nHe also has a book called Arduino Music and Audio Projects to help you do this yourself.\r\n

\r\n

\r\n
\r\n\r\nAt Drake Music we are leaders in music, disability and technology.
\r\nWe are innovators, educators, curators and advocates. We believe everyone has the right to express themselves creatively through music. We use new technologies and ideas to open up access to music for all. Our vision is a world where disabled and non-disabled musicians work together as equals.
\r\n

\r\n

\r\n
\r\nThe bat base.\r\n

\r\n

\r\n
\r\n

\r\n

\r\n
\r\n

\r\n

\r\n
\r\n

\r\n

\r\n
\r\nThe Cattle Caster.\r\n

\r\n

\r\n
\r\nThe Arduino Caster\r\n

\r\n

\r\n
\r\nThe Open Rights Group.
\r\n\r\nOpen Rights Group protects the digital rights of people in the UK including privacy and free speech online. We are funded by over 3,000 people like you.\r\n\r\n

\r\n

\r\n
\r\nManchester Grey Hats
\r\n

Manchester Grey Hats is a place for all those interested in hacking and cyber security to learn and share. We run capture the flags, workshops and perform/present security research.

\r\n

We encourage all skill levels and those from all backgrounds. Are you an aspiring hacker or a developer thinking about security? Come along and learn. Presenting is open to all members, so if you have something you’d like to present but aren’t ready for the big conferences, get in touch.

\r\n\r\n

Said best by The Mentor – “This is our world now… the world of the electron and the switch, the beauty of the baud”

\r\n\r\n

Although we meet face to face once a month, MGH is mostly an online community. We encourage people to join us in person for workshops and events but if you can\'t, join us on Slack and our live stream.

\r\n

\r\n

\r\n
\r\nAn example of the of the locks that needed to be picked for the FlawCon Capture the Flag event.\r\n

\r\n

\r\n
\r\n

\r\n

\r\n
\r\n

\r\n

\r\n
\r\n

\r\n

\r\n
\r\nHow to hold the lock while you are picking it.\r\n

\r\n',30,78,0,'CC-BY-SA','OGGCamp, FSFE, Matrix, BlackEdge, mystorm, blackice, fswebcam, android, sshpass',0,0,1), (2947,'2019-11-19','The Mimblewimble Protocol',1261,'mimblewimble is a new blockchain protocol for scalability, privacy and fungibility','

Financial privacy is critical for adoption of cryptocurrency as a means of exchange. Individuals worry about employers monitoring their spending details, insurers increasing rates based on purchases and landlords raising rents when they get a promotion. Businesses can only operate using cryptocurrency if they can prevent disclosure of vendor payments, rates paid to suppliers, payroll details, and so on. At the same time, they need to selectively disclose financial data to governments and might need to demonstrate compliance in some industries.

\r\n

Mimblewimble is a new protocol that uses cryptography to achieve striking reductions in blockchain size, so users can run a full node on low powered devices like phones. It offers the strongest privacy protection assurances around, through a variety of clever tricks. For one thing, transaction history is not recorded, which also results in a smaller blockchain. There are no addresses and no transaction amounts are recorded.

\r\n

We’re not going to focus on the cryptography, although it’s a fascinating example of just how much progress is being made in recent years. We’ll focus instead on what makes this mysterious network protocol unique among cryptocurrencies.

\r\n',379,110,0,'CC-BY-SA','blockchain, privacy',0,0,1), (2954,'2019-11-28','Wrestling As You Like It episode 1',462,'A Wrestling podcast reporting on indie wrestling. Today we are talking about different TV styles.','

TV and pro wrestling go hand in hand. Both have fed off of each other, and with the internet we are now exposed to many different promotions with their own visual style in order to broadcast wrestling in the ring.

\r\n',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1), (2949,'2019-11-21','Grin and Beam: The 2 major mimblewimble blockchains',1387,'Grin and Beam are two mimblewimble implementations that are very different & we take a look at both','

Last time we reviewed the mimblewimble protocol for blockchain networks. This is an innovative protocol focused on privacy and scalability.

\r\n

In this episode we take a closer look at the two major implementations of mimblewimble, called Grin and Beam. They are both interesting projects that take very different approaches, yet both have managed to launch working blockchains that preserve the core strengths of the protocol.

',379,110,1,'CC-BY-SA','blockchain, privacy',0,0,1), (2960,'2019-12-06','Dehydrated Foods',835,'Dehydrating your own fruits and vegetables for healthy snacks','

I have begun to dehydrate fruits and vegetables at home with my own dehydrator, and it lets me have fresher products without all of the additives. In this episode I discuss both the why and the how.

\r\n',198,100,0,'CC-BY-SA','Health, Diet',0,0,1), (2958,'2019-12-04','Haskell modules',1387,'Tuula talks about haskell modules','

With small programs it’s easy enough to have all code in single file. But as the program grows, you eventually want to organize things into separate files. In this episode I’ll talk a bit how to define modules and how to use them.

\r\n

Defining

\r\n

Each module is defined in separate file. In our example, we have file called multiplexer.hs, which contains our module definition.

\r\n

At the beginning of the file, we have following:

\r\n
module Multiplexer (mix, match, Plexer, Scooper(..))\r\n  where\r\n  ....
\r\n

We’re omitting actual function and type definitions as they aren’t important to this episode. In any case, there’s two functions: mix and match and two types: Plexer and Scooper that module exports (that is, these are available outside of the module). Plexer is imported as a type only and Scooper with field accessors or value constructors depending if it’s a record or algebraic datatype.

\r\n

Using modules

\r\n

In order to be able to use identifiers defined in separate module, we have to import them into our current one. In our imaginary program, we have main.hs that defines entry point for our program and we would like to import the definitions from Multiplexer module.

\r\n

Easiest one is to just have import Multiplexer at the start of the main. This brings all exported identifiers from Multiplexer and we can then use them. Both qualified and unqualified names are imported. Qualified means name is prepended with module name: Multiplexer.mix instead of just mix.

\r\n

If we want, we can specify what exactly should be imported: import Multiplexer (mix, match). This causes only functions mix and match be imported, while Plexer and Scooper are unavailable for us. Again, both qualified and unqualified names are imported.

\r\n

In case we want only qualified names, we’ll write import qualified Multiplexer. After this mix isn’t available, but Multiplexer.mix is (and all the other identifiers exported by Multiplexer).

\r\n

Sometimes module name is long and tedious to repeat when using qualified names. In these cases, renaming module while importing is a good option. This can be done by writing import Multiplexer as M. After this, instead of Multiplexer.mix you write M.mix.

\r\n

Final thing I’m going to mention is importing everything else except specified identifiers. This is done by writing import Multiplexer hiding (mix). This imports everything exported by Multiplexer, except mix.

\r\n

Summary

\r\n

There are many ways of importing and they can be mixed. Here’s a list of them:

\r\n\r\n

In short:

\r\n\r\n

Prelude

\r\n

Prelude is base module containing lots of helpful types and functions, which is automatically imported by every module. If this is not what you want, there’s two options. First one is to use pragma at start of the file: {-# LANGUAGE NoImplicitPrelude #-}, which causes Prelude not to be imported. Another one is to manually import Prelude, which turns of automatic import: import qualified Prelude as P.

\r\n

Closing

\r\n

When system grows, it’s helpful to break it into more manageable pieces. For this we use modules. import is used to bring identifiers from other modules into current one.

\r\n

Questions, comments and feedback is welcomed. Best way to reach me is either email or in fediverse where I’m Tuula@mastodon.social

\r\n',364,107,0,'CC-BY-SA','haskell, modules',0,0,1), (2951,'2019-11-25','A walk through my PifaceCAD Python code – Part 2',888,'In this episode I cover some generic functions at the top of the code.','

Code

\r\n

The script being discussed in this show is available for download with this show: cad-menu.py

\r\n

GENERIC FUNCTIONS

\r\n\r\n

GENERIC BLINKSTICK FUNCTIONS

\r\n\r\n

END BLINKSTICK FUNCTIONS

\r\n\r\n
# Local Variables (for function writelongstring)\r\nDisplaySize = 15\r\n# Number of characters  that can be displayed on 1 line of display\r\n\r\nStepSize = 4\r\n# Step size when scrolling message on display\r\n\r\nScrollSpeed =   0.55\r\n# Adjusts scroll speed, delay in seconds between scrolls\r\n\r\nScroll = 0\r\n# Default value for scroll, used when string is smaller than display size
\r\n\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1), (2952,'2019-11-26','Publishing your book using open source tools',1562,'How I evolved from writing with a publisher to self-publishing using open source tools','

Printing on demand website: https://www.lulu.com

',369,0,0,'CC-BY-SA','asciidoc,asciidoctor,lulu,writing,books',0,0,1), (2953,'2019-11-27','How I got started in Linux',276,'How I start in Linux, computing, and Free Software','

Osdisc.com is the website that I mentioned while distro hopping. Unfortunately, as of August 2019, their site is no longer sending CD’s/DVD’s.

\r\n

How I recorded:
\r\nAndroid phone, lapel mic, and Audio Recorder app found here:

\r\n

https://play.google.com/store/apps/details?id=com.github.axet.audiorecorder

\r\n

And here:

\r\n

https://f-droid.org/en/packages/com.github.axet.audiorecorder/

\r\n',318,29,0,'CC-BY-SA','Linux, FreeBSD, Computers',0,0,1), (2957,'2019-12-03','Lord D\'s Film Reviews: Ever',1025,'Lostnbronx reviews a recent drama/romance.','

Ever
\r\nWritten/Directed by Josh Beck
\r\nStarring Wendy McColm & Christina Elizabeth Smith
\r\nCinematography by Micah Van Hove
\r\nRunning Time: 1:37:42

\r\n

https://www.youtube.com/watch?v=5F-XfwIvmMg

\r\n

A young woman named Ever, while grieving over a devastating loss, meets Emily, who helps her to heal and find love again.

\r\n',107,109,0,'CC-0','review, film, lord d',0,0,1), (2959,'2019-12-05','Interview with Josh Clements about gpodder.net ',2314,'What starts as an Interview and ends in a brain storm.','

\r\nIn today\'s show Ken interviews Josh Clements from the gpodder.net project.\r\n

\r\n

\r\nJosh answered the call to arms he heard on the Ubuntu Podcast. We discuss the plan and explain how you can also get involved.\r\n

\r\n

Links

\r\n\r\n',30,78,0,'CC-BY-SA','gpodder.net, Josh Clements',0,0,1), (2961,'2019-12-09','Kubernetics / Cloud - Terminology',664,'We talk about terms often used when using Kubernetes','

We talk about terms often used when using Kubernetes.

\r\n

Terms we talk about

\r\n\r\n',382,0,0,'CC-BY-SA','kubernetics, basic, terminology',0,0,1), (2968,'2019-12-18','Life and Times of a Geek part 3',2441,'Part 3 of my personal story of experiences with computers','

Introduction

\r\n

In the last part of my story (show 1811 in 2015) I told you about some of my experiences at the University of Manchester as a postgraduate student from around 1973.

\r\n

Today I want to talk a little more about my time in Manchester and mention some of the things I did that may be of interest to Hackers!

\r\n

Researching for the episode

\r\n

As I have been researching for this HPR episode I realise how long ago some of these events were - in Internet years particularly. In many cases I could find no online records of places, equipment or people. This seems to be because any records there might be are on paper and have never made it online. I contacted a company that made some of the laboratory equipment I used that I thought might be of interest, and the person I contacted said that although he remembered what I was referring to the company had kept no records of it and had had to discontinue it due to modern safety concerns.

\r\n

I find this somewhat dispiriting and it makes me feel very very old!

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode. The HTML version can be viewed here and the ePub version downloaded from here.

\r\n

Links

\r\n\r\n',225,29,1,'CC-BY-SA','video recorder,Skinner box,logic gate,digitiser,Dobbie McInnes,Data General,teletype,Cyber-72,APL,Si',0,0,1), (2975,'2019-12-27','SimpleScreenRecorder and Vidcutter',311,'Two useful applications to record a screen, and to chop and trim a video ','

In today’s show Ken talks about two small applications to make recording and trimming video easy.

\r\n

What is SimpleScreenRecorder?

\r\n
\r\n

SimpleScreenRecorder is a Linux program that I’ve created to record programs and games. There were already a few programs that could do this, but I wasn’t 100% happy with any of them, so I created my own.

\r\n

My original goal was to create a program that was just really simple to use, but as I was writing it I started adding more and more features, and the result is actually a pretty powerful program. It’s ‘simple’ in the sense that it’s easier to use than ffmpeg/avconv or VLC, because it has a straightforward user interface.

\r\n
\r\n

What is VidCutter

\r\n
\r\n

The simplest & sexiest tool for cutting and joining your videos without the need for re-encoding or a diploma in multimedia. VidCutter focuses on getting the job done using tried and true tech in its arsenal via mpv and FFmpeg.

\r\n
\r\n

Links

\r\n\r\n',30,0,1,'CC-BY-SA','SimpleScreenRecorder, Vidcutter, ffmpeg, ffprobe, mediainfo',0,0,1), (2980,'2020-01-03','FLOSS Weekly 553 - Hacker Public Radio',4037,'Randal Schwartz and Aaron Newcomb featured HPR on FLOSS Weekly ','

On the 30th Oct 2019 Kevin O’Brien (Ahuka) and Ken Fallon were interviewed about Hacker Public Radio by Randal Schwartz and Aaron Newcomb for FLOSS Weekly 553.

\r\n

This is that show and is released under a Creative Commons Attribution Non-Commercial No-Derivatives 4.0 International license.

\r\n

Links

\r\n',30,78,0,'CC-BY-NC-ND','Randal Schwartz, Aaron Newcomb, FLOSS Weekly',0,0,1), (2962,'2019-12-10','Bespoke bike building',1474,'Brian in Ohio continues his bike building project','

Links

\r\n\r\n

Pictures

\r\n

(The images below may be clicked to view the full-sized versions)

\r\n

\"Mocking
\r\nmocking up parts to see spacing, especially the crankset

\r\n

\"Laying
\r\nlaying out ‘fishmouth’ cut, used to connect two tubes

\r\n

\"Cutting
\r\nlay out fishmouth

\r\n

\"Cutting
\r\nanother layout picture, note marks on tube

\r\n

\"Cutting
\r\nfinished product

\r\n

\"Cutting
\r\ntest fitting assembly one, the engine room

\r\n

\"Brazing
\r\nbrazing complete! assembly one done

\r\n

\"Readying
\r\nsetting up assembly tube, gray tube slips inside the red tube

\r\n

\"Removing
\r\nneed to cut that small tab off, get to hear this in the recording

\r\n

\"Jigging
\r\njigging up the frame, similar to john kulps set up, see hpr 1282

\r\n

\"Still
\r\nstill in the jig but all brazed up, top half of frame done!

\r\n

\"More
\r\nthe next part will be modifiying the rear triangle and brazing it where i’m pointing to.

\r\n

Summary

\r\n\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent, recycle',0,0,1), (2963,'2019-12-11','A walk through my PifaceCAD Python code – Part 3',880,'In this episode I cover functions activated when a button is pushed on the PiFaceCAD board','

Code

\r\n

The script being discussed in this show is available for download with the previous show: cad-menu.py

\r\n

Functions

\r\n\r\n\r\n\r\n',201,38,1,'CC-BY-SA','Audio, Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1), (2964,'2019-12-12','Bolos and Bowties: Neckwear for Nerds',980,'I talk about ties, at least the kind I like to wear when the occasion calls for it.','

It\'s probably because of a non-conformist streak in me, but I\'ve never liked traditional neckties. In fact I never wanted to wear any ties until I got my first bolo tie, which was sufficiently different from everyone else and easy enough to put on that I decided I could wear bolo ties. I\'ve built a collection of about a dozen of these and they always get positive comments, especially the ones made from recycled circuit boards. Recently I\'ve expanded my horizons to include bowties, which have a more formal appearance and the added nerd factor of being difficult to tie for most people. In this episode I talk about my ties.

\r\n\r\n

Click image to view photo gallery

\r\n\r\n

\"Bolos

\r\n\r\n

Links

\r\n\r\n\r\n',238,0,0,'CC-BY-SA','Style, Fashion, Recycling, Upcycling, Circuit Boards, Ties, Bowties, Bolo Ties, Neck ties',0,0,1), (2969,'2019-12-19','Crewing a spaceship in Haskell',1358,'How to calculate amount of crew needed for a spaceship','

Intro

\r\n

Every spaceship in game needs a crew to operate it. Smaller ships with fewer components require less crew than huge ones with lots of components.

\r\n

Types

\r\n

Unit stats lists amount of crew required to operate a spaceship and if they need sleeping quarters.

\r\n
data UnitStats = UnitStats\r\n    { unitStatsMinimumCrew :: ![CrewRequirement]\r\n    , unitStatsNominalCrew :: ![CrewRequirement]\r\n    , unitStatsCrewSpace :: !TotalCrewSpace\r\n    , unitStatsCrewSpaceRequired :: !CrewSpaceReq\r\n    } deriving (Show, Read, Eq)
\r\n

Different positions a crew can have is an enumeration:

\r\n
data CrewPosition =\r\n    Commander\r\n    | Navigator\r\n    | Signaler\r\n    | SensorOperator\r\n    | Gunner\r\n    | Doctor\r\n    | Nurse\r\n    | Driver\r\n    | Helmsman\r\n    | Artificer\r\n    | Crew\r\n    | Passenger\r\n    deriving (Show, Read, Eq, Enum, Bounded)\r\nderivePersistField "CrewPosition"
\r\n

Rank of a crew member isn’t a military rank, but rather their position in ship’s internal hierarchy:

\r\n
data CrewRank =\r\n    SecondClass\r\n    | FirstClass\r\n    | Senior\r\n    | Chief\r\n    deriving (Show, Read, Eq, Enum, Bounded)\r\nderivePersistField "CrewRank"
\r\n

Amount of crew is newtype that helps me not to mix different types of numbers with each other.

\r\n
newtype CrewAmount = CrewAmount { unCrewAmount :: Int }\r\n    deriving (Show, Read, Eq, Ord, Num)
\r\n

Total crew space of a ship is divided to three different types: steerage, standard and luxury.

\r\n
data TotalCrewSpace = TotalCrewSpace\r\n    { totalCrewSpaceSteerage :: !(CrewSpace SteerageQuarters)\r\n    , totalCrewSpaceStandard :: !(CrewSpace StandardQuarters)\r\n    , totalCrewSpaceLuxury :: !(CrewSpace LuxuryQuarters)\r\n    } deriving (Show, Read, Eq)
\r\n

Again, crew space is newtype so I don’t mix different types of numbers with each other.

\r\n
data CrewSpace a =\r\n    CrewSpace { unCrewSpace :: CrewAmount }\r\n    deriving (Show, Read, Eq)
\r\n

I could have modeled fact that vehicle might need crew space with Bool, but having a descriptive name and type is more to my liking.

\r\n
data CrewSpaceReq =\r\n    CrewSpaceRequired\r\n    | CrewSpaceOptional\r\n    deriving (Show, Read, Eq)\r\nderivePersistField "CrewSpaceReq"
\r\n

The fact that single person could manage multiple components is reflected by ComponentCrewReq having Double instead of Integer

\r\n
-- | Crew requirements for a component\r\ndata ComponentCrewReq =\r\n    ComponentCrewReq CrewPosition Double\r\n    deriving (Show, Read, Eq)
\r\n

In closing

\r\n

If you have questions, comments or feedback, easiest way to catch me nowdays is by email or in fediverse where I’m Tuula@mastodon.social

\r\n',364,107,0,'CC-BY-SA','haskell, problem solving',0,0,1), (2965,'2019-12-13','instant feedback for students in maths',838,'How we use old CAS software to give students instant feedback in their maths homework','

I\'m trying to make sure that this show doesn\'t come across as as advertisment placement on HPR I won\'t provide a link to our application (which wouldn\'t help a lot anyway as we don\'t really have much of a web site anyway.).

\r\n

However I\'ll link to some of the technical components:

\r\n

The Computer Algebra System we use is called Maxima, its history goes back to the early 80s. It\'s written in common lisp.

\r\n

We have considered switching to SymPy as a more modern alternative. SymPy doesn\'t offer the feature completeness Maxima does, though. It has still a long way to go.

\r\n

Our servers run Debian. The current version is written in PHP but we are working on a new version based on dockerized Django with a JS frontend in Ember along with some micro services written in Go, Python and PHP.

\r\n

To render math we use MathJax in the current version and KaTeX in the new version. The PDF-export of worksheets is of course done in LaTeX.

',288,0,0,'CC-BY-SA','maths,education,learning',0,0,1), (2966,'2019-12-16','World of Commodore 2019 Episode 1: The Interviews',1174,'In this first episode, I interview exhibitors and members at the World of Commodore in 2019.','

Hello, good people of Hacker Public Radio, my name is Paul Quirk and this is my very first ever podcast. I would like to give credit Klaatu of Gnu World Order for making me aware of Hacker Public Radio, which I’ve been a listener of for the past year. As we near the holiday season of the winter solstice, I decided to give back to the open source community with this gift of a mini series of podcasts about the World of Commodore from December 7, 2019.

\r\n

The World of Commodore is an annual computer expo dedicated to Commodore computers that is normally held on the first Saturday of December in the city of Mississauga, Ontario. It started off back in 1983 by Commodore Canada as a trade show where Commodore and related vendors could showcase their latest products for the holiday season. As a Commodore computer nerd kid of the 1980’s living within an hour’s drive of Mississauga, this was an event I always looked forward to with excitement. For me, this was bigger and better than Santa Claus. Commodore went bankrupt in 1994, but a decade later, the show was revived by the Toronto PET user’s group, or TPUG, one of the world’s oldest computer user groups of which I am a member. Today’s World of Commodore is very different from the expo’s of the 1980’s, and has transformed into an event where hackers from around the world gather together to share ideas and show off their own discoveries and products, both open source and commercial.

\r\n

Since many listeners and contributors of Hacker Public Radio got started with a Commodore computer at some time, and since this event has grown beyond Commodore products and into open source hardware and software, I thought this event would be of great interest to this community, and it is my hope that many of you listeners might join us at next year’s World of Commodore.

\r\n

I have decided to create a miniseries of podcasts of this event which I will release on a weekly schedule. In this first episode, I walk around the trade show floor and interview various exhibitors, vendors, and members of TPUG. As there is a visual element to this podcast, I have posted pictures of the exhibits in my personal non-commercial blog at pquirk.com, which I encourage you to visit in order to get the full experience. And so, with no further ado, let’s all go to the wonderful world of Commodore.

\r\n\r\n',383,103,0,'CC-BY-SA','Commodore,PET,Amiga,Gecko,retro',0,0,1), (2967,'2019-12-17','Wrestling As You Like It Episode 2',1599,'Wrestling As You Like It Episode 2','

Today’s episode is about the landscape of professional wrestling today, the hierarchy, and how it came to be that way, and a brief explanation of different styles of professional wrestling.

',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1), (2970,'2019-12-20','The Fediverse',1142,'The Fediverse is the open network of social media platforms','

The Fediverse is the name given to the collection of social media platforms that are distributed and interconnected. Distributed means that the servers are not centrally controlled, but are available to users in a variety of forms and conditions. And interconnected means they use protocols that are designed to allow communication between different platforms as well as different servers. The most common of these protocols is ActivityPub.

\r\n

https://www.zwilnik.com/?page_id=1050

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1), (2971,'2019-12-23','World of Commodore 2019 Episode 2: Hacking GeckOS',2960,'Glen Holmer explains how he got Linux running on a Commodore 64.','',383,103,0,'CC-BY-SA','Commodore,PET,Amiga,Geckos,retro,Linux,Open Source',0,0,1), (2972,'2019-12-24','The foot of the ski slope',2681,'MrX and Dave Morriss chat about nerdy things near a ski slope','

Another in the chat series from Edinburgh

\r\n

Hosted by MrX and Dave Morriss

\r\n

This time we met up for breakfast on Sunday 24th November in a pub/restaurant in an area called Hillend, just outside Edinburgh in Midlothian. The hill close by is the location of the Midlothian Snowsports Centre, an artificial Ski Slope which is very popular in the region for recreation and training.

\r\n

We chatted for a while inside then moved to Studio C in the car park and recorded this episode.

\r\n

PDAs and the like

\r\n

We were talking about PDAs (Personal Data Assistants) from the 1980’s.

\r\n\r\n

Software annoyances

\r\n\r\n

OS choices

\r\n\r\n

A few other topics

\r\n\r\n

Links

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
\r\n
\r\n
    \r\n
  1. The person using a Palm Pilot to take meeting notes had an external keyboard, and wasn’t using handwriting recognition!

  2. \r\n
  3. calibre was failing with the error: ImportError: No module named functools_lru_cache. It later proved possible to fix this by reinstalling a Python module: pip2 install --force backports.functools_lru_cache

  4. \r\n
  5. There have been no releases of Clementine since 2016 sadly, though there are more recent changes on the GitHub page.

  6. \r\n
  7. Information on the web about alsa-tools-gui seems a little sparse. The hdajackretask application has a README file in the distribution that gives some information.

  8. \r\n
\r\n
',225,0,1,'CC-BY-SA','HPR,hosts,meeting,technology',0,0,1), (2976,'2019-12-30','A walk through my PifaceCAD Python code – Part 4',391,'This is the last show in the series and covers the main program section at the bottom of my script','

This is the last show in the series. The series was recorded in one go and split into multiple parts. This last section is pretty short; it covers the main program section at the bottom of my script that calls all the other functions and allows the user to quit the program. In this episode I also mention explanatory notes that I included in my script. These are mainly for my own benefit so I could remember how I set up lirc. I’ve included these notes at the end of these show notes.

\r\n

Main program
\r\nTurn LCD backlight on, print System up message to LCD, wait a few seconds then clear screen. Activate push buttons on control and display board. Activates various IR buttons waiting on input from the remote control. Print quit message to terminal, waiting for input, repeat message until q is entered by user. When q is entered deactivate buttons and turn LCD backlight off.

\r\n

Below are my Lirc explanatory comments at the end of my Python script.

\r\n
\r\n

lirc
\r\nThis is the Linux IR control program
\r\nLIRC (Linux Infrared remote control) is an open source package that allows users to receive and send infrared signals with a Linux-based computer system.

\r\n

Irrecord
\r\nTool used to record valid IR codes from your remote control. It generates the file /etc/lirc/lircd.conf, possibly overwrites original file so use with caution. It attempts to recognise your remote control from a series of button pushes. If the remote is not recognised then it captures the codes in raw mode, I abandoned this tool and got a valid IR file for a very similar remote control on the internet, see info below

\r\n

/etc/lirc/lircd.conf
\r\nFile used to store IR codes for your remote control, either using the tool irrecord or from somewhere on the internet. This file is a direct copy of file \"BN59-00861A-SAMSUNG-TV.conf\" I added the Samsung TV string to the file name.

\r\n

irw
\r\nTool used to get the key names for your particular remote control, for this to work you must first have a valid /etc/lirc/lircd.conf file

\r\n

~/.lircrc
\r\nThis file is used to store the remote control key names that you want to activate, and what action is to be taken when the button is pushed. Adding the field \"remote =\" allows the use of multiple remote controls. The remote control key names can be found by using the command \"irw\", I created a file called ~/scripts/remote-key-names-sorted.txt to store the valid key names for my Samsung remote control

\r\n

~/scripts/remote-key-names-sorted.txt
\r\nList of valid remote control key names for my Samsung remote control, this was generated using the irw command. I used the \"tee\" command to pipe output to the screen and write output to this file at the same time, see file for further details of commands I used.

\r\n
\r\n',201,38,1,'CC-BY-SA','Podcasts, Linux, Command Line, Python, Raspberry Pi',0,0,1), (3241,'2021-01-04','HPR Community News for December 2020',4055,'HPR Volunteers Dave, ToeJet, and Ken talk about shows released and comments posted in December 2020','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Pat from TLLTS.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3217Tue2020-12-01Sump MinionBrian in Ohio
3218Wed2020-12-02An introduction to DarktablePaul Quirk
3219Thu2020-12-03Linux Inlaws S01E18: Voice Recognition and Text to Speechmonochromec
3220Fri2020-12-04PixelFedAhuka
3221Mon2020-12-07HPR Community News for November 2020HPR Volunteers
3222Tue2020-12-08Musings about writing a book about the Odoo software suiteJeroen Baten
3223Wed2020-12-09My COVID year summaryb-yeezi
3224Thu2020-12-10Adventures in Retrocomputing with the Mac PlusPaul Quirk
3225Fri2020-12-11Grill repairoperat0r
3226Mon2020-12-14Using taskwarrior to structurize your workJeroen Baten
3227Tue2020-12-15Fresh water Aquarium BasicsEnigma
3228Wed2020-12-16YAML basicsklaatu
3229Thu2020-12-17Linux Inlaws S01E19: Redismonochromec
3230Fri2020-12-18Introduction to LayersAhuka
3231Mon2020-12-21USB KeyToeJet
3232Tue2020-12-22Nextcloudklaatu
3233Wed2020-12-23HPR RPG Club reviews Shadowrun 5eklaatu
3234Thu2020-12-24Apple products I have ownedswift110
3235Fri2020-12-25Soldering Tipsoperat0r
3236Mon2020-12-28The State of Linux Audio Apps in 2020Pat from TLLTS
3237Tue2020-12-29Cloning a Hard Drive with ClonezillaJon Kulp
3238Wed2020-12-30Linux Inlaws S01E20: The Xmas and New Year Specialmonochromec
3239Thu2020-12-31New Community Project ProposalEnigma
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 18 comments in total.

\n

Past shows

\n

There are 3 comments on\n3 previous shows:

\n\n

This month\'s shows

\n

There are 15 comments on 8 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2020-December/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nWindigo

\n

Over the period tags and/or summaries have been added to 3 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3261,'2021-02-01','HPR Community News for January 2021',3606,'HPR Volunteers talk about shows released and comments posted in January 2021','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n TrumpetJohn.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3240Fri2021-01-01Linux Under AttackAhuka
3241Mon2021-01-04HPR Community News for December 2020HPR Volunteers
3242Tue2021-01-05The eternal battle over how to run your chromebook is about to beginZen_Floater2
3243Wed2021-01-06Pictor - free and open radio astronomyAndrew Conway
3244Thu2021-01-07Interview with Anco Scholte ter Horst CEO of Freedom InternetKen Fallon
3245Fri2021-01-08ELECTRICITYoperat0r
3246Mon2021-01-11LXCast: freeing the Fairphone 3 (and many other phones) 2BFrank
3247Tue2021-01-12Saturday Morning Automotive RoutineTrumpetJohn
3248Wed2021-01-13SARS-CoV-2 detection by PCR explanationb-yeezi
3249Thu2021-01-14Linux Inlaws S01E21: The Big Linux Inlaws Peep Showmonochromec
3250Fri2021-01-15GIMP: Getting Started With LayersAhuka
3251Mon2021-01-18Opposing Views on AlcoholWindigo
3252Tue2021-01-19Simple JSON querying tool (also YAML, and to a lesser extent XML)crvs
3253Wed2021-01-20Pandas IntroEnigma
3254Thu2021-01-21The Markdown editor RetextMrX
3255Fri2021-01-22garage door part 2operat0r
3256Mon2021-01-25Update, MS Teams, Covid 19, Raspberry PI 400 Raspberry PI 4 8GB CentosJWP
3257Tue2021-01-26Lack of diversity in Linux and other open source communitiesswift110
3258Wed2021-01-27Linux Inlaws S01E22: The Linux Professional Institutemonochromec
3259Thu2021-01-28Nextcloud - The easy wayArcher72
3260Fri2021-01-29Free, Public Domain and Creative Commons AssetsAhuka
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 21 comments in total.

\n

Past shows

\n

There are 2 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 19 comments on 12 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-January/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nWindigo

\n

Over the period tags and/or summaries have been added to 3 shows which were without them.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (2973,'2019-12-25','Introduction to Advent of Code',836,'Advent of code is a challenge each year between 1-25 of December.','

I discuss all the challenges we have seen so far during the Advent of Code and talk about what they entailed and how hard they were to solve.

',382,0,0,'CC-BY-SA','coding, challenge',0,0,1), (2974,'2019-12-26','Guitar Setup pt. 2',3107,'NYbill finish a guitar setup.','

Heh, listen to NYbill tune a guitar for an hour.

\r\n

Part two of guitar set up. Fret polishing, neck relief, string height, and intonation.

\r\n

Suppliers:

\r\n\r\n',235,0,0,'CC-BY-SA','Guitar, Setup, Repair',0,0,1), (2977,'2019-12-31','World of Commodore 2019 Episode 3: Life after Commodore',1660,'A presentation by Dr. Richard Immers, author of \"Inside Commodore DOS\"','

Some relevant links of note:

\r\n\r\n',383,78,0,'CC-BY-SA','Commodore,PET,Amiga,64,Geckos,retro,Inside Commodore,DOS',0,0,1), (2978,'2020-01-01','GARAGE DOOR',738,'I talk about various GARAGE DOOR and fixes','

Are you afraid if your garage door ? Have no fear!

',36,0,1,'CC-BY-SA','home improvement, garage door ,DIY',0,0,1), (2982,'2020-01-07','World of Commodore 2019 Episode 4: Bare metal c64 Emulation on Raspberry Pi',2420,'Randy Rossi\'s presentation of his Github project on bare metal emulation of the C64 on a Pi 3.','

Links of note:

\r\n',383,103,0,'CC-BY-SA','Raspberry,Pi,emulation,Commodore,64,World of Commodore,TPUG,Toronto,Pet,Users,Group,Github,Open Sour',0,0,1), (2985,'2020-01-10','Firefox Update',1046,'Some recent updates to Firefox that add useful features','

Firefox has been the more secure alternative to Chrome, and it has over the last few months made some updates. So we may want to take a look and see if these are any good, and ask if they add to the security. In some cases there are valuable improvements, such as Facebook Container and the Monitor service.

\r\n

Links:

\r\n\r\n',198,74,0,'CC-BY-SA','Firefox, Sync, Container',0,0,1), (2986,'2020-01-13','Onlykey Updated',1390,'Onlykey more like you better have two keys!','

I chat about Onlykey updates along with plugins / updates / issues/ fixes

\r\n

https://chrome.google.com/webstore/detail/onlykey-configuration/adafilbceehejjehoccladhbkgbjmica?hl=en-US

\r\n',36,74,1,'CC-BY-SA','fob,2fa,onlykey,security,computers',0,0,1), (2991,'2020-01-20','Fix yer fog machine',674,'Save Your Fog Machine today!','

https://smile.amazon.com/gp/product/B077HYSYSG

\r\n',36,0,1,'CC-BY-SA','Halloween,fog machine,DIY',0,0,1), (2996,'2020-01-27','Spideroak Update',465,'I give you an update on my cloud backup solution and fixes','

https://spideroak.support/hc/en-us/articles/115001891343-Command-Line-Reference

\r\n

service script:

\r\n
# Make sure you have space or link the base path to some place else\r\n# make sure you have R/W for the plex user\r\n# ln -s /media/data/SPIDEROAK_CONFIG/ /home/plex/.config/SpiderOakONE\r\n\r\n[Unit]\r\nDescription=SPIDEROAK STARTUP\r\nAfter=network.target\r\n\r\n[Service]\r\nUser=plex\r\nGroup=adm\r\n\r\nType=simple\r\nExecStart=/bin/bash -c '\r\nPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ;\r\n/usr/bin/SpiderOakONE --headless --verbose'\r\n\r\n[Install]\r\nWantedBy=multi-user.target
\r\n',36,0,1,'CC-BY-SA','cloud backup,computers,linux,spideroak one,spideroak',0,0,1), (3006,'2020-02-10','Hijack Auxiliary Input of your car!',2159,'I talk about my Q40 and getting Auxiliary Input when your car does not have one','

https://www.myg37.com/forums/audio-video-and-electronics/285929-2015-infiniti-q40-4dr-with-crap-audio.html

\r\n

https://rmccurdy.com/.scripts/downloaded/www.nicoclub.com/FSM/Q40/2015%20Q40/

\r\n

Updated: Solved: The audio could use a dac or something nice but this will do. Not (DO NOT PLUG IN THE HARNESS WRONG ORDER OR YOU WILL BLOW AT LEAST 4 FUSES ) I had to swap out 3 in the passenger side and 1 for the rear lights on the IPDM E/R next to the battery in a #@$% spot.

\r\n

pulled the pins and soldered a audio jack to them and fed it though the AC vent :

\r\n

pin 1 - G : Satellite radio sound signal LH pin 2 + R : Satellite radio sound signal LH pin 3 - w : Satellite radio sound signal RH pin 4 + b : Satellite radio sound signal RH

\r\n

Reference:

\r\n\r\n

NOT SOLVED 08/21/2019 : So I\'m sick of this jank setup .. the software is wonky and works about 1/2 the time .. I have to ƒ@#$ with it for about 5-10 min every time I want to use it … WIRELINQ is crap.. and I don\'t want the 600$ BT mod .. I just want AUX in !! I dont care if CD or SAT is spliced!

\r\n\r\n

maybe I can hack it myself the issue is that the SAT is in the @^ing trunk .. so I would have to find the wires that go to the trunk. I use a long speaker wire with alligator clips on it and a continuity tester (volt meter ) to hunt for it …

\r\n

Part No
\r\n2591a 1ma5e

\r\n

Model No
\r\ncv-vn01e04d

\r\n

\"11 12 Infiniti G25 G37 Radio CD Player 2591A-1MA5E Bulk 711\"

\r\n

SOLVED 01/20/2018 : YAY ! this works and I dont have to have grap BT audio

\r\n\r\n',36,0,1,'CC-BY-SA','Car Audio,DIY,music,cars,auto',0,0,1), (3011,'2020-02-17','Linux is HARD rant with Intel graphics',1228,'I go over my issues around Linux in general specifically Video issues','

Help me help you! I rant about linux and Video drivers etc …

\r\n

Get Video and CPU Info
\r\nchrome://gpu

\r\n
# gives you info about video GPU in chrome!\r\nchrome://gpu
\r\n

phoronix-test-suite system-info

\r\n
# neat little project to dump out all kinds of info\r\nphoronix-test-suite system-info
\r\n
# get hard disk temperatures !\r\n\r\nhddtemp /dev/sdb\r\n/dev/sdb: WDC WD4003FZEX-00Z4SA0: 37°C\r\nhddtemp /dev/sdc\r\n/dev/sdc: WDC WD4003FZEX-00Z4SA0: 36°C
\r\n

vainfo - display information from VA API driver

\r\n

lspci specific device

\r\n
lspci -v -s 00:02.0\r\n00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Desktop) (prog-if 00 [VGA controller])\r\n        Subsystem: ASRock Incorporation Device 3e92\r\n        Flags: bus master, fast devsel, latency 0, IRQ 126\r\n        Memory at a0000000 (64-bit, non-prefetchable) [size=16M]\r\n        Memory at 90000000 (64-bit, prefetchable) [size=256M]\r\n        I/O ports at 4000 [size=64]\r\n        [virtual] Expansion ROM at 000c0000 [disabled] [size=128K]\r\n        Capabilities: [40] Vendor Specific Information: Len=0c <?>\r\n        Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00\r\n        Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable- 64bit-\r\n        Capabilities: [d0] Power Management version 2\r\n        Capabilities: [100] Process Address Space ID (PASID)\r\n        Capabilities: [200] Address Translation Service (ATS)\r\n        Capabilities: [300] Page Request Interface (PRI)\r\n        Kernel driver in use: i915\r\n        Kernel modules: i915\r\nlshw\r\n#  lshw is a small tool to extract detailed information on the hardware configuration of the machine\r\n\r\nlshw -c video\r\n  *-display\r\n       description: VGA compatible controller\r\n       product: UHD Graphics 630 (Desktop)\r\n       vendor: Intel Corporation\r\n       physical id: 2\r\n       bus info: pci@0000:00:02.0\r\n       version: 00\r\n       width: 64 bits\r\n       clock: 33MHz\r\n       capabilities: pciexpress msi pm vga_controller bus_master cap_list rom\r\n       configuration: driver=i915 latency=0\r\n       resources: irq:126 memory:a0000000-a0ffffff memory:90000000-9fffffff ioport:4000(size=64) memory:c0000-dffff
\r\n

glxinfo

\r\n

The glxinfo program shows information about the OpenGL and GLX implementations running on a given X display.

\r\n
glxinfo | egrep -i 'device|memory|OpenGL|direct'
\r\n

dmesg

\r\n
dmesg | grep -e IOMMU -e DMAR\r\n\r\ndmesg | grep -E 'drm|radeon' | grep -iE 'firmware|microcode'\r\ndmesg | grep -i -e i915 -e drm -e vga
\r\n

dmidecode - DMI table decoder

\r\n
dmidecode -t baseboard | grep -i 'Product'
\r\n

GPU usage

\r\n
apt-get install intel-gpu-tools | intel_gpu_top
\r\n

Google Dorks

\r\n\r\n',36,0,1,'CC-BY-SA','linux,video,DIY,xbmc,kodi,ubuntu,debian',0,0,1), (3016,'2020-02-24','Nixie tube clock and friends!',874,'I chat about Novice Nixie tubes and tronics soldering etc','

Nixie tube (English: /ˈnɪk. siː/ NIK-see), or cold cathode display, is an electronic device for displaying numerals or other information using glow discharge.

\r\n

https://www.tindie.com/products/robg/msp430-nixie-clock-kit/

',36,0,0,'CC-BY-SA','DIY,nixie tube,LED,electronics ',0,0,1), (2987,'2020-01-14','World of Commodore 2019 Episode 5: New games from Double Sided Games',2250,'A presentation by Jérémie Marsin of Double Sided games.','

Links of note:

\r\n',383,0,0,'CC-BY-SA','Commodore 64,retro,computing,games,gamer,vintage',0,0,1), (2992,'2020-01-21','World of Commodore 2019 Episode 6: Introduction to C64 OS',2159,'Greg Naçu presents to us his new operating system to the Commodore 64','

Links of note:

\r\n\r\n',383,103,0,'CC-BY-SA','Commodore,64,OS,World of Commodore',0,0,1), (2983,'2020-01-08','my phone',497,'gnu-linuxy in my pocket','\r\n',243,0,0,'CC-BY-SA','phone, linux',0,0,1), (2990,'2020-01-17','JDK14 - Wrap up edition',911,'We look into what is included in the next release of the JDK.','

305: Pattern Matching for instanceof (Preview)
\r\n343: Packaging Tool (Incubator)
\r\n345: NUMA-Aware Memory Allocation for G1
\r\n349: JFR Event Streaming
\r\n352: Non-Volatile Mapped Byte Buffers
\r\n358: Helpful NullPointerExceptions
\r\n359: Records (Preview)
\r\n361: Switch Expressions (Standard)
\r\n362: Deprecate the Solaris and SPARC Ports
\r\n363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
\r\n364: ZGC on macOS
\r\n365: ZGC on Windows
\r\n366: Deprecate the ParallelScavenge + SerialOld GC Combination
\r\n367: Remove the Pack200 Tools and API
\r\n368: Text Blocks (Second Preview)
\r\n370: Foreign-Memory Access API (Incubator)

\r\n',382,0,0,'CC-BY-SA','java, news',0,0,1), (2979,'2020-01-02','Bicycle Freewheel Maintenance',450,'I explain how to lube a bicycle freewheel','

This is a short episode where I explain how to service your bicycle freewheel if it\'s misbehaving. My pedals were turning around when I walked the bike, and they ought to be stationary. A quick dose of chain oil in the freewheel fixed the problem. Click the image to see photos showing how to do this.

\r\n\r\n

\"Bicycle

\r\n',238,115,0,'CC-BY-SA','bicycles, bicycle maintenance, DIY, bicycle repair',0,0,1), (2984,'2020-01-09','RHEL 8 Workstation first looks ',543,'Runing RHEL 8 workstation on a HP Stream Laptop','

Hi Everyone a bit random ideas about RHEL 8 on a low end laptop.

\r\n

Interesting Git and flatpak are already installed out of the box.

\r\n

MS Teams works great.

',129,0,0,'CC-BY-SA','HP Stream, RHEL 8, MS Teams, flatpak',0,0,1), (2988,'2020-01-15','A tale of two hackers in the same system',518,'AIX Hacking and modem stuff!!','

Hi, I’m sigflup. This is about that awesome time I found that there was another hacker in the same system that I was hacking. Fun stuff

\r\n',115,0,1,'CC-BY-SA','unix,aix,modem,lynx',0,0,1), (2989,'2020-01-16','2019-2020 New Year Show Episode 1',8435,'Eighth Annual New Year Show - Sint brings toys','

Hacker Public Radio 2019-20 New Year Show Episode 1

\r\n

04:30 - 11:00 EST (09:30 - 16:00 UTC)

\r\n\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show, NYS',0,0,1), (3026,'2020-03-09','Hex Bug and Battle Bots',1120,'Review/mods of fun Hex Bug and Battle Bots','

Review/mods of fun Hex Bug and Battle Bots

\r\n',36,0,0,'CC-BY-SA','robots,hexbug,battlebots,RC,IR',0,0,1), (2993,'2020-01-22','2019-2020 New Year Show Episode 2',9298,'Eighth Annual New Year Show with ThinkPads, Steam engines and Corporate America philosophy','

Hacker Public Radio 2019-20 New Year Show Episode 2

\r\n

11:00 - 16:30 EST (16:00 - 21:30 UTC)

\r\n\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show, HPRNYS',0,0,1), (2994,'2020-01-23','Wrestling As You Like It Episode 3',1327,'A podcast on why I like wrestling and how it works to draw in fans.','

In this episode I discuss what direction I’m taking the podcast in. Also more importantly I discuss what Supercards are and their purpose in Pro Wrestling.

',354,0,1,'CC-BY-SA','Pro Wrestling',0,0,1), (2995,'2020-01-24','ActivityPub Conference 2019 - ActivityPub: past, present, future',961,'ActivityPub Conference 2019 Keynote','

The ActivityPub Conference of 2019 was held in Prague. This is about the opening keynote talk from Christopher Lemmer Webber. https://www.zwilnik.com/?page_id=1063

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1), (2997,'2020-01-28','World of Commodore 2019 Episode 7: Video Playback with 1541 Ultimate',1161,'In this seventh episode, Greg returns to tell us how he got full video playback on a Commodore 64.','

Links

\r\n\r\n',383,103,0,'CC-BY-SA','Commodore 64,retro,computing,games,gamer,vintage,video,World of Commodore,TPUG',0,0,1), (2998,'2020-01-29','2019-2020 New Year Show Episode 3',9164,'Eighth Annual New Year Show: The US is awake','

Hacker Public Radio 2019-20 New Year Show Episode 3

\r\n

16:30 - 21:54 EST (21:30 - 02:54 UTC)

\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1), (3002,'2020-02-04','World of Commodore 2019 Episode 8: Vote of thanks',1156,'This is the final episode of the World of Commodore 2019 mini series.','

Links

\r\n',383,0,1,'CC-BY-SA','Commodore,64,PET, Vic 20, amiga,World of Commodore, TPUG',0,0,1), (3003,'2020-02-05','2019-2020 New Year Show Episode 4',9707,'Eighth Annual New Year Show. From Star Wars to NASA','

Hacker Public Radio 2019-20 New Year Show Episode 4

\r\n

21:54 - 01:40 EST (02:54 - 06:40 UTC)

\r\n\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1), (3008,'2020-02-12','2019-2020 New Year Show Episode 5',7013,'Eighth Annual New Year Show: war stories and more war stories','

Hacker Public Radio 2019-20 New Year Show Episode 5

\r\n

01:40 - 07:20 EST (09:40 - 12:20 UTC)

\r\n\r\n',159,121,1,'CC-BY-SA','2019-20 New Year Show',0,0,1), (3005,'2020-02-07','Is ActivityPub Paving The Way to Web 3.0?',735,'ActivityPub Conference 2019, a talk about whether ActivityPub is leading the way to Web 3.0','

The ActivityPub Conference of 2019 was held in Prague. This is about a talk raising a suggestion that ActivityPub might be a way to implement Web 3.0. https://www.zwilnik.com/?page_id=1081

\r\n

Links:

\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1), (3015,'2020-02-21','ActivityPub Conference 2019 - The Semantic Social Network',438,'ActivityPub Conference 2019, building a Semantic Social Network','

The ActivityPub Conference of 2019 was held in Prague. This is about a talk using ActivityPub to create the Semantic Social Network. https://www.zwilnik.com/?page_id=1086

\r\n

Links:

\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1), (3025,'2020-03-06','Keep unwanted messages off the Fediverse',881,'ActivityPub Conference 2019, techniques for fighting SPAM and unwanted messages in the Fediverse.','

The ActivityPub Conference of 2019 was held in Prague. This is about a talk about how we can keep SPAM and unwanted messages off of our platforms in the Fediverse. https://www.zwilnik.com/?page_id=1089

\r\n

Links:

\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, SPAM',0,0,1), (3035,'2020-03-20','Decentralised Hashtag Search and Subscription in Federated Social Networks',669,'ActivityPub Conference 2019, a proposal for how we can use hashtags to find and subscribe to content','

The ActivityPub Conference of 2019 was held in Prague. This is about a talk a proposal for a method to allow searching for hashtags in a decentralized Fediverse environment so that we can find, and subscribe to, content of interest. https://www.zwilnik.com/?page_id=1091

\r\n

Links:

\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Hashtags',0,0,1), (3045,'2020-04-03','OSS compliance with privacy by default and design',951,'How can Open Source Software manage the mandates of regulations like the GDPR?','

The GDPR (General Data Protection Regulation) was enacted by the European Community in 2016, and began to be enforced in 2018. Since this covers a large segment of the Internet users, and other jurisdictions are looking at similar legislation this talk is a timely look at what is required and how Open Source Software can meet the legal requirements. https://www.zwilnik.com/?page_id=1096

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Privacy',0,0,1), (3007,'2020-02-11','Photography 101',1468,'I tell you everything I know about the basics of photography','

Links

\r\n\r\n',383,0,0,'CC-BY-SA','Photography 101,digital,film,camera',0,0,1), (2999,'2020-01-30','SQRL - Secure Quick Reliable Login',1442,'In this podcast we talk about what SQRL is and how it works.','

In this podcast, we talk about what SQRL is, and how it works, why I feel that it’s an exciting new login method that is safe and easy to use.

\r\n\r\n',382,0,1,'CC-BY-SA','security, login method',0,0,1), (3281,'2021-03-01','HPR Community News for February 2021',4150,'HPR Volunteers talk about shows released and comments posted in February 2021','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n o9l, \n Some Guy On The Internet.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3261Mon2021-02-01HPR Community News for January 2021HPR Volunteers
3262Tue2021-02-02My thoughts on diversity in Linux and open sourceswift110
3263Wed2021-02-03My Beginnings in Techo9l
3264Thu2021-02-04Intro to Nagiosnorrist
3265Fri2021-02-05My Chromebook ExperienceAhuka
3266Mon2021-02-08Upgrading Debian on my raspberry piMrX
3267Tue2021-02-09Ripping Media 2021operat0r
3268Wed2021-02-10Video Game Review - Ark Survival EvolvedEnigma
3269Thu2021-02-11Linux Inlaws S01E23: The first year of the five year planmonochromec
3270Fri2021-02-12An Example of Using LayersAhuka
3271Mon2021-02-15Interview with a 6yo child operat0r
3272Tue2021-02-16In GNU/Linux, there is no \"diversity\", we\'re all just data.Some Guy On The Internet
3273Wed2021-02-17Embrace FirefoxSome Guy On The Internet
3274Thu2021-02-18My Custom dwm Setuparfab
3275Fri2021-02-19D1 Mini Close Lid to ScanKen Fallon
3276Mon2021-02-22Deepgeek\'s thoughts about HD Radiodeepgeek
3277Tue2021-02-23Microsoft in my Debian repoArcher72
3278Wed2021-02-24A Minor Victory Against Designed-In ObsolescenceBeeza
3279Thu2021-02-25Linux Inlaws S01E24: Legacy programming languagesmonochromec
3280Fri2021-02-26What We Need For the ActivityPub NetworkAhuka
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 16 comments in total.

\n

Past shows

\n

There are 7 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 9 comments on 5 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-February/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nDave Morriss

\n

Over the period tags and/or summaries have been added to 10 shows which were without them.

\n

There are now 414 shows which need a summary and/or tags.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3306,'2021-04-05','HPR Community News for March 2021',2000,'HPR Volunteers talk about shows released and comments posted in March 2021','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n timttmy.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3281Mon2021-03-01HPR Community News for February 2021HPR Volunteers
3282Tue2021-03-02HP Laptop with AMD Ryzen 3 Mobile with Radeon GraphicsSome Guy On The Internet
3283Wed2021-03-03HPR RPG Club reviews Dead Earthklaatu
3284Thu2021-03-04Introduction to gdbklaatu
3285Fri2021-03-05Upgrading Lubuntu on my Samsung N150 Plus netbookMrX
3286Mon2021-03-08Wireguard How Totimttmy
3287Tue2021-03-09Quick tipArcher72
3288Wed2021-03-10Linux Inlaws S01E25: The Grumpy Old Codersmonochromec
3289Thu2021-03-11NextCloud the hard wayKen Fallon
3290Fri2021-03-12GIMP: More on Layer Tools and TechniquesAhuka
3291Mon2021-03-15The New Audacity and Batch Processing MacrosAhuka
3292Tue2021-03-16Squirrel FSF blogZen_Floater2
3293Wed2021-03-17HPR RPG Club reviews Dungeon Raidersklaatu
3294Thu2021-03-18Update to MakeMKV to back up mediaArcher72
3295Fri2021-03-19Renewing a Let\'s Encrypt cert for Home Network useKen Fallon
3296Mon2021-03-22Spam Bot Honey PotRho`n
3297Tue2021-03-23Nextcloud Application UpdatingToeJet
3298Wed2021-03-24Poisoning The WellSome Guy On The Internet
3299Thu2021-03-25Linux Inlaws S01E26: Make your Linux hardermonochromec
3300Fri2021-03-26YouTube Channels for Learning Spanish, Part 1Ahuka
3301Mon2021-03-29K S P Kerbal Space Program! (Game)operat0r
3302Tue2021-03-30Input Methods on Ubuntuclacke
3303Wed2021-03-31Slackware on RaspberryPiBrian in Ohio
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 3 comments on\n3 previous shows:

\n\n

This month\'s shows

\n

There are 12 comments on 7 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-March/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nDave Morriss

\n

Over the period tags and/or summaries have been added to 10 shows which were without them.

\n

There are now 404 shows which need a summary and/or tags.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3055,'2020-04-17','Advice to new Fediverse administrators and developers',754,'An experienced admin for a Mastodon Instance at a major Fediverse developer offers some tips','

Framasoft is a company that develops for PeerTube and Mobilizon, and also hosts a Mastodon instance. The speaker is the sysadmin for the Mastodon instance gives his tips based on his experience at this non-profit company. https://www.zwilnik.com/?page_id=1098

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1), (3065,'2020-05-01','The case for the unattributed message',977,'Anonymity can cause problems (trolls) but also can be necessary.','

Anonymity has an unfortunate consequence of enabling trolls and abuse. But there are cases where it is important for people to communicate anonymously. In this talk some ideas are presented on how to enable a measure of anonymity without having all of the problems. https://www.zwilnik.com/?page_id=1103

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Privacy, Anonymity',0,0,1), (3075,'2020-05-15','Federated Blogging with WriteFreely',740,'A look at a minimally social blogging app using ActivityPub.','

Many social media apps seem determined to put bells and whistles in every possible place, which is not always in the interest of the user. This talk presents an alternative view which is called “minimally social” which only puts in the features needed by the user. In this case, the main focus is on a simple blogging app. There is also a brief mention of a very technical talk about coding. https://www.zwilnik.com/?page_id=1103

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Blogging',0,0,1), (3085,'2020-05-29','Architectures of Robust Openness',1142,'A look at how to secure social networks against attack while still being open to strangers.','

Social networks can be attacked by people who want to cause abuse and disruption, and one way to deal with that is to lock down the membership. But that goes against the idea of social, which should include being open to welcoming strangers. Mark Miller presents an analysis of how you can be both secure and welcoming which focuses on Object Capabilities. https://www.zwilnik.com/?page_id=1107

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Security, OCaps',0,0,1), (3000,'2020-01-31','Chopin Free project',1433,'An effort to produce royalty and copyright free versions of Frédéric Chopin work.','

\r\nThe Musopen (www.musopen.org) is a 501(c)(3) non-profit focused on improving access and exposure to music by creating free resources and educational materials. We provide recordings, sheet music, and textbooks to the public for free, without copyright restrictions. Put simply, our mission is to set music free.\r\n

\r\n

\r\nTheir latest Kickstarter aims to open the works of Frédéric Chopin copyright free.\r\n

',383,0,0,'CC-BY-SA','musopen, Frédéric Chopin',0,0,1), (3004,'2020-02-06','Fixing simple audio problems with Audacity',808,'Sharing a few experiences with Audacity that may be helpful to others','

Overview

\r\n

I recorded the audio for the show I did with MrX in late 2019: “hpr2972 :: The foot of the ski slope”. I was using my Zoom H2n recorder in my car, on a small tripod placed on the dashboard. Something about this setup caused the result to be very boomy and (to me) unpleasant to listen to. This episode is about what I did for a cure, after some research.

\r\n

I have also been using the Truncate Silence effect in Audacity incorrectly in the past, and I used the opportunity to learn how to do a better job with it.

\r\n

Now, I am well aware that there are some skilled and experienced Audio Engineers out there in HPR-land. I am certainly not one of these, though I quite enjoy fiddling with audio to make it sound better. I’d like to make two requests:

\r\n
    \r\n
  1. If I didn’t do a good job, please tell me what I did wrong here, and how I should have done it.
  2. \r\n
  3. Think about doing a show (or shows) on HPR about how to deal with common audio problems. For example: how to remove a mains hum, the use of compression and normalisation.
  4. \r\n
\r\n

Long notes

\r\n

A longer form of these notes may be found here (full_shownotes.html). These go into more detail on the steps I took to try and make the audio for show 2972 more tolerable.

\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','audio,Audacity,effects,problem solving',0,0,1), (3009,'2020-02-13','Linux Inlaws S01E01',3570,'Linux Inlaws - a podcast about on topics around free and open source software','

Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.

\r\n

Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute t-rexes or other associated dinosaurs.

\r\n\r\n

\r\nIn this show the lads introduce themselves and discuss the technology they use and why they are putting on the show.\r\n

\r\n\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY','free open source software revolution',0,0,1), (3095,'2020-06-12','Intro to GIMP',1064,'An introduction to GIMP to kick off a new series.','

GIMP is the open source alternative to the proprietary Photoshop, and can do most of the same things while respecting your freedom. This show will kick off a new series of tutorials. As a note of caution, I am not an expert, I am just learning GIMP as I go. But I thought there was no harm in sharing my experiences with the HPR community. https://www.ahuka.com/?page_id=1423

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics',0,0,1), (3010,'2020-02-14','FOSDEM first impressions',1638,'Impressions from my first attendance at FOSDEM.','

FOSDEM is the biggest Free and Open Source conference in the world and on its 20th anniversary I decided to attend for the first time. By a good turn of fate, and some well-judged pitching, Ken Fallon secured a stand for the Free Culture Podcasts project which is an umbrella group that covers HPR, many of the shows on The Other Side Network and many more excellent podcasts that are released under creative commons licenses.

\r\n\r\n

This audio is recorded in snippets in between manning the stand and gives some off-the-cuff observations from a FOSDEM noob. I was surprised to find that relatively few visitors to our stand had heard of HPR, which we quickly rectified of course, and I give a brief summary of the feedback we received. Also mentioned in this show, but not actually appearing, are my co-conspirators at FOSDEM, Ken, Beni, JWP as well as Dave Morriss who unfortunately wasn\'t able to join us in person but was very much there in spirit.

\r\n\r\n',268,0,0,'CC-BY-SA','fosdem,conference,podcasts,creative commons',0,0,1), (3012,'2020-02-18','Sample episode from Wikipediapodden',518,'An English microsode of their Swedish language podcast about Wikipedia.','

\r\nJan Ainali from the https://wikipediapodden.se/ podcast came over to the https://freeculturepodcasts.org/ booth at FOSDEM 2020.\r\n

\r\n

\r\nThey do a Swedish Language Podcast about wikipedia et al, and of course we added them to the https://freeculturepodcasts.org/ site. While their main shows are in Swedish, they also have summaries that they do in English which can be found at https://wikipediapodden.se/tag/english/, (RSS Feed).\r\n

',30,75,1,'CC-BY-SA','fosdem, wikipediapodden, swedish, sweden',0,0,1), (3036,'2020-03-23','WiiU is dead long live WiiU!',1439,'How to approach dea-ish mod communities','\r\n',36,0,1,'CC-BY-SA','wiiu,modding,hacking,tcpgecko,android,ssl pinning,games',0,0,1), (3014,'2020-02-20','A Headless Raspberry Pi Streaming Radio',1068,'I use a Raspberry Pi to make a streaming radio device for my pillow speaker.','

In this episode I talk about how I used a Raspberry Pi to create a streaming radio device to feed my pillow speaker. This is something I used to do with clock radios and later a satellite radio, but in an effort to decrease monthly subscription costs for services I did not use optimally, I discontinued my satellite radio subscription about a year ago. This new free solution is an excellent substitute for Satellite Radio so far, since I was mostly listening to this same channel on the Sat Radio but paying about $12 a month for the privilege. The device I’m using is a Raspberry Pi 2 Model B with Ubuntu Server. My barrier to this project in the past was not being able to find the URL for the stream I wanted but I discovered you can find it easily if you use Firefox with Video Download Helper to reveal the URL on a page with media playing (in this case it’s from TuneIn):

\r\n\r\n
https://XX.XXX.XXX.XXX/radio-stationmp3-48?session-id=af1b271fefba04b650f8e253c6b253bd&source=TuneIn\r\n
\r\n\r\n

Strip off everything after the 48 to get raw URL:

\r\n\r\n
https://XX.XXX.XXX.XXX/radio-stationmp3-48\r\n
\r\n\r\n

Command to play stream with mpg123 on the Pi. Using the -q option to suppress output:

\r\n\r\n
mpg123-pulse -q https://XX.XXX.XXX.XXX/radio-stationmp3-48 &\r\n
\r\n\r\n

Once I figure out the command that plays the stream I want, I save the command as an executable script in /home/$user/bin.

\r\n\r\n

Using the “Radio”

\r\n\r\n

To start playing a stream you first have to SSH into the RasPi. This is easy from a laptop using any terminal emulator. I use pubkey auth so I don’t have to type a password every time. On my phone I use ConnectBot. Once I’m into the Pi I run the radio commands from CLI like espn or kmfa or krvs. To stop playback I kill the process with pkill mpg. I have a 3.5mm audio splitter Plugged into the headphone jack of the USB audio interface. In one side of the splitter I’ve got an old pair of earbuds where one side didn’t work, with the working earbud under my pillow. That’s my pillow speaker. On the other side of the splitter I put the audio cable for an FM transmitter, so that I can use an FM radio to listen to the stream while I’m walking around the house.

\r\n\r\n

Click the image below to see pictures of the setup.

\r\n\r\n

\"Raspberry

\r\n\r\n

Links

\r\n\r\n\r\n',238,0,0,'CC-BY-SA','Raspberry Pi, Internet Radio, Streaming Radio, Radio, Streaming Audio, Ubuntu, Ubuntu Server',0,0,1), (3018,'2020-02-26','Encrypted edit',1234,'Klaatu talks about editing and viewing encrypted files in a tmpfs in RAM','\r\n',78,0,0,'CC-BY-SA','GPG, privacy',0,0,1), (3017,'2020-02-25','Developing Black and White Film',2544,'Join me as I develop my first roll of black and white film since over 30 years ago.','

My photos will be available at: https://pquirk.com

\r\n',383,0,0,'CC-BY-SA','Photography,film,developing,black and white',0,0,1), (3019,'2020-02-27','Linux Inlaws S01E02 FOSDEM shenanigans',3929,'Linux Inlaws - a podcast about on topics around free and open source software','

Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.

\r\n

Links:

\r\n',384,111,1,'CC-BY-SA','free open source software, revolution, FLOSS',0,0,1), (3013,'2020-02-19','Bash Tips - 21',2497,'Environment variables','

The Environment (More collateral Bash tips)

\r\n

Overview

\r\n

You will probably have seen references to The Environment in various contexts relating to shells, shell scripts, scripts in other languages and compiled programs.

\r\n

In Unix and Unix-like operating systems an environment is maintained by the shell, and we will be looking at how Bash deals with this in this episode. When a script, program or subprocess is invoked it is given an array of strings called the environment. This is a list of name-value pairs, of the form name=value.

\r\n

Using the environment

\r\n

The environment is used to convey various pieces of information to the executing script or program. For example, two standard variables provided by the shell are \'HOME\', which is set to the current user’s home directory and \'PWD, set to the current working directory. The shell user can set, change, remove and view environment variables for their own purposes as we will see in this episode. The Bash shell itself creates and in some cases manages environment variables.

\r\n

The environment contains global data which is passed down to subprocesses (child processes) by copying. However, it is not possible for a subprocess to pass information back to the superior (parent) process.

\r\n

Viewing the environment

\r\n

You can view the environment in a number of ways.

\r\n\r\n

Changing variables in the environment

\r\n

The variables in the environment are not significantly different from the shell parameters we have seen throughout this Bash Tips series. The only difference is that they are marked for export to commands and sub-shells. You will often see variables (or parameters) in the environment referred to as environment variables. The Bash manual makes a distinction between ordinary parameters (variables) and environment variables, but many other sources are less precise about this in my experience.

\r\n

The standard variables in the environment have upper-case names (HOME, SHELL, PWD, etc), but there is no reason why a variable you create should not be in lower or mixed case. In fact, the Bash manual suggests that you should avoid using all upper-case names so as not to clash with Bash’s variables.

\r\n

Variables can be created and changed a number of ways.

\r\n\r\n

We will look at all of these features in more detail later in the episode.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n\r\n',225,42,1,'CC-BY-SA','Bash,variable,environment,environment variable',0,0,1), (3020,'2020-02-28','Validating data in Haskell',1500,'Tuula talks about wow to validate incoming http request before acting on them','

Background

\r\n

The space game I working on needs a admin interface that can by used by game masters to view and modify the simulation.

\r\n

For start, I added interface for viewing, modifying and creating new people. It has three HTTP endpoints that are defined below. In this episode, I’ll concentrate on creating a new person and especially making sure that parameters used are valid.

\r\n
/api/admin/people              AdminApiPeopleR     GET\r\n/api/admin/people/#PersonId    AdminApiPersonR     GET PUT\r\n/api/admin/addPerson           AdminApiAddPersonR  POST
\r\n

Types and parsing

\r\n

There are two important approaches on making sure that data is valid. Making illegal state unpresentable and parsing instead of validation.

\r\n

If it’s impossible to create invalid data, you don’t have to validate it. Instead of using Integer and checking that given parameter is 0 or more, you should use Natural. Since Natural can’t have negative values, you don’t have to validate it. Similarly, instead of using a list, you could use NonEmpty to make sure that there’s at least one element present in the collection.

\r\n

Parse, don’t validate is similar approach. Instead of having a lax parser and then validating the result, parser should reject data that doesn’t make sense. By selecting suitable datatypes to represent data in the system, simply parsing incoming message is sometimes enough to validate it at the same time.

\r\n

Person creation

\r\n

Function in charge of generating a new person has signature of generatePersonM :: RandomGen g => StarDate -> PersonOptions -> Rand g Person. Given a current StarDate and PersonOptions describing what kind of person is needed, it will return a computation that can be executed to generate a random person.

\r\n

PersonOptions is very barebones. There’s only one field to tell what kind of age the person should have and even that is an optional field.

\r\n
data PersonOptions = PersonOptions\r\n    { personOptionsAge :: Maybe AgeOptions\r\n    } deriving (Show, Read, Eq)
\r\n

AgeOptions has two possibilities. AgeBracket describes case where age should be inside of given range. ExactAge specifies exactly what age should be.

\r\n
data AgeOptions =\r\n    AgeBracket Age Age\r\n    | ExactAge Age\r\n    deriving (Show, Read, Eq)
\r\n

Age is newtype wrapping Natural, thus Age can never be less than zero.

\r\n
newtype Age = Age { unAge :: Natural }\r\n    deriving (Show, Read, Eq, Num, Ord)
\r\n

Hand written FromJSON instance takes care of rejecting numbers that aren’t integers and at least zero. One could skip the checks here and parsed Age still couldn’t be negative. Advantage of explicit checks is that we get much nicer error message instead of just annoying runtime exception.

\r\n
instance FromJSON Age where\r\n    parseJSON =\r\n        withScientific "age"\r\n            (\\x -> case toBoundedInteger x of\r\n                Nothing ->\r\n                    mempty\r\n\r\n                Just n ->\r\n                    if n >= 0 then\r\n                        return $ Age $ fromIntegral (n :: Int)\r\n\r\n                    else\r\n                        mempty)
\r\n

So, when creating a new person, you can have:

\r\n\r\n

There’s still possibility of error. Nothing ensure that age bracket makes sense. It could be AgeBracket (Age 10) (Age 5) (bracket from 10 to 5). We need to add a bit of validation.

\r\n

Data.Validation is “a data-type like Either but with an accumulating Applicative”. What this means to me is that I can validate multiple aspects and collect errors in a list. It’s handy for getting all the problems at once, instead of having to fix them one by one and retry after each fix.

\r\n

Our validation function has signature validateAddPerson :: PersonOptions -> Validation [ErrorCode] PersonOptions. Given PersonOptions, it will give list of ErrorCode and original PersonOptions. Multiple validation functions can be combined for more complex validations.

\r\n

In our example validateAgeOptions validates only age related options of the data. validateAddPerson is supposed to validate whole data, but currently it just delegates to validateAgeOptions. In the future, we can add more validations by adding more functions and chaining them with <* operator.

\r\n
validateAddPerson :: PersonOptions -> Validation [ErrorCode] PersonOptions\r\nvalidateAddPerson opt =\r\n        pure opt\r\n            <* validateAgeOptions opt\r\n\r\nvalidateAgeOptions :: PersonOptions -> Validation [ErrorCode] PersonOptions\r\nvalidateAgeOptions opt =\r\n    case personOptionsAge opt of\r\n        Nothing ->\r\n            _Success # opt\r\n\r\n        Just (AgeBracket a b) ->\r\n            if a <= b\r\n                then _Success # opt\r\n                else _Failure # [ AgeBracketStartIsGreaterThanEnd ]\r\n\r\n        Just (ExactAge _) ->\r\n            _Success # opt
\r\n

Putting it all together

\r\n

Function that handles POST message and creates a new person is shown below:

\r\n
postAdminApiAddPersonR :: Handler Value\r\npostAdminApiAddPersonR = do\r\n    _ <- apiRequireAdmin\r\n    msg <- requireJsonBody\r\n    date <- runDB $ starDate\r\n    _ <- raiseIfFailure $ validateAddPerson msg\r\n    g <- liftIO newStdGen\r\n    let person = evalRand (generatePersonM date msg) g\r\n    pId <- runDB $ insert person\r\n    returnJson (Entity pId person)
\r\n

It does several things: - check that current user is admin - get json content and parse it to PersonOptions - get current star date from database - validate PersonOptions and return error if validation fails - get new random number generator - generate new person - insert it into database - return tuple of (PersonId, Person)

\r\n

Closing

\r\n

Types should represent only valid states. By having invalid state unpresentable, we can avoid many errors. Likewise, parsing should reject invalid data. This usually follows from having invalid states being unpresentable (you can’t parse invalid message to invalid data if you don’t have way to represent that invalid data).

\r\n

Questions, comments and feedback welcome. Best way to reach me is either by email or in mastodon, where I’m Tuula@mastodon.social.

\r\n',364,107,0,'CC-BY-SA','validation, algebraic data types, json',0,0,1), (3022,'2020-03-03','FOSDEM 2020 Stand Interviews',5578,'Interviews with some of the stands at FOSDEM 2020','

Table of Contents

\r\n\r\n\r\n\r\n

Previously Interviewed Projects

\r\n\r\n\r\n

Projects we did not get to Interview (yet)

\r\n\r\n\r\n

0 A.D.

\r\n

\"Logo\"

\r\n
\r\n0 A.D. is a free and open-source, real-time strategy game under development by Wildfire Games. It is a historical war and economy game focusing on the years between 500 BC and 1 BC for the first part, and a planned second part for the years 1 AD to 500 AD. The game is cross-platform, playable on Windows, macOS, FreeBSD, Linux, and OpenBSD. It aims to be entirely free and open-source, using the GPLv2+ license for the game engine and CC BY-SA for the game art. \r\n
\r\n\r\n
\r\nWildfire Games is a global group of volunteer game developers. We create open source games and mods.\r\n
\r\n

Listen to the interview with Stanislas Dolcini from 0 A.D.

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

AdoptOpenJDK

\r\n

\"Logo\"

\r\n
\r\nPrebuilt OpenJDK Binaries for Free!
\r\nJava™ is the world\'s leading programming language and platform. AdoptOpenJDK uses infrastructure, build and test scripts to produce prebuilt binaries from OpenJDK™ class libraries and a choice of either the OpenJDK HotSpot or Eclipse OpenJ9 VM. All AdoptOpenJDK binaries and scripts are open source licensed and available for free.\r\n
\r\n

Listen to the interview with Stewart X Addison AdoptOpenJDK

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Apache Camel

\r\n

\"Logo\"

\r\n
\r\nApache Camel is an open source framework for message-oriented middleware with a rule-based routing and mediation engine that provides a Java object-based implementation of the Enterprise Integration Patterns using an application programming interface (or declarative Java domain-specific language) to configure routing and mediation rules. The domain-specific language means that Apache Camel can support type-safe smart completion of routing rules in an integrated development environment using regular Java code without large amounts of XML configuration files, though XML configuration inside Spring Framework is also supported. Camel is often used with Apache ServiceMix, Apache ActiveMQ and Apache CXF in service-oriented architecture projects. \r\n
\r\n

Listen to the interview with Rachel Yordán from Apache Camel

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Checkmk

\r\n

\"Logo\"

\r\n
\r\nBest-in-class infrastructure and application monitoring. Helping you stay up and running from simple to the most complex environments.\r\n
\r\n

Listen to the interview with Marcel Arentz from Checkmk

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Coderdojo

\r\n

\"Logo\"

\r\n
\r\nCoderDojo organizes free coding workshops (called Dojo’s) for girls and boys from 7 to 18 years old. A Dojo is entirely prepared and led by volunteers. If you are older, then you can help out at an existing Dojo or start your very own CoderDojo! \r\n
\r\n

Listen to the interview with Coderdojo

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Eclipse Foundation

\r\n

\"Logo\"

\r\n
\r\nThe Eclipse Foundation provides our global community of individuals and organizations with a mature, scalable, and business-friendly environment for open source software collaboration and innovation. The Foundation is home to the Eclipse IDE, Jakarta EE, and over 350 open source projects, including runtimes, tools, and frameworks for a wide range of technology domains such as the Internet of Things, automotive, geospatial, systems engineering, and many others.\r\n
\r\n

Listen to the interview with Mikaël Barbero, Release Engineer, Eclipse Foundation

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

GitLab

\r\n

\"Logo\"

\r\n
\r\nGitLab is a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and CI/CD pipeline features, using an open-source license, developed by GitLab Inc.\r\n
\r\n

Listen to the interview with David Planella Director Of Community Relations at GitLab

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

GNU Health

\r\n

\"Logo\"

\r\n
\r\nGNU Health combines the socioeconomic determinants of health with state-of-the-art technology in bioinformatics and clinical genetics. It manages the internal processes of a health institution, such as financial management, stock and pharmacies or laboratories (LIMS)\r\n
\r\n

Listen to the interview with Axel K. Braun about GNU Health

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Javascript

\r\n

\"Logo\"

\r\n
\r\nHackages is a community-based tech company with education at its core. We help you boost your skills and realise your projects through our expertise in training, product development, consultancy and community building.\r\n
\r\n

Listen to the interview with Marta Moliz about Javascript

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Jenkins-x

\r\n

\"Logo\"

\r\n
\r\nJenkins X provides pipeline automation, built-in GitOps, and preview environments to help teams collaborate and accelerate their software delivery at any scale.\r\n
\r\n

Listen to the interview with Kara de la Marck, Open Source Community Manager at CloudBees, about Jenkins-x

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Kopano

\r\n

\"Logo\"

\r\n
\r\n100% Open source collaboration tools: email, calendaring, Mattermost chat, webRTC video meetings, document collaboration with LibreOffice Online, integration with file storage services and more.\r\n
\r\n

Listen to the interview with Brian Joseph about Kopano

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

KubeVirt and Metal3

\r\n

\"Logo\"

\r\n
\r\nVirtual Machine Management on Kubernetes. Building a virtualization API for Kubernetes. KubeVirt technology addresses the needs of development teams that have adopted or want to adopt Kubernetes but possess existing Virtual Machine-based workloads that cannot be easily containerized. More specifically, the technology provides a unified development platform where developers can build, modify, and deploy applications residing in both Application Containers as well as Virtual \r\n
\r\n

\"Logo\"

\r\n
\r\nThere are a number of great open source tools for bare metal host provisioning, including Ironic. Metal3.io aims to build on these technologies to provide a Kubernetes native API for managing bare metal hosts via a provisioning stack that is also running on Kubernetes. We believe that Kubernetes Native Infrastructure, or managing your infrastructure just like your applications, is a powerful next step in the evolution of infrastructure management.\r\n
\r\n

Listen to the interview with KubeVirt and Metal3

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Micropython and Espruino

\r\n

\"Logo\"

\r\n
\r\nMicroPython is a lean and efficient implementation of the Python 3 programming language that includes a small subset of the Python standard library and is optimised to run on microcontrollers and in constrained environments. \r\n
\r\n

\"Logo\"

\r\n
\r\nEspruino is an open-source JavaScript interpreter for microcontrollers. It is designed for devices with small amounts of RAM (as low as 8kB). Espruino was created by Gordon Williams in 2012 as an attempt to make microcontroller development truly multiplatform. It was made open-source in 2013 after a successful Kickstarter campaign for a development board running the software.\r\n
\r\n

Listen to the interview with Christine Spindler from Micropython and Gordon Williams from Espruino

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Nuspell

\r\n

\"Logo\"

\r\n
\r\n
\r\n

Listen to the interview with Sander van Geloven from Nuspell

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

openHAB

\r\n

\"Logo\"

\r\n
\r\nEmpowering the smart home. A vendor and technology agnostic open source automation software for your home.\r\n
\r\n

Listen to the interview with Thomas Bail about openHAB

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

OpenStack Foundation

\r\n

\"Logo\"

\r\n
\r\nThe OpenStack Foundation promotes the global development, distribution and adoption of open infrastructure with more than 105,000 community members from 187 countries around the world. The OpenStack Foundation was founded in September 2012 to provide an independent home for the OpenStack cloud operating system, which has since become one of the largest and most diverse open source projects in history.\r\n
\r\n

Listen to the interview with Jeremy Stanley about OpenStack Foundation

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

OpenTAP

\r\n

\"Logo\"

\r\n
\r\nOpenTAP is an open source project for test automation. An open source test sequencing engine. The project is available online at \r\nhttps://Gitlab.com/OpenTAP/OpenTAP\r\n
\r\n

Listen to the interview with Michael Dieudonné about OpenTAP

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

OpenUK

\r\n

\"Logo\"

\r\n
\r\nWe are a UK organisation committed to develop and sustain UK leadership in Open Technology. We promote businesses, projects and people, who use Open. We strive to collaborate across all existing organisations for Open.\r\n
\r\n

Listen to the interview with Amanda Brock about OpenUK

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

openWifi

\r\n

\"Logo\"

\r\n
\r\nopenwifi: Linux mac80211 compatible full-stack IEEE802.11/Wi-Fi design based on SDR (Software Defined Radio).\r\n
\r\n

Listen to the interview with XianJun Jiao about openWifi

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

OWASP

\r\n

\"Logo\"

\r\n
\r\nThe Open Web Application Security Project (OWASP) is a nonprofit foundation that works to improve the security of software. Through community-led open source software projects, hundreds of local chapters worldwide, tens of thousands of members, and leading educational and training conferences, the OWASP Foundation is the source for developers and technologists to secure the web.\r\n
\r\n

Listen to the interview with Antonis Manaras about OWASP

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Percona

\r\n

\"Logo\"

\r\n
\r\nPercona is a leading provider of unbiased open source database solutions that allow organizations to easily, securely and affordably maintain business agility, minimize risks, and stay competitive.\r\n
\r\n

Listen to the interview with Evgeniy Patlan about Percona

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

PineTime

\r\n

\"Logo\"

\r\n
\r\nAn Open Source Smartwatch For Your Favorite Devices. Low Cost, High Fidelity.\r\n
\r\nThe PineTime is a free and open source smartwatch capable of running custom-built open operating systems. Some of the notable features include a heart rate monitor, a week-long battery as well as a capacitive touch IPS display that is legible in direct sunlight. It is a fully community driven side-project, which means that it will ultimately be up to the developers and end-users to determine when they deem the PineTime ready to ship. \r\n
\r\n

Listen to the interview with Koen Zandberg about PineTime

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

PostGraphile

\r\n

\"Logo\"

\r\n
\r\nExtensible high-performance automatic GraphQL API for PostgreSQL\r\n
\r\n

Listen to the interview with Benjie Gillam, OSS Maintainer PostGraphile

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Skolelinux / AlekSIS / Teckids

\r\n

\"Logo\"

\r\n
\r\nAt Teckids, all children and adolescents become part of the Free Software community - as users and contributors. Our young tutors aged between 9 and 16 regularly work together on their workshops, which they then lead for children and adolescents of the same age.\r\n
\r\n

Listen to the interview with Niels Bradek from Skolelinux / AlekSIS / Teckids

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Technoethical

\r\n

\"Logo\"

\r\n
\r\nTechnoethical is an online shop that sells hardware compatible with operating systems that fully respect users\' freedom as defined by the GNU Project. We are based in Bucharest, Romania (European Union) and we ship worldwide.\r\n
\r\n

Listen to the interview with Tiberiu Turbureanu about Technoethical

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Tiny Go

\r\n

\"Logo\"

\r\n
\r\nTinyGo is a project to bring the Go programming language to microcontrollers and modern web browsers by creating a new compiler based on LLVM. You can compile and run TinyGo programs on several different microcontroller boards such as the BBC micro:bit and the Arduino Uno. TinyGo can also be used to produce WebAssembly (WASM) code which is very compact in size.\r\n
\r\n

Listen to the interview with Ron \"Dead Program\" Evans about Tiny Go

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

XCP-ng

\r\n

\"Logo\"

\r\n
\r\nTurnkey Open Source Hypervisor. Based on XenServer, XCP-ng is the result of massive cooperation between individuals and companies, to deliver a product without limits. No restrictions on features and every bit available on GitHub! \r\n
\r\n

Listen to the interview with Olivier Lambert about XCP-ng

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Zenroom

\r\n

\"Logo\"

\r\n
\r\nZenroom: easy cryptography to the people. Zenroom is a tiny and portable virtual machine that authenticates and manages access to data using human-readable smart contracts. Zenroom is easy to program to performs fast cryptographic operations for end-to-end encryption and runs on: desktop, embedded, mobile phones, clouds and web browsers.\r\n
\r\n

Listen to the interview with Denis \"Jaromil\" Roio from Zenroom

\r\n

\"headshot\"

\r\n

\r\n

Links

\r\n\r\n\r\n\r\n

Fenster

\r\n

Fenster - Free Software Song

\r\n

\r\n

Links

\r\n\r\n\r\n
Track name : Free Software Song\r\nPerformer : Fenster\r\nRecorded date : 2002\r\nCopyright : Copyright (C) 2002, \r\nFenster LLC. Verbatim copying of this entire recording is permitted in any medium, \r\nprovided this notice is preserved. \r\nPerformers: \r\nPaul Robinson (vocals), \r\nRoman Kravec (guitar), \r\nEd D\'Angelo (bass), \r\nDave Newman (drums), \r\nBrian Yarbrough (trumpet), \r\nTony Moore (trumpet). \r\n
\r\n\r\n',30,78,0,'CC-BY-SA','FOSDEM 2020',0,0,1), (3023,'2020-03-04','Critique My Script, Episode 1 - Qots-Crew-Gen',782,'Discussion of using a shell script to randomly generate a ten man aircrew.','

This is my second HPR episode and the first in what could be a series about shell scripts I have written. This episode goes through a short script which randomly generates first and last names for a ten man aircrew to use with the Avalon Hill game B-17 Queen of the Skies.

\r\n

You can see the basic script in action here:
\r\nhttps://www.sodface.com/misc/qots-crew-gen

\r\n

and a more complicated version here, though based on the same underlying methodolgy:
\r\nhttps://www.sodface.com/misc/qots-crew-gen2

\r\n

Here’s the script:

\r\n
#!/bin/sh\r\n\r\nfirst_names='./firstnames.txt'\r\nlast_names='./surnames.txt'\r\ncrew_positions='./positions.txt'\r\ncrew_ranks='./ranks.txt'\r\n\r\nlen_first_names=$(wc -l < ${first_names})\r\nlen_last_names=$(wc -l < ${last_names})\r\n\r\nnum_pairs=$(printf "10 ${len_first_names} ${len_last_names}" | \\\r\n    awk 'BEGIN { srand() }\r\n    { for (i=1; i<=$1; i++) {\r\n        for(f = 2; f <= NF; f++) {\r\n        num=int(rand() * $f + 1); printf num"," } printf "\\n"\r\n    }\r\n    }')\r\n\r\ni=1\r\n\r\nfor crew_member in ${num_pairs}\r\ndo\r\n  line_num=$(printf "${crew_member}" | cut -d',' -f1)\r\n  first_name=$(sed -n ${line_num}p ${first_names})\r\n\r\n  line_num=$(printf "${crew_member}" | cut -d',' -f2)\r\n  last_name=$(sed -n ${line_num}p ${last_names})\r\n\r\n  crew_position=$(sed -n ${i}p ${crew_positions})\r\n  crew_rank=$(sed -n ${i}p ${crew_ranks})\r\n\r\n  #\r\n  # Use the variables above to generate HTML.\r\n  # Omitted here to simplify this example.\r\n  #\r\n\r\n  i=$((( ${i} +1 )))\r\ndone
\r\n',380,0,0,'CC-BY-SA','Shell Script,Random Numbers,Awk',0,0,1), (3024,'2020-03-05','A funny thing happened the other day',259,'Describing a funny thing that happened the other day.','

Equipment used

\r\n\r\n',201,0,1,'CC-BY-SA','story, audio, sound',0,0,1), (3027,'2020-03-10','What is quantum computing and why should we care?',1515,'What is all the quantum computing hype about & what is it that quantum computers will be able to do?','

What are quantum computers anyway?

\r\n

Physical computing systems that take advantage of quantum effects.

\r\n

What kind of quantum effects, and why does that matter?

\r\n

Entanglement and superposition: Entanglement lets us do unusual, head-scratching kinds of things like teleportation. Superposition lets us harness the almost unimaginable potential of quantum mechanics to do things that conventional computers can never do.

\r\n

How can you ever explain that in a podcast?

\r\n

To really understand the details, you must have math, but math and audio formats are not so compatible. So I use analogies, and throw in some pithy quotes from Einstein and hope that does the trick.

\r\n

Big picture?

\r\n

Lots of work going on to build quantum processors (QPUs) that use quantum memory and, get this, will at some point actually do error correction. There are programming frameworks and rudimentary compilers to compile down python code all the way down to microwave pulses and laser pulses and there is control machinery to gather back the signals and interpret them to ones and zeros. Quantum computers will be securely networked using quantum protocols and we’ll all live happily ever after in a quantum computing world.

\r\n

Questions? Please leave suggestions if you want to dive a bit deeper in some topic areas - it’ll encourage me to do more episodes.

\r\n',379,0,0,'CC-BY-SA','quantum computing',0,0,1), (3028,'2020-03-11','Monads and Haskell',1275,'A hopefully not too rambly \"introduction\" to functors and monads in and out of haskell','

This is basically a transcript of the post I wrote on the subject which I host here It has a bit more than what I talked about

\r\n

Join in Haskell

\r\n

join is a monadic operation, instead of working only on lists, it works on monads and has the signature:

\r\n
   join :: Monad m => m ( m a ) -> (m a)\r\n
\r\n

In effect it joins or merges two successive monad applications into a single monad application. But join is not part of the canonical monad definition, which is given by:

\r\n
   return ::  Monad m => a -> m a` ; and`\r\n   (>>=) :: Monad m => m a -> ( a -> m b ) -> m b\r\n
\r\n

A good or rather trivial way to think of the relationship between return join and (>>=) is that in essence, since each monad is a functor, then what (>>=) does is that it maps the second argument over the first argument, and then uses join to merge the two applications of the monad constructor, i.e.:

\r\n
  (x >>= f) = join $ fmap f x\r\n
\r\n

However, join needs to be constructed from return and (>>=). The naive solution is that we want to trick (>>=) to let us apply a function that does not pile up yet another m onto our initial type m (m a) and surprisingly, this will actually work if we let

\r\n
   join x = (x >>= id)\r\n
\r\n

Initially this is surprising since id has the signature (c -> c) instead of the necessary a -> m b! However, when c is not an atomic type, but rather of the form m d for some (maybe atomic) type d, then we actually have the signature m d -> m d, and if we bind type a to m d and type b to d, we obtain id with actual type signatuare a -> m b, and it can indeed be used as the second argument of (>>=), and everything actually makes sense.

\r\n

Now style is important and so we can do an eta reduction on this, to get a point-free implementation by simply binding the second argument of >>=:

\r\n
   join = (>>= id)\r\n
\r\n

This is all fine and well for the type number, and it does work, but it\'s also important to understand how it works, so let\'s see it in a simple example, using the Maybe monad. So let\'s start by refreshing the implementation of the monad instance:

\r\n
instance Monad Maybe where\r\n\r\n   (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b\r\n   (>>=) Nothing _ = Nothing\r\n   (>>=) (Just x) f = f x\r\n\r\n   return :: a -> Maybe a\r\n   return = Just\r\n
\r\n

So let\'s now go through the successive bindings when performing (>>=id):

\r\n
   Just x = Just (Just 2) => x = Just 2\r\n   Just x >>= id = id x = x\r\n   x = Just 2\r\n
\r\n

This example is pretty much verbatim the same thing for the Either monad and many other monads that follow a similar principle, so let\'s look at a bit more of a complex example. Let\'s look at the List monad:

\r\n

instance Monad List where

\r\n
   (>>=) :: [a] -> (a -> [b]) -> [b]\r\n   (>>=) [] _ = []\r\n   (>>=) (x:xs) f = f x ++ (xs >>= f)\r\n\r\n   return :: a -> [a]\r\n   return = (:[])\r\n
\r\n

Following the bindings again we have

\r\n
   [[2,3],[4]] = (x:xs) => x = [2,3] ; xs = [[4]]\r\n   (x:xs) >>= id = (id x) ++ (xs >>= id) = x ++ (xs >>= id)\r\n   [[4]] = (y:ys) => y = [4] ; ys = []\r\n   (y:ys) >>= id = y ++ (ys >>= id)\r\n   ys = [] => (ys >>= id) = []\r\n   => (y:ys) >>= id  =  [4] ++ [] = [4]\r\n   => xs >>= id = [4]\r\n   => (x:xs) >>= id = x ++ [4] = [2,3] ++ [4] = [2,3,4]\r\n
\r\n

So all of this is to say that join actually does what one expects it to do on a list of lists. It joins them one by one into a single list.

\r\n

The Associativity Law

\r\n

The associativity law of a monad can be quite confusing, after all it takes the form:

\r\n
   (m >>= f) >>= g == m >>= ( x -> f x >>= g )\r\n
\r\n

While not too complicated to understand it is difficult to see how it relates to a usual associativity law, which follows the form a * (b * c) = (a * b) * c. To recover the associativity the usual explanation is that one has to see it in terms of the monadic function composition (>=>) and while this is a valid way of doing so, I like to decompose things in terms of fmap, (>>=) and join.

\r\n

So let\'s use what we did previously on the associativity law, starting on the left side, and replacing the atomic-looking type m with the dependent type M z:

\r\n
   (M z >>= f) >>= g\r\n   = join (fmap f (M z)) >>= g\r\n   = join (fmap g $ join ( fmap f (M z)))\r\n   = join (fmap g $ join ( M (f z) )\r\n
\r\n

and the right-hand side:

\r\n
   M z >>= ( x -> f x >>= g )\r\n   = M z >>= ( x -> join $ fmap g (f x))\r\n   = join $ fmap ( x -> join $ fmap g (f x)) (M z)\r\n   = join $ M ( x -> join $ fmap g (f x)) z\r\n   = join $ M (join $ fmap g (f z))\r\n
\r\n

And essentially what it says is that if I have two functions f and g I can either do it in an orderly fashion where I apply them sequentially with join . fmap f followed by join . fmap g, or I can apply them both within the constructor and then join once within the constructor and one outside the constructor, and I should get the same thing. In fact if you replace f and g with id; this is the associativity law for monads as usually presented in a standard category theory textbook such as Mac Lane\'s Categories for the Working Mathematician (and recovering this was the whole point of this exercise in the first place).

\r\n',385,107,1,'CC-BY-SA','Haskell, Programming, Math',0,0,1), (3029,'2020-03-12','At Union Station with a train delay',347,'This is a soundscape while waiting for a train at Union Station.','

I was waiting for the Metra train, when there was an announcement that the train would be late due to a server failure.

',318,101,0,'CC-BY-SA','soundscape, trains',0,0,1), (3030,'2020-03-13','My new Samsung tablet',1686,'A general discussion about my new 10.5 inch Samsung Galaxy tablet','\r\n',201,0,1,'CC-BY-SA','Android, Tablet',0,0,1), (3031,'2020-03-16','Daniel Persson - Me? Me!',1131,'I talk about who I am and where I come from and what my interests are.','

Talking about my history, forgot to talk about my open-source interests and different projects I’m a part of.

\r\n

If you want to know more about me you could follow any of the links below.

\r\n\r\n',382,0,0,'CC-BY-SA','biography',0,0,1), (3032,'2020-03-17','piCore on a Raspberry Pi 1 Model B',651,'How I revived my Raspberry Pi Model 1 B with piCore and a tiny SD card.','

In this episode, I discuss how I revived my Raspberry Pi 1 Model B using piCore, a specialized version of Tiny Core Linux for the Raspberry Pi, on a 128 MB SD card that I had laying around. I also mention nanoBSD and Alpine Linux as possible alternatives to try out.

\r\n\r\n',152,0,0,'CC-BY-SA','raspberrypi,rpi,linux,bsd',0,0,1), (3033,'2020-03-18','Linux Inlaws S01E03 32 Bit Time Travel',3543,'Linux Inlaws - a podcast on topics around free and open source software','

For show notes, please visit https://linuxinlaws.eu

',384,111,1,'CC-BY-SA','Linux Inlaws, free open source software, revolution, FLOSS',0,0,1), (3034,'2020-03-19','How to bridge Freenode IRC rooms to Matrix.org',786,'Thaj builds upon a previous episode by Clacke to deep dive into bridging IRC to Matrix.org','\r\n',270,108,0,'CC-BY-SA','Freenode, IRC, Matrix.org, Riot.im, Social Media',0,0,1), (3037,'2020-03-24','Ambient recording at Union Station',205,'Ambient recording in the main hall at Union Station, Chicago','

This was recorded in the main hall at Union Station in Chicago, Illinois.
\r\nThere was a brief security announcement about watching for bags or package left unattended.

',318,101,0,'CC-BY-SA','soundscape, train station',0,0,1), (3038,'2020-03-25','Solo Magic',2244,'All the magic without the gathering','

This episode outlines my single-player mod for the Magic: The Gathering card game.

',78,95,0,'CC-BY-SA','magic, mtg',0,0,1), (3040,'2020-03-27','Why use GNU Autotools',1766,'6 good reasons you should be using a build system','

GNU Autotools is a build system that helps you distribute your code in a predictable and reliable way.\r\nBuild systems offer many benefits, including:\r\n

\r\n\r\n
    \r\n
  1. Standard and automate-able build process
  2. \r\n
  3. hooks into packaging systems (RPM, DEB, Slackbuilds, Flatpak, Snap, and so on)
  4. \r\n
  5. version reporting
  6. \r\n
  7. build for various OSes
  8. \r\n
  9. you get lots of code to handle every possible corner case, for free
  10. \r\n
  11. with a single configuration, you can build your project as the developer, build it for packagers, and enable users to build it for themselves
  12. \r\n
\r\n\r\n

Next up: how to use GNU Autotools

',78,0,0,'CC-BY-SA','autotools,build,make',0,0,1), (3041,'2020-03-30','How to use GNU Autotools',2337,'How to use GNU Autotools','

I found a great article on this topic here: https://opensource.com/article/19/7/introduction-gnu-autotools, so please refer to that as show notes.

\r\n

\r\n\r\nPage included by Ken, as permitted by cc-by-sa\r\n\r\n

\r\n

Introduction to GNU Autotools

\r\n\r\n

Have you ever downloaded the source code for a popular software project that required you to type the almost ritualistic ./configure; make && make install command sequence to build and install it? If so, you’ve used GNU Autotools. If you’ve ever looked into some of the files accompanying such a project, you’ve likely also been terrified at the apparent complexity of such a build system.

\r\n\r\n

Good news! GNU Autotools is a lot simpler to set up than you think, and it’s GNU Autotools itself that generates those 1,000-line configuration files for you. Yes, you can write 20 or 30 lines of installation code and get the other 4,000 for free.

\r\n\r\n

Autotools at work

\r\n\r\n

If you’re a user new to Linux looking for information on how to install applications, you do not have to read this article! You’re welcome to read it if you want to research how software is built, but if you’re just installing a new application, go read my article about installing apps on Linux.

\r\n\r\n

For developers, Autotools is a quick and easy way to manage and package source code so users can compile and install software. Autotools is also well-supported by major packaging formats, like DEB and RPM, so maintainers of software repositories can easily prepare a project built with Autotools.

\r\n\r\n

Autotools works in stages:

\r\n\r\n
    \r\n
  1. First, during the ./configure step, Autotools scans the host system (the computer it’s being run on) to discover the default settings. Default settings include where support libraries are located, and where new software should be placed on the system.
  2. \r\n
  3. Next, during the make step, Autotools builds the application, usually by converting human-readable source code into machine language.
  4. \r\n
  5. Finally, during the make install step, Autotools copies the files it built to the appropriate locations (as detected during the configure stage) on your computer.
  6. \r\n

This process seems simple, and it is, as long as you use Autotools.

\r\n\r\n

The Autotools advantage

\r\n\r\n

GNU Autotools is a big and important piece of software that most of us take for granted. Along with GCC (the GNU Compiler Collection), Autotools is the scaffolding that allows Free Software to be constructed and installed to a running system. If you’re running a POSIX system, it’s not an understatement to say that most of your operating system exists as runnable software on your computer because of these projects.

\r\n\r\n

In the likely event that your pet project isn’t an operating system, you might assume that Autotools is overkill for your needs. But, despite its reputation, Autotools has lots of little features that may benefit you, even if your project is a relatively simple application or series of scripts.

\r\n\r\n

Portability

\r\n\r\n

First of all, Autotools comes with portability in mind. While it can’t make your project work across all POSIX platforms (that’s up to you, as the coder), Autotools can ensure that the files you’ve marked for installation get installed to the most sensible locations on a known platform. And because of Autotools, it’s trivial for a power user to customize and override any non-optimal value, according to their own system.

\r\n\r\n

With Autotools, all you need to know is what files need to be installed to what general location. It takes care of everything else. No more custom install scripts that break on any untested OS.

\r\n\r\n

Packaging

\r\n\r\n

Autotools is also well-supported. Hand a project with Autotools over to a distro packager, whether they’re packaging an RPM, DEB, TGZ, or anything else, and their job is simple. Packaging tools know Autotools, so there’s likely to be no patching, hacking, or adjustments necessary. In many cases, incorporating an Autotools project into a pipeline can even be automated.

\r\n\r\n

How to use Autotools

\r\n\r\n

To use Autotools, you must first have Autotools installed. Your distribution may provide one package meant to help developers build projects, or it may provide separate packages for each component, so you may have to do some research on your platform to discover what packages you need to install.

\r\n\r\n

The primary components of Autotools are:

\r\n\r\n\r\n\r\n

While you likely need to install the compiler (GCC, for instance) required by your project, Autotools works just fine with scripts or binary assets that don’t need to be compiled. In fact, Autotools can be useful for such projects because it provides a make uninstall script for easy removal.

\r\n\r\n

Once you have all of the components installed, it’s time to look at the structure of your project’s files.

\r\n\r\n

Autotools project structure

\r\n\r\n

GNU Autotools has very specific expectations, and most of them are probably familiar if you download and build source code often. First, the source code itself is expected to be in a subdirectory called src.

\r\n\r\n

Your project doesn’t have to follow all of these expectations, but if you put files in non-standard locations (from the perspective of Autotools), then you’ll have to make adjustments for that in your Makefile later.

\r\n\r\n

Additionally, these files are required:

\r\n\r\n\r\n\r\n

You don’t have to actively use the files, and they can be symlinks to a monolithic document (like README.md) that encompasses all of that information, but they must be present.

\r\n\r\n

Autotools configuration

\r\n\r\n

Create a file called configure.ac at your project’s root directory. This file is used by autoconf to create the configure shell script that users run before building. The file must contain, at the very least, the AC_INIT and AC_OUTPUT M4 macros. You don’t need to know anything about the M4 language to use these macros; they’re already written for you, and all of the ones relevant to Autotools are defined in the documentation.

\r\n\r\n

Open the file in your favorite text editor. The AC_INIT macro may consist of the package name, version, an email address for bug reports, the project URL, and optionally the name of the source TAR file.

\r\n\r\n

The AC_OUTPUT macro is much simpler and accepts no arguments.

\r\n\r\n
AC_INIT([penguin], [2019.3.6], [seth@example.com])
\r\nAC_OUTPUT
\r\n\r\n

If you were to run autoconf at this point, a configure script would be generated from your configure.ac file, and it would run successfully. That’s all it would do, though, because all you have done so far is define your project’s metadata and called for a configuration script to be created.

\r\n\r\n

The next macros you must invoke in your configure.ac file are functions to create a Makefile. A Makefile tells the make command what to do (usually, how to compile and link a program).

\r\n\r\n

The macros to create a Makefile are AM_INIT_AUTOMAKE, which accepts no arguments, and AC_CONFIG_FILES, which accepts the name you want to call your output file.

\r\n\r\n

Finally, you must add a macro to account for the compiler your project needs. The macro you use obviously depends on your project. If your project is written in C++, the appropriate macro is AC_PROG_CXX, while a project written in C requires AC_PROG_CC, and so on, as detailed in the Building Programs and Libraries section in the Autoconf documentation.

\r\n\r\n

For example, I might add the following for my C++ program:

\r\n\r\n
AC_INIT([penguin], [2019.3.6], [seth@example.com])
\r\nAC_OUTPUT
\r\nAM_INIT_AUTOMAKE
\r\nAC_CONFIG_FILES([Makefile])
\r\nAC_PROG_CXX
\r\n\r\n

Save the file. It’s time to move on to the Makefile.

\r\n\r\n

Autotools Makefile generation

\r\n\r\n

Makefiles aren’t difficult to write manually, but Autotools can write one for you, and the one it generates will use the configuration options detected during the ./configure step, and it will contain far more options than you would think to include or want to write yourself. However, Autotools can’t detect everything your project requires to build, so you have to add some details in the file Makefile.am, which in turn is used by automake when constructing a Makefile.

\r\n\r\n

Makefile.am uses the same syntax as a Makefile, so if you’ve ever written a Makefile from scratch, then this process will be familiar and simple. Often, a Makefile.am file needs only a few variable definitions to indicate what files are to be built, and where they are to be installed.

\r\n\r\n

Variables ending in _PROGRAMS identify code that is to be built (this is usually considered the primary target; it’s the main reason the Makefile exists). Automake recognizes other primaries, like _SCRIPTS, _DATA, _LIBRARIES, and other common parts that make up a software project.

\r\n\r\n

If your application is literally compiled during the build process, then you identify it as a binary program with the bin_PROGRAMS variable, and then reference any part of the source code required to build it (these parts may be one or more files to be compiled and linked together) using the program name as the variable prefix:

\r\n\r\n
bin_PROGRAMS = penguin
\r\npenguin_SOURCES = penguin.cpp
\r\n\r\n

The target of bin_PROGRAMS is installed into the bindir, which is user-configurable during compilation.

\r\n\r\n

If your application isn’t actually compiled, then your project doesn’t need a bin_PROGRAMS variable at all. For instance, if your project is a script written in Bash, Perl, or a similar interpreted language, then define a _SCRIPTS variable instead:

\r\n\r\n
bin_SCRIPTS = bin/penguin
\r\n\r\n

Automake expects sources to be located in a directory called src, so if your project uses an alternative directory structure for its layout, you must tell Automake to accept code from outside sources:

\r\n\r\n
AUTOMAKE_OPTIONS = foreign subdir-objects
\r\n\r\n

Finally, you can create any custom Makefile rules in Makefile.am and they’ll be copied verbatim into the generated Makefile. For instance, if you know that a temporary value needs to be replaced in your source code before the installation proceeds, you could make a custom rule for that process:

\r\n\r\n
all-am: penguin
\r\n        touch bin/penguin.sh
\r\n       
\r\npenguin: bin/penguin.sh
\r\n        @sed \"s|__datadir__|@datadir@|\" $< >bin/$@
\r\n\r\n

A particularly useful trick is to extend the existing clean target, at least during development. The make clean command generally removes all generated build files with the exception of the Automake infrastructure. It’s designed this way because most users rarely want make clean to obliterate the files that make it easy to build their code.

\r\n\r\n

However, during development, you might want a method to reliably return your project to a state relatively unaffected by Autotools. In that case, you may want to add this:

\r\n\r\n
clean-local:
\r\n        @rm config.status configure config.log
\r\n        @rm Makefile
\r\n        @rm -r autom4te.cache/
\r\n        @rm aclocal.m4
\r\n        @rm compile install-sh missing Makefile.in
\r\n\r\n

There’s a lot of flexibility here, and if you’re not already familiar with Makefiles, it can be difficult to know what your Makefile.am needs. The barest necessity is a primary target, whether that’s a binary program or a script, and an indication of where the source code is located (whether that’s through a _SOURCES variable or by using AUTOMAKE_OPTIONS to tell Automake where to look for source code).

\r\n\r\n

Once you have those variables and settings defined, you can try generating your build scripts as you see in the next section, and adjust for anything that’s missing.

\r\n\r\n

Autotools build script generation

\r\n\r\n

You’ve built the infrastructure, now it’s time to let Autotools do what it does best: automate your project tooling. The way the developer (you) interfaces with Autotools is different from how users building your code do.

\r\n\r\n

Builders generally use this well-known sequence:

\r\n\r\n
$ ./configure
\r\n$ make
\r\n$ sudo make install
\r\n\r\n

For that incantation to work, though, you as the developer must bootstrap the build infrastructure. First, run autoreconf to generate the configure script that users invoke before running make. Use the –install option to bring in auxiliary files, such as a symlink to depcomp, a script to generate dependencies during the compiling process, and a copy of the compile script, a wrapper for compilers to account for syntax variance, and so on.

\r\n\r\n
$ autoreconf --install
\r\nconfigure.ac:3: installing \'./compile\'
\r\nconfigure.ac:2: installing \'./install-sh\'
\r\nconfigure.ac:2: installing \'./missing\'
\r\n\r\n

With this development build environment, you can then create a package for source code distribution:

\r\n\r\n
$ make dist
\r\n\r\n

The dist target is a rule you get for \"free\" from Autotools.
\r\nIt’s a feature that gets built into the Makefile generated from your humble Makefile.am configuration. This target produces a tar.gz archive containing all of your source code and all of the essential Autotools infrastructure so that people downloading the package can build the project.

\r\n\r\n

At this point, you should review the contents of the archive carefully to ensure that it contains everything you intend to ship to your users. You should also, of course, try building from it yourself:

\r\n\r\n
$ tar --extract --file penguin-0.0.1.tar.gz
\r\n$ cd penguin-0.0.1
\r\n$ ./configure
\r\n$ make
\r\n$ DESTDIR=/tmp/penguin-test-build make install
\r\n\r\n

If your build is successful, you find a local copy of your compiled application specified by DESTDIR (in the case of this example, /tmp/penguin-test-build).

\r\n\r\n
$ /tmp/example-test-build/usr/local/bin/example 
\r\nhello world from GNU Autotools
\r\n\r\n

Time to use Autotools

\r\n\r\n

Autotools is a great collection of scripts for a predictable and automated release process. This toolset may be new to you if you’re used to Python or Bash builders, but it’s likely worth learning for the structure and adaptability it provides to your project.

\r\n\r\n

And Autotools is not just for code, either. Autotools can be used to build Docbook projects, to keep media organized (I use Autotools for my music releases), documentation projects, and anything else that could benefit from customizable install targets.

\r\n',78,25,0,'CC-BY-SA','autotools,build,make',0,0,1), (3039,'2020-03-26','Making a Raspberry Pi status display',1608,'A project making use of my Pi 3A+, an old monitor and MagicMirror2','

Introduction

\r\n

I have had a project on my To Do list for a while: to make a status display from a Raspberry Pi. My vision was to show the state of various things including some HPR stuff, and I had imagined setting up a Pi with a monitor and controlling it over SSH.

\r\n

I started on the project over the Christmas period 2019. I have a Raspberry Pi 3A+, which is a sort of souped-up Pi Zero, which I bought on a whim and hadn’t found a use for (Yannick reviewed this RPi model in show 2711). I also had an old square Dell monitor from about 15 years ago which still worked (at least to begin with).

\r\n

I had imagined I’d write some software of my own with a web front end which ran various tasks to monitor things.

\r\n

However, in my researches I came across MagicMirror2 which I thought I might be able to use instead of writing my own thing.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','Raspberry Pi,VGA monitor,MagicMirror2,MQTT,Node.js,Electron',0,0,1), (3042,'2020-03-31','The COVID-19 Work From Home Stream - Day 0',4021,'A couple of HPR characters decide to spend some of their social distancing time being social','

Tuesday 17.03.2020

\r\n

Guests: honkeymagoo, crvs, and Thaj

\r\n\r\n',270,0,1,'CC-BY-SA','COVID-19, Stock Markets, Emacs, Python, Programming, Audiobooks, Growing Food, Video Games, SBCs',0,0,1), (3043,'2020-04-01','How I record for HPR',119,'The tools I use to record a show for HPR','
    \r\n
  1. Sentry BT250 Bluetooth Headphones w/ mic
    \r\nhttps://www.amazon.com/Wireless-Rechargeable-Stereo-Earbuds-Bluetooth/dp/B015NFWDX8

  2. \r\n
  3. F-Droid - free open source apps for Android
    \r\nhttps://f-droid.org/en/

  4. \r\n
  5. Audio Recorder from F-Droid
    \r\nhttps://f-droid.org/en/packages/com.github.axet.audiorecorder/
    \r\nFeatures:\r\n
      \r\n
    • Mute incoming call audio while recording
    • \r\n
    • Variety of format encoding\r\n
        \r\n
      • ogg (default)
      • \r\n
      • wav
      • \r\n
      • flac
      • \r\n
      • m4a
      • \r\n
      • mp3
      • \r\n
      • opus
      • \r\n
    • \r\n
  6. \r\n
  7. X-plore Android file explorer
    \r\nhttps://play.google.com/store/apps/details?id=com.lonelycatgames.Xplore&hl=en_US

  8. \r\n
  9. Audacity\r\n
      \r\n
    • Amplify tool
    • \r\n
    • Bass and Treble tool
    • \r\n
  10. \r\n
\r\n',318,0,0,'CC-BY-SA','recording, bluetooth, android',0,0,1), (3047,'2020-04-07','The COVID-19 Work From Home Stream - Day 1',2449,'A couple of HPR characters decide to spend some of their social distancing time being social','

Wednesday 18.03.2020 (2020-03-18)

\r\n

Guests: honkeymagoo, crvs, Lyle, Thaj

\r\n',270,0,1,'CC-BY-SA','OBS, Bidets, Grocery',0,0,1), (3048,'2020-04-08','Alternatives to toilet paper',702,'A non-satirical and non-sarcastic review of alternatives to toilet paper.','

In some countries, people seem to be legitimately concerned about the availability of toilet paper. This episode offers alternatives to toilet paper in the hope of relieving people of additional stress around hygiene.\r\n

This is not a joke episode and contains no offensive language, but it is about a potentially sensitive subject, so it has been marked explicit as a precaution.

',78,100,1,'CC-BY-SA','hygiene',0,0,1), (3051,'2020-04-13','The COVID-19 Work From Home Stream - Day 2',2552,'A few HPR characters decide to spend some of their social distancing time being social','

Thursday 19.03.2020

\r\n

Guests: honkeymagoo, Thaj

\r\n',270,0,1,'CC-BY-SA','Healthcare, Python, COVID-19, Plumble, Politcs, Technology',0,0,1), (3054,'2020-04-16','Coronavirus Thoughts',1101,'Where we are with this pandemic, and how should we respond.','

This is an attempt on my part to pull together what we know about the Coronavirus, and what measures we can take. It emphasizes the importance of social distancing, and evaluates our prospects for conquering the disease. https://www.palain.com/?page_id=731

\r\n\r\n\r\n
\r\nShow notes added by Ken as they are released under a Creative Commons Attribution-ShareAlike 4.0 International License. \r\n\r\n

\r\n Well, since I am sitting at home maintaining a “social distance” I thought I would put down some thoughts about this pandemic and how we will be affected. But a disclaimer to be completely clear: I am not a doctor or a research scientist. I am retired, but I was once a college professor teaching \r\n \r\n Statistics\r\n \r\n and \r\n \r\n Research Methods\r\n \r\n . I think this helps me in some way to interpret the information I receive, but when I want authoritative information I look to real doctors, the CDC, and qualified researchers. If you want to know more about what I mean by qualified researchers, you might want to check out my series on interpreting studies:\r\n

\r\n\r\n

\r\n And if you prefer audio to reading, you can download the audio versions at Hacker Public Radio:\r\n

\r\n\r\n

\r\n So, with the preliminaries out of the way, what do we know? We know that this is a virus of a type called coronavirus, which makes it part of the family of viruses that include the common cold, SARS, and MERS. What distinguishes this new virus, technically called SARS-CoV2 (though I usually just call it covid-19, like most reports do) is that it is highly infectious and highly virulent. Highly infectious means it is easily passed from one person to another. Highly virulent means that it can cause death easily. It has been compared in this respect to the 1918 Flu pandemic, which we estimate infected 500 million people worldwide (about 1/3 of the population at that time) and killed at least 20 million to 50 million people, and perhaps more. Note that assigning a cause of death is not a precise science, and medical record keeping in many parts of the world was sketchy at best.\r\n

\r\n

\r\n What Can Help?\r\n

\r\n

\r\n The ultimate answer to this would be a vaccine. Thankfully, the anti-vaxxers have crawled back under whatever rocks they live under for the time being, but a vaccine is not the perfect answer right now. The good news is that coronavirus appears to be one that does not mutate a lot, which means a vaccine is likely to be more effective than the flu vaccine. Influenza virus changes every year and that makes it a bit of guesswork to figure out. \r\n \r\n Scientists are working on a vaccine right now in a crash program\r\n \r\n , and again there is some good news on that front. First, Chinese scientists were able to DNA sequence the virus pretty quickly. They found that this virus shares 80-90% of its DNA with SARS, which is why it is named SARS-CoV2. Unfortunately, we don’t have a SARS vaccine because that outbreak died off before work was completed, but the work that was done is something we can build on. But in general, most researchers have said that it will take as much as 18 months even with a crash program. \r\n

\r\n

\r\n Usually these take much longer. First you do animal studies, both for safety and for efficacy. For example, one of the early candidates for a SARS vaccine was causing harm to the animals who received it, though they think that problem has now been solved. If the animal trials are promising, you can move on to human trials Stage 1 is to test with a small number of healthy volunteers, looking specifically to test safety. You don’t want to administer a vaccine that kill everyone, or even any significant number of people. If the candidate passes that test, Stage 2 is to administer the vaccine to a few hundred people in an area where the disease is rampant. If it looks like it is working, and no safety issues have arisen, a final trial can involve several thousand people. If it passes that, it can be approved for medical use and move into production. And that adds even more delays, since producing vaccine in large quantities takes a long time. According to Ronald Klain, Obama Administration’s Ebola Czar:\r\n

\r\n
\r\n

\r\n Developing and testing the vaccine — hard as it is — isn’t the hardest part. Manufacturing hundreds of millions of doses — and getting people to take the vaccine — will be harder and take longer.\r\n

\r\n \r\n \r\n https://s2.washingtonpost.com/camp-rw/?e=endpbG5pa0B6d2lsbmlrLmNvbQ%3D%3D&s=5e8b05f4fe1ff6038cf6a56a&linknum=0&linktot=79\r\n \r\n \r\n
\r\n

\r\n Now, this process can be accelerated to some degree, but not by as much as you might think. Doing the research to find a candidate that might work will take time, and there is no short cut. That is why researchers say a crash program might deliver something in 18 months, as opposed to the decade or more many vaccines require. Sometimes when these studies are done, you get quick results that can lead to dropping some steps. For example, if you have a test group and a control group, and the test group recovers quickly while the control group is dying, any ethical researcher will stop the trial and give the remedy to everyone who needs it. But you are dealing with probabilities in this, and most people are not comfortable with that. They want yes or no answers, and sadly life does not give that all the time. If you are responsible for that decision, if anything goes wrong you will get all of the blame. I’m glad I don’t have to make that decision, though also apprehensive that the people who do make that decision may not be sane adults.\r\n

\r\n

\r\n OK, if you we wait for the vaccine, what about medicines to cure the infection? Again, there is work being done here. Several different approaches are being studied. One which we know can work is called \r\n \r\n Convalescent Plasma\r\n \r\n (aka Convalescent Blood). This takes plasma from people who have recovered from the disease, and gives it intravenously to someone seriously ill. It is an old approach, predating vaccines, but it does work. The transfusion of the plasma contains antibodies made by the person who recovered, and those antibodies can help someone with the disease. But the obvious problem is that it does not scale very well when new cases keep increasing. Other approaches are using drugs developed for different illnesses, in the hope that they are sufficiently similar to covid-19 so that the medication would be effective. This is good since those medications have already passed all of the safety tests, but we just don’t know enough right now. Some reports suggest HIV drugs can help, other reports say they don’t. And so this may bear fruit, but it may be a while yet. The medicine promoted by Donald Trump, hydroxychloroquine, has not been found effective in any good research, and should not be counted on as a valid cure.\r\n

\r\n

\r\n And that brings us back to the things we know are effective at this point, which is preventing people from passing on the virus by \r\n \r\n social distancing\r\n \r\n , i.e. quarantine, and massive testing. If people stay home and do not interact with other people, they cannot pass the disease along and the outbreak will eventually die off. This will work if done properly. To see this, I will use an example I pulled from Steve Mirsky of the \r\n \r\n Scientific American Podcast\r\n \r\n , which requires less than a minute of spreadsheet work. This uses the reproduction factor R0, which is the average number of people who get infected by each person with the virus.\r\n

\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n Round\r\n \r\n R0=1.3\r\n \r\n R0=2.5\r\n
\r\n 1\r\n \r\n 1.3\r\n \r\n 2.5\r\n
\r\n 2\r\n \r\n 1.7\r\n \r\n 6.3\r\n
\r\n 3\r\n \r\n 2.2\r\n \r\n 15.6\r\n
\r\n 4\r\n \r\n 2.9\r\n \r\n 39.1\r\n
\r\n 5\r\n \r\n 3.7\r\n \r\n 97.7\r\n
\r\n 6\r\n \r\n 4.8\r\n \r\n 244.1\r\n
\r\n 7\r\n \r\n 6.3\r\n \r\n 610.4\r\n
\r\n 8\r\n \r\n 8.2\r\n \r\n 1525.9\r\n
\r\n 9\r\n \r\n 10.6\r\n \r\n 3814.7\r\n
\r\n 10\r\n \r\n 13.8\r\n \r\n 9536.7\r\n
\r\n
\r\n How the reproduction factor affects the spread\r\n
\r\n
\r\n

\r\n As we can see, with a factor of R0=1.3, which means each person infects on average 1.3 others, after ten rounds of infection it has only spread to 14 other people. But with R0=2.5, which doesn’t seem that much different, ten rounds means 9,536 people have the disease. Now, there are two primary factors affecting R0. One is the inherent infectiousness of the virus, which is high and out of our control. The other factor is how many people each person interacts with, and that is what we are trying to reduce through social distancing.\r\n

\r\n

\r\n Testing is still important, even at this stage, because it does several good things. First, it helps with the allocation of resources if we know exactly where the worst spots are. Second, it saves time and equipment in hospitals if we know exactly who is sick. Third, this gets us data we need to plan for future outbreaks. This pandemic is not the last one we will face, and this one won’t be over soon either. We need to know everything we can about how it spreads. And finally, we need a robust testing regime in place before we can “safely” start to resume our lives. \r\n

\r\n
\r\n

\r\n There’s also the fact that, eventually, we’re going to want to go back outside again. As the current protocols start to relax, \r\n \r\n a second wave of infections may arise,\r\n \r\n  especially if we don’t have a good grasp on where and how many cases we have in the U.S., said Dr. Eli Perencevich, a professor of medicine and epidemiology at the University of Iowa.\r\n

\r\n

\r\n “We can’t stay in social distancing forever,” Perencevich said. “So we need to ramp up testing quickly.”\r\n

\r\n \r\n \r\n https://fivethirtyeight.com/features/why-we-still-need-to-test-widely-for-coronavirus/\r\n \r\n \r\n
\r\n

\r\n So, the bottom line is that a vaccine is most likely 18 months away, medicines may be months away, and right now the best thing we can do as individuals is isolate.\r\n

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Coronavirus, COVID-19',0,0,1), (3049,'2020-04-09','What computers taught me about reality',1451,'Klaatu tells us what computers taught him about reality','

Some musings about what computers taught me about reality and perception.

',78,0,0,'CC-BY-SA','philosophy,system design',0,0,1), (3044,'2020-04-02','mocp snooze tip',391,'A quick snooze tip when using mocp','

I use cordless headphones, I find this very handy when I want mocp to play for a set time then pause.

\r\n

Commands used

\r\n',201,0,1,'CC-BY-SA','Linux, bash, podcasts, audio',0,0,1), (3056,'2020-04-20','Jitsi',764,'Jitsi is an open-source multiplatform videoconferencing ','

Jitsi is a collection of free and open-source multiplatform voice, videoconferencing and instant messaging applications for the web platform, Windows, Linux, Mac OS X and Android

\r\n

Jitsi          (Editor\'s Note: show notes amended 2020-06-13 from comment)

\r\n
systemctl stop docker\r\n\r\nrm -Rf /var/lib/docker\r\nrm -Rf ~/.jitsi-meet-cfg\r\n\r\n# change docker-data to your path you want to put images in\r\nmount --rbind /media/moredata/docker-data /var/lib/docker\r\n\r\napt-get remove --purge install docker-ce docker-ce-cli containerd.io\r\napt-get install docker-ce docker-ce-cli containerd.io\r\n\r\ncurl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose\r\nchmod +x /usr/local/bin/docker-compose\r\n\r\ngit clone https://github.com/jitsi/docker-jitsi-meet && cd docker-jitsi-meet\r\n\r\nsystemctl restart docker\r\n\r\ncp env.example .env\r\nmkdir -p ~/.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb}\r\n\r\ndocker-compose --log-level DEBUG up -d --force-recreate --remove-orphans\r\n\r\ntail -f `find /var/lib/docker/containers -iname "*.log" `\r\n\r\ndocker container ls\r\n\r\ndocker exec -it d4c89a799fd7 bash\r\n\r\n# side that will be controlled needs to run\r\nhttps://github.com/jitsi/jitsi-meet-electron/releases/latest
\r\n\r\n',36,0,1,'CC-BY-SA','linux,debian,computers,software,internet,Jitsi,video,conferencing,open-source',0,0,1), (3050,'2020-04-10','Linux Inlaws S01E04 What\'s in a name',4396,'Season 1, Episode 4. The episode where the legacy is revealed','

This is Linux Inlaws, a series on free and open source software, black humour, the revolution and freedom in general (this includes ideas and software) and generally having fun.

\r\n

Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.

\r\n

Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute t-rexes or other associated dinosaurs.

\r\n

In this show the lads Martin and Chris speak about the legacy, its name and also introduce Tech Support from the Dark Side, a new hotline helping politicians and other users in need of computer support to cope with reality.

\r\n

Links

\r\n\r\n',384,111,1,'CC-BY-SA','linux inlaws,communism,free and open source software',0,0,1), (3052,'2020-04-14','Locating computers on a network',1322,'Ken explains some different ways to locate computers on the network','

Locating computers on a network

\r\n\r\n

Sometimes you may wish to locate a device on your network. It might be to find rogue devices, or to locate a new device be that a printer, an Internet of Things light bulb, or whatever. In my case I was trying to track down a RaspberryPi. Raspbian now lists the IP Addresses assigned to it when it first starts, but that requires a monitor to be connected.

\r\n\r\n

Locating using your router.

\r\n\r\n

This is by far the easiest way to find a new device but it is also the most manual. If you have access to the (WiFi) Router/DHCP server on your network then this should be a matter of logging in and getting the address from the menu area probably called Network or LAN or something like that. So first list all the computers that are on the network. Then turn on your pi, and see if a new one has joined. If you\'re lucky it may even be labeled Raspberry Pi Foundation.

\r\n\r\n

In my case I want to locate these devices automatically using a script. So below we will explore some ways that you can approach the problem of locating devices on your network. All of them rely on trying to find the mapping between an Ethernet MAC Address, and a IP Address. It will help to understand a little about how Ethernet works. This is a nice short overview, How does Ethernet work? (animated) by Janos Pasztor

\r\n\r\n

ARP

\r\n\r\n

I don\'t know the network device you will be using so I\'d like to share a few ways of doing this using the ARP protocol. This provides a mapping between a device\'s permanent MAC address and their, often temporarily, assigned IP address.

\r\n\r\n

When your computer 192.168.1.1 wants to talk to another device it will need to know the Ethernet MAC address of the other device. Let\'s assume it wants to connect to the local printer 192.168.1.2 that is on the same network, and it knows its IP Address. If your computer has already heard the printer communicate on the network, it will have already added the printer\'s IP address and MAC Address to its so called ARP table. Over time older entries will be removed from this table either because they are too old, or there were too many entries.

\r\n\r\n

Linux has a command called arp which will show you a list of the IP addresses mapped to the MAC/HWaddress address.

\r\n
# arp -n\r\nAddress                  HWtype  HWaddress           Flags Mask            Iface\r\n192.168.1.254            ether   ff:ee:dd:cc:bb:aa   C                     eno1\r\n192.168.1.2              ether   00:11:22:33:44:55   C                     eno1\r\n192.168.1.1              ether   00:aa:bb:cc:dd:ee   C                     eno1\r\n
\r\n\r\n

From a Internet Protocol (IP) point of view all your devices in your house are probably in the same Subnet(work). But what if you need to communicate outside your network? For example to ping a well known server 8.8.8.8 to check if you have an Internet Connection. The IP settings also include a Default gateway to send all traffic not intended for the local network.

\r\n\r\n

Finding the Default gateway

\r\n\r\n

Your computer will have many IP Addresses configured but it\'s a good bet that the network you and your new pi are on is the same one as the default gateway is on. You can find the default gateway using the following command:

\r\n
$ route -n | grep -E \'Destination|^0.0.0.0\'\r\nDestination     Gateway         Genmask         Flags Metric Ref    Use Iface\r\n0.0.0.0         192.168.1.254   0.0.0.0         UG    100    0        0 eno1\r\n
\r\n\r\n

It uses route to show the route table showing IP Addresses and not network names. The first column is Destination and so a 0.0.0.0 there means route everything else to and the to we get from the second column Gateway, which is our gateway.

\r\n\r\n

You can also get the same information using the following command:

\r\n
$ ip route show | grep default\r\ndefault via 192.168.1.254 dev eno1 proto dhcp metric 100\r\n
\r\n\r\n

And now to just show the IP Address.

\r\n\r\n
$ route -n | awk '/^0.0.0.0/ {print $2}'\r\n192.168.1.254\r\n
\r\n\r\n\r\n

From an Ethernet point of view it needs to find the MAC address associated with your router/default gateway\'s IP address 192.168.1.254, so that it can send Ethernet Frames to it. In our case the address is in the ARP table, but if it wasn\'t then your computer would broadcast to everyone on the network using a special address ff:ff:ff:ff:ff:ff. When the router/default gateway replies that entry will be added to the ARP table.

\r\n\r\n
\r\n739  5.328679069  00:aa:bb:cc:dd:ee  ff:ff:ff:ff:ff:ff  ARP  42  Who has 192.168.1.254? Tell 192.168.1.1\r\n746  5.328911559  ff:ee:dd:cc:bb:aa  00:aa:bb:cc:dd:ee  ARP  60  192.168.1.254 is at ff:ee:dd:cc:bb:aa\r\n
\r\n\r\n

Have a play with WireShark to see what is actually going on on your network. There is a good step by step walk through on Wireshark/Arp on wikiversity.

\r\n\r\n

All RaspberryPi computers have an Ethernet MAC address starting with b8:27:eb or dc:a6:32. So if your computer and the new pi are on the same network you can look for new MAC addresses starting with b8:27:eb or dc:a6:32.

\r\n\r\n

Foiled by the Switch

\r\n\r\n

All is not plain sailing as most modern LAN\'s use switches to split up the broadcast domain.

\r\n\r\n
\r\nSwitches act as buffers, receiving and analyzing the frames from each connected network segment. Frames destined for nodes connected to the originating segment are not forwarded by the switch. Frames destined for a specific node on a different segment are sent only to that segment. Only broadcast frames are forwarded to all other segments. This reduces unnecessary traffic and collisions.\r\n
\r\n\r\n

What this means is that although all your computers may be on one big IP network, the devices may be connected to different switches. For example a WiFi Router downstairs, a Cabled Switch in the back room, and a network extender in the attic. All are filtering out unnecessary traffic. While that is a good thing, it does mean that it may not ever see the traffic from the new Pi.

\r\n\r\n

If we try and contact each and every IP Address on the network, that forces ARP \"Who has?\" traffic, and the answers that come back will be added to the arp table. There are a few ways to force this discovery.

\r\n\r\n

Discovery by ping

\r\n\r\n

One way to generate ARP traffic is to use the ping utility.

\r\n\r\n
\r\nPing measures the round-trip time for messages sent from the originating host to a destination computer that are echoed back to the source. The name comes from active sonar terminology that sends a pulse of sound and listens for the echo to detect objects under water.\r\n
\r\n\r\n

To ping an IP Address, just type ping 192.168.1.1. That will send out a continuous ping which you can stop by pressing and holding the ctrl key and then pressing the letter c.

\r\n\r\n
$ ping 192.168.1.1\r\nPING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.\r\n64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=0.547 ms\r\n64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=0.493 ms\r\n64 bytes from 192.168.1.1: icmp_seq=3 ttl=63 time=0.422 ms\r\n64 bytes from 192.168.1.1: icmp_seq=4 ttl=63 time=0.466 ms\r\n^C\r\n--- 192.168.1.1 ping statistics ---\r\n4 packets transmitted, 4 received, 0% packet loss, time 3105ms\r\nrtt min/avg/max/mdev = 0.422/0.482/0.547/0.045 m\r\n
\r\n\r\n

We don\'t actually care about the output, as the point here is to generate some traffic to see who is awake. So we can redirect output and errors to /dev/null. So a good command to do this would be:

\r\n\r\n
ping -n -c 1 -W 1 192.168.1.1 >/dev/null 2>&1 &
\r\n\r\n

The options used are to limit the traffic and wait time as much as possible:

\r\n\r\n
-n Numeric output only.  No attempt will be made to lookup symbolic names for host addresses.\r\n-c count. Stop after sending count ECHO_REQUEST packets. With deadline option, ping waits for count ECHO_REPLY packets, until the timeout expires.\r\n-W timeout. Time to wait for a response, in seconds. The option affects only timeout in absence of any responses, otherwise ping waits for two RTTs.\r\n
\r\n\r\n

In this solution we will try and ping every host on the network. It would be a bit tedious to do each one by one, so we will make a script to do this for us. It\'s a very safe bet that your home network will have a private IP range of 192.168.???.0 to 192.168.???.255. This is not a safe assumption in an Office Environment but we can deal with that later.

\r\n\r\n

So we will try and find the base part of the subnet 192.168.1.1 which will be 192.168.1 and then we will ping each address in turn.

\r\n\r\n
base=$( ip route show | awk -F '\\\\.|/| ' '/default/ {print $3"."$4"."$5}' )\r\nfor node in {1..254}\r\ndo\r\n( ping -n -c 1 -W 1 ${base}.${node} & )\r\ndone\r\n
\r\n\r\n

I\'m assigning the base variable the first three parts of the IP Address and then I am cycling through all possible addresses sending out a ping (a sort of hello message) to each. By wrapping the whole thing in () we can fork each to run at the same time.

\r\n\r\n

This will force some traffic between my computer and every computer on the network, which will fill up the arp table on my pc.

\r\n\r\n
# arp -n\r\nAddress                  HWtype  HWaddress           Flags Mask            Iface\r\n192.168.1.2              ether   00:11:22:33:44:55   C                     eno1\r\n192.168.1.1              ether   00:aa:bb:cc:dd:ee   C                     eno1\r\n192.168.1.10             ether   11:11:11:11:11:11   C                     eno1\r\n192.168.1.25             ether   22:22:22:22:22:22   C                     eno1\r\n192.168.1.3              ether   33:22:22:22:22:22   C                     eno1\r\n192.168.1.5              ether   b8:27:eb:11:11:11   C                     eno1\r\n
\r\n\r\n

And now we find all the computers that are on, and responding to pings on the network. We can see that there is one that starts with b8:27:eb|dc:a6:32, and it has an IP Address of 192.168.1.5.

\r\n\r\n
# arp -n | grep -Ei 'b8:27:eb|dc:a6:32' | awk '{print $1}'\r\n192.168.1.5\r\n
\r\n\r\n

Putting it all together

\r\n\r\n
base=$( ip route show | awk -F '\\\\.|/| ' '/default/ {print $3"."$4"."$5}' )\r\nfor node in {1..254}\r\ndo\r\n  (ping -n -c 1 -W 1 ${base}.${node} >/dev/null 2>&1 &)\r\ndone\r\narp -n | grep -Ei 'b8:27:eb|dc:a6:32' | awk '{print $1}'\r\n
\r\n\r\n

Discovery by nmap

\r\n\r\n

You should have permission in writing from your network administrator before you proceed with these steps.

\r\n\r\n

Here I am going to use some of the commands above together with the tools nmap and ipcalc to locate and scan the network. This has the advantage of dealing with more exotic subnet masks.

\r\n\r\n

Find the default interface

\r\n\r\n
# route -n\r\nKernel IP routing table\r\nDestination     Gateway         Genmask         Flags Metric Ref    Use Iface\r\n0.0.0.0         192.168.1.254   0.0.0.0         UG    100    0        0 eno1\r\n....\r\n\r\n# route -n | grep -E '^0.0.0.0' | awk '{print $8}'\r\neno1\r\n
\r\n\r\n

Find the ip and subnetmask for the default interface

\r\n
# ifconfig eno1 | grep 'inet '\r\ninet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255\r\n\r\n# ifconfig eno1 | grep 'inet ' | awk '{print $2"/"$4}'\r\n192.168.1.1/255.255.255.0\r\n
\r\n\r\n

Get the network from ipcalc

\r\n\r\n
# ipcalc 192.168.1.1/255.255.255.0\r\nAddress:        192.168.1.1\r\nNetwork:        192.168.1.0/24\r\nNetmask:        255.255.255.0 = 24\r\nBroadcast:      192.168.1.255\r\n\r\nAddress space:  Private Use\r\nAddress class:  Class C\r\nHostMin:        192.168.1.1\r\nHostMax:        192.168.1.254\r\nHosts/Net:      254\r\n\r\n# ipcalc 192.168.1.4/255.255.255.0 | grep 'Network' | awk '{print $NF}'\r\n192.168.1.0/24\r\n
\r\n

Now call nmap to give the ip address and MAC address

\r\n
# nmap -sn 192.168.1.0/24\r\nStarting Nmap 7.40 ( https://nmap.org ) at 2017-07-05 20:57 CEST\r\nNmap scan report for 192.168.1.2\r\nHost is up (0.0012s latency).\r\nMAC Address: 00:11:22:33:44:55 (Acme industries)\r\nNmap scan report for 192.168.1.5\r\nMAC Address: b8:27:eb:11:11:11 (Raspberry Pi Foundation)\r\nNmap scan report for local.lan (192.168.1.254)\r\nHost is up.\r\nNmap done: 256 IP addresses (2 hosts up) scanned in 3.51 seconds\r\n\r\n\r\n-sn (No port scan) This option tells Nmap not to do a port scan after host discovery, and only print out the available hosts that responded to the host discovery probes. This is often known as a “ping scan”, but you can also request that traceroute and NSE host scripts be run. In previous releases of Nmap, -sn was known as -sP.\r\n
\r\n\r\n

Discovery by arp-scan

\r\n\r\n

By far the easiest way to do this is using the dedicated tool called arp-scan, (Man Page)

\r\n\r\n
# arp-scan --interface eno1 --localnet --numeric --ignoredups\r\nInterface: eno1, type: EN10MB, MAC: 20:47:47:ca:24:a6, IPv4: 192.168.10.14\r\nStarting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)\r\n192.168.1.2     00:11:22:33:44:55       Acme industries\r\n192.168.1.5     dc:a6:32:22:22:22       Raspberry Pi Trading Ltd\r\n192.168.1.233   b8:27:eb:11:11:11       Raspberry Pi Foundation\r\n192.168.1.254   e4:95:6e:00:00:00       IEEE Registration Authority\r\n\r\n12 packets received by filter, 0 packets dropped by kernel\r\nEnding arp-scan 1.9.7: 256 hosts scanned in 1.939 seconds (132.03 hosts/sec). 12 responded\r\n
\r\n\r\n

Whichever option you chose I hope this helps you become more familiar with your network and the way it works.

\r\n',30,61,0,'CC-BY-SA','arp, ethernet, ip address, dhcp, wireshark, nmap, ping, route, router, arp-scan, wikiversity',0,0,1), (3053,'2020-04-15','AudioBookClub 17 - Blood Witness',9328,'Straight out of the Freezer, the HPR Audiobook Club reviews Blood Witness by David Hitt','

In this episode the HPR Audiobook Club discusses the audiobook Blood Witness by David Hitt

\r\n
\r\n

Non-Spoiler Thoughts

\r\n
\r\n\r\n

Beverage Reviews

\r\n
\r\n

As usual, the HPR AudioBook Club took some time to review the beverages that each of us were drinking during the episode

\r\n\r\n

Things We talked about

\r\n
\r\n\r\n

Our Next Audiobook

\r\n
\r\n

Star Trek: The Continuing Mission

\r\n

The Next Audiobook Club Recording

\r\n
\r\n

Right now we are working through a backlog of older episode that have already been recorded. Once that ends we fully anticipate recording new episodes with listener participation.

\r\n

Further Recommendations

\r\n
\r\n\r\n

Feedback

\r\n
\r\n

Thank you very much for listening to this episode of the HPR AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you’ll consider joining us next time we record a new episode. Please leave a few words in the episode’s comment section.

\r\n

As always; remember to visit the HPR contribution page HPR could really use your help right now.

\r\n

Sincerely, The HPR Audiobook Club

\r\n

P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.

\r\n

Our Audio

\r\n
\r\n

This episode was processed using Audacity. We’ve been making small adjustments to our audio mix each month in order to get the best possible sound. Its been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it’s not good at making everyone’s voice the same volume. We’re pretty happy with the way this month’s show turned out, so we’d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).

\r\n

We use the \"Truncate Silence\" effect with it’s default settings to minimize the silence between people speaking. When used with it’s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.

\r\n

Next we use the \"Compressor\" effect with the following settings:

\r\n
Threshold: -30db\r\nNoise Floor: -50db\r\nRatio: 3:1\r\nAttack Time: 0.2sec\r\nDecay Time: 1.0 sec
\r\n

\"Make-up Gain for 0db after compressing\" and \"compress based on peaks\" were both left un-checked.

\r\n

After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.

\r\n

We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.

\r\n

At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file’s metadata.

\r\n

At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.

\r\n

Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.

\r\n',157,53,1,'CC-BY-SA','HPR Audiobook Club,Audiobooks,Horror',0,0,1), (3060,'2020-04-24','Running a local imap server',360,'Ken installs courier-imap locally to have a local backup of his mail.','

Setting up a local imap server

\r\n

To install a local imap daemon that will only listen to localhost connections, made via ssh tunneling. This is for use as a local backup of your imap files, or for keeping a remote backup somewhere.

\r\n

This is not a mail delivery solution but rather a way to keep a backup of your email using to a MailDir directory that you can access using your email client. As each message is stored in its own file, you can also use normal tools like find|sed|awk|grep to find messages.

\r\n

This setup can be installed locally or remotely on, for example, a raspberry pi. In that case you can enable a portforwarding rule in ~/.ssh/config to include something like LocalForward 127.0.0.1:2143 127.0.0.1:143

\r\n

Install using aptitude install courier-imap courier-authdaemon

\r\n

You can check the status using systemctl status courier-imap.service courier-authdaemon.service

\r\n

Edit the file /etc/courier/imapd and modify the following settings:

\r\n

Address to listen on, can be set to a single IP address.

\r\n
    < ADDRESS=0\r\n    > ADDRESS=127.0.0.1\r\n
\r\n

Maximum number of IMAP servers started

\r\n
    < MAXDAEMONS=40\r\n    > MAXDAEMONS=80\r\n
\r\n

Maximum number of connections to accept from the same IP address

\r\n
    < MAXPERIP=20\r\n    > MAXPERIP=40\r\n
\r\n

The following setting is optional, and causes messages from the given folder to be automatically deleted after the given number of days.

\r\n
    < IMAP_EMPTYTRASH=Trash:7\r\n    > #IMAP_EMPTYTRASH=Trash:7\r\n
\r\n

Change the directory name of the maildir directory.

\r\n
    < MAILDIRPATH=Maildir\r\n    > MAILDIRPATH=/home/pi/MailDir\r\n
\r\n

Then restart the service using systemctl restart courier-imap.service courier-authdaemon.service.

\r\n

When I did this I got a strange error about but installing the package gamin fixed it. Which is a Library providing the FAM File Alteration Monitor API.

\r\n
  Filesystem notification initialization error -- contact your mail\r\n  administrator (check for configuration errors with the FAM/Gamin library)\r\n
\r\n

Links

\r\n\r\n',30,0,0,'CC-BY-SA','courier, imap, MailDir, raspberrypi',0,0,1), (3058,'2020-04-22','The COVID-19 Work From Home Stream - Day 3',6065,'A few HPR characters decide to spend some of their social distancing time being social','

Friday 2020-03-02

\r\n\r\n',270,0,1,'CC-BY-SA','Bidets, ffmpeg, driving, Programming, Arch Linux, OggcastPlanet, education',0,0,1), (3061,'2020-04-27','Parental Controls With Mike Ivy',2051,'We talk about Parental Controls and IOT device ','\r\n',36,0,1,'CC-BY-SA','IOT,hacking,amazon,android,firestick',0,0,1), (3057,'2020-04-21','Formal verification with Coq',1271,'Tuula talks about formally verifying code','

Coq is interactive theorem prover, which comes with its own programming language Gallina.

\r\n

If we wanted to write function that calculates resulting blood type based on two gene alleles, we could do it as following.

\r\n

Start by defining types that represents alleles and resulting blood type:

\r\n
Inductive BloodTypeAllele : Type :=\r\n  | BloodTypeA\r\n  | BloodTypeB\r\n  | BloodTypeO.\r\n\r\nInductive BloodType : Type :=\r\n  | TypeA\r\n  | TypeB\r\n  | TypeAB\r\n  | TypeO.
\r\n

Mapping between them is defined as follows:

\r\n
Definition bloodType (a b : BloodTypeAllele) : BloodType :=\r\n  match a, b with\r\n  | BloodTypeA, BloodTypeA => TypeA\r\n  | BloodTypeA, BloodTypeO => TypeA\r\n  | BloodTypeA, BloodTypeB => TypeAB\r\n  | BloodTypeB, BloodTypeB => TypeB\r\n  | BloodTypeB, BloodTypeA => TypeAB\r\n  | BloodTypeB, BloodTypeO => TypeB\r\n  | BloodTypeO, BloodTypeA => TypeA\r\n  | BloodTypeO, BloodTypeB => TypeB\r\n  | BloodTypeO, BloodTypeO => TypeO\r\n  end.
\r\n

Notice that the only way of getting TypeO blood is for both alleles to be BloodTypeO.

\r\n

We can state theorems about the code:

\r\n
Theorem double_O_results_O_type :\r\n  bloodType BloodTypeO BloodTypeO = TypeO.\r\nProof.\r\n  reflexivity.\r\n  Qed.
\r\n

double_O_results_O_type states that bloodType BloodTypeO BloodTypeO will have value of TypeO. There’s also attached proof for this theorem.

\r\n

Second theorem is longer:

\r\n
Theorem not_double_O_does_not_result_O_type :\r\n  forall (b1 b2 : BloodTypeAllele),\r\n  b1 <> BloodTypeO \\/ b2 <> BloodTypeO ->\r\n  bloodType b1 b2 <> TypeO.\r\nProof.\r\n  intros.\r\n  destruct b1.\r\n  - destruct b2.\r\n    + discriminate.\r\n    + discriminate.\r\n    + discriminate.\r\n  - destruct b2.\r\n    + discriminate.\r\n    + discriminate.\r\n    + discriminate.\r\n  - destruct b2.\r\n    + discriminate.\r\n    + discriminate.\r\n    + destruct H.\r\n      * simpl. contradiction.\r\n      * simpl. contradiction.\r\nQed.
\r\n

It states that if bloodType is applied with anything else than two BloodTypeO, the result will not be TypeO. Proof for this is longer. It goes through each and every combination of parameters and proves that the result isn’t TypeO. Mathematician could write this as: ∀ b1 b2, b1 ≠ BloodTypeO ∨ b2 ≠ BloodTypeO → bloodType b1 b2 ≠ TypeO.

\r\n

If code above is in module called Genes, we can add following at the end to instruct compiler to emit Haskell code:

\r\n
Extraction Language Haskell.\r\nExtraction Genes.
\r\n

Resulting code is as follows:

\r\n
data BloodTypeAllele =\r\n   BloodTypeA\r\n | BloodTypeB\r\n | BloodTypeO\r\n\r\ndata BloodType =\r\n   TypeA\r\n | TypeB\r\n | TypeAB\r\n | TypeO\r\n\r\nbloodType :: BloodTypeAllele -> BloodTypeAllele -> BloodType\r\nbloodType a b =\r\n  case a of {\r\n   BloodTypeA -> case b of {\r\n                  BloodTypeB -> TypeAB;\r\n                  _ -> TypeA};\r\n   BloodTypeB -> case b of {\r\n                  BloodTypeA -> TypeAB;\r\n                  _ -> TypeB};\r\n   BloodTypeO ->\r\n    case b of {\r\n     BloodTypeA -> TypeA;\r\n     BloodTypeB -> TypeB;\r\n     BloodTypeO -> TypeO}}
\r\n

Now we have Haskell code that started in Coq, has two properties formally verified and is ready to be integrated with rest of the system.

\r\n

Further reading:

\r\n\r\n',364,0,0,'CC-BY-SA','Coq, Haskell, mathematics',0,0,1), (3059,'2020-04-23','A quick intro to Snapcast',293,'A brief overview of Snapcast, an open source multi-room audio streaming system.','

Relevant links:

\r\n',386,0,1,'CC-BY-SA','opensource, selfhosted',0,0,1), (3062,'2020-04-28','Vassal: How to play board games while remote',931,'How to do physical distancing while avoiding social distance using digitized boardgames','

A friend, a stranger and I played https://www.vassalengine.org/ together.

\r\n

We played the Carcasonne-simple 1.2 module downloaded from https://www.vassalengine.org/wiki/Module:Carcassonne.

\r\n

There are some things that may be confusing the first time, but the game engine works well, the rule- and tile-set we played worked well, text chat is surprisingly adequate for talking to people while playing, and I would like to play again some time.

\r\n

Original Fediverse post at https://libranet.de/display/0b6b25a8-675e-91bf-8b9d-5c6226360513.

',311,95,0,'CC-BY-SA','game, board game, xmpp, remote, network game',0,0,1), (3063,'2020-04-29','Pens, pencils, paper and ink - 1',879,'Looking at a few more of my writing implements','

Introduction

\r\n

It’s been over four years since I did a show about fountain pens. It was in the What’s in My Toolkit series entitled What’s in my case, show 1941 released on 2016-01-11.

\r\n

I thought it might be appropriate to visit the subject once again. I want to tell you about some new pens and pencils I have acquired, some inks I am enjoying and some of the notebooks I have bought.

\r\n

There’s too much for a single show here, so I’m making a mini-series of three shows. This also leaves the door open for more when the collection grows in the future!

\r\n

Long notes

\r\n

I have provided detailed notes with pictures for this episode, and these can be viewed here.

\r\n

Links

\r\n',225,112,1,'CC-BY-SA','fountain pen,ballpoint pen',0,0,1), (3064,'2020-04-30','How I got started in Electronics',427,'How I got started in Electronics and some job stuff','

Links:

\r\n\r\n',318,0,0,'CC-BY-SA','electronics, soldering, trains, jobs',0,0,1), (3105,'2020-06-26','Akaso EK7000 Pro',1009,'My experience with an inexpensive Waterproof action camera called the Akaso EK7000 Pro','

Action cameras are becoming very popular, and many incorporate a waterproof feature. If you want to try this with something less expensive than a GoPro, take a look at this review.

\r\n\r\n',198,0,0,'CC-BY-SA','Camera, Waterproof Camera, Action camera',0,0,1), (3068,'2020-05-06','Keeping track of downloads in Elm',791,'Tuula shows how to keep track of what data is being downloaded in Elm','

Background

\r\n

I have page that requests several resources from server. To keep track what is going on, I initially had model like:

\r\n
type alias Model =\r\n    { availableChassis : List Chassis\r\n    , chassisLoaded : Bool\r\n    , chassisLoading : Bool\r\n    ...\r\n    }
\r\n

Problem with this is that I have to remember to check those boolean flags while rendering on screen. And it’s possible to have inconsistent state (both loading and loaded).

\r\n

Solution

\r\n

We can model state with algebraic datatypes and we don’t even have to write it by ourselves as there’s RemoteData library.

\r\n

Now we can change our model to following:

\r\n
import RemoteData exposing (RemoteData(..), WebData)\r\n\r\ntype alias Model =\r\n    { availableChassis : WebData (List Chassis)\r\n    }
\r\n\r\n

For example, while rendering the view, you could do

\r\n
    case model.availableChassis of\r\n        NotAsked ->\r\n            renderEmptyTable\r\n\r\n        Loading ->\r\n            renderLoadingTable\r\n\r\n        Success chassis ->\r\n            renderChassisList chassis\r\n\r\n        Failure error ->\r\n            renderErrorMessage error
\r\n',364,0,0,'CC-BY-SA','Elm, programming',0,0,1), (3080,'2020-05-22','Ansible ping',440,'Troubleshooting a basic install of Ansible','Here are some steps you need to should take when setting up Ansible for the first time.\r\n\r\n\r\n\r\n

Install the software

\r\nFirst you need to install the Ansible software. On Fedora that is as simple as a dnf install ansible, or on debian apt install ansible.\r\n\r\n

Confirm ssh working

\r\n\r\nConfirm that you can connect to the servers via ssh as you would normally.\r\n\r\n
ssh -i /home/my_user/.ssh/id_ed25519_pi my_user@192.168.0.1\r\nssh -i /home/my_user/.ssh/id_ed25519_pi your_username@192.168.1.2\r\n
\r\n\r\n

Create a Inventory/Host file

\r\n\r\nTranslate the ssh commands into a Inventory/Host file. I am using a YAML in this example but other variants are available.\r\n\r\n
all:\r\n  hosts:\r\n    my_server:\r\n      ansible_host: 192.168.0.1\r\n    your_server:\r\n      ansible_host: 192.168.1.2\r\n      ansible_ssh_user: your_username\r\n  vars:\r\n    ansible_connection: ssh\r\n    ansible_ssh_user: my_user\r\n    ansible_ssh_private_key_file: /home/my_user/.ssh/id_ed25519_pi\r\n
\r\n\r\n

Ansible Ping

\r\nCheck that your server is up and reported correctly in your file by having Ansible ping it. This should allow you to determine if at least there is a command and control connection available.\r\n\r\n
ansible --inventory-file my_inventory.yaml -m ping all\r\n
\r\n\r\nThis uses the group all and will ping all servers under it. The reply below shows a positive and negative response. \r\n\r\n
my_server | SUCCESS => {\r\n    \"ansible_facts\": {\r\n        \"discovered_interpreter_python\": \"/usr/bin/python\"\r\n    },\r\n    \"changed\": false,\r\n    \"ping\": \"pong\"\r\n}\r\nyour_server | UNREACHABLE! => {\r\n    \"changed\": false,\r\n    \"msg\": \"Failed to connect to the host via ssh: ssh: connect to host 192.168.1.2 port 22: No route to host\",\r\n    \"unreachable\": true\r\n}\r\n
\r\n\r\nThe msg will give you a clue as to what is going wrong and you should try to ssh directly with the Ansible credentials again, and then try and ping using Ansible.\r\n
ansible --inventory-file my_inventory.yaml -m ping your_server\r\n
\r\n\r\nModify the Inventory file until you have managed to get a successful reply. \r\n\r\n

Create a playbook

\r\n\r\nWork on your playbook and verify that it is valid yaml.\r\n\r\n
---\r\n- name: Test Ping\r\n  hosts: all\r\n  tasks:\r\n  - action: ping\r\n
\r\n\r\n

Confirm the YAML is valid

\r\nIf there is no reply all is good.\r\n
yamllint ~/my_example.yaml\r\n
\r\n\r\nIf there is no reply all is good. For your reference I will remove the --- line and this is the response.\r\n
yamllint ~/my_example.yaml\r\n/home/user/my_example.yaml\r\n  1:1       warning  missing document start \"---\"  (document-start)\r\n
\r\n\r\n

Confirm the syntax is valid

\r\nThen verify that the playbook is sane\r\n
ansible-playbook --syntax-check ~/my_example.yaml\r\n
\r\n\r\nIf there is no reply all is good. For your reference I will remove the hosts line and this is the response.\r\n
ansible-playbook --syntax-check ~/my_example.yaml\r\nERROR! the field \'hosts\' is required but was not set\r\n
\r\n\r\n

Confirm everything works together

\r\n\r\nAfter that you should be able to run the playbook using.\r\n\r\n
ansible-playbook --inventory-file my_inventory.yaml ~/my_example.yaml\r\n\r\nPLAY [Test Ping] ***************************************************************************************************\r\n\r\nTASK [Gathering Facts] *********************************************************************************************\r\n[WARNING]: Platform linux on host my_server is using the discovered Python interpreter at /usr/bin/python, but\r\nfuture installation of another Python interpreter could change this. See\r\nhttps://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.\r\nok: [my_server]\r\nfatal: [your_server]: UNREACHABLE! => {\"changed\": false, \"msg\": \"Failed to connect to the host via ssh: ssh: connect to host 192.168.1.2 port 22: No route to host\", \"unreachable\": true}\r\n\r\nTASK [ping] ********************************************************************************************************\r\nok: [my_server]\r\n\r\nPLAY RECAP *********************************************************************************************************\r\nmy_server                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \r\nyour_server                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0\r\n
\r\n',30,0,0,'CC-BY-SA','ansible, ping, ssh',0,0,1), (3084,'2020-05-28','AudioBookClub 18 - Star Trek: The Continuing Mission',6017,'The HPR Audiobook Club reviews the fan audio drama Star Trek: The Continuing Mission','

In this episode, the HPR_AudioBookClub discusses Star Trek The Continuing Mission created by Sebastian Prooth and Andy Tyrer.

\r\n
\r\n

Non-Spoiler Thoughts

\r\n
\r\n\r\n

Beverage Reviews

\r\n
\r\n

As usual, the HPR AudioBook Club took some time to review the beverages that each of us were drinking during the episode

\r\n\r\n

Things We talked about

\r\n
\r\n\r\n

Our Next Audiobook

\r\n
\r\n

Tincture, An Apocalyptic Proposition

\r\n

The Next Audiobook Club Recording

\r\n
\r\n

Right now we are working through a backlog of older episode that have already been recorded. Once that ends we fully anticipate recording new episodes with listener participation.

\r\n

Further Recommendations

\r\n
\r\n\r\n

Feedback

\r\n
\r\n

Thank you very much for listening to this episode of the HPR AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time we record a new episode. Please leave a few words in the episode\'s comment section.

\r\n

As always; remember to visit the HPR contribution page HPR could really use your help right now.

\r\n

Sincerely, The HPR Audiobook Club

\r\n

P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.

\r\n

Our Audio

\r\n
\r\n

This episode was processed using Audacity. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. Its been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).

\r\n

We use the \"Truncate Silence\" effect with it\'s default settings to minimize the silence between people speaking. When used with it\'s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.

\r\n

Next we use the \"Compressor\" effect with the following settings:

\r\n
Threshold: -30db\r\nNoise Floor: -50db\r\nRatio: 3:1\r\nAttack Time: 0.2sec\r\nDecay Time: 1.0 sec\r\n
\r\n

\"Make-up Gain for 0db after compressing\" and \"compress based on peaks\" were both left un-checked.

\r\n

After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.

\r\n

We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.

\r\n

At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata.

\r\n

At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.

\r\n

Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.

\r\n',270,0,1,'CC-BY-SA','Audiobooks, Audio Drama, Star Trek',0,0,1), (3100,'2020-06-19','For your consideration - Makers Corner',4534,'Makers Corner is a tech oriented DIY podcast, from the Other Side Podcast Network','

\r\nI\'m amazed I didn\'t find this podcast earlier, epically as one half of the team is HPR Host Yannick, and that we listed it on our Sister Project Free Culture Podcasts.

\r\n

\r\nThis show is a sample episode I picked, but it is not a typical show. I wanted to give a bit more exposure to the interview.\r\n

\r\n

\r\nIn this episode, Nate talks about his oldest boy’s Electronic Engineering class. Then, Jon and Phil join in to talk about the 32Blit. And finally, the guys have a look at the Monster Mouth Headphone Holder – Clampable, from thingiverse.

\r\n\r\n

Links

\r\n',30,75,0,'CC-BY-SA','pimoroni, gadgetoid, Monster Mouth Headphone Holder,Free Culture Podcasts',0,0,1), (3074,'2020-05-14','For your consideration - Escape Pod',1773,'A sample episode from Escape Pod The Original Science Fiction Podcast','

\r\nIt\'s high time I submitted a sample episode from Escape Pod, one of the many excellent Podcasts from the Escape Artists. They are a serious platform for the best science fiction out there today.\r\n

\r\n

\r\nWith so much choice, I can pick a recommendation that I think will be right up HPR\'s alley, and that is Escape Pod 624: Fandom for Robots released on April 19, 2018 written by Vina Jie-Min Prasad and Narrated by Trendane Sparks.\r\n

\r\n

\r\nThe sound files are published by under a Creative Commons Attribution-NonCommercial-NoDerivatives license https://creativecommons.org/licenses/by-nc-nd/3.0/.\r\n

',30,75,1,'CC-BY-NC-ND','EA Podcasts, Escape Pod, Fandom for Robots, Vina Jie-Min Prasad, Trendane Sparks',0,0,1), (3326,'2021-05-03','HPR Community News for April 2021',4825,'HPR Volunteers talk about shows released and comments posted in April 2021','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n Anonymous Host, \n Trey.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3304Thu2021-04-01Newsflash 21/01/04Anonymous Host
3305Fri2021-04-02Nagios part 2norrist
3306Mon2021-04-05HPR Community News for March 2021HPR Volunteers
3307Tue2021-04-06Git worktreeklaatu
3308Wed2021-04-07let\'s talk about ThunderbirdSome Guy On The Internet
3309Thu2021-04-08Linux Inlaws S01E27: The Big Uncertainties in Life and beyondmonochromec
3310Fri2021-04-09Layer MasksAhuka
3311Mon2021-04-12Bradley M. Kuhn\'s article from 2019 on Richard M. StallmanAnonymous Host
3312Tue2021-04-13COVID DoldrumsDave Morriss
3313Wed2021-04-14Zoom UpdateToeJet
3314Thu2021-04-15Introduction... A little bit about meTrey
3315Fri2021-04-16tesseract optical character recognitionKen Fallon
3316Mon2021-04-19FSF and RMS on election of Richard StallmanAnonymous Host
3317Tue2021-04-20Reading a manifesto: Towards A Cooperative Technology Movementclacke
3318Wed2021-04-21Modding a Wii classic with a DNS exploitArcher72
3319Thu2021-04-22Linux Inlaws S01E28: Politicians and artificial intelligence part 1monochromec
3320Fri2021-04-23YouTube Channels for Learning Spanish, Part 2Ahuka
3321Mon2021-04-26DNS66 URANDOM RANDOMoperat0r
3322Tue2021-04-27Tune system performance with tunedklaatu
3323Wed2021-04-28The alternate Internet you never knew existedklaatu
3324Thu2021-04-29Infosec Podcasts Part 1 News and Current Events Trey
3325Fri2021-04-30Games and rulesklaatu
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 25 comments in total.

\n

Past shows

\n

There are 4 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 21 comments on 9 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-April/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Booth kit update

\n

The FSF Europe have sent us a selection of stickers and leaflets to add to our booth kit(s).

\n

Posting Anonymously

\n\n

Older HPR shows on archive.org

\n

The project to upload the older HPR shows to archive.org has been quiescent for a few years. The shows between 1 and 870 had not been uploaded prior to April 2021 (though some shows had been uploaded in batches in the early days, without notes etc).

\n

However, this old show project has been restarted this month, after new software had been written to help manage the process. At the time of writing 65 shows in the range 1-870 have been uploaded, with notes, and with the same range of audio formats used for current shows.

\n

Since we don\'t want to upload shows without summaries or tags the two projects are now tied together. So we will be all the more welcoming of tag and summary updates sent to the address referenced in the next section!

\n

The plan is to report the numbers uploaded each month in the AOB section of the Community News show notes.

\n

HPR shows on archive.org have the URL https://archive.org/details/hprXXXX where XXXX is the show number with leading zeroes. So for example, show 840\'s URL is: https://archive.org/details/hpr0840.

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nDave Morriss, Windigo

\n

Over the period tags and/or summaries have been added to 23 shows which were without them.

\n

There are now 384 shows which need a summary and/or tags.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3351,'2021-06-07','HPR Community News for May 2021',3956,'The HPR Matrons are doing the rounds.','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3326Mon2021-05-03HPR Community News for April 2021HPR Volunteers
3327Tue2021-05-04Looking into Ceph storage solutionDaniel Persson
3328Wed2021-05-05Pandas Part 2Enigma
3329Thu2021-05-06Linux Inlaws S01E29: The (one and only) Linux Kernel Contributor Panelmonochromec
3330Fri2021-05-07A Layer Mask ProjectAhuka
3331Mon2021-05-10Audio for Podcasting: Episode 1 - The MicrophoneThaj Sara
3332Tue2021-05-11My current DevicesJWP
3333Wed2021-05-12My TV Stand devices and Pine64.orgJWP
3334Thu2021-05-13Infosec Podcasts Part 2 - General Information SecurityTrey
3335Fri2021-05-14For your consideration, the Anarcho Book ClubKen Fallon
3336Mon2021-05-17HPR 2020 - 2021 New Years Eve Show Episode 1Honkeymagoo
3337Tue2021-05-18I like that the boat is stuckDaniel Persson
3338Wed2021-05-19Using openssl s_client like telnetklaatu
3339Thu2021-05-20Linux Inlaws S01E30: Politicians and artificial intelligence part 2monochromec
3340Fri2021-05-21Hacked?Ahuka
3341Mon2021-05-24Linux on a serial Terminal - And Jorome\'s MainFrame ChallengeJWP
3342Tue2021-05-25HPR 2020 - 2021 New Years Eve Show Episode 2Honkeymagoo
3343Wed2021-05-26The Forth programming languageBrian in Ohio
3344Thu2021-05-27Infosec Podcasts Part 3 - Infosec Career and Personal DevelopmentTrey
3345Fri2021-05-28Audio for Podcasting: Episode 2 - EqualizationThaj Sara
3346Mon2021-05-31HPR 2020 - 2021 New Years Eve Show Episode 3Honkeymagoo
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 12 comments in total.

\n

Past shows

\n

There are 5 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 7 comments on 6 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-May/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Reminder - Stuff you need to know

\n\n

Reminder - Scheduling Guidelines

\n
    \n
  1. You must have your audio recording ready to upload before you pick a slot.
  2. \n
  3. Always try and fill any free slots that are available in the upcoming two weeks.
  4. \n
  5. If the queue is filling up then please consider leaving some slots free for new contributors.
  6. \n
  7. If you have a non urgent show then find a empty week and schedule it then.
  8. \n
  9. If you are uploading a series of shows, consider scheduling one every two weeks.
  10. \n
\n

Older HPR shows on archive.org

\n

This month 96 additional shows in the range 1-870 have been uploaded to the Internet Archive.

\n

Since we don\'t want to upload shows without summaries or tags the old shows and tag and summary projects are now tied together. So we will be all the more welcoming of tag and summary updates submitted as described on the summary page.

\n

Tags and Summaries

\n

Thanks to the following contributor for sending in updates in the past month:
\nDave Morriss

\n

Over the period tags and/or summaries have been added to 7 shows which were without them.

\n

There are currently 377 shows which need a summary and/or tags.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3077,'2020-05-19','Video conference Push to Talk',457,'Building the push to talk button missing from many video conference tools','

For the sake of archival, \"state of the world\" refers to the COVID-19 pandemic.

\r\n

The code and CAD files for this project can be found here.

\r\n

Relevant links:

\r\n\r\n

Early prototype:
\r\n\"Electronic

\r\n

Assembled electronics fitted into case ready to be closed:
\r\n\"Electronics

\r\n

View of the top of the case, showing Cherry switch and NeoPixel LED indicator:
\r\n\"View

\r\n

View of the bottom of the case, showing USB port and some of the nicer M3 screws from my parts bin:
\r\n\"View

\r\n

Plugged in and powered on, showing the muted state:
\r\n\"Device

\r\n

Button pushed, showing the unmuted/mic live state:
\r\n\"Device

\r\n',386,103,1,'CC-BY-SA','arduino, linux audio, electronics, hardware',0,0,1), (3067,'2020-05-05','Getting my Python3 code working in Python2',1526,'What I had to do to get my raspberry Pi PifaceCAD board working after a Debian upgrade.','

I have a raspberry Pi model B with the original Pifacecad add on board

\r\n

I recently upgraded the operating system on my raspberry pi from Wheezy (Debian 7) to Jessie (Debian 8), all seemed fine till I tried to run my Python3 project. It reported that the pifacecad module wasn’t present. I tried to install the module using the standard apt-get command given in the Pifacecad documentation. It installed OK for python 2 but It would not install for python 3 as there was a dependency issue with the python-lirc library. I’m guessing the upgrade broke something.

\r\n

I installed a fresh minimal installation of raspbian Stretch (Debian 9) onto a new SD card and ran the standard installation command in the Pifacecad documentation. It all installed but there was a warning about Spi which I had forgotten to enable. I enabled this using the raspi-config util and rebooted the pi.

\r\n

I then tested the installation by running the sys-info.py example that is mentioned in the installation documentation that comes with the pifacecad board.

\r\n

Running this example gave a warning saying that the pifacecad hardware could not be found at this point I gave up and decided instead to run my project in python 2.

\r\n

Of course at first the code wouldn’t run using python 2 and I had to do a bit of digging around to find out what was going wrong.

\r\n

You may find this useful in the unlikely event that you have a project written in python 3 that you want to run in python 2, it might also be useful if you’re going in the other direction.

\r\n

One other thing that I briefly stumbled upon was that I believe there is a tool available that attempts to convert python 2 code to python 3 I don’t know anything about it and didn’t bother looking to see if there is a tool to go in the opposite direction which is what I needed. I’ve included a link to the tool below https://docs.python.org/2/library/2to3.html

\r\n

I’ve got the two versions of code loaded into the excellent graphical diff tool meld and I’ll just briefly cover the things that I had to change.

\r\n

Link to meld diff tool: https://meldmerge.org/

\r\n

After some mucking about I got it partially working by installing Piface module for Python 2.7

\r\n

Had to do the following changes to get the code working in Python 2.7:

\r\n\r\n
    urllib.request.urlopen(url).read()
\r\n
\r\n

https://docs.python.org/3/library/urllib.request.html

\r\n
\r\n\r\n
    urllib2.urlopen(url).read()
\r\n
\r\n

https://docs.python.org/2/library/urllib2.html

\r\n
\r\n\r\n

Two article about incorporating future statements in Python 2
\r\nhttps://docs.python.org/3/library/__future__.html
\r\n

\r\n

https://simeonvisser.com/posts/how-does-from-future-import-work-in-python.html

\r\n

Related shows about my PiFaceCAD add on board for the raspberry pi

\r\n\r\n',201,38,1,'CC-BY-SA','Python, Programming, Linux, Raspberry Pi',0,0,1), (3069,'2020-05-07','Linux Inlaws S01E05 Porn and Skynet',4029,'This is Linux Inlaws, a series on free and open source software, black humour, the revolution','

Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.

\r\n

Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute t-rexes or other associated dinosaurs.

\r\n',384,111,1,'CC-BY-SA','linux inlaws, communism, free and open source software, adult entertainment, skynet',0,0,1), (3070,'2020-05-08','making vim xdg compatible',3070,'move your vim configuration out of the home directory','

xdg vim config

\r\n

To make vim load an alternative config file either use an alias or the VIMINIT variable. i.e. place either alias vim=\"vim -u ~/.config/vim/vimrc\" or VIMINIT=\"source ~/.config/vim/vimrc\" in your .bashrc (ironically, that one is still in my home folder).

\r\n

Once that is loaded, you should source the following file after \"nocompatible\"

\r\n
" file: ~/.config/vim/xdg.vim\r\nif empty($XDG_CACHE_HOME)\r\n    let $XDG_CACHE_HOME=$HOME."/.cache"\r\nendif\r\n\r\nif empty($XDG_CONFIG_HOME)\r\n    let $XDG_CONFIG_HOME=$HOME."/.config"\r\nendif\r\n\r\nif empty($XDG_DATA_HOME)\r\n    let $XDG_DATA_HOME=$HOME."/.local/share"\r\nendif\r\n\r\nset directory=$XDG_CACHE_HOME/vim/swap,~/,/tmp\r\nset backupdir=$XDG_CACHE_HOME/vim/backup,~/,/tmp\r\nset undodir=$XDG_CACHE_HOME/vim/undo,~/,/tmp\r\nset viminfo+=n$XDG_CACHE_HOME/vim/viminfo\r\nset runtimepath+=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$XDG_DATA_HOME/vim/bundle/Vundle.vim,$VIM,$VIMRUNTIME\r\nlet $MYVIMRC=$XDG_CONFIG_HOME."/vim/vimrc"\r\n
\r\n

With this file in place you should call it from your vimrc

\r\n
" file: ~/.config/vim/vimrc\r\nset nocompatible\r\nfiletype off\r\nsource $HOME/.config/vim/xdg.vim\r\ncall vundle#begin()\r\nlet vundle#bundle_dir = expand("$XDG_DATA_HOME/vim/bundle")\r\n\r\n" include your calls to Plugin here\r\n\r\ncall vundle#end()\r\nfiletype plugin indent on\r\nsyntax on\r\n\r\nsource ~/.config.\r\n
\r\n

Note that it is important that all the paths are defined BEFORE Vundle (or whatever is your plugin manager) is called, since the path to it is defined in xdg.vim.

\r\n

You can check my full vim config at gitlab.

\r\n

References

\r\n

The vim script I modified my config from - https://gist.github.com/dkasak/6ae1c6bf0d771155f23b

\r\n',385,82,1,'CC-BY-SA','vim, configuration, XDG',0,0,1), (3071,'2020-05-11','Bash snippet - quotes inside quoted strings',799,'How to add quotes to quoted strings in Bash','

Bash and quoted strings

\r\n

An issue I just hit in Bash was that I had a quoted string, and I wanted to enclose it in quotes. How to do this?

\r\n

This is the umpteenth time I have stumbled over this issue, and I realised I had found out how to solve it a while back but the information hadn’t rooted itself into my mind!

\r\n

I have always been less clear in my mind about quoted strings in Bash than I should be, so, assuming others might have similar confusion I thought I’d try and clarify things in the form of an HPR show.

\r\n

The problem

\r\n

The thing I was having difficulties with was an alias definition of a useful pipeline:

\r\n
nmap -sn 192.168.0.0/24 | awk '/^Nmap scan report/{print ""; print; next}{print}'
\r\n

This uses nmap (see Ken’s show 3052 for a discussion of its use) piped into an awk one-liner that formats the information returned by nmap.

\r\n

The alias command can be used to store such a command or command sequence as a single simple command. It’s usually added to the ~/.bashrc file so it gets added to every Bash shell you start up (note Bash Tips #22, currently being written, will cover these startup files).

\r\n

An alias definition looks something like this:

\r\n
alias la='ls -Al'
\r\n

The alias itself \'la\' is defined as the command ls -Al.

\r\n

So how to make my nmap sequence into an alias given that the commands contain both single and double quotes?

\r\n

Quoted strings in Bash

\r\n

Bash is (to my mind) a bit weird with quoted strings.

\r\n

There are two sorts of quotes in Bash (leaving aside the backquote or backtick`):

\r\n\r\n

There’s a more comprehensive treatment of these quoting types (and others) in the Bash Reference Manual.

\r\n

Changing quotes and concatenating strings

\r\n

To make a variable containing a string with embedded quotes you can do this:

\r\n
$ x='string1'"'"'string2'\r\n$ echo $x\r\nstring1'string2
\r\n

What we did here was close \'string1\', start a new string enclosed in double quotes \"\'\", then append a second string \'string2\'. Bash treats the three strings as one, but they have to be contiguous. There must be no intervening spaces1.

\r\n

This solution is rather ugly. You could also use Bash string concatenation to do this, though it’s more long-winded:

\r\n
$ x='string1'\r\n$ x+="'"\r\n$ x+='string2'\r\n$ echo $x\r\nstring1'string2
\r\n

The same principles hold for double quotes of course:

\r\n
$ x="string1"'"'"string2"\r\n$ echo $x\r\nstring1"string2
\r\n

You’d probably not want to do this though.

\r\n

Using backslashes

\r\n

You can use backslashes to escape double quotes inside a double quoted string in Bash as we have seen.

\r\n
$ x="string1\"string2"\r\n$ echo $x\r\nstring1"string2
\r\n

However, as discussed earlier, it’s not possible to use backslashes to escape single quotes inside a single quoted string in Bash. However, outside a string a backslashed character is escaped. For example, if you have files which have spaces in their names, you can quote the name or use the backslash escape to protect the spaces2:

\r\n
$ ls -l a\ file\ with\ spaces.awk\r\n-rw-r--r-- 1 hprdemo hprdemo 0 Apr 22 22:25 'a file with spaces.awk'
\r\n

So, knowing this, you can exit a string, concatenate with a backslashed quote then restart a string like this:

\r\n
$ x='string1'\''string2'\r\n$ echo $x\r\nstring1'string2
\r\n

Solution

\r\n

So now we can see how to achieve the alias definition I wanted earlier:

\r\n
alias show_network='nmap -sn 192.168.0.0/24 | awk '\''/^Nmap scan report/{print ""; print; next}{print}'\'''\r\n\r\n
\r\n

Epilogue

\r\n

There’s more to be said about this subject, but too much of this stuff is not healthy.

\r\n

Links

\r\n\r\n
\r\n
\r\n
    \r\n
  1. This is quite an artificial example to make a point. You wouldn’t do things this way in reality. Using x=\'string1\'\"\'string2\" would also work (\'string1\' in single quotes, and \"\'string2\'\" in double quotes). Also, you could just write x=\"string1\'string2\" and stop all the messing about, but that would not be much of an example!

  2. \r\n
  3. The backslash is making the space a literal space, otherwise Bash would see it as an argument delimiter, and would look for the files \'a\', \'file\', \'with\' and \'spaces.awk\' to list details about!

  4. \r\n
\r\n
\r\n',225,42,1,'CC-BY-SA','Bash,quotes',0,0,1), (3072,'2020-05-12','The joy of pip-tools and pyenv-virtualenv',1441,'How to manage your dependencies and environment isolation when developing in Python','

TL;DL: What I end up recommending is that you use pip-tools for your dependency management needs, and pyenv-virtualenv for your environment management needs. In the show I explain why you would want these things.

\r\n\r\n

I talk about these tools:

\r\n\r\n\r\n\r\n

I mention in passing, and as fodder for further shows:

\r\n\r\n\r\n\r\n

Install pyenv and pyenv-virtualenv

\r\n\r\n
git clone https://github.com/pyenv/pyenv ~/.pyenv\r\ngit clone https://github.com/pyenv/pyenv-virtualenv ~/.pyenv/plugins/pyenv-virtualenv\r\n
\r\n\r\n

Add to ~/.bash_profile:

\r\n\r\n
export PYENV_ROOT=$HOME/.pyenv\r\nexport PATH=$PYENV_ROOT/bin:$PATH\r\n
\r\n\r\n

Add to ~/.bash_profile (optional):

\r\n\r\n
eval \"$(pyenv init -)\"\r\neval \"$(pyenv virtualenv-init -)\"\r\n
\r\n\r\n

The optional bits provide you with the pyenv shell functionality for setting a session-specific Python version, and automatic activation of the virtualenv. Most of the time you don’t need activation, scripts and commands run just fine via the shims, but some tooling around Python may sometimes need to know which virtualenv you’re in.

\r\n\r\n

Run the export and eval lines in your shell to have the configuration work immediately. Alternatively, do su - yourusername to login to a new session that runs the profile. The - is important.

\r\n\r\n

You might be able to get away with just opening a new tab or window in your terminal. Whether that runs the profile depends on your settings.

\r\n\r\n

Set up your pyenv virtualenv for your project

\r\n\r\n
# Creates the virtualenv named my-project-env using \r\n# the python named system (your system default python)\r\npyenv virtualenv system my-project-env  \r\ncd /path/to/my-project\r\npyenv local my-project-env\r\n
\r\n\r\n

Your system Python may or may not work for this. You might have to install pip and virtualenv. It might still break with some message about ensurepip failing (currently both Nix (20.09pre) python and Ubuntu (18.04) python are failing for me, and older Anaconda pythons also had a broken venv). In that case, use pyenv to install a Python that works, and use that instead of the system python:

\r\n\r\n
pyenv install miniconda3-latest\r\npyenv virtualenv miniconda3-latest my-project-env\r\ncd /path/to/my-project\r\npyenv local my-project-env\r\n
\r\n\r\n

Install pip-tools

\r\n\r\n

You’ll want to do this inside the virtual environment that you want to manage. Don’t install pip-tools globally.

\r\n\r\n
cd /path/to/my/project\r\n# And, assuming you have the shims on your $PATH\r\n# and you set the pyenv local as shown previously\r\npython -m pip install pip-tools\r\n
\r\n\r\n

Now put your requirements in requirements.in, one on each line, in the form you would give them to pip on the command line:

\r\n\r\n
somepackage >=3, <4\r\notherpackage <7\r\n
\r\n\r\n

Compile requirements.in to a requirements.txt:

\r\n\r\n
python -m piptools compile\r\n
\r\n\r\n

You could run the shorter command pip-compile for convenience, but using the long form with -m looks it up through your configured Python, and makes it less likely for you to surprise yourself and run a tool in a different virtualenv than you expected. Same with python -m pip above.

\r\n\r\n

Your requirements.txt will look something like this:

\r\n\r\n
otherpackage==6.9.3          # via -r requirements.in\r\nsomepackage==3.4.2           # via -r requirements.in\r\ntransitivedependency==2.7.6  # via somepackage\r\n
\r\n\r\n

It helpfully tells you where everything is from!

\r\n\r\n

Now to actually install these things you python -m pip -r requirements.txt.

\r\n\r\n

Now you’re good to go! Happy hacking!

',311,38,1,'CC-BY-SA','python,pyenv,virtualenv,virtualenvwrapper,poetry,pipenv,pip-tools',0,0,1), (3076,'2020-05-18','Keep calm and Virion',3526,'A COVID-19 lockdown chat from Scotland','

Introduction

\r\n

Two HPR hosts from Scotland get together over Mumble to chat about all manner of stuff.

\r\n\r\n

Apology

\r\n

Dave’s sound was a bit muffled in this recording. It turns out that it’s important which USB port the microphone (Zoom recorder) is plugged into. Who knew!

\r\n

Notes

\r\n

Some of the topics we discussed

\r\n\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','Virus,Virion,COVID-19',0,0,1), (3090,'2020-06-05','Locating Computer on a Enterprise Network',2388,'advanced nmap tips','

\r\nIn this episode operat0r responds to hpr3052 :: Locating computers on a network, with more tips and tricks. Then he continues through a detailed exercise in using nmap on the corporate network.\r\n

\r\n

\r\nThe expanded commands can be found here.\r\n

',36,61,1,'CC-BY-SA','nmap,hacking,computers,networking,scripting,bash,shell',0,0,1), (3073,'2020-05-13','Matchbox and Diecast Restoration',182,'A short episode about my New hobby restoring Matchbox and other Diecast models','

\r\nToday\'s show is about my recently started hobby of restoring Matchbox models. I talked about this on the New Year show and Ken said it deserved a show in its own right.\r\n

\r\n

\r\nSo today I briefly talk about how I got into the hobby through watching YouTube Videos of Marty\'s Matchbox Makeovers, and my first restoration pictured below. Enjoy.\r\n

\r\n

\r\n\r\n\"Photo\r\n

\r\n\r\n\r\n

Links:

\r\n\r\n\r\n',338,114,0,'CC-BY-SA','Matchbox, Diecast Models, Restoration',0,0,1), (3078,'2020-05-20','Coronavirus Update 2020-05-07',878,'Where we are with this pandemic, and how should we respond?','

This is an update to my earlier show to pull together what we know about the Coronavirus on this date, and what measures we can take. It focuses on the lack of solid information at this point and suggests a prudent course to stay safe. https://www.palain.com/health-topics/coronavirus-update-20200507/

\r\n\r\n\r\n
\r\n\r\n

\r\nExtracted from Palain.com under the tearms of Creative Commons Attribution-ShareAlike 4.0 International License. \r\n

\r\n\r\n

Coronavirus Update 20200507

\r\n\r\n

The coronavirus pandemic is continuing throughout most of the world, and I wanted to put down some observations on where we stand today. First, note that I put the date in the title. This is because the situation in some ways changes day-by-day, even though there are continuities. That makes it a dangerous place to be because it is human nature to look for the latest news and jump on it if it looks good. And that is a prime mistake because we do not in fact know enough at this point to be confident in these news reports. I would refer you to my earlier essay, Scientific and Medical Reports, which is highly relevant right now. While I could not have predicted this pandemic when I wrote it, it contains basic principles that are always relevant.

\r\n\r\n\r\n\r\n

The nature of the press is that it is like the carnivorous plant in the movie Little Shop of Horrors, always crying \"Feed Me!\" And of course we are all interested if not to say anxious for any news on the course of this disease and where it is taking us. What this means is that you will see a unstoppable stream of news stories touting the latest study on one or another aspect of this. Add in the desire of politicians to spin things to their advantage, and you have a recipe for disaster. To keep sane, remember a few basic principles:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

So, with that background, do we know anything at this point? Yes, we do. But we also have a lot of unanswered questions.

\r\n\r\n\r\n\r\n

Second Wave?

\r\n\r\n\r\n\r\n

The first big question is whether there will be a second wave, and this is something that every qualified epidemiologist I have heard from says is guaranteed. And the reason is that a certain \"fatigue\" sets in with staying in isolation, and at least some people will convince themselves they don’t need to do it. They are wrong, and they will guarantee that second wave. In the 1918 Flu Pandemic, the second wave was far worse than the first wave. And don’t forget there was a third wave in that pandemic until it petered out in 1920. The best thing you can do is keep isolated if at all possible, and follow all of the guidelines:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

Yeah, this is all of the stuff we have been hearing all along. But annoying as it is, it does work if you do it.

\r\n\r\n\r\n\r\n

Is the virus mutating?

\r\n\r\n\r\n\r\n

Yes. In other news, water is wet. Face it, mutation is what organisms do, and that has been true for billions of years. The question you really have is \"Is it getting worse?\" And right now the answer is \"We don’t know.\" Sorry I can’t give you any more determinative answer, but we are only at the \"one study\" phase right now, and we are a ways off from the \"peer-reviewed, replicated consensus\" phase that will resolve this. There are indications that at least this virus does not mutate as much as influenza, but even that may require more study.

\r\n\r\n\r\n\r\n

Am I Immune?

\r\n\r\n\r\n\r\n

We would all love to know if we are immune. This requires two big things to give a good answer. First, does having the disease and then recovering give you immunity? And the sad truth is that we don’t know yet. The common cold is a coronavirus, and you never get immunity. Influenza is a virus, and getting it one year provides no immunity the next. And if getting it once does provide immunity, we still need testing to discover this. The number one priority right now in all locations should be testing, testing, testing. That is the prerequisite for doing any decent epidemiology. There was a report (note: one study) out of South Korea that indicated that some people could get the disease twice, but they re-analyzed the data and decided that it might have been false positives. That is the kind of thing that happens when scientists are trying to do a year’s worth of work in few weeks, which is what they are doing.

\r\n\r\n\r\n\r\n

Is It More Infectious Than We Thought?

\r\n\r\n\r\n\r\n

Again, very unclear. And even less clear is what this implies. An argument is being made that if the rate of infection is higher, given the number of deaths, that would imply it is less lethal. And that is being used to argue in favor of this not being a big deal, so reopen everything. But to put it in perspective, in the 2017-2018 flu season, which was on the high end of deaths, we had 61 thousand deaths in the U.S. Today, in just over 2 months, we have 75 thousand deaths in the US, and that is with all of the extraordinary measures we put in place to keep people safe. To make an argument that Covid-19 is no more dangerous than the flu is to be criminally stupid at best.

\r\n\r\n\r\n\r\n

Didn’t They Predict More Deaths?

\r\n\r\n\r\n\r\n

Why yes, they did. A widely used model in the US is from the Institute for Health Metrics and Evaluation (IHME), at the University of Washington. And they have issued forecasts that ranged from hundreds of thousands of deaths to around 60,000 deaths. Clearly they have no idea what they are doing, right? Not so fast. As the statistician George Box famously said, \"All models are wrong but some are useful\". In this case you have to factor in two things. One is uncertainty, of course. To forecast how many people will die, it helps to know how many people have died, and this has been subject to fierce debate.

\r\n\r\n\r\n\r\n

And here it gets difficult, since one argument is over what counts as a Covid-19 death. And since every one of our 50 states has their own health reporting system, there is a wide disparity. One example of this is the idea of \"excess deaths\". If a given area has a pretty regular death rate for a number of years, and suddenly that death rate jumps 500% in the midst of a pandemic, it is reasonable to suspect those \"excess deaths\" are a result of the coronavirus. But if those deaths get counted, others will argue that it is inflating the numbers, and that only a positive coronavirus serum test should count. Since each state does this differently, this leads to the odd result that the disease appears more or less lethal depending on your state of residence. And that means politicians have incentive to get the numbers they want.

\r\n\r\n\r\n\r\n

The other factor complicating things is the phenomenon known as the \"self-preventing\" prophecy. You see, the initial high estimates tended to be \"This is what will happen if you don’t take strong measures\", and of course they were very high. And we know that governments like the UK and the US looked at those predictions, and started to take some stronger measures. So after a little bit, new predictions came out that were lower as a result of those measures. And now we are seeing misguided efforts to get people to go out and resume normal life, and as a result the newest forecasts are going up again. This is a feedback loop, in other words.

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Coronavirus',0,0,1), (3115,'2020-07-10','Pest Control',2291,'Talk about pest control','\r\n',36,0,1,'CC-BY-SA','Pest Control,bugs,DIY,Home Improvement',0,0,1), (3082,'2020-05-26','RFC 5005 Part 1 – Paged and archived feeds? Who cares?',2108,'An interview with two passionate RFC 5005 fans on how to handle big Atom feeds','

This conversation took almost an hour, so I split it into two shows:

\r\n\r\n\r\n\r\n

The why

\r\n\r\n

When serving most RSS/Atom feed readers today, you have to choose: Do you make a complete feed with all the things you ever published, or do you make a shorter feed with just the latest entries?

\r\n\r\n

This is a trade-off with pros and cons, and it seems like a trade-off you have to make, but a solution to let your Atom feed have the cake and eat it too existed already 13 years ago, if only any of our feed readers would adhere to it: RFC 5005, Feed Paging and Archiving

\r\n\r\n

The what

\r\n\r\n

https://tools.ietf.org/html/rfc5005 was published in September 2007

\r\n\r\n\r\n\r\n

The who

\r\n\r\n

In this show I’m talking to:

\r\n\r\n

fluffy

\r\n\r\n\r\n\r\n

Jamey

\r\n\r\n\r\n\r\n

Conversation notes

\r\n\r\n\r\n',311,0,0,'CC-BY-SA','rss,atom,rfc,interview,feedreader,podcatcher',0,0,1), (3083,'2020-05-27','Mumbling while on lockdown',3021,'Two Edinburgh-based hosts have a chat from their respective houses','

Introduction

\r\n

Two HPR hosts based in Edinburgh got together over Mumble to have a chat during the COVID-19 lockdown.

\r\n\r\n

Apology

\r\n

Dave’s sound was a bit distorted in this recording. Having had recent problems using the Zoom recorder as a microphone, this time the in-built microphone was resorted to, with even worse results it turned out. See the Sound processing section below if you want to know more.

\r\n

Notes

\r\n

Some of the topics we discussed

\r\n\r\n

Links

\r\n\r\n

Sound processing

\r\n

The recording was made in multichannel mode in anticipation of problems. The distorted channel was processed by using the Clip Fix effect in Audacity, which didn’t seem to change much except reduce the sound level. It was also necessary to find and remove sounds produced by the push to talk key presses. Removal meant replacing these sounds by silence so the two channels would not get out of step. After this the two channels were merged together and silences truncated.

\r\n

Lessons learned: don’t use a built-in microphone if you can help it!

\r\n\r\n',225,0,1,'CC-BY-SA','COVID-19,lockdown',0,0,1), (3081,'2020-05-25','Why do formal verification?',1120,'Tuula talks about testing and formal verification of software','

In episode 3057 I talked about formal verification of software and forgot to mention why one would want to do it. This episode hopefully answers to that.

\r\n

While formal verification is powerful tool, it’s also rather cumbersome and slow to use. In some cases you’re better off with traditional ways of testing.

',364,0,0,'CC-BY-SA','testing, verification, mathematics',0,0,1), (3079,'2020-05-21','Linux Inlaws S01E06 Porn and Trump',4779,'The lads discuss Audacity, KDEnlive, Blender, PwC, The Current War, Better Things, and Pamela Adlon','

This is Linux Inlaws, a series on free and open source software, black humour, the revolution and freedom in general (this includes ideas and software) and generally having fun.

\r\n

Linux Inlaws - a podcast about on topics around free and open source software, any associated contraband, communism / the revolution in general and whatever else fancies your tickle.

\r\n

Please note that this and other episodes may contain strong language, offensive humor and other certainly not politically correct language - you have been warned (our parents insisted on this disclaimer - happy mum?). Thus the content is not suitable for consumption in the workplace (especially when played back on a speaker in an open plan office or similar environments), any minors under the age of 35 or any pets including fluffy little killer bunnies, your trusty guide dog (unless on speed) and cute T-Rexes or other associated dinosaurs.

\r\n

Links:

\r\n',384,111,1,'CC-BY-SA','Audacity, KDEnlive, Blender, PwC mishap, The Current War, Better Things, Pamela Adlon',0,0,1), (3087,'2020-06-02','Phonetic alphabet',114,'The NATO phonetic alphabet recited once.','

The NATO phonetic alphabet. Play this a few times until it\'s ingrained in your memory banks. It\'ll change the way you communicate.

\r\n

\r\nWikipedia\r\n

',78,43,0,'CC-BY-SA','nato, alphabet, communication',0,0,1), (3088,'2020-06-03','Matchbox Restoration Part 2',307,'Second episode discussing restoring Matchbox diecast models Tony talks tools and materials needed ','

Matchbox HPR Episode 2 – Equipment

\r\n

Hello all those in HPR land. This is Tony Hughes coming to you from Blackpool in the UK. I hope you are all keeping well at the current time of restrictions due to the Corona Virus.

\r\n

In this the second of my recordings talking about restoring of Matchbox and other Die-cast models, I am going to talk of the equipment you will find essential, and some other things that while at the start you could live without, as you get into the hobby you may find extremely useful.

\r\n

So the first thing you will need is a drill for drilling the posts out on the model, both to aid in dismantling them and if you plan to reassemble with the aid of small screws, to drill the hole in the post for tapping to accommodating the screws. This can be a hand held wired or cordless drill or if you have a workshop with a drill press, all the better as this can be used in several ways during the reassembly of the models. That is on my wish list as I don’t have one at the moment.

\r\n

Secondly you will need a set of modelling files for removing the burr on axles, to remove these and the plastic wheels of the base of the model to allow for repainting if required.

\r\n

Wire brushes for cleaning the remains of any paint that didn’t get removed by the paint stripper.

\r\n

Hemostat Clamp Tweezers or crocodile clips on a rod, for use to hold the model during spray painting

\r\n

Additionally, although you can start doing restorations without these, the following will become very useful to help save time and achieve better finishes of the completed restoration.

\r\n

Rotary Tool, the most well known is the Dremel but there are many other manufacturers of similar tools at more economic cost. However beware you do get what you pay for and you may find buying the cheapest you can find a false economy. My cheap Lidl rotary tool which I have had for a few years but barely used, failed after 5 months of use a few weeks ago. The chuck ring thread striped and it will no longer hold bits in the chuck. The rotary tool makes the removal of the axles a very quick job, and cleaning paint stripped castings with a wire rotary brush is a breeze.

\r\n

Another thing you may find useful is a small spray booth with an extractor fan and filter for removing over-spray from the area you are painting in if doing this indoors, particularly if your workshop is in the house. Although one YouTube modeller I follow sprays his models on the cooker with the cooker extractor fan on to achieve a similar result when painting indoors.

\r\n

Finally you may wish to put a compressor and spray gun on your wish list if you get hooked as this gives you a far better range of colours you can paint in, as you can mix your own shades. Some in this community are sticklers for trying to get an exact match to the original colour of the model, others like me at the moment are happy to use shop bought spray paint cans.

\r\n

Small table vice for holding the model. A set of helping hands for the same during painting, particularly when painting fine details.

\r\n

So that’s the tools, now the consumables:

\r\n\r\n

Later in the series I’ll talk about other things you may add to the consumables list as you get more into the hobby. So that’s it for this episode. In the next episode I’ll talk you through me dismantling a model for restoration.

\r\n

This is Tony Hughes for HPR signing off for this episode. Keep safe and I’ll be back soon.

\r\n',338,114,0,'CC-BY-SA','Matchbox Cars, Diecast Models, Restoration, Tools and materials.',0,0,1), (3089,'2020-06-04','For my Entertainment',425,'How I have my file server and media center put together','

Reasoning.

\r\n

I have a file server with Slackware running on a Pi4. I wanted to make the
movies and TV Shows easily accessible on the TV without using a DVD or Blu ray
player.

\r\n

It would give my wife and I a chance to sit and watch a show without much
fuss. The latest show we are on is Sue Thomas F.B. Eye.
The main character, Sue has been deaf from about the age of 4 years.
She is adept at reading lips and learned to speak despite being deaf.

\r\n

https://en.wikipedia.org/wiki/Sue_Thomas:_F.B.Eye

\r\n

Hardware.

\r\n

The Pi4 is enclosed in a stripped out power supply that died on me. The fan
still worked, so I wired it to the Pi on the 5v line. It runs at half the
speed it was designed for, but that makes it run almost silent. With the
heatsinks added, stays about 35C when idle and 50C when encoding video.

\r\n

Pi Networking.

\r\n

I have 2 Pi\'s connected via ethernet. One is on 192.168.2.5 with a gateway of
192.168.2.6, with the other on 192.168.2.6 with a gateway of 192.168.2.5.
Essentially just a crossover network. The reason for this is running Kodi on Pi4
has choppy video, but is better at running video encoding. So I linked it to a
Pi3 to run Kodi via a samba share from the Pi4.

\r\n

Used OSMC for the kodi interface.
It was the distribution that was stable on my Pi and booted right to the Kodi
interface.

\r\n

https://osmc.tv/download/

\r\n

lsblk - List block devices
dd status=progress if=osmc.img of=/devsdX

\r\n

Installing Slackware.

\r\n

Get sources
https://sarpi.fatdog.eu/index.php?p=getslack

\r\n
root@mynixbox:/tmp# mkdir /slackarm\r\nroot@mynixbox:/tmp# mount /dev/sdc1 /slackarm\r\nroot@mynixbox:/tmp# cd /slackarm\r\nroot@mynixbox:/slackarm#
\r\n

To download Slackware ARM 14.2, type the following at the command prompt:

\r\n

root@mynixbox:/slackarm# rsync -Prv --delete
ftp.slackware.uk::slackwarearm/slackwarearm-14.2 .

\r\n

[FatDog says ...] DON\'T forget the period \".\" at the end of the rsync command
or it won\'t work!

\r\n

I made a directory called extras, under the /slackarm directory

\r\n

https://sarpi.fatdog.eu/index.php?p=rpi4getcurrent

\r\n

upgradepkg --install-new (for each of these packages, after finishing the main Slackware installation.)

\r\n
System Packages
\r\n

kernel_sarpi4-5.4.40-armv7l-1_slackcurrent_13May20_sp1.txz
\r\nkernel-modules-sarpi4-5.4.40-armv7l-1_slackcurrent_13May20_sp1.txz
\r\nsarpi4-boot-firmware-armv7l-1_slackcurrent_13May20_sp1.txz\r\nsarpi4-hacks-4.0-armv7l-1_slackcurrent_13May20_sp1.txz

\r\n

Partitioning example

\r\n

After mounting the sd card listed by the lsblk command, run
cfdisk /dev/mmcblk0 to partition the card.

\r\n
mmcblk0 179:0 0 59.5G 0 disk 
|-mmcblk0p2 179:2 0 4G 0 part [SWAP]
|-mmcblk0p3 179:3 0 55.3G 0 part /
`-mmcblk0p1 179:1 0 150M 0 part
root@slack-server:mark # df -h /
Filesystem Size Used Avail Use% Mounted on /dev/root 55G 25G 28G 48% /\r\n\r\nmkfs.vfat /dev/mmcblk0p1
mkswap /dev/mmcblk0p2
\r\n

Samba snippet

\r\n
[MediaServer.Movies]
path = /mnt/media2/Movies/
writable = no
browsable = yes
read only = no
guest ok = no
public = no
\r\n

fstab snippet (Kodi)

\r\n
//192.168.2.5/MediaServer.Movies /mnt/Movies cifs noauto,users,username=mark,password=*********** 0 0
\r\n

Script to connect to the wifi network

\r\n
mark@osmc:~$ cat /usr/bin/net.sh

#!/bin/bash
connmanctl enable wifi
connmanctl connect wifi_HASH_managed_psk
\r\n

Systemd service file

\r\n
mark@osmc:~$ cat /lib/systemd/system/net.service

[Unit]
Description=Wifi network auto connect on boot
After=http-time.service\r\n
[Service]
Type=simple
Restart=always
ExecStart=/bin/bash /usr/bin/net.sh
\r\n[Install]
WantedBy=multi-user.target
\r\n\r\n

Edit:

\r\n

Since I sent the show notes, I had problems using the GUI way to set up
a static IP address on the OSMC section. Here is a more concise way to go about\r\nit.

\r\n

https://discourse.osmc.tv/t/solved-setting-ip-static/1439/14

\r\n

It seems OSMC uses connman, so in order to create an ethernet static IP:

\r\n
    \r\n
  1. \r\n

    Create a config file with your editor:

    \r\n
    sudo vim /var/lib/connman/osmc.config\r\n
    \r\n
  2. \r\n
  3. \r\n

    Add the following contents:

    \r\n
    [global]\r\nName = OSMC\r\nDescription = OSMC static network configuration\r\n[service_osmc]\r\nType = ethernet\r\nIPv4 = 192.168.0.21/255.255.255.0/192.168.0.1\r\nNameservers = 8.8.8.8,8.8.4.4\r\n
    \r\n

    Make sure to change the IPv4 line to match your own network/netmask/gateway and Nameservers to use the ones you want.

    \r\n
  4. \r\n
  5. \r\n

    Reboot your RPi or restart the connman service:

    \r\n
    sudo systemctl restart connman\r\n
    \r\n
  6. \r\n
\r\n

If you opt to restart connman, you’ll loose the connection.

\r\n',318,0,0,'CC-BY-SA','Raspberry Pi, Kodi, OSMC, Networking, Slackware, Sarpi Project',0,0,1), (3104,'2020-06-25','HPR AudioBook Club 19 - Tincture: An Apocalyptic Proposition',7607,'The HPR Audiobook Club reviews the audiobook Tincture by Matthew D. Jordan','

In this episode, the HPR_AudioBookClub discusses Tincture: An Apocalyptic Proposition written by Matthew D. Jordan

\r\n
\r\n

Non-Spoiler Thoughts

\r\n
\r\n\r\n

Beverage Reviews

\r\n
\r\n

As usual, the HPR AudioBook Club took some time to review the beverages that each of us were drinking during the episode

\r\n\r\n

Things We talked about

\r\n
\r\n\r\n

Our Next Audiobook

\r\n
\r\n

Quarter Share by Nathan Lowell

\r\n

The Next Audiobook Club Recording

\r\n
\r\n

Right now we are working through a backlog of older episode that have already been recorded. Once that ends we fully anticipate recording new episodes with listener participation.

\r\n

Further Recommendations

\r\n
\r\n\r\n

Feedback

\r\n
\r\n

Thank you very much for listening to this episode of the HPR AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time we record a new episode. Please leave a few words in the episode\'s comment section.

\r\n

As always; remember to visit the HPR contribution page HPR could really use your help right now.

\r\n

Sincerely, The HPR Audiobook Club

\r\n

P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.

\r\n

Our Audio

\r\n
\r\n

This episode was processed using Audacity. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. Its been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).

\r\n

We use the \"Truncate Silence\" effect with it\'s default settings to minimize the silence between people speaking. When used with it\'s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.

\r\n

Next we use the \"Compressor\" effect with the following settings:

\r\n
Threshold: -30db\r\nNoise Floor: -50db\r\nRatio: 3:1\r\nAttack Time: 0.2sec\r\nDecay Time: 1.0 sec\r\n
\r\n

\"Make-up Gain for 0db after compressing\" and \"compress based on peaks\" were both left un-checked.

\r\n

After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.

\r\n

We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.

\r\n

At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata.

\r\n

At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.

\r\n

Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.

\r\n',157,53,1,'CC-BY-SA','HPR Audiobook Club, Audiobooks, SciFi, Western',0,0,1), (3091,'2020-06-08','fuguserv',2628,'Fuguita OpenBSD server - building a new wifi-router / server','\r\n

The files I cover in the /etc/ directory first..

\r\n

dhclient.conf

\r\n
interface "em0" {\r\n#      ignore domain-name-servers;\r\n      reject 192.168.1.1;\r\n}\r\n#supersede domain-name-servers 127.0.0.1;
\r\n

dhcpd.conf

\r\n
option domain-name-servers 192.168.1.1;\r\nsubnet 192.168.1.0 netmask 255.255.255.0 {\r\n        option routers 192.168.1.1;\r\n        range 192.168.1.40 192.168.1.190;\r\n        host myserver {\r\n                fixed-address 192.168.1.2;\r\n                hardware ethernet 00:00:00:00:00:00;\r\n                }\r\n        host darkstar {\r\n                fixed-address 192.168.1.210;\r\n                hardware ethernet a0:d3:7a:42:aa:1d;\r\n                }\r\n        host zenbig   {\r\n                fixed-address  192.168.1.215;\r\n                hardware ethernet 14:d6:4d:aa:6c:c6;\r\n                }\r\n        host zenstar  {\r\n                fixed-address 192.168.1.205;\r\n                hardware ethernet 2c:6e:85:bf:72:91;\r\n                }\r\n        host mini10   {\r\n                fixed-address 192.168.1.200;\r\n                hardware ethernet 88:25:2C:B2:94:8C;\r\n                }\r\n        host nexus9   {\r\n                fixed-address 192.168.1.195;\r\n                hardware ethernet 44:91:60:9e:d2:73;\r\n                }\r\n        host diningpi {\r\n                fixed-address 192.168.1.197;\r\n                hardware ethernet b8:27:eb:09:bb:1e;\r\n                }\r\n        host think330 {\r\n                fixed-address 192.168.1.193;\r\n                hardware ethernet 50:5B:C2:E5:CA:F5;\r\n                }\r\n        host largedongle1 {\r\n                fixed-address 192.168.1.211;\r\n                hardware ethernet 00:C0:CA:82:EC:30;\r\n                }\r\n        host largedongle2 {\r\n                fixed-address 192.168.1.212;\r\n                hardware ethernet 00:C0:CA:82:E6:29;\r\n                }
\r\n

dhcpd.interfaces

\r\n
athn0
\r\n

hostname.athn0

\r\n
inet            192.168.1.5    255.255.255.0    192.168.1.255\r\nmedia           autoselect\r\nmediaopt        hostap\r\nchan            4\r\nwpa\r\nnwid            fuguserv\r\nwpakey          1234567890ABCD#\r\nup
\r\n

hostname.bridge0

\r\n
add vether0\r\nadd em0\r\nadd athn0\r\nblocknonip vether0\r\nblocknonip em0\r\nblocknonip athn0\r\nup
\r\n

hostname.em0

\r\n
dhcp\r\ninet6 autoconf
\r\n

hostname.vether0

\r\n
inet 192.168.1.1 255.255.255.0 192.168.1.255
\r\n

pf.conf

\r\n
nt_if="{ vether0 em0 athn0 }"\r\nbroken="224.0.0.22 127.0.0.0/8 192.168.0.0/16 172.16.0.0/12\r\n        10.0.0.0/8 169.254.0.0/16 192.0.2.0/24\r\n        198.51.100.0/24, 203.0.113.0/24,\r\n        169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32"\r\ntable <bruteforce> persist\r\nset block-policy drop\r\nset loginterface egress\r\nset skip on lo0\r\nmatch in all scrub (no-df random-id max-mss 1440)\r\nmatch out on egress inet from !(egress:network) to any nat-to (egress:0)\r\nantispoof quick for (egress)\r\nblock quick from <bruteforce>\r\nblock in quick on egress from { $broken no-route urpf-failed } to any\r\nblock in quick inet6 all\r\nblock return out quick inet6 all\r\n#block return out quick log on egress proto { tcp udp } from any to any port 53\r\nblock return out quick log on egress from any to { no-route $broken }\r\nblock in all\r\npass out quick inet keep state\r\npass in on $int_if inet\r\npass in on egress inet proto tcp from any to (egress) port 22 keep state (max-src-conn 40, max-src-conn-rate 40/172800 ,overload <bruteforce> flush global)\r\npass in quick on $int_if proto udp from any to ! 192.168.1.1 port 123 rdr-to 192.168.1.1
\r\n

sysctl.conf

\r\n
net.inet.ip.forwarding=1\r\nnet.inet.ip.redirect=0\r\nkern.bufcachepercent=50\r\nnet.inet.ip.ifq.maxlen=1024\r\nnet.inet.tcp.mssdflt=1440\r\nmachdep.allowaperture=2 # See xf86(4)\r\nmachdep.lidaction=0\r\nnet.inet6.ip6.forwarding=0\r\nnet.inet6.ip6.mforwarding=0\r\nhw.smt=1
\r\n

rc.conf.local

\r\n
check_quotas=NO\r\ndhcpd_flags="vether0"\r\nntpd_flags=""\r\n#pkg_scripts=dnscrypt_proxy -config /etc/dnscrypt-proxy.toml\r\nsndiod_flags=NO\r\nunbound_flags=""
\r\n

/var/unbound/etc/unbound.conf

\r\n
# $OpenBSD: unbound.conf,v 1.14 2018/12/16 20:41:30 tim Exp $\r\nserver:\r\n    username: _unbound\r\n    directory: /var/unbound\r\n    chroot: /var/unbound\r\n\r\n    interface: 192.168.1.1\r\n    interface: 127.0.0.1\r\n    do-ip6: no\r\n\r\n    access-control: 127.0.0.0/8 allow\r\n    access-control: 192.168.1.0/24 allow\r\n    hide-identity: yes\r\n    hide-version: yes\r\n    do-not-query-localhost: no\r\n\r\n    tcp-upstream: yes\r\n\r\n    private-address: 10.0.0.0/8\r\n    private-address: 172.16.0.0/12\r\n    private-address: 192.168.0.0/16\r\n\r\nremote-control:\r\n        control-enable: yes\r\n        control-use-cert: no\r\n        control-interface: /var/run/unbound.sock\r\n\r\nforward-zone:\r\n    name: "."\r\n    forward-addr: 127.0.0.1
\r\n',377,0,0,'CC-BY-SA','FuguIta, OpenBSD, Wifi-Routers, Servers, Portable, Memory_resident',0,0,1), (3092,'2020-06-09','Pens, pencils, paper and ink - 2',1256,'Looking at more writing equipment','

Introduction

\r\n

This is the second in a short series about pens, pencils, writing paper and ink. In this episode we will look at three more fountain pens (two lower-priced and one around £50), a mechanical pencil and some paper.

\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n',225,112,1,'CC-BY-SA','fountain pen,mechanical pencil,paper',0,0,1), (3093,'2020-06-10','Response to Linux Inlaws S01E06 (hpr 3079) on NeXT',430,'Response to Linux Inlaws S01E06 (hpr 3079) regarding NeXT, NeXTSTEP, and what would become Mac OS X.','

Some clarification on NeXT as I ramble on about all things NeXT, what would become \"Mac OS X\" (now \"macOS\"), and a harbinger of what was to come.

\r\n

Links:

\r\n',152,0,0,'CC-BY-SA','NeXT, NeXTSTEP, OPENSTEP, Rhapsody, Darwin, MacOSX, OSX, macOS, AUX',0,0,1), (3098,'2020-06-17','Matchbox Restoration Part 3',191,'In this the 3rd in the series Tony discusses dismantling the castings of the MK10 Jaguar','

HPR Matchbox show Episode 3

\r\n

Good day to all in HPR land, this is Tony Hughes coming to you again from Blackpool in the UK. To recap this is the 3rd in a series of shows about my hobby of restoring Matchbox and other Die-cast models. In the first 2 shows I introduced the concept and discussed the tools and other equipment you would need to start this hobby.

\r\n

In this episode I have decided to return to where it all started with the Matchbox No28 the Jaguar Mk10. Please refer to the show notes for the pictures of the process as we move along. You can see in the first picture the 4 castings used in this process.

\r\n

Picture 000:
\r\n\"Picture

\r\n

This is a lovely little casting and is a nice introduction to the techniques used in the process. Also I have several of these that I can strip down to their components and that should give us enough quality parts to reassemble at least one good example, hopefully one or two more.

\r\n

The next picture shows you the base of the model and that there is a mushroomed post that needs to be drilled out at the rear of the model, the front of the base is retained by a tab, which once the post is removed and the base released, this can be slid forward to free the tab.

\r\n

Picture 001:
\r\n\"Picture

\r\n

I drilled out this post. The post is drilled out with a 4mm drill bit, and as you can see in the next picture on this particular casting I was a little over zealous and damaged the base a little, although as it is the base it’s not a major issue.

\r\n

Picture 003:
\r\n\"Picture

\r\n

I then released the base by prying it off the remainder of the post with a small flat bladed screwdriver to lever it of the body. This now allowed the removal of the inner plastic forming the seating and holding a small plastic suspension piece. In the next picture you can see the casting without any internals but with the plastic window unit still held in place with another shallow mushroom post.

\r\n

Picture 005:
\r\n\"Picture

\r\n

Being very careful not to be too aggressive drilling this mushroom holding the windscreen unit, it is removed, again with a 4mm drill bit, so that a little pressure from a flat blade slid between the roof and the glassing unit will allow it to pop out without it breaking. It usually takes several attempts of a little drilling, trying with the flat blade, then if not coming free, a little more drilling until it pops off.

\r\n

Picture 006:
\r\n\"Picture

\r\n

Picture 006x:
\r\n\"Picture

\r\n

This process was repeated with the other 3 castings and the result is shown in the next picture

\r\n

Picture 008:
\r\n\"Picture

\r\n

As you can see the casting on the upper left of the image still has the bonnet (Hood) attached, this would not come off without me risking damaging it, so I was hoping that once the paint is removed that this will help it to come free. You will have to wait for the next instalment to find out what happened next. I’ve got to keep you wanting some more of this rambling tale.

\r\n

So until next time this is Tony Hughes saying goodbye to all those in HPR land. Keep safe until the next instalment.

\r\n',338,114,0,'CC-BY-SA','Matchbox Cars, Diecast Models, Restoration, dismantling the model',0,0,1), (3094,'2020-06-11','Holy crud! I have a kinesis advantage 2 keyboard!',275,'Sigflup does a review of the Kinesis Advantage 2 keyboard','

Kinesis Advantage 2 Keyboard

\r\n\r\n

\"Kinesis

',115,0,0,'CC-BY-SA','keyboards',0,0,1), (3097,'2020-06-16','Linux Inlaws S01E07 The Big Blue Button',3895,'The lads talk to Fred Dixon, product manager for BigBlueButton.','

In this episode our two chaps welcome Fred Dixon, product manager for BigBlueButton, on the show to talk about the project, its history and if it will finally run on Fedora and CentOS.

\r\n

Surrounding musings include how to hack the GDM login screen, why Martin is not behind the recent Easyjet hack and poxes as well as anti-poxes.

\r\n

Shownotes:

\r\n\r\n',384,111,1,'CC-BY-SA','BigBlueButton, GDM, Focal Fossa, Ubuntu',0,0,1); INSERT INTO `eps` (`id`, `date`, `title`, `duration`, `summary`, `notes`, `hostid`, `series`, `explicit`, `license`, `tags`, `version`, `downloads`, `valid`) VALUES (3371,'2021-07-05','HPR Community News for June 2021',3988,'Dave and Ken talk about shows released and comments posted in June 2021','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3347Tue2021-06-01Ethical Analysis of Renewable Energy and ConservationPaul Quirk
3348Wed2021-06-02Feedback on the Article by hedorah about HPRKen Fallon
3349Thu2021-06-03Linux Inlaws S01E31: Interview with Paul Ramsey FOSS aficionado and entrepreneurmonochromec
3350Fri2021-06-04Blending LayersAhuka
3351Mon2021-06-07HPR Community News for May 2021HPR Volunteers
3352Tue2021-06-08HPR 2020 - 2021 New Years Eve Show Episode 4Honkeymagoo
3353Wed2021-06-09My terminal journey, part 01.Some Guy On The Internet
3354Thu2021-06-10My Devicesoperat0r
3355Fri2021-06-11Tiki Helloperat0r
3356Mon2021-06-14HPR 2020 - 2021 New Years Eve Show Episode 5Honkeymagoo
3357Tue2021-06-15My terminal journey, part 02.Some Guy On The Internet
3358Wed2021-06-16BlastEm! A wicked awesome Sega Genesis/Megadrive emulatorsigflup
3359Thu2021-06-17Linux Inlaws S01E32: Politicians and artificial intelligence part 3monochromec
3360Fri2021-06-18Android Malware AlertAhuka
3361Mon2021-06-21HPR 2020 - 2021 New Years Eve Show Episode 6Honkeymagoo
3362Tue2021-06-22Spam Bot Honey Pot: Eating your own dog foodRho`n
3363Wed2021-06-23Electronics podcasts I listen toArcher72
3364Thu2021-06-24Part One - all the covid crapClinton Roy
3365Fri2021-06-25Diablo 2 Portable and Moddingoperat0r
3366Mon2021-06-28HPR 2020 - 2021 New Years Eve Show Episode 7Honkeymagoo
3367Tue2021-06-29Making books with linux - part 1Andrew Conway
3368Wed2021-06-30Infosec Podcasts Part 4 - Social Engineering PodcastsTrey
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 7 comments on\n5 previous shows:

\n\n

This month\'s shows

\n

There are 16 comments on 7 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-June/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Condolences

\n

Our deepest condolences to Randy Noseworthy on the loss of his wife.

\n

Older HPR shows on archive.org

\n

This month 100 additional shows in the range 1-870 have been uploaded.

\n

Since we don\'t want to upload shows without summaries or tags the old shows and tag and summary projects are now tied together. So we will be all the more welcoming of tag and summary updates submitted as described on the summary page.

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nArcher72, Dave Morriss

\n

Over the period tags and/or summaries have been added to 82 shows which were without them.

\n

There are now 295 shows which need a summary and/or tags.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3391,'2021-08-02','HPR Community News for July 2021',4611,'HPR Volunteers talk about shows released and comments posted in July 2021','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3369Thu2021-07-01Linux Inlaws S01E33: The Return of the Rustmonochromec
3370Fri2021-07-02More Free Images?Ahuka
3371Mon2021-07-05HPR Community News for June 2021HPR Volunteers
3372Tue2021-07-06HPR 2020 - 2021 New Years Eve Show Episode 8Honkeymagoo
3373Wed2021-07-07HPR RPG Club reviews Starfinderklaatu
3374Thu2021-07-08Why I love the MacBook Mid 2010swift110
3375Fri2021-07-09Car ODB2 Fun and Failoperat0r
3376Mon2021-07-12Making books with Linux - part 2Dave Morriss
3377Tue2021-07-13Chromebook support and moreZen_Floater2
3378Wed2021-07-14A bit of my experience with Starlink internet serviceJezra
3379Thu2021-07-15Linux Inlaws S01E34: The one with the intelligencemonochromec
3380Fri2021-07-16Building a Better Goodreads with ActivityPubAhuka
3381Mon2021-07-19Learning to skateklaatu
3382Tue2021-07-20How I fixed a fault on my car for free thanks to YouTubeMrX
3383Wed2021-07-21My gEeeky Experiment - Part 1Claudio Miranda
3384Thu2021-07-22Page Numbers in EPUB eBook FilesJon Kulp
3385Fri2021-07-23DIY Cat feeder!operat0r
3386Mon2021-07-26What\'s for dinner?Dave Morriss
3387Tue2021-07-27Infosec Podcasts Part 5 Grab bagTrey
3388Wed2021-07-28Linux Inlaws S01E35: The Free Software Foundation Europemonochromec
3389Thu2021-07-29Tales of a TaggerArcher72
3390Fri2021-07-30Intro to DOS SeriesAhuka
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 18 comments in total.

\n

Past shows

\n

There are 5 comments on\n3 previous shows:

\n\n

This month\'s shows

\n

There are 13 comments on 8 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-July/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Older HPR shows on archive.org

\n

This month 35 additional shows in the range 1-870 have been uploaded.

\n

Since we don\'t want to upload shows without summaries or tags the old shows and tag and summary projects are now tied together. So we will be all the more welcoming of tag and summary updates submitted as described on the summary page.

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nArcher72, Rho`n, Dave Morriss

\n

Over the period tags and/or summaries have been added to 71 shows which were without them.

\n

There are currently 222 shows which need a summary and/or tags.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3114,'2020-07-09','Using the Akaso EK7000 Pro',666,'Some tips on using the camera based on my limited experience on one trip.','

I found this camera to be useful, but it has a few quirks. Here is what I learned about using it. I took it on a cruise in the Caribbean Sea in February 2020, just before the coronavirus hit everything.

\r\n\r\n',198,0,0,'CC-BY-SA','Camera, Waterproof Camera, Action camera',0,0,1), (3125,'2020-07-24','GIMP: The Canvas',785,'The Canvas is the first key concept in learning Gimp','

The Canvas is the main stage on which all of the action takes place, and it controls some aspects of the final image. When you get ready to export, you only export what is on the canvas.

\r\n

Links:

\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, canvas, layer',0,0,1), (3110,'2020-07-03','Finding an Android phone to run LineageOS',2277,'Join Ken on this 6 year long journey of success but also failure','

Finding an Android phone to run LineageOS

\r\n

Affordable phone that support school apps, and allow firewall.

\r\n

TL;DR

\r\n

Don\'t, unless you are willing to loose the money you are paying.

\r\n

Requirements

\r\n\r\n

Support

\r\n

Getting a brand new phone means that Developers have not had time to release code.

\r\n

Older phones are no longer available for purchase, and actually become more expensive.

\r\n

Too old a version and apps are no longer supported.

\r\n

Finding a phone that can be unlocked

\r\n

I use a site called Tweakers.net which allows you to do parameter search.

\r\n

Set the maximum price you are willing to pay.

\r\n

The current version of Android is 10 so select only those. You want your phone to be supported for as long as possible.

\r\n

Make any other selections that you think are critical, like memory, processor etc but be prepared to adjust this later.

\r\n

In my case I selected a minimum of 4G Ram and 64G Storage the first time.

\r\n

Sort by price low to high, and loop through, finding what support there is for TWRP. That will tell you how open the phone is. If the Manufacturer support (the spirit of) unlocking, then remove them from the list.

\r\n\r\n

After finding a phone that can be unlocked and rooted, then check to see if there is an official version for LineageOS

\r\n

If no phone meets all the requirements then try the next one.

\r\n

It\'s very likely you will not find a phone. You are then faced with the choice of adjusting your parameters, for example picking a more expensive model, but at the end of the day be prepared that you may not find a phone.

\r\n

If you do find a phone, it\'s very likely that it may be a different version than the one supported. I have had to return several phones that I had unlocked and just hoped that the supplier would take them back and refund me.

\r\n

Even on supported phones, especially newer ones, it\'s quite often that a major piece of functionality will not work. I have had issues with no GPS on one phone, and bluetooth/wifi not working on another until files were manually edited on each reboot.

\r\n

Do not do this if you want a stress free life, and also if you are not willing to accept the waste of all the money, and time involved.

\r\n

Links

\r\n\r\n',30,0,1,'CC-BY-SA','TWRP,Tweakers,LineageOS,scrcpy,tektab.com,bootloader,fastboot,Sony Xperia XA2,pinephone',0,0,1), (3102,'2020-06-23','RFC 5005 Part 2 – Webcomics, subscribers and feed readers',902,'fluffy, Jamey and I go on for another ten minutes about how webcomic artists feel about feeds','

An interview with two passionate RFC 5005 fans on how to handle big Atom feeds

\r\n\r\n

This conversation took almost an hour, so I split it into two shows:

\r\n\r\n\r\n\r\n

This is part 2.

\r\n\r\n

In this show I’m talking to:

\r\n\r\n

fluffy

\r\n\r\n\r\n\r\n

Jamey

\r\n\r\n\r\n\r\n

Conversation notes

\r\n\r\n\r\n',311,0,0,'CC-BY-SA','webcomics, rfc5005, atom, rss, feeds',0,0,1), (3099,'2020-06-18','Linux Inlaws S01E08 The review of the review',2741,'In this short episode our two heroes rant about Linus, Transmeta, EdgeOS','

S01E08: The review of the review

\r\n

More shenanigans from our two heroes. In this short episode our two heroes rant about Linus and other old people, Transmeta and other history, discuss Martin\'s EdgeOS woes and discover that MIPS is indeed a CPU architecture supported by standard Debian. The show concludes with a short review of Claudio\'s review and poxes about the Arch wiki and Californication. You have been warned!

\r\n\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','Linus, Transmeta, EdgeOS, Arch, Californication, device tree ',0,0,1), (3096,'2020-06-15','Unscripted ramblings on a walk: PC Building.',135,'I take a walk and discuss my experience building a new PC after having not done so for many years.','

I certainly want to say that this episode isn\'t a brag-a-thon about my new rig. I try to discuss what surprised me most about how PC building has changed in the last 10-15 years.

\r\n

The parts for my build:

\r\n',241,57,0,'CC-BY-SA','pc,hardware,build,battlestation,discussion,review,walk',0,0,1), (3101,'2020-06-22','Metrics',1553,'A layman\'s explanation of the mathematical concept of metric.','

Whether you are writing a simple darts simulation 8-bit computer game or are traversing the galaxy Elite-style, you might well find yourself tangling with the mathematical concept known as the metric. In this episode I describe the mathematical concept of a metric which I address with the following questions. Brief answers are provided below but the show, I hope, gives more context and colour.

\r\n

What is a metric?

\r\n

A type of ruler that is used in mathematics.

\r\n

Why not just use a ruler?

\r\n

You can if all you want to do is measure distances in real life but if you want to work out distances from coordinates you need a metric.

\r\n

What\'s the simplest example of a metric?

\r\n

In 1D, distance s equals change in x coordinate.

\r\n

OK, can I have a more interesting example please?

\r\n

On a flat 2D surface, distance squared is the change in x squared plus change in y squared.

\r\n

Isn\'t that pythagoras?

\r\n

Yes, it is, but using the word distance and two co-ordinates.

\r\n

What other co-ordinates can we use for a flat 2D surface?

\r\n

Those x and y co-ordinates are called Cartesian co-ordinates. Instead we can use polar co-ordinates: radius r, and the angle φ (or phi) measured clockwise from the vertical. These might be more convenient in some cases, say for a dart board computer game, or if you are working with a compass bearing, eg head east for 1 km would become start at the origin (r=0) and move with phi=90° until r=1 km.

\r\n

Does Pythagoras still work in polar coords?

\r\n

Yes and no. No, it is no longer true to say that distance squared equals radius squared plus φ squared, but since the geometry is the same - a flat 2D surface - we can say that a change in distance squared equals the change in radius squared plus radius squared times the change in φ squared.

\r\n

Why do we have to talk about changes in s, r and φ?

\r\n

Because one of our coordinates now appears in the metric. That is, the radius squared multiplies on to the change in φ squared. This means that a change in φ depends on r. In other words, bigger circles have bigger circumferences. Actually, it\'s more intricate than that, as we must deal with infinitesimals: quantities which are very, very, very small but not zero.

\r\n

Can we use Cartesian or polar co-ordinates on the surface of the Earth?

\r\n

Only over short distances, much smaller than the radius of the Earth which is 6400 km. So up to about 100 km that\'s fine for many purposes, but not when flying a plane over great distances, say London to Singapore.

\r\n

Why not?

\r\n

The surface of the Earth may look locally flat but of course the Earth has a curved 2D surface. This means that this surface has a non-euclidean geometry, which means that Pythagoras does not hold and we cannot even define Cartesian co-ordinates, let alone use them.

\r\n

I want to know more OR my mind is not fully blown.

\r\n

I will probably do more shows on this.

\r\n

Can I have some links?

\r\n

Sure:

\r\n\r\n',268,0,0,'CC-BY-SA','mathematics,relativity,physics',0,0,1), (3103,'2020-06-24','A warning about browser extensions and add-ons.',93,'A unmaintained extension lead to a popup storm','

\r\nI started getting popups while going to safe websites in chromium-browser. I disabled all browser extensions and then turned them back on individually. I found one that which was causing the problem and it is no longer on the app store. It was however still working and had not been revoked on my browser.\r\n

\r\n

\r\nPlease check your extensions and add-ons to make sure they are regularly updated.\r\n

',30,0,0,'CC-BY-SA','extensions,add-ons,firefox,chromium,chrome,thunderbird',0,0,1), (3116,'2020-07-13','Unscripted ramblings on a walk: Crisis at The Manor',1137,'A walk and a talk about a lightning strike zapping a network.','

In an episode years ago, I talked about \"libernil.net\" (a network for my family and friends). That network grew to be known as \"The Manor\" (manor.space) and has hosted more friends over time. Not too long ago our primary infrastructure was knocked out by lightning. On today\'s walk, I talk a little bit about what happened.

',241,0,1,'CC-BY-SA','networks,post-mortem,retrospective,community,walk,rambling',0,0,1), (3108,'2020-07-01','Fuguita as a Desktop',3148,'I cover all the wonderful things about using Fuguita as your Desktop','

I cover many issues about using OpenBSD based Fuguita as your Desktop. I wouldn\'t have it any other way, I use Fuguita for my main Desktop these days.

\r\n',377,0,0,'CC-BY-SA','OpenBSD,Fuguita,Desktop,Portability,Sanity',0,0,1), (3119,'2020-07-16','Converting to FFS2',2426,'FFS2, FuguIta encryption and UUID\'s and 9 volt batteries','

I talk about converting my I386 Dell Mini 10 running OpenBSD6.7 to the new FFS2 file system. I also talk about the two new features of FuguIta 6.7 which are data encryption and the use of UUID\'s in the noasks file which is used for automatic booting. I also talk about 9 volt batteries and high technology transistor radios. I am also surprised by an SD card discovery I found on my Dell Mini 10.

\r\n',377,0,0,'CC-BY-SA','FFS2, SD cards, OpenBSD',0,0,1), (3120,'2020-07-17','How open are roleplaying games?',2767,'Klaatu and mcnalu talk through what open and free mean in roleplaying games.','

Roleplaying games open you up to a seemingly unlimited array of possibilities taking place in many universes. But truly unlimited freedom would literally mean nothing without a context of history, lore and rules for your adventures. Klaatu and mcnalu talk through what open and free mean in roleplaying games with a particular focus on Dungeons & Dragons which Klaatu has been been running for the HPR community in recent months.

\r\n

If you want to play D&D you can go to the website of its publisher Wizards of the Coast and browse for the player and other manuals. But if you want to play but can\'t or won\'t pay then you can use the System Reference Document (SRD) which is published under the Open Game License (OGL). You can even use that document to create and publish your own adventures.

\r\n

However, if you want to publish an adventure with the full set of D&D rules from official manuals — every monster and every spell — then you need the publisher\'s approval. To do this for D&D you need to publish through the Dungeon Masters\' Guild.

\r\n',268,0,0,'CC-BY-SA','open,free,roleplaying,licensing',0,0,1), (3128,'2020-07-29','Linux Inlaws S01E11 The Python Bumper Part 2',4065,'The chaps continue to shed more light on our beloved programming language','\r\n\r\n\r\n',384,111,1,'CC-BY-SA','Python 3.9, Mortgages in New York, Williamsburg, Wirecard, middle-aged blondes',0,0,1), (3106,'2020-06-29','Linux Inlaws S01E09 Postgres',3851,'The lads talk to Bruce Momjian Postgres evangelist','

S01E09:

\r\n

Postgres
\r\nListen to our two OAP interviewing Bruce\r\nMomjian, Postgres evangelist and long-time supporter of this popular SQL\r\ndatabase. Expect lots of strong language around SQL and NoSQL topics and\r\nsome ranting about MINT\'s attitude towards snaps, a fun breach of a health\r\nservice provider in the UK and why broadcasters should stick to\r\nmonopolies.

\r\n',384,111,1,'CC-BY-SA','Postgres, SQL, NoSQL, MINT',0,0,1), (3107,'2020-06-30','Generating comfortable passwords',1800,'generating passwords to be comfortably type-able','

Random Password Generation

\r\n

First implementation: 14 character long with 6 letters and 8 digits

\r\n
#!/usr/bin/env python3\r\n# file: passgen-v1.py\r\n\r\nimport random\r\n\r\nLETTERS = "abcdefghijklmnopqrstuvwxyz"\r\n\r\nif __name__ == "__main__":\r\n\r\n    passwd = []\r\n\r\n    for i in range(6):\r\n            passwd.append(random.choice(LETTERS))\r\n\r\n    for i in range(8):\r\n            passwd.append(random.choice("1234567890"))\r\n\r\n    print("".join(passwd))\r\n
\r\n

The passwords that come out of this are a bit difficult to type so I forced it to alternate between the left and right hands

\r\n
#!/usr/bin/env python3\r\n# file: passgen-v2.py\r\n\r\nimport random\r\n\r\nLEFTS = "',.pyaoeui;qjkx"\r\nRIGHTS = "fgcrldhdhtns-bmwvz"\r\n\r\nif __name__ == "__main__":\r\n\r\n    passwd = []\r\n\r\n    for i in range(6):\r\n        if i % 2 == 0:\r\n            passwd.append(random.choice(LEFTS))\r\n        else:\r\n            passwd.append(random.choice(RIGHTS))\r\n\r\n    for i in range(8):\r\n        if i % 2 == 0:\r\n            passwd.append(random.choice("123456"))\r\n        else:\r\n            passwd.append(random.choice("7890"))\r\n\r\n    print("".join(passwd))\r\n
\r\n

The regularity of switching between left and right hands (intuitively, and almost surely) decreases the entropy of the password, so use markov models to make that happen for the most part but critically NOT enforce it.

\r\n
#!/usr/bin/env python3\r\n# file: passgen-v3.py\r\n\r\nimport random\r\n\r\nLs = [\r\n    "aoeui",  # L1\r\n    "',.py",  # L2\r\n    ";qjkx",  # L3\r\n    "123456", # L4\r\n    "-snthd", # R1\r\n    "lrcgf",  # R2\r\n    "zvwmb",  # R3\r\n    "7890"    # R4\r\n]\r\n\r\nA = [[ .03,  .03,  .03, .01,  .27,  .27,  .27, .09],\r\n     [ .03,  .03,  .03, .01,  .27,  .27,  .27, .09],\r\n     [ .03,  .03,  .03, .01,  .27,  .27,  .27, .09],\r\n     [.004, .003, .003, .09,  .03,  .03,  .03, .81],\r\n     [ .27,  .27,  .27, .09,  .03,  .03,  .03, .01],\r\n     [ .27,  .27,  .27, .09,  .03,  .03,  .03, .01],\r\n     [ .27,  .27,  .27, .09,  .03,  .03,  .03, .01],\r\n     [ .03,  .03,  .03, .81, .004, .003, .003, .09]]\r\n\r\npi = [ .41, .03, .03, .03, .41, .03, .03, .03]\r\n\r\ndef sample( l ):\r\n    l_partial = [ sum(l[:i+1],0) for i in range(len(l))]\r\n    u = random.uniform(0,1)\r\n    for j,v in enumerate(l_partial):\r\n        if v > u:\r\n            return j\r\n\r\nif __name__ == "__main__":\r\n\r\n    passwd = []\r\n\r\n    s = sample(pi)\r\n    for i in range(20):\r\n        s = sample(A[s])\r\n        passwd.append(random.choice(Ls[s]))\r\n\r\n    print("".join(passwd))\r\n
\r\n

For increased entropy should also consider peppering in a few upper case characters.

\r\n
#!/usr/bin/env python3\r\n# file: passgen-v3.py\r\n\r\nimport random\r\n\r\nLs = [\r\n    "aoeui",  # L1\r\n    "',.py",  # L2\r\n    ";qjkx",  # L3\r\n    "123456", # L4\r\n    "-snthd", # R1\r\n    "lrcgf",  # R2\r\n    "zvwmb",  # R3\r\n    "7890"    # R4\r\n]\r\n\r\nA = [[ .03,  .03,  .03, .01,  .27,  .27,  .27, .09],\r\n     [ .03,  .03,  .03, .01,  .27,  .27,  .27, .09],\r\n     [ .03,  .03,  .03, .01,  .27,  .27,  .27, .09],\r\n     [.004, .003, .003, .09,  .03,  .03,  .03, .81],\r\n     [ .27,  .27,  .27, .09,  .03,  .03,  .03, .01],\r\n     [ .27,  .27,  .27, .09,  .03,  .03,  .03, .01],\r\n     [ .27,  .27,  .27, .09,  .03,  .03,  .03, .01],\r\n     [ .03,  .03,  .03, .81, .004, .003, .003, .09]]\r\n\r\npi = [ .41, .03, .03, .03, .41, .03, .03, .03]\r\n\r\nUPPER=.1\r\n\r\ndef sample( l ):\r\n    l_partial = [ sum(l[:i+1],0) for i in range(len(l))]\r\n    u = random.uniform(0,1)\r\n    for j,v in enumerate(l_partial):\r\n        if v > u:\r\n            return j\r\n\r\nif __name__ == "__main__":\r\n\r\n    passwd = []\r\n\r\n    s = sample(pi)\r\n    for i in range(20):\r\n        s = sample(A[s])\r\n        c = random.choice(Ls[s])\r\n        u = random.uniform(0,1)\r\n        if u < UPPER:\r\n            c = c.upper()\r\n        passwd.append(c)\r\n\r\n    print("".join(passwd))\r\n
\r\n

Finally, generating the matrix by hand was a bit of a pain, so I made it a bit easier by making a small procedure with few control knobs (the variables SWITCH_HAND and SWITCH_CHAR which control how likely it is that a character pair will result in a hand switch, or a switch between general characters and digits).

\r\n
#!/usr/bin/env python3\r\n\r\nimport random\r\nimport numpy\r\n\r\n# this version uses a markov chain to make it more likely to alternate hands\r\n# (in dvorak) so that the password is easy to type (in dvorak)\r\n\r\nLs = [\r\n    "aoeui",  # L1\r\n    "',.py",  # L2\r\n    ";qjkx",  # L3\r\n    "123456", # L4\r\n    "-snthd", # R1\r\n    "lrcgf",  # R2\r\n    "zvwmb",  # R3\r\n    "7890"    # R4\r\n]\r\n\r\nSWITCH_HAND = .8\r\nSWITCH_CHAR = .3\r\nUPPER=.1\r\n\r\ndef prob( i , j ):\r\n    switch_hand = int(i / 4) != int(j / 4)\r\n    to_num = (j % 4) == 3\r\n    from_num = (i % 4) == 3\r\n\r\n    prob = 1\r\n\r\n    if to_num and from_num:\r\n        prob *= (1 - SWITCH_CHAR)\r\n    elif to_num:\r\n        prob *= (SWITCH_CHAR)\r\n    elif from_num:\r\n        prob *= (SWITCH_CHAR / 3)\r\n    else:\r\n        prob *= ((1 - SWITCH_CHAR) / 3)\r\n\r\n    if switch_hand:\r\n        prob *= SWITCH_HAND\r\n    else:\r\n        prob *= (1 - SWITCH_HAND)\r\n\r\n    return prob\r\n\r\n\r\nA = numpy.array([ [ prob(i,j) for j in range(8)  ] for i in range(8) ])\r\n\r\npi = [ 1.0 / 8 for i in range(8) ]\r\n\r\ndef sample( l ):\r\n    l_partial = [ sum(l[:i+1],0) for i in range(len(l))]\r\n    u = random.uniform(0,1)\r\n    for j,v in enumerate(l_partial):\r\n        if v > u:\r\n            return j\r\n\r\nif __name__ == "__main__":\r\n\r\n    passwd = []\r\n\r\n    s = sample(pi)\r\n    for i in range(20):\r\n        s = sample(A[s])\r\n        c = random.choice(Ls[s])\r\n        u = random.uniform(0,1)\r\n        if u < UPPER:\r\n            c = c.upper()\r\n        passwd.append(c)\r\n\r\n    print("".join(passwd))\r\n
\r\n',385,0,1,'CC-BY-SA','passwords, python',0,0,1), (3109,'2020-07-02','Matchbox Restoration Part 4',277,'In this the 4th in the series Tony discusses paint removal on the castings of the MK10 Jaguars','

Good day to all in HPR land, this is Tony Hughes coming to you again from Blackpool in the UK. To recap this is the 4th in a series of shows about my hobby of restoring Matchbox and other Die cast models. In the last show I went through the process of stripping the models down to their component parts. In this episode I will discuss the process I use to remove the paint and prepare the casting for repainting and reassembly.

\r\n

So first off, and I should have said this last episode, a health and safety warning. If there are young people listening to this some of the things talked about on today\'s show require parental supervision, and are not recommended for young people unless properly supervised. So with that public service announcement out of the way let\'s get on with the show.

\r\n

So before the base can be put in the paint stripper the wheels and axles need to be removed. As you can see from the picture there are flanges holding on the wheels to the metal axle and one side is only a small flange.

\r\n

Picture 000
\r\n\"Picture

\r\n

This can be removed with a small needle file or a small rotary file attachment for my rotary tool. Once removed the bases can be put in with the rest of the casting for paint removal.

\r\n

Picture 001
\r\n\"Picture

\r\n

So let\'s talk about paint removal, obviously the first one you will think of is some kind of chemical paint stripper and I use 2 different methods of this. The first and probably the safest in the first instance is a commercial paint stripper from one of the chain DIY stores here in the UK, B&Q. There is a local store about 10 minutes drive from me so it is convenient during normal shopping times just to pop in and grab a 2.5Ltr container of their own brand DIAL paint stripper that is fantastic for this job and quite economic.

\r\n

The second is a little more aggressive if you need fast results but requires a little more in the way of care when using it as it is very corrosive and can be harmful if the fumes are breathed in, or the product gets onto your skin or in your eyes. This is caustic soda and I buy this through eBay and have it delivered in 1Kg pouches. It needs to be stored in an air tight container in a dry environment to keep it from getting damp as this is a potential fire hazard as if it gets contaminated buy moisture a chemical reaction starts which generates heat. So if you go with the caustic soda method you need to take adequate safety precautions. With the Jaguar I mainly used the caustic soda method to remove the paint but one casting I put in the paint stripper to show that method.

\r\n

With the caustic soda place the castings in a jar with enough room to cover with just boiled water so that it does not overflow when the caustic soda crystals are added slowly, I use a long handle tea spoon and add 2-3 tea spoons of the soda until it has a good fizz. Then leave for about 15 minutes but the longer the better, I sometimes do this and leave over night and this gives a great result. Remember to wear gloves when doing this to prevent getting the caustic on your hands.

\r\n

Picture 002
\r\n\"Picture

\r\n

Picture 003
\r\n\"Picture

\r\n

Picture 004
\r\n\"Picture

\r\n

Picture 005
\r\n\"Picture

\r\n

With the paint stripper I have a plastic click lock box with this in that I immerse the casting into and leave for several hours for best results. This can be reused many times as you can see in this picture keeping it an economic method as most of the stripper is left in the box when you remove the casting. The results for both methods are similar, but I find the caustic although you need to be careful, is the less messy of the two options, and the casting is easier to clean after paint removal.

\r\n

Picture 006
\r\n\"Picture

\r\n

So after removal of the paint the castings are polished up with either a hand wire brush or a wire brush attachment for the rotary tool. You can see the base before and after and a picture of the polished main casting in the notes.

\r\n

Picture 007
\r\n\"Picture

\r\n

Picture 008
\r\n\"Picture

\r\n

So we now have a casting ready for repainting, which I will cover in the next episode. So until next time this is Tony Hughes saying goodbye to all those in HPR land. Keep safe until the next instalment.

\r\n',338,114,0,'CC-BY-SA','Matchbox Cars,Diecast Models,Restoration,paint removal,caustic soda,paint stripper',0,0,1), (3403,'2021-08-18','Forth on microcontrollers',1341,'A little more about forth and a couple of chapters in the novel of my life','\r\n
  sudo avrdude -c usbtiny -p m328p -e -U flash:w:uno.hex:i -U eeprom:w:uno.eep.hex:i\r\n  sudo avrdude -c usbtiny -p m328p -e -U flash:w:uno.hex:i -U eeprom:w:uno.eep.hex:i\r\n  sudo avrdude -P usbtiny -p m328p -e -U efuse:w:0x05:m -U hfuse:w:0xD9:m -U lfuse:w:0xFF:m
',326,0,0,'CC-BY-SA','programming, history, arduino',0,0,1), (3112,'2020-07-07','finishing the frame on the long wheelbase recumbent',529,'a narrated slideshow of the next steps in building a bespoke recumbent bicycle','\r\n\r\n\r\n

Rear triangle in jig
\r\n\"Rear

\r\n

Close up
\r\n\"Close

\r\n

View from the front
\r\n\"View

\r\n

Jig ready for bending
\r\n\"Jig

\r\n

Bending process complete
\r\n\"Bending

\r\n

Jigging up rear triangle onto frame
\r\n\"Jigging

\r\n

Rear triangle brazed to frame
\r\n\"Rear

\r\n

Making emt bottom rails
\r\n\"Making

\r\n

Prying cuts open
\r\n\"Prying

\r\n

Finished and ready to fit in frame
\r\n\"Finished

\r\n

Emt bending tool
\r\n\"Emt

\r\n

Bottom rails ready for brazing
\r\n\"Bottom

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent',0,0,1), (3130,'2020-07-31','More Quick Tips',667,'This time tips onNvidia ffmpeg transcoding Fallout Perks Late to Movies,Shared 2FA,Time to leave app','
    \r\n
  1. I talk about using Nvidia to quickly transcode
  2. \r\n
  3. Go over fallout 76 perks
  4. \r\n
  5. Show up to movies 20min late to miss th BS
  6. \r\n
  7. Shared 2FA because everybody uses SMS for some reason even tho the feds say now not to ... it took us 10 years to get here lol
  8. \r\n
  9. Time to leave app ! never be late to anything again... LOL .. you wish !
  10. \r\n
\r\n

-rmccurdy.com

\r\n',36,0,1,'CC-BY-SA','Nvidia ffmpeg transcoding,Fallout Perks,Late to Movies,Shared 2FA,Time to leave app',0,0,1), (3135,'2020-08-07','Quick Tips for May 20 20',977,'BlueTooth,Carseats,tweezers,waffles ','
    \r\n
  1. Talk about Bluetooth...
  2. \r\n
  3. We can put a man on the moon but we can\'t make a carseat that doesn\'t make me want to murder people when I try to move it ...
  4. \r\n
  5. Sharpen those tweezers!
  6. \r\n
  7. Waffffffffelz! YUM!
  8. \r\n
',36,0,1,'CC-BY-SA','BlueTooth,Carseats,tweezers,waffles ',0,0,1), (3140,'2020-08-14','GIMP: Selection Tools',962,'The key to using GIMP effectively is to select the area you want to work on.','

Selection Tools define the area that other tools will work within. For example, if you want to add color to an image, you probably want to add it to a specific area, not to the entire image. Selection Tools help you to pick the area precisely, and are useful for photo retouching purposes.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, selection',0,0,1), (3150,'2020-08-28','GIMP: Paint Tools',1097,'With Paint Tools you begin to operate on the image.','

Paint Tools are where you begin to add things to an image. You can add a large variety of things depending on the tool, from thin lines to broad strokes, to gradients, and so on.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, paint, draw',0,0,1), (3160,'2020-09-11','GIMP: Transform Tools',992,'With Transform Tools you can stretch, move, and crop the image.','

Transform Tools are where you start to manipulate an image. You can move it around, stretch it, rotate it, crop it, and so on. This is the third of the four groups of tools we will look at for GIMP.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, transform',0,0,1), (3113,'2020-07-08','OpenJDK 15 - Unsafe Garbage',893,'We take a quick look at what is coming in JDK 15','

Youtube: OpenJDK 15 - Unsafe Garbage

\r\n

339: Edwards-Curve Digital Signature Algorithm (EdDSA)

\r\n

360: Sealed Classes (Preview)

\r\n

371: Hidden Classes

\r\n

372: Remove the Nashorn JavaScript Engine

\r\n

373: Reimplement the Legacy DatagramSocket API

\r\n

374: Disable and Deprecate Biased Locking

\r\n

375: Pattern Matching for instanceof (Second Preview)

\r\n

377: ZGC: A Scalable Low-Latency Garbage Collector

\r\n

378: Text Blocks

\r\n

379: Shenandoah: A Low-Pause-Time Garbage Collector

\r\n

381: Remove the Solaris and SPARC Ports

\r\n

383: Foreign-Memory Access API (Second Incubator)

\r\n

384: Records (Second Preview)

\r\n

385: Deprecate RMI Activation for Removal

\r\n',382,0,0,'CC-BY-SA','java, news',0,0,1), (3118,'2020-07-15','Linux Inlaws S01E10 The Python Bumper Part 1',5436,'A discussion of Python questions and their answers (part 1). Plus news on Brad and Alia','',384,111,1,'CC-BY-SA','Python, PEP, Linux, Alia Shawkat, Brad Pitt, Stackless Python',0,0,1), (3117,'2020-07-14','The joy of retro computing',1914,'Knightwise talks about the old computers in his attic and how it is a loverly geek getaway','

Knightwise talks about his collection of old macs and pc\'s and how he uses them as a little \"getaway\" of the rush of modern day life. Show recorded in the car, excuse the road noise.

',111,0,0,'CC-BY-SA','Retro computer',0,0,1), (3123,'2020-07-22','Arduino controlled Christmas lights',170,'Controlling Christmas LED lights with an Arduino','
    \r\n
  1. Inspired by an Instructable project

    \r\n

    https://www.instructables.com/id/LED-VU-Meter-With-Arduino-UNO

  2. \r\n
  3. Started the project with Arduino Uno.

    \r\n
      \r\n
    • Found that power it with the barrel plug made audio input stable
    • \r\n
    • Tested this theory by using USB power
    • \r\n
    • Suspect this was due to grounding not being as good with the USB
    • \r\n
    • This caused LED\'s to light even without an audio input
    • \r\n
    • Ended up using an generic Arduino Nano to control the project
    • \r\n
  4. \r\n
  5. Modified an audio mic preamplifier from Amazon to condition the output from the laptop music source

  6. \r\n
  7. Ran the output from this to A0 on the Arduino

  8. \r\n
  9. Split the signal out to an external speaker

  10. \r\n
  11. Used digital outputs listed in the sketch to power the LED indicators

    \r\n
      \r\n
    • For reference, a sketch is the program that the Arduino runs through a loop.
    • \r\n
  12. \r\n
  13. Used pins 10 to 12 as AnalogWrite pin to provide the power to the solid state relays.

  14. \r\n
  15. Used a dremel to separate the power to the hot side of the two power outlets

    \r\n
      \r\n
    • Used three of the outlets to power three strings of Christmas tree LED lights.
    • \r\n
    • Used the other outlet to power the Arduino
    • \r\n
  16. \r\n
  17. Bonus

    \r\n
      \r\n
    • Using these particular solid state relays, there is still a 10Vac output in off state. It actually worked for good, as the lights are at a nice brightness without a music input.
    • \r\n
    • Kindly leave a note in the comments if this is common to Solid State relays.
    • \r\n
  18. \r\n
\r\n

Links:

\r\n

GY-MAX4466 Electret Microphone Amplifier

\r\n

https://www.amazon.com/gp/product/B07C3HXPJ9/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

\r\n

Solid State relay on Ebay

\r\n

https://www.ebay.com/itm/25A-40A-SSR-25DA-SSR-40DA-250V-Solid-State-Relay-Module-Alloy-Heat-Sink/401478280169?hash=item5d79f863e9:g:dkwAAOSwiqFaX3f8

\r\n

ELEGOO for Arduino Nano V3.0

\r\n

https://www.amazon.com/gp/product/B0713XK923/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

\r\n

AnalogWrite

\r\n

https://www.arduino.cc/en/pmwiki.php?n=Reference/AnalogWrite

\r\n

https://www.arduino.cc/en/Tutorial/AnalogInOutSerial

\r\n

My video

\r\n

Sound\r\nReactive Christmas lights on Archive.org

\r\n

\r\n

Edit:

\r\n

Here is the song I meant to add, to see if it matches my video of the lights.

\r\n

It is the Trans Siberian Orchestra, Carol of the Bells.

\r\n

https://m.youtube.com/watch?v=sCabI3MdV9g

\r\n',318,91,0,'CC-BY-SA','Arduino, Christmas, lights, Solid state relays',0,0,1), (3170,'2020-09-25','GIMP: Color Tools',1199,'With Color Tools you can adjust the colors and brightness of an image.','

Color Tools are where you can adjust the colors and brightness of an image.You can change the color balance, adjust individual colors or transparency without affecting other colors, and so on. This is the fourth of the four general groups of tools we will look at for GIMP. There will also be some miscellaneous tools.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, color',0,0,1), (3180,'2020-10-09','GIMP: Miscellaneous Tools',803,'These few remaining tools are important, but don\'t fit neatly into one category.','

The Miscellaneous tools do a number of useful things without fitting neatly into a category. The Paths tool takes Selections up a notch and also lets you add interesting effects. Zoom is one you would use every day, and Measure is handy in some situations. Finally, GEGL Operations are the future of all GIMP development

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, paths, zoom, GEGL',0,0,1), (3124,'2020-07-23','Matchbox Restoration Part 5',310,'In this the 5th in the series Tony discusses the painting process on the castings of the MK10 Jaguar','

HPR Matchbox show Episode 5

\r\n

Good day to all in HPR land, this is Tony Hughes coming to you again from Blackpool in the UK. To recap this is the 5th in a series of shows about my hobby of restoring Matchbox and other Die cast models. In the last show I went through the process I use to remove the paint and prepare the casting for repainting and reassembly. In this episode we will look at the painting of the castings and \'Spoiler\' what to do if things go wrong.

\r\n

After polishing and before painting I degrease the casting in some alcohol. I use a cheap own brand nail polish remover from the Co-Op but there are many ways of doing this and as many products on the market, so use what you have to hand. Even a good clean in hot soapy water, dry with a lint free cloth and then a wipe over with alcohol wipes works well. Remember to wear gloves when handling the casting after this process as the grease from your hands can undo all your hard work.

\r\n

So the first thing to say is that I am still in the early stages of learning this hobby and use what are referred to as \'Rattle\' cans in this community, it just means spray can painting rather than the use of an Air Brush, which I will be moving onto at some point so I can mix my own paint colours and not just those available in a spray can.

\r\n

So far I have been painting the casting outside during a warm dry day with little or no wind, or in a sheltered spot behind the garage if the wind is a little strong. I have now set up a small portable spray booth in the garage for this so will be able to paint in all conditions weather wise, which will make life easier.

\r\n

Image 001
\r\n\"Image

\r\n

So back to the casting, I use a Hemostat Clamp to hold the casting on this model it is attached to the post that holds the model together as this will not be seen when reassembled, I used a grey primer, spraying light coats all over the model until it is completely covered in the primer. Priming helps smooth out any small imperfections for the final paint coat, and as the casting is over 50 years old, it also lays down a consistent base colour and ensures that the colour coat should be the same all over when final paint is applied. As you can see in the picture it also shows up the casting lines and if desired these can be filed away prior to final painting, as this is a restoration I left this casting as original as possible, and left these in.

\r\n

Image 002
\r\n\"Image

\r\n

Image 003
\r\n\"Image

\r\n

After leaving the casting to dry for about an hour I came back with the colour coat, the original model was a metallic brown, but the nearest match I was able to find in the local pound shops is a metallic gold. Not perfect but the final results look good, but a little lighter than the original paint. I applied the paint in smooth fine strokes, getting what is called a tack coat of the paint all over the model casting to start, then applying another coat (the wet coat) all over until there is no sign of the primer and all looks smooth but with no runs in the paint finish. The balance needs to be just right with not too little or too much paint, but with practice you get there in the end. Unforseeably on this occasion there was a reaction with the primer on the rear of the model which caused bubbling of the paint.

\r\n

Image 004
\r\n\"Image

\r\n

Image 005
\r\n\"Image

\r\n

So after allowing the paint to fully cure I used a little wet and dry fine sanding paper to smooth out this area and gave the casting another coat of paint, and fortunately this time all was well as you can see from the pictures in the show notes.

\r\n

Image 006
\r\n\"Image

\r\n

Image 007
\r\n\"Image

\r\n

While the casting was fully curing I turned my attention to the screen plastic. I found the best of the ones I had salvaged, from the 4 castings, picture 008 in the notes, and gave it a polish with some auto sol polishing compound using a cotton bud, and it came out quite nice. I then gave it a wash in soapy water to remove the residue of the polishing compound and after drying gave it a dip in some Pledge floor shine, it works great.

\r\n

Image 008
\r\n\"Image

\r\n

Image 009
\r\n\"Image

\r\n

Image 010
\r\n\"Image

\r\n

After coating the screen in the Pledge it is placed on a pad of paper towel and covered with a plastic pot to stop dust getting on it while drying.

\r\n

Image 011
\r\n\"Image

\r\n

Although the original casting had a black painted base I liked the look of the polished base so decided to leave this as it was, but if painting the base it is the same process as the main casting.

\r\n

Well that\'s it for this episode, on the next I will look at putting the wheels and axles back on the base and the reassembly process.

\r\n

This is Tony Hughes for Hacker Public Radio, saying goodbye for now, keep safe everyone and I\'ll be back soon with the next instalment.

\r\n',338,114,0,'CC-BY-SA','Matchbox Cars, Diecast Models, Restoration, painting, Rattle cans, Air brushing, Plastic polishing',0,0,1), (3121,'2020-07-20','Opposing Views on Tattoos',1866,'Windigo and Mrs. Honeyhume discuss their views on tattoos','

\r\nNote: Phone recording came with a little bit of a hiss. Sorry about that!\r\n

\r\n

\r\nI discuss the subject of tattoos with my partner of fifteen years, Mrs. Honeyhume. While we agree on many subjects, tattoos are not one of them.\r\n

\r\n

\r\nShe enjoys and appreciates tattoos, seeing them as a permanent form of art that you can display on your own body. She has several of her own. I do not mind if other people tattoo themselves, but I am very opposed to getting them myself.\r\n

\r\n

\r\nWe discuss cultural influences of tattooing, some different methods used to tattoo skin, and many hypothetical situations to try to pin down the source of my opposition to getting one.\r\n

\r\n',196,0,1,'CC-BY-SA','tattoos',0,0,1), (3126,'2020-07-27','Metrics part II',1967,'The metric of a 2D curved surface','

In this show I continue from where I left off in my last show (3101) and talk about the geometry of curved 2D surfaces such as that of a sphere.

\r\n

Using the Earth\'s surface as an example we can use familiar the co-ordinates of longitude and latitude, illustrated on this diagram:

\r\n\"Sphere\r\n\r\n

Source: Public domain, Wikimedia commons

\r\n

On the left we see circles of constant latitude. The largest of these circles is at latitude 0° and is called the equator. Its circumference is equal to that of the Earth and so it is an example of a great circle.

\r\n

On the right we see lines of constant longitude. These run from pole to pole and are perpendicular to the equator. Each of these lie on a great circle (in fact they are half a great circle each).

\r\n

Great circles on the surface of a sphere are analogous to straight lines on a flat 2D surface. They offer a way to connect any two points with the shortest distance. Lines in 2D or great circles on a sphere are examples of what is called a geodesic. In physics, particles that are not subject to any forces will follow geodesics.

\r\n

In Einstein\'s General Theory of Relativity, the presence of mass or energy will alter the shape of spacetime and that will determine the metric. From the metric you can derive the geodesics and from that you can predict the motion of objects with no forces acting on them. In this way you can do away with the approximation that is Newton\'s gravitational force and replace it by a description that only involves the curvature of spacetime. I only touch on this in this show but will likely return to it in future shows.

\r\n

Here are the equations discussed in this show and the previous one:

\r\n\"Sphere\r\n\r\n',268,0,0,'CC-BY-SA','maths,relativity,physics,earth',0,0,1), (3122,'2020-07-21','Devuan review - and commentary',2086,'Devuan Review plus I talk about race','

\r\nFrom Wikipedia, the free encyclopedia\r\n

\r\n

\r\nDevuan is a fork Debian that uses sysvinit or OpenRC instead of systemd, which is the default in newer Debian releases. The Devuan development team aim to maintain compatibility with other init systems in the future and not detach Linux from other Unix systems.\r\n

\r\n

\r\n[Edit: Ken 2020-07-21]\r\n

\r\n

\r\nA significant portion of this show relates to the U.S Supreme Court decision in the case of McGIRT v. OKLAHOMA, and speculation as to possible ramifications.\r\n

\r\n\r\n',377,0,0,'CC-BY-SA','Devuan, Debian, sysvinit, OpenRC, systemd',0,0,1), (3190,'2020-10-23','GIMP Brushes',1219,'Paint tools, and particularly the Paintbrush Tool, require the use of brushes.','

Brushes are a key part of using Paint tools, and in particular the Paintbrush Tool. And in this episode we look at how to work with, edit, download, and save different brushes. We look at the Brush Dialog, and examine the different settings that make them easier to work with.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, brushes',0,0,1), (3129,'2020-07-30','Followup on HPR3122',2157,'Followup on HPR3122 and *MORE* - percent *MORE* undescribed','https://www.youtube.com/watch?v=OFWCbGzxofU',377,0,0,'CC-BY-SA','Followups MORE',0,0,1), (3127,'2020-07-28','HPR AudioBook Club 20 - Quarter Share',9131,'The HPR Audiobook Club reviews the audiobook Quarter Share by Nathan Lowell','

In this episode the HPR Audiobook Club discusses the audiobook Quarter Share by Nathan Lowell

\r\n
\r\n

Non-Spoiler Thoughts

\r\n
\r\n\r\n

Beverage Reviews

\r\n
\r\n

As usual, the HPR AudioBook Club took some time to review the beverages that each of us were drinking during the episode

\r\n\r\n

Things We talked about

\r\n
\r\n\r\n

Our Next Audiobook

\r\n
\r\n

The Terrible Business of Salmon & Dusk

\r\n

The Next Audiobook Club Recording

\r\n
\r\n

Right now we are working through a backlog of older episode that have already been recorded. Once that ends we fully anticipate recording new episodes with listener participation.

\r\n

Further Recommendations

\r\n
\r\n\r\n

Feedback

\r\n
\r\n

Thank you very much for listening to this episode of the HPR AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time we record a new episode. Please leave a few words in the episode\'s comment section.

\r\n

As always; remember to visit the HPR contribution page HPR could really use your help right now.

\r\n

Sincerely, The HPR Audiobook Club

\r\n

P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.

\r\n

Our Audio

\r\n
\r\n

This episode was processed using Audacity. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. Its been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).

\r\n

We use the \"Truncate Silence\" effect with it\'s default settings to minimize the silence between people speaking. When used with it\'s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.

\r\n

Next we use the \"Compressor\" effect with the following settings:

\r\n
    Threshold: -30db\r\n    Noise Floor: -50db\r\n    Ratio: 3:1\r\n    Attack Time: 0.2sec\r\n    Decay Time: 1.0 sec\r\n
\r\n

\"Make-up Gain for 0db after compressing\" and \"compress based on peaks\" were both left un-checked.

\r\n

After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.

\r\n

We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.

\r\n

At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata.

\r\n

At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.

\r\n

Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.

\r\n',157,53,1,'CC-BY-SA','Nathan Lowell, Audiobooks, SciFi, Space Opera',0,0,1), (3132,'2020-08-04','Keeping track of where I am',1362,'How I keep track of where I am','

This episode covers how I keep track of what I\'m listening to

\r\n

I almost never produced this podcast as I discovered part way through that I had covered it in my show \"Describing how I listen to podcasts PART 2\" (HPR 2889). I\'m conscious I have a tendency to repeat myself in real life, I think this is because I have such a terrible memory. Despite this I decided to continue with the episode but will go into subject in a bit more detail.

\r\n

These ideas slowly evolved over time and I think some of them may now be redundant. I think I need to do some tidying.

\r\n

As I\'ve previously mention I used cordless headphones to listen to my podcasts and audiobooks. The headphones come with base transmitter which was originally plugged into my old Compaq home server. This server was generally turned on when I came home from work and turned off before going to bed. Each night I had to remember which track I was on and where about in the track. I often forgot and had to try and find the place again. This quickly became a tiresome task.

\r\n

My first solution was to use some bash Kung Fu jiggery pokery to create list of files which I placed in each podcast folder. In the process I learned a bit about using bash commands.

\r\n

Command used to create index

\r\n
id3v2 -l *.mp3 | grep 'TIT2' | cut -c44- >> readme.txt\r\nid3v2 -l *.mp3 | grep 'TIT2' | cut -c44- | egrep 'HPR[01][9][7-9]' >> readme.txt\r\nid3v2 -l *.mp3 | grep 'TIT2' | cut -c44- | egrep 'HPR[1-9]' |less >> readme.txt\r\n========================================================\r\n========================================================
\r\n

Example output

\r\n
epr0006.mp3 - dosman                            complete\r\nhpr0010.mp3 - linux boot process, part 1        complete\r\nhpr0012.mp3 - zen virtulization                 complete\r\nhpr0018.mp3 - book review                       complete
\r\n

The downside of this was that at the end of each night I had to remember to update my file lists recording what I had listened to and what position I was in within the track. From time to time I had to update this list by appending the latest episodes sitting on my server using the previous id3v2 command.

\r\n

As you can imagine this took up a fair amount of time and became very tiresome, I would sometimes forget to do it this would cause me a headache next time I started listening to my podcasts.

\r\n

My next solution involved creating a bash script that attempted to persuade my music player moc to find the track I was previously listening to.

\r\n

The script sometimes worked but it was a bit flaky and didn\'t always work.

\r\n

My final solution is in multiple parts

\r\n

The 1st part consists of a bash script and a log file, it\'s a handy way of checking the last podcast episode and last position, this information is recorded to the log file when the front end of moc is exited by hitting Q. Of course this doesn\'t work if mocp closes for any other reason ie if I forgot to hit Q or my Pi crashed.

\r\n

First script

\r\n
~/scripts/podcasts\r\n\r\nquick lash up of script created 29/12/12 (DD/MM/YY)\r\nCreated to keep track of last position of listened podcast\r\n\r\nScript displays last 4 lines of logfile "podcasts.txt"\r\nThe four lines consist of a Dashed line separator, the last recorded Track\r\nTitle, last recorded Filename and the last recorded track position.\r\nThe script then pauses and displays a message saying\r\npress any key to continue.\r\nRuns mocp\r\nWhen the frontend of mocp exits\r\nThe script gets the current track filename\r\nIf the result is empty ie no filename then\r\n    exit with error saying (moc was not playing anything)\r\nif not empty\r\n    append a dashed line separator, the current track title, the current\r\n    filename, the current track position to logfile it then display last 4 lines\r\n    of logfile and exits the script\r\n\r\nSo in essence I get a reminder of the track and position I'm listening to\r\nevery time a start or stop the front end of moc\r\n\r\nThe logfile located at /home/pi/scripts/podcast.txt\r\npodcasts.txt as of 4th October 2019 is 168KB in size and currently has 4904\r\nlines as each entry has 4 lines this means it currently contains 1226 entries.
\r\n

The 2nd script I use runs as a cron job every night at 11.01pm. This script keeps track of all the files copied to the MP3 directory of my raspberry pi, this is where I put my podcasts that I want to listen to. I can then grep the log file to see the latest version of a particular episodes that\'s been copied to my mp3 directory as from time to time I delete the episodes I\'ve listened to before copying new ones in.

\r\n
~/scripts/update-podcast-episode-log\r\n Below are the comments taken directly from my script\r\nCreated to keep track of the latest podcast episode I've\r\nlistened to it does this by logging the contents\r\nof the mp3 directory on the raspberry pi.\r\nThe script checks the logfile exists, then checks the\r\npodcast (mp3) directory exists, it then use the find\r\ncommand to list the files in the mp3 directory and send the  listing to a log\r\nfile, a date stamp is added at the beginning of the listing.\r\nV1 11 July 2015\r\n\r\nLogfile located at /home/pi/files/logs/podcast-episodes.log\r\nAs of the 4th October 2019 the log file is an impressive 688Kb containing\r\na whopping 28,158 lines, the first entry was dated  15th July 2013
\r\n

The 3rd script is also runs as a cron job every every night at 11.00pm

\r\n
/home/pi/scripts/update-podcast-position-log\r\nBelow are the comments taken directly from my script\r\nCreated to log current position of current podcast\r\nThe script checks the logfile exists, then checks that mocp  is installed on\r\nthe system it then writes a timestamp, and track position information to\r\na logfile using moc with -Q flag to get current track position, track title\r\n& file name\r\nV1 Created by MrX 11th July 2015\r\n\r\nLogfile located at /home/pi/files/logs/podcast-position.log\r\nSize is 148Kb as of 4th October 2019 currently has a 1495 lines, the first\r\nentry was dated 15th July 2013
\r\n

Example logfile output

\r\n
15:09:06:23:01 | 01:12 | Dave Morriss - HPR1811: Life and Times of a Geek part 2 (Hacker Public Radio) | hpr1811.mp3\r\n\r\nYY:MM:DD:HH:MM | Track position (MM:SS) | ID3 track title | Filename
\r\n

The 4th script is identical to the previous script but is used to update the current audiobook position to a log file, like the previous script it runs as a cron job every night.

\r\n
/home/pi/scripts/update-audiobook-position-log
\r\n

The 5th and final script

\r\n
home/pi/scripts/logs
\r\n

Was created to easily view podcast and audiobook logs The script first checks that the logfiles exists, then displays the last three lines of my podcasts and audiobooks logs so I can quickly see the most recent episode positions that were stored by the cron jobs at 11pm.

\r\n

Logs are:-

\r\n
/home/pi/files/logs/podcast-position.log\r\n/home/pi/files/logs/audiobook-position.log
\r\n

V1 Created by MrX 13th July 2015

\r\n

V2 Updated by MrX 8th August 2015

\r\n

This added an option to seach for a string in my episodes position logs to easily find out what the last episode I listened to of a particular book or podcast, the output is piped to less as numerous lines can be returned.

\r\n

if more than one argument is given then it displays an error and usage message

\r\n

V3 Updated by MrX 21st Jul 2017

\r\n

If a single argument is given now jumps to end of list rather than beginning, this was achieved by using the +G flag with less command.

\r\n

The script displays contents of logfiles

\r\n
/home/pi/files/logs/podcast-position.log\r\n/home/pi/files/logs/audiobook-position.log
\r\n

Links

\r\n\r\n',201,0,1,'CC-BY-SA','Linux, bash, podcasts, audio, scripts',0,0,1), (3149,'2020-08-27','HPR AudioBook Club 21 - The Terrible Business of Salmon and Dusk',6342,'The HPR Audiobook Club reviews the audiobook The Terrible Business of Salmon and Dusk by Myke Bartle','

In this episode the HPR Audiobook Club discusses the audiobook The Terrible Business of Salmon & Dusk by Myke Bartlett

\r\n
\r\n

Non-Spoiler Thoughts

\r\n
\r\n\r\n

Beverage Reviews

\r\n
\r\n

As usual, the HPR AudioBook Club took some time to review the beverages that each of us were drinking during the episode

\r\n\r\n

Things We talked about

\r\n
\r\n\r\n

Our Next Audiobook

\r\n
\r\n

Murder at Avedon Hill by P.G. Holyfield

\r\n

The Next Audiobook Club Recording

\r\n
\r\n

Right now we are working through a backlog of older episode that have already been recorded. Once that ends we fully anticipate recording new epsiodes with listener participation.

\r\n

Further Recommendations

\r\n
\r\n\r\n

Feedback

\r\n
\r\n

Thank you very much for listening to this episode of the HPR AudioBookClub. We had a great time recording this show, and we hope you enjoyed it as well. We also hope you\'ll consider joining us next time we record a new episode. Please leave a few words in the episode\'s comment section.

\r\n

As always; remember to visit the HPR contribution page HPR could really use your help right now.

\r\n

Sincerely, The HPR Audiobook Club

\r\n

P.S. Some people really like finding mistakes. For their enjoyment, we always include a few.

\r\n

Our Audio

\r\n
\r\n

This episode was processed using Audacity. We\'ve been making small adjustments to our audio mix each month in order to get the best possible sound. Its been especially challenging getting all of our voices relatively level, because everyone has their own unique setup. Mumble is great for bringing us all together, and for recording, but it\'s not good at making everyone\'s voice the same volume. We\'re pretty happy with the way this month\'s show turned out, so we\'d like to share our editing process and settings with you and our future selves (who, of course, will have forgotten all this by then).

\r\n

We use the \"Truncate Silence\" effect with it\'s default settings to minimize the silence between people speaking. When used with it\'s default (or at least reasonable) settings, Truncate Silence is extremely effective and satisfying. It makes everyone sound smarter, it makes the file shorter without destroying actual content, and it makes a conversations sound as easy and fluid during playback as it was while it was recorded. It can be even more effective if you can train yourself to remain silent instead of saying \"uuuuummmm.\" Just remember to ONLY pass the file through Truncate Silence ONCE. If you pass it through a second time, or if you set it too aggressively your audio may sound sped up and choppy.

\r\n

Next we use the \"Compressor\" effect with the following settings:

\r\n
    Threshold: -30db\r\n        Noise Floor: -50db\r\n        Ratio: 3:1\r\n        Attack Time: 0.2sec\r\n        Decay Time: 1.0 sec\r\n
\r\n

\"Make-up Gain for 0db after compressing\" and \"compress based on peaks\" were both left un-checked.

\r\n

After compressing the audio we cut any pre-show and post-show chatter from the file and save them in a separate file for possible use as outtakes after the closing music.

\r\n

We adjust the Gain so that the VU meter in Audacity hovers around -12db while people are speaking, and we try to keep the peaks under -6db, and we adjust the Gain on each of the new tracks so that all volumes are similar, and more importantly comfortable. Once this is done we can \"Mix and Render\" all of our tracks into a single track for export to the .FLAC file which is uploaded to the HPR server.

\r\n

At this point we listen back to the whole file and we work on the shownotes. This is when we can cut out anything that needs to be cut, and we can also make sure that we put any links in the shownotes that were talked about during the recording of the show. We finish the shownotes before exporting the .aup file to .FLAC so that we can paste a copy of the shownotes into the audio file\'s metadata.

\r\n

At this point we add new, empty audio tracks into which we paste the intro, outro and possibly outtakes, and we rename each track accordingly.

\r\n

Remember to save often when using Audacity. We like to save after each of these steps. Audacity has a reputation for being \"crashy\" but if you remember save after every major transform, you will wonder how it ever got that reputation.

\r\n',157,53,1,'CC-BY-SA','Audiobook, Review, Creative Commons',0,0,1), (3133,'2020-08-05','Quick tip - Using MPV with Youtube links',124,'I give a quick tip on shortcut keys for watching Youtube or other video sites in MPV','

Idea:

\r\n

Quickly copy a Youtube or other video site, and open in the MPV media player.

\r\n

Plugins:

\r\n

Vim Vixen for Firefox
\r\nhttps://addons.mozilla.org/en-US/firefox/addon/vim-vixen

\r\n

Surfingkeys for Chrome/Chromium browser
\r\nhttps://chrome.google.com/webstore/detail/surfingkeys/gfbliohnnapiefjpjlpjnehglfpaknnc?hl=en-US

\r\n

Script:

\r\n
#!/bin/bash\r\n## mpvurl\r\n\r\nurl=`xsel -o -b`\r\necho $url\r\nmpv $url
\r\n

Rename /usr/bin/vlc to /usr/bin/vlc.old

\r\n

Copy script to /usr/bin/vlc and chmod +x /usr/bin/vlc

\r\n

How to use:

\r\n

Vim Vixen copy is \'y\' Surfingkeys copy is \'yy\'

\r\n

Shortcut to open copied video url is Shift-Mod-p, with Mod being the windows key

\r\n

Tested with Gnome3, Xfce and i3

\r\n

In i3, press Mod+v then Mod+s.

\r\n

Any video played this way will be stacked under Firefox/Chromium for the rest of your session.

\r\n

Config:

\r\n

In ~/.config/i3/config

\r\n
#Paste url into mpv player\r\nbindsym $mod+Shift+p exec vlc
\r\n

Example screenshots:

\r\n

Example of stacked Firefox/MPV layout
\r\n\"Example

\r\n

For Gnome3 the setting can be reached with Mod (Windows key) and Shortcuts
\r\n\"For

\r\n

And the Default Applications need to be changed
\r\n\"And

\r\n

The setting for Shortcuts in Xfce looks like this
\r\n\"The

\r\n',318,0,0,'CC-BY-SA','Video, media, bash, i3, Gnome3, Xfce',0,0,1), (3416,'2021-09-06','HPR Community News for August 2021',5765,'Ken\'s not available so MrX joins Dave to talk about the shows and comments in August','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3391Mon2021-08-02HPR Community News for July 2021HPR Volunteers
3392Tue2021-08-03Structured error reportingTuula
3393Wed2021-08-04We need to talk about XMLklaatu
3394Thu2021-08-05Be an XML star with xmlstarletklaatu
3395Fri2021-08-06Hacking Stories with Reacted: part 1operat0r
3396Mon2021-08-09Card roles in Magic the Gatheringklaatu
3397Tue2021-08-10What is a PineTimeDaniel Persson
3398Wed2021-08-11Anacronklaatu
3399Thu2021-08-12Linux Inlaws S01E36: Open Source Licensesmonochromec
3400Fri2021-08-13Normal Layer Modes: Normal, Dissolve, Color EraseAhuka
3401Mon2021-08-16Mana hacksklaatu
3402Tue2021-08-17Reading a manifesto: Declaration of Digital Autonomyclacke
3403Wed2021-08-18Forth on microcontrollersBrian in Ohio
3404Thu2021-08-19Suse 15.3 LeapJWP
3405Fri2021-08-20Hacking Stories with Reacted: part 2operat0r
3406Mon2021-08-23A study of cards in gamesklaatu
3407Tue2021-08-24Software Freedom PodcastKen Fallon
3408Wed2021-08-25CompostingRho`n
3409Thu2021-08-26Linux Inlaws S01E37: All about Hacker Public Radiomonochromec
3410Fri2021-08-27Operating SystemsAhuka
3411Mon2021-08-30Dominion card gameklaatu
3412Tue2021-08-31Reading a license: Creative Commons Attribution ShareAlike 3.0 Unportedclacke
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 9 comments on\n5 previous shows:

\n\n

This month\'s shows

\n

There are 15 comments on 7 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-August/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Older HPR shows on archive.org

\n

This month 10 additional shows in the range 1-870 have been uploaded.

\n

Since we don\'t want to upload shows without summaries or tags the old shows and tag and summary projects are now tied together. So we will be all the more welcoming of tag and summary updates submitted as described on the summary page.

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nArcher72, Rho`n, Ken Fallon, Dave Morriss

\n

Over the period tags and/or summaries have been added to 108 shows which were without them.

\n

There are currently 114 shows which need a summary and/or tags.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3436,'2021-10-04','HPR Community News for September 2021',3268,'HPR Volunteers talk about shows released and comments posted in September 2021','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n CoGo, \n BlacKernel.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3413Wed2021-09-01Bash snippet - using coproc with SQLiteDave Morriss
3414Thu2021-09-02Critical Thinking may make You Critical of the Covid CrisisCoGo
3415Fri2021-09-03Hacking Stories with Reacted: part 3operat0r
3416Mon2021-09-06HPR Community News for August 2021HPR Volunteers
3417Tue2021-09-07Ceph cluster hardwareDaniel Persson
3418Wed2021-09-08My gEeeky Experiment - Part 2Claudio Miranda
3419Thu2021-09-09Linux Inlaws S01E38: Tiny kernelsmonochromec
3420Fri2021-09-10Normal Layer Modes: Erase, Merge, and SplitAhuka
3421Mon2021-09-13BlacKernel\'s Journey Into Technology: Episode 1BlacKernel
3422Tue2021-09-14Update about Phones and DevicesJWP
3423Wed2021-09-15\"upg.sh\" my \"dump.txt\" to \"note.md\"Some Guy On The Internet
3424Thu2021-09-16Infosec Podcasts Part 6 - Infosec LeadershipTrey
3425Fri2021-09-17Hacking Stories with Reacted: part 4operat0r
3426Mon2021-09-20Rust 101: Episode 0 - What in Tarnishing?BlacKernel
3427Tue2021-09-21Ranger for the Win!b-yeezi
3428Wed2021-09-22Bad disk rescueAndrew Conway
3429Thu2021-09-23Linux Inlaws S01E39: Ubuntu and the Communitymonochromec
3430Fri2021-09-24BootingAhuka
3431Mon2021-09-27Living in the TerminalBlacKernel
3432Tue2021-09-28Reading a license: Creative Commons Attribution ShareAlike 4.0 Internationalclacke
3433Wed2021-09-29A Squirrels thoughts about RMSZen_Floater2
3434Thu2021-09-30From 0 to K8s in 30 minutesklaatu
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 27 comments in total.

\n

Past shows

\n

There are 2 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 25 comments on 13 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-September/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Older HPR shows on archive.org

\n

This month 5 additional shows in the range 1-870 have been uploaded.

\n

Since we don\'t want to upload shows without summaries or tags the old shows and tag and summary projects are now tied together. So we will be all the more welcoming of tag and summary updates submitted as described on the summary page.

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nArcher72, Rho`n

\n

Over the period tags and/or summaries have been added to 76 shows which were without them.

\n

There are currently 38 shows which need a summary and/or tags.

\n

If you would like to contribute to the tag/summary project visit the summary page at https://hackerpublicradio.org/report_missing_tags.php and follow the instructions there.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3134,'2020-08-06','Tomorrowland 2020',584,'Explaining the experience of the first virtual music festival','

The music festival Tomorrowland was made virtual this year.

\r\n

Usually, they have 200k visitors over two weekends on a small area of 128 football (soccer) fields. This year they digitally did it all, which was engaging and fun. I\'ve never attended, but I loved this year, where I could be a part of the experience.

\r\n

This recording was made at 01.00 AM right after the festival had ended, so I still had the hype, totally sober but euphoric.

\r\n\r\n',382,0,0,'CC-BY-SA','music,dance,house,festival,tomorrowland',0,0,1), (3136,'2020-08-10','Matchbox Restoration Part 6',286,'Matchbox Cars, Diecast Models, Restoration, Reassembly of the model','

Good day to all in HPR land, this is Tony Hughes coming to you again from Blackpool in the UK. To recap this is the 6th in a series of shows about my hobby of restoring Matchbox and other Die cast models. In the last show I went through the process I use to paint and prepare the casting for reassembly. In this episode I will discuss how I put back the wheels onto the base and reassemble the final model, before revealing in the show note pictures how the model came out.

\r\n

So before putting back the plastic wheels onto the axles I polished the axles in my drill bit using a little bit of fine wet and dry emery paper.

\r\n

Picture 001
\r\n\"Picture

\r\n

After selecting the best 4 of the plastic tyres from the models we originally dismantled I washed these in a little soapy water and after drying they these were fit for putting back on the restored model. The cleaned up axle is assembled on the base with the first tyre in place with the large dome end of the axle sat on a nail punch held in a vice. The second tyre is then placed on the axle and holding this all in place a small hammer is used to peen over the end of the axle by hitting it gently so the end is peened over but the axle does not bend. It is possible to do this stage in a drill press using another nail punch in the drill chuck, but I do not have a drill press at the moment, so have to do this the old school way, with a bit of brute force and ignorance.

\r\n

Picture 002
\r\n\"Picture

\r\n

So we now have all the parts ready for reassembly. The base has the axles and wheels back on, the screen has been polished and the plastic seating given a clean in soapy water and dried, and the body is repainted and ready to go.

\r\n

Picture 003
\r\n\"Picture

\r\n

So being careful not to damage the paint work the casting is placed with the base side up and the window unit is placed into it.

\r\n

Picture 004
\r\n\"Picture

\r\n

Followed by the plastic interior, the eagle eyed among you will notice a colour change to the body work as I forgot to take a picture of this stage on the gold model. You have to ensure that the tab with the tow hitch (yes Matchbox put a tow hitch on a posh car) is fully over the retaining post or the base will not seat properly.

\r\n

Picture 005
\r\n\"Picture

\r\n

The base is then placed back on the model by sliding it over the tab at the front and clicking it down over the rivet post.

\r\n

Picture 006
\r\n\"Picture

\r\n

I then used some \'5 second Fix\' UV glue to glue around the post to hold it in place. You can also drill out the post with a 1.5mm drill and using an M2 tap then use a small M2 screw to hold the base in place, but in this case I was happy with the glue as it was for display and will not be handled frequently enough to require the more secure retention of a screw. With these small models there is a risk of damaging the post while drilling and tapping them so it is personal preference as to the method used to hold it all together at the end.

\r\n

Picture 007
\r\n\"Picture

\r\n

Picture 008
\r\n\"Picture

\r\n

The model is now completed and the final picture in the show notes is a small collection of what it looks like now it is ready to display again.

\r\n

Picture 009
\r\n\"Picture

\r\n

So that is the story of how to restore a Die-cast model back from the dead (well almost). These small models are comparatively easy, but some of the larger scale models with many more parts can take many days to restore, and require a lot of patience to do so. But from small beginnings we all start, and maybe in the future I will feel confident enough to tackle something a little more complicated. I have recently done a few models with opening doors which have a retaining spring holding them in place.

\r\n

So this short story is finished so this is Tony Hughes for Hacker Public Radio, saying goodbye for now, keep safe everyone and I\'ll be back at some time with another show. At the moment I\'m not sure about what, but I will be back, so Ken can rest assured I still owe him a show.

\r\n',338,114,0,'CC-BY-SA','Matchbox Cars, Diecast Models, Restoration, Reassembly of the model',0,0,1), (3137,'2020-08-11','Coronavirus Update 2020-07-30',1364,'Where we are with this pandemic, and how should we respond?','

This is an update to my earlier shows to pull together what we know about the Coronavirus on this date, and what measures we can take. It focuses on the lack of solid information at this point and suggests a prudent course to stay safe. https://www.palain.com/health-topics/coronavirus-update-20200730/

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Coronavirus',0,0,1), (3138,'2020-08-12','Linux Inlaws S01E12: Reminiscing in FLOSS Weekly',5664,'An interview with Randal Schwartz of FLOSS Weekly fame','\r\n\r\n',384,111,1,'CC-BY-SA','Linux inlaws, communism, free and open source software, FLOSS Weekly, Perl, ship cruises',0,0,1), (3200,'2020-11-06','Better Social Media 17 - OcapPub',1125,'How using Object Capabilities within ActivityPub could solve some problems with social media.','

Social media has some problems, and even federated media is not immune to them. OcapPub proposes to help reduce some problems by moving away from a fundamentally broken model revolving around identity and access to a better model involving objects and capabilities. This could help reduce to problems of identity theft, and help against web site problems like clickjacking and Cross-Site Request Forgery. It is a proposal being worked on, not a finished technology, but it is promising.

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, OcapPub',0,0,1), (3139,'2020-08-13','MIDI Sysex',1238,'Klaatu talks about Sysex functions in MIDI','

\r\nThe MIDI spec is available at MIDI.org\r\n

\r\n\r\n

\r\nSysex commands are listed at midi.org/specifications-old/item/table-4-universal-system-exclusive-messages\r\n

\r\n',78,0,0,'CC-BY-SA','midi,music,synth',0,0,1), (3141,'2020-08-17','Lessons learnt from Magic the Gathering game design',2269,'Lessons learnt from Magic the Gathering game design','

\r\nObservations and musings about game design, seen through the lens of MTG.\r\n

\r\n',78,95,0,'CC-BY-SA','magic, mtg',0,0,1), (3142,'2020-08-18','tcsh',1719,'Klaatu talks about tcsh','

\r\nTcsh is a shell. It was popular once, I think. Anyway, I talk about why I sometimes use it, fondly, sometimes.\r\n

',78,0,0,'CC-BY-SA','shell,csh,bash,tcsh',0,0,1), (3210,'2020-11-20','GIMP: Patterns and Gradients',1337,'Patterns and Gradients are useful for drawing with more than just color.','

Patterns and Gradients let you create images that go beyond simple colors and let you create more interesting images. And using them also means we begin to see how to combine a variety of tools, like paint tools, selection tools, and brushes, to create the effects we want in our images.

\r\n

Links:

\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, patterns, gradients',0,0,1), (3220,'2020-12-04','PixelFed',1183,'A look at a federated alternative to Instagram.','

Maybe you want to share some photos with your family and friends. You could use Instagram, but that is part of the Surveillance Capitalist media environment. Fortunately, there is a privacy-respecting federated alternative called PixelFed. This episode is an introduction to that platform.

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, PixelFed, photo sharing',0,0,1), (3143,'2020-08-19','LibreOffice 7.0 Released!',927,'LibreOffice releases a new major update, LibreOffice 7.0','

LibreOffice is the premiere open source office suite, and with the major release of 7.0 continues to move forward. In this episode I look at some of the major features of this upgrade and why it matters.

\r\n

Links

\r\n\r\n',198,70,0,'CC-BY-SA','LibreOffice, new release',0,0,1), (3230,'2020-12-18','Introduction to Layers',1258,'Layers are the most important concept in using GIMP','

Layers are the feature that does most of the heavy lifting in GIMP. In this episode we begin looking at them with an introduction, but we\'ll go deeper!

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, layers',0,0,1), (3146,'2020-08-24','Help Me Help you with HPR eps!',358,'What should I do and how should I do it ?','

A show about shows ?

',36,0,0,'CC-BY-SA','podcasting, hpr',0,0,1), (3155,'2020-09-04','LastPass Security Dashboard',680,'A recent update to LastPass added a Security Dashboard','

LastPass is one of the password managers I use (along with Keepass), and recently they added a Security Dashboard feature to the product. I take a look at this dashboard and review some of the features.

\r\n

Links:

\r\n\r\n',198,74,0,'CC-BY-SA','LastPass, passwords, security, monitoring',0,0,1), (3144,'2020-08-20','Pentesting: Insecure Object Reference',726,'How an insecure object reference lead to a covid-related databreach','

Insecure object reference is a very common bug in online applications which most of the time leads to significant data breaches. In this episode I talk about one such vulnerability I discovered recently in a covid-related application.

',387,74,0,'CC-BY-SA','pentesting,security,hacking',0,0,1), (3145,'2020-08-21','A light bulb moment, part 1',649,'Finding the working voltage of a bulb','

This show came about because of an email from Dave Morriss on the 4th March 2020

\r\n

The upshot of it was that Dave came into possession of an illuminated lantern that he wanted to use. He had a problem however as the lantern in question was sealed and he didn\'t know the working voltage of the bulb within. He asked me if there was a way of working it out.

\r\n

Well first of all before I go any further I should probably say I\'m not a bulb expert, however I set about doing a little investigating. What I was about to discover is that calculating this is not as straightforward as you might think.

\r\n

One thing you might think to do is to use a meter to measure the resistance of the bulb. Even doing this however is fraught with difficulty because measuring the resistance of a cold bulb not at working temperature will give a misleading answer. This is because the resistance of a standard bulb changes with temperature.

\r\n

I can demonstrate this by measuring the resistance of two light bulbs I have lying around the house.

\r\n

One is a clear traditional Bayonet tungsten filament house bulb rated at 40W. I live in the UK so its operating voltage is 240V I used my trusty Fluke 77 Digital Ohmmeter but any meter capable of measuring resistance will do. This bulb at room temperature measured a resistance of 108 ohms

\r\n

The other bulb was a Halogen E14 screw in bulb rated at 28W and its operating voltage like the previous bulb was 240V. Its measured resistance at room temperature was 144 ohms)

\r\n

Diagrams Created using LibreOffice Draw \"Version: 6.0.7.3\"

\r\n

Formulae
\r\n\"Formulae\"

\r\n

Calculations For (tungsten filament bulb)

\r\n
V/R = I (Amps)\r\nso 240V / 108 ohms = 2.2 Amps\r\n\r\nV x I = P (Watts)\r\nso 240V x 2.2 Amps = 528W
\r\n

Calculations For (halogen bulb)

\r\n
V/R = 240V / 144 ohms = 1.7 Amps    (halogen)\r\n\r\nV x I = W\r\nso 240V x 1.7 Amps = 408W
\r\n

As per usual I used google and come up with somebody asking the same sort of question at https://www.candlepowerforums.com/vb/showthread.php?64832-How-to-identify-voltage-of-an-unmarked-bulb yes it seems like there a forum for just about anything you can think of.

\r\n

One person on the forum made the point that there really isn\'t such a thing as a working voltage it just depends on how long you want the bulb to last. For this reason I always turn down the brightness on any car I own that his dimmable dashboard lights changing these bulbs can be a real pain and or can be expensive.

\r\n

Sometimes the stated working voltage for a bulb can be misleading for example a car bulb will often state a working voltage of 12V but is likely to be running at a higher voltage when the engine is running due to the operation of cars alternator.

\r\n

Another person suggested trying to estimate the length of the filament and using this to determine the working voltage.

\r\n

Yet somebody else suggested just using a variable supply and to just slowly increase the voltage until a reasonable amount of light is generated. This might be quite simple if it\'s a low voltage bulb and you could even use some batteries lying around connecting them in series adding one battery at a time until the required brightness is achieved.

\r\n

It isn\'t so simple if bulb requires a higher voltage.

\r\n

In the end I just passed this information onto Dave wishing him luck in his path to discovering the optimal working voltage for his lantern.

\r\n

Feel free to write a comment if any of you out there have any other idea on finding the working voltage of a bulb this way it can be shared with the rest of us during the Community News, better still send in your own show.

\r\n',201,0,1,'CC-BY-SA','Hardware, electrical',0,0,1), (3147,'2020-08-25','NIST\'s Quantum Cryptography Update',825,'NIST has concluded Round Two of the quantum encryption search and moved to Round Three','

NIST initiated a competition to find and test algorithms for quantum encryption that would resist quantum decryption back in December of 2016. Two rounds of testing have been completed, and an initial group of 69 submissions have been winnowed to 15. These 15 are now in Round Three of the testing process, and it is anticipated that as many as 4 of them will be approved as standards. This news update is intended to bring you up to date on the process.

\r\n

Links:

\r\n\r\n',198,74,0,'CC-BY-SA','security, encryption, quantum computing',0,0,1), (3148,'2020-08-26','Why Open Source matters (to me)',1612,'I go briefly into my own history that has lead me to choose open source software exclusively.','

My original website: https://psquirk.tripod.com

',383,0,0,'CC-BY-SA','history,open source,matters,vic 20,amiga,commodore',0,0,1), (3151,'2020-08-31','How I listen to podcasts',393,'This is a reply to MrX episode on how to listen to podcasts','

In this episode I talk about the program I use to listen to podcasts.

\r\n

BeyondPod which has a smart play feature where you can decide how to listen, in what order and how much of each podcast.

',382,0,0,'CC-BY-SA','podcast,software,android',0,0,1), (3152,'2020-09-01','My Pocket Knives',870,'I talk a little about some pocket knives I often carry','

Introduction

\r\n

As a boy I was allowed to have a penknife from about the age of 10. Since then I have tended to carry pocket knives with me on a regular basis.

\r\n

I have three knives that often travel with me, though two might have become illegal in the UK in the recent past because they lock.

\r\n

The knives are:

\r\n\r\n

Long notes

\r\n

I have provided detailed notes as usual for this episode, and these can be viewed here.

\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','knife,pocket knife,penknife,Victorinox,Durol,Roxon',0,0,1), (3153,'2020-09-02','Fixing eBooks with Calibre and pdfcrop',308,'Ken uses Calibre to convert a epub to PDF then uses pdfcrop to trim the margins','
\r\npdfcrop --margins \'-4 -4 -4 -5\' --clip input.pdf output.pdf\r\n
\r\n\r\n

\r\ncalibre is a powerful and easy to use e-book manager. Users say it’s outstanding and a must-have. It’ll allow you to do nearly everything and it takes things a step beyond normal e-book software. It’s also completely free and open source and great for both casual users and computer experts. \r\n

\r\n

\r\nPDFCrop is a Perl script that crops the white margins of PDF pages and rescales them to fit a standard size sheet of paper. It makes the printed pages far more attractive to read! \r\n

\r\n

Links

\r\n',30,0,0,'CC-BY-SA','calibre,pdfcrop,epub,pdf',0,0,1), (3154,'2020-09-03','Make NextCloud your next cloud',771,'I go into my reasons for using NextCloud, what it is, and why you might want it.','

My federated address is @paul@cloud.pquirk.com

',383,0,0,'CC-BY-SA','Raspberry Pi,NextCloud,federated',0,0,1), (3157,'2020-09-08','Compost',2583,'How and why to compost','

\r\n How to compost food scraps to produce nutrient-rich soil. It's natural!\r\n

',78,93,0,'CC-BY-SA','food, rubbish, landfill, gardening',0,0,1), (3159,'2020-09-10','Vivaldi - The Four Seasons',2703,'All four movements of Vivaldi\'s Four Seasons, celebrating the Creative Commons license','

\r\nAntonio Vivaldi composed The Four Seasons (\'Le quattro stagioni\' in its original Italian) in 1723. It is a set of 4 violin concertos that propose an early form of descriptive music: for example, Winter makes prominent use of pizzicato notes in high registers, whereas Summer evokes a storm in its final movement. The work was first presented as part of Op. 8, being later catalogued as RV 269, 315, 293 & 297. The Four Seasons remain very popular to this day, some of its concertos spawning a great number of derivative works, whereas thousands of recordings of the original pieces have been made. It is still debated if Vivaldi wrote this concertos to accompany four sonnets that may have been written by himself.
\r\nFrom Vivaldi The Four Seasons, Op. 8\r\n

\r\n\r\n

\r\nThe Modena Chamber Orchestra Music\r\n

',383,22,0,'CC-BY-SA','Vivaldi, four seasons, creative commons',0,0,1), (3158,'2020-09-09','Fingerprint access control? LOL... ',1201,'A story about pentesting physical security','

Hello everyone, my name is Cedric and I\'m here again with another story on pentesting and security, straight from the trenches.

\r\n

Today I\'m going to share a story with you about an assignment we did some time ago for a large entertainment company. Our client, like many entertainment companies, produces a lot of intellectual property. So, one of their biggest concerns is that someone might physically break into their premises and steal some of these designs and products. They had already taken some precautions, like installing intrusion detection alarms and access controls on all doors etc\' The access controls they installed even had a dual function and could be used both as an RFID reader and as a fingerprint reader. So, they were already trying their best to secure their on-site intellectual property. And that\'s also the reason why they hired me and my team: they wanted to check if their investment in security was actually worth its money so far.

\r\n

We proposed a plan to hack them, in any way our devious minds could possibly think of. Everything was on the table: We could try and hack ourselves in. We could social engineer ourselves in, basically by manipulating people and abusing their trust and confidence. We could do all of that, and we would, eventually. But first, the grand opening of this show, would be an attempt to physically break into their premises at night. And yes, that was as much fun as it sounds ;-)

\r\n

Our approach was basically the same as that of a professional burglar: we\'d start with a week of preparation and scoping the place.

\r\n

So how do you do this? Well, we knew the address of course so first we checked out the place on Google Maps. And we were pretty lucky: Google had just recently updated their imagery of the area which meant we had recent maps to work with and the entire thing could be viewed in 3D with a fair amount of detail. That\'s pretty much as perfect as it comes when you\'re planning to do a major heist on a place in the physical world out there :-) So, we started with scouting the area from behind our laptops. We saw where all the entrances to the building were. We also saw that on the frontside the building just gave access to the street, while on the backside of the premise there was a public park. This looked very promising as a potential entrypoint, so our next step would be to actually physically go there and scout the area.

\r\n

So, first we went there during daylight hours and just took a drive around the block using a rental car. We\'d look for entrances to the building, camera\'s guarding these and the general view of the area, basic things… We didn\'t spot any cameras on the outside of the building. So we figured it would be pretty safe to take a walk and scout the area by foot. There was foot traffic but not too much, so we wouldn\'t draw any attention by just casually walking around and having a closer look.

\r\n

The main entrance to the building was in a quiet street which led to a small square where a few kids were playing, and on the other side there was a street with some shops and a few restaurants. The entrance to our clients building had a gate through which we could see a quiet courtyard and the general layout of the building. The first thing that drew our attention was an access control device guarding the entrance, it was a fingerprint reader and it had a brand name Suprema printed on it. Straight across the courtyard we could see the trees of the neighboring park. There was a rooftop terrace on the first floor which gave access to the offices of our client. We also noticed the wall that separated this terrace from the park and it was huge, at least 6 meters.

\r\n

We couldn\'t hang around for too long of course so we decided to continue our walk to the second entrance we spotted just around the corner. We could recognise its anonymous door next to a restaurant because it was guarded by the same Suprema fingerprint device. The restaurant however seemed quite popular, and it had a terras in front of it with a dozen tables, so that pretty much dismissed this entrance as a possible entry for our heist.

\r\n

Needless to say that while we walked around the block we were also continuously scanning the area for Wifi and bluetooth devices. But nothing interesting had shown up so far. We had spotted our clients network but it was protected. We probably could use this information to set up rogue access-points later during our assignment, but for now this information was of little use to us.

\r\n

We continued our walk and took a left to end up at the park bordering to the other side of our clients building. While the park was empty at that moment, we didn\'t really feel at ease. On one side the park bordered an apartment building and all of its rear terrasses faced this park. We went to the wall at the far end of the park as casually as possible, and inspected it. It had two large windows, giving the people working in the offices on the inside a nice view of the park. Unfortunately these windows didn\'t seem to have any way of opening. The wall was high, very high, we estimated about 8 meters. On the other side it would give access to the terrace on the first floor. We figured that this would be the perfect entrypoint for our heist. We\'d use the cover of darkness to get a ladder across the park, under the trees against that wall. I\'d climb over it to land on the terrace and that would be our first step onto the premise. Next step would be to find a way into the building and for that we\'d have to find a way to bypass these Suprema fingerprint readers next to every door.

\r\n

So we went back to our hackerspace and researched this device and we figured the best way to move forward would be to actually buy one of these to first try and hack it in the safety of our lab. So I spent a fair amount of time researching the exact model they had installed and ordering one from a local supplier. The thing came at a hefty price, these Suprema devices are not cheap. But now I had an electronic lock, a relay board, a power supply and one of these fingerprint readers with which I could start playing.

\r\n

I started off with reading the manual of course, which already was very interesting on its own. I learned that this thing can be configured in a zillion ways. I figured that, like most things, the guys that installed it would probably stick pretty close to how it came out of the box. So that\'s what I did as well: I installed the thing exactly as it came, following the instructions in the manual.

\r\n

I\'ll give you the summary of this entire installation. Electronic locks are pretty simple technology. Basically it\'s just an electro-magnet, a coil through which you send current to create a magnetic field that pulls a bolt out of the way so the lock can open, that\'s when it makes the clicking sound. Inside of the building, the receptionist can just press a button and a current will flow to the lock. However, on the outside of the building it wouldn\'t be very desirable that anyone can just press a button to open the door. That\'s why most companies implement access controls like RFID-readers or in this case fingerprint readers. A visitor scans his fingerprint with the device next to the door, the software checks if it finds the signature of the print in the database holding all recognized prints, and if so it will open the door.

\r\n

So if we\'d want to bypass this scheme, we\'d basically have two options: hack the device to open the lock, or duplicate a registered fingerprint to fool the scanner and open the lock. Research had shown that this last option wasn\'t actually so far fetched. It\'s actually a proven feasible attack, last DEFCON even demonstrated an attack where a print was copied in 3D using a 3D printer. The technique we would try involved etching the negative of a high-contrast image from a lifted latent print onto a copper plate. Next we\'d pour hot glue over that etch to actually recreate the fingerprint in 3D. However, this procedure requires some practice and skills, and we didn\'t have time for that. We tried it using our own prints lifted from a glass plate, following the procedure as best as we could but we failed miserably. So, this would not be an option and we already spent a fair amount of time.

\r\n

So by now it had become clear we would have to hack the device. And as it was laying there in front of me on my desk, basically running the default setup with just my own print registered in the software, it became obvious that I had missed a crucial error in the design the entire time. I had never actually bothered to install this thing \"properly\" like mounted to a board with its cables fitted nicely behind a wall etc. The entire thing was just laying there, in front of me on my desk and all the cables really were a mess, but most importantly: the software wasn\'t showing any warnings whatsoever that the device was not mounted to a wall. I investigated the manual and I learned that the thing has something called a \"tamper alarm\". But this must have been disabled by default because I never had any alarms while the device was just laying there and was continuously shaking and moving it. So this meant that I could probably just pull this thing from a wall without any alarms going off.

\r\n

I had to validate this premise first before we could continue. If this turned out to be a false assumption we\'d waste valuable time investigating a plan which would probably fail in the end. So the following night I set out again to our clients building. It was like 3:30 in the morning and there was nobody on the streets. We already validated that there were no cameras pointing to the entrance, still I didn\'t feel too confident. My plan was simple but solid: I\'d unscrew the fingerprint reader at the main entrance and put it back in place after 30seconds. I\'d then walk to the little square at the end of the street and sit on the bench there so I would have a clear view of our clients entrance. I figured that, if the tamper alarm was enabled, and if they had someone monitoring it, they would probably come and check the device causing the alarm. I\'d be interested in their response time of course, but most of all I was just hoping nobody would show up. And that\'s also what happened. I waited for 2 whole hours on that bench and nobody showed up, so I concluded the tamper alarm must have been disabled as is the default setting on these things, or nobody is monitoring it. Anyway, now I knew I could safely start tinkering on how I could manipulate this thing into letting me.

\r\n

So the next day after I had a few hours of sleep we went back to work, playing with that Suprema BioLite and its software. I was in a good mood and had lots of inspiration. We started with investigating the general architecture of this access control scheme. So it turns out you have a client device, the scanner which is next to the door and this client device gets a database of recognized fingerprints from a control server which holds a list of all connected devices. So it\'s on this server where you register new doors and locks and new users that can open these locks. Now, when I installed the setup to experiment with, I learned that I had to register the lock into the control server before I could actually do anything, so I followed that entire procedure but unless I was missing something I didn\'t notice any real checks to be in place during that registration. So what I was thinking was: maybe I can disconnect this device from its network and the control server and reconnect it to my own server. Then I could upload my own prints to the device and then I\'d be able to open the door with my own finger. So that\'s what I tried. I had the entire setup running in my own network, so I re-installed the software once again on my laptop. I then registered another print of mine into this installation. Next I disconnected the device from my network and connected it to a new temporary network running on my laptop: I had it running DHCP and I had a little USB-powered ethernet switch laying around which came in handy for this job. So the device quickly got an ip address from my new network and when I scanned for new fingerprint devices in my network using the Suprema control server that was installed on my laptop, I easily found it and was able to register it in this installation. I then was able to upload a copy of my fingerprints from my laptop to the device and after reconnecting it to the original network I could still open the lock with my newly registered print. So this meant we had our hack to bypass this device: we\'d just upload our own set of prints to it and it would happily accept these and open the door for us.

\r\n

So we hired a van and a ladder, and with some action cameras geared up we set out in the middle of the following night. We managed to get the ladder across the park and put it against the wall without making too much noise, we didn\'t wake up any curious neighbours. Next, I\'d climb up the ladder, but since it was only 6m and the wall was about 8m high I\'d have to climb the last bit by hand. Fortunately there was some vegetation growing on that wall and it felt like it would be strong enough to hold my weight. So, I gave it a try and pulled myself up from the ladder and the vines fortunately didn\'t break, so I climbed to the top of the wall and hoisted myself on top of it. I jumped off on the other side and landed on the first floor terrace we saw earlier. I went straight to the door and as expected it had one of these Suprema fingerprint readers next to it and I immediately went to work: I unscrewed the device from its mounting bracket and pulled the cables a bit from the wall. I then cut all the wires of the UTP-connection and connected a female RJ-45 socket to the UTP-wires of the fingerprint reader with crocodile clips. Next I hooked it up to my usb-powered switch which connected the device to the network running on my laptop. As I had tested everything in detail, the attack went smooth as a breeze and within no time I had my own fingerprint loaded into the device. I tested it and I could hear the lock of the door clicking while I put my finger onto the reader, so I started screwing the device back into the mounting bracket.

\r\n

Everything went exactly as planned and I had just put my laptop and all my gear into my backpack again when suddenly I saw the lights go on through the glass door separating me from the inside of the top floor. I could see the elevator doors open and suddenly there I was, standing face to face with a janitor. I could see his face and he could see me so I tried to pull myself together, I had to think quickly. I figured he would let me in, or call the cops and I would probably only get one chance to explain myself. So I pulled my silly face, pointed with a finger to the access control, shrugged my shoulders and lipped slowly \"it\'s not working\". Well, I must have been an actor in a previous life because, sure thing the man came up to the door and opened up for me. While I entered and said a quick \"hey thanks man\", he looked a bit questioning and mumbled something of \"who are you and what are you doing here?\" and as casual as I could I answered \"Oh I\'m from IT, I\'m here for work\". I smiled, thanked him once again while I stepped into the elevator and pressed the button for the ground floor. I was in! My heart was pounding like a racehorse but I was in! This stuff was like straight from the movies.

\r\n

Now it was time for the fun part of the night: claiming our flag of victory. First I went to the director\'s office, to leave a friendly signature of my presence: I left a bottle of champagne on his desk and I decorated the place with some CYBER-tape :-) On my way out I left a little present in the form of a LAN Turtle 3G. That\'s a 3G-enabled remote access toolkit with a network-connection which I hooked up with an empty socket underneath the receptionist\'s desk. The LAN Turtle would immediately boot and using its 3G connection it established a reverse tunnel using SSH to our command-and-control server. Using that covert connection we now had a way into the network from the outside. Installing it only took about 15 seconds and after having confirmed tunnel using a shell on my phone I went straight to the front-door and left the place. Mission accomplished! We had successfully penetrated the place.

\r\n

I went to bed with a very big smile on my face early in the morning that day. By Noon I got up after a few hours of sleep and called our clients. They thanked us for the champagne and I gave them the gist of what had happened earlier that day while everyone else was still in bed sleeping.

\r\n

The following weeks we would continue with our assignment and use our newly granted access into the place to go there physically during daytime hours, posing as an external developer. Eventually we gained full access to the entire place, including their on-premise datacenter holding their intellectual property, the crown jewels as to speak. Apparently, the access control-server was still protected with the default credentials admin/admin so I had pretty easy time expanding my initial foothold.

\r\n

At the end of our assignment we presented all of our findings to our client and they immediately took appropriate action, including making sure tampering control got enabled on all of their access control devices. And I for my part had learned a whole lot of new fun stuff about access control devices and the possible flaws they can hold.

\r\n

So, this was yet another story on pentesting and security. I hope you enjoyed this episode. If you\'d like to reach out to me, please use the comment section on Hacker Public Radio or contact me on Twitter or Facebook. See you next time!

\r\n',387,74,0,'CC-BY-SA','pentesting,security,hacking,biometrics',0,0,1), (3161,'2020-09-14','How I manage podcast listening',1192,'Another reply to MrX\'s episode on how he listens to podcasts','

Introduction

\r\n

I have spoken in the past about the podcast management system I have created, but have never gone into much detail about how I manage the playing of episodes.

\r\n

Prompted by MrX’s HPR episode hpr3132, “Keeping track of where I am” I will describe it now.

\r\n

Long notes

\r\n

Follow this link to read the detailed notes associated with this episode.

\r\n

Links

\r\n\r\n',225,0,1,'CC-BY-SA','podcast,software,mp3 player,database',0,0,1), (3164,'2020-09-17','I\'m Learning Spanish',989,'How I am using a variety of tools to learn Spanish','

I decided to use my time spent in relative isolation to do something productive and learn another language. I picked Spanish because I am hoping to visit Mexico and other Latin American countries whenever the plague lifts. I decided to document this for anyone who wants to know what options I found and how they have worked for me so far.

\r\n\r\n',198,116,0,'CC-BY-SA','Spanish, Language learning',0,0,1), (3165,'2020-09-18','Spanish Tools Continued',830,'Part two of how I am using a variety of tools to learn Spanish','

I decided to use my time spent in relative isolation to do something productive and learn another language. I picked Spanish because I am hoping to visit Mexico and other Latin American countries whenever the plague lifts. I decided to document this for anyone who wants to know what options I found and how they have worked for me so far. This is the second part of my tools exploration.

\r\n\r\n',198,116,0,'CC-BY-SA','Spanish, Language learning',0,0,1), (3175,'2020-10-02','International Keyboard',681,'How I learned to implement a keyboard that lets me type in Spanish','

I decided to use my time spent in relative isolation to do something productive and learn another language. I picked Spanish because I am hoping to visit Mexico and other Latin American countries whenever the plague lifts. I decided to document this for anyone who wants to know what options I found and how they have worked for me so far. This is the third part where I explain how I implemented the US International Keyboard on a variety of platforms. This lets me type characters that Spanish uses which do not appear on a standard US English keyboard. And best of all, it a purely free software fix.

\r\n\r\n',198,116,0,'CC-BY-SA','Spanish, Language learning, typing foreign characters',0,0,1), (3456,'2021-11-01','HPR Community News for October 2021',4849,'HPR Volunteers talk about shows released and comments posted in October 2021','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n hakerdefo.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3435Fri2021-10-01Hacking Stories with Reacted: part 5operat0r
3436Mon2021-10-04HPR Community News for September 2021HPR Volunteers
3437Tue2021-10-05The HTML document formatDaniel Persson
3438Wed2021-10-06Ten privacy friendly Google search alternatives.hakerdefo
3439Thu2021-10-07Linux Inlaws S01E40: The One with the BSDsmonochromec
3440Fri2021-10-08Lighten Layer ModesAhuka
3441Mon2021-10-11Murphy Work Benchoperat0r
3442Tue2021-10-12What is this thing called scienceklaatu
3443Wed2021-10-13Neuton battery replacementRho`n
3444Thu2021-10-14The Psion series 5mxNihilazo
3445Fri2021-10-15True critical thinking seems to be the keyDave Morriss
3446Mon2021-10-18Speech To Textoperat0r
3447Tue2021-10-19BlacKernel\'s Journey Into Technology: Episode 2BlacKernel
3448Wed2021-10-20Installing GuixSDRho`n
3449Thu2021-10-21Linux Inlaws S01E41: The Halloween Documentsmonochromec
3450Fri2021-10-22Internal CommandsAhuka
3451Mon2021-10-25Bricklinkoperat0r
3452Tue2021-10-26Neuton battery testRho`n
3453Wed2021-10-27Rust 101: Episode 1 - Hello, World!BlacKernel
3454Thu2021-10-28Engineering NotationKen Fallon
3455Fri2021-10-29Podcast Recommendation: IBM and Quantum computingArcher72
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 38 comments in total.

\n

Past shows

\n

There are 16 comments on\n7 previous shows:

\n\n

This month\'s shows

\n

There are 22 comments on 7 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-October/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Older HPR shows on archive.org

\n

This month 70 additional shows in the range 1-870 have been uploaded.

\n

Tags and Summaries

\n

Thanks to the following contributors for sending in updates in the past month:
\nArcher72, Rho`n

\n

Over the period tags and/or summaries have been added to 38 shows which were without them.

\n

----------------------------------------
\nHooray! There are now no more shows that need summaries or tags!

\n

Thanks to all of the contributors to this project. According to my records the people who have helped to get to this point are listed below. Apologies if I have omitted anyone from the list:
\nAhuka
archer72
bjb
ClaudioM
crvs
Daniel Persson
Dave Morriss
Ken Fallon
Kirk Reiser
NYbill
Rho`n
Tony Hughes
Windigo

\n

----------------------------------------
\n

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3481,'2021-12-06','HPR Community News for November 2021',5638,'HPR Volunteers talk about shows released and comments posted in November 2021','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n one_of_spoons, \n dnt.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3456Mon2021-11-01HPR Community News for October 2021HPR Volunteers
3457Tue2021-11-02Tablesklaatu
3458Wed2021-11-03Living in the Terminal 2: The Obligatory SequelBlacKernel
3459Thu2021-11-04Linux Inlaws S01E42: The Open Source Initiativemonochromec
3460Fri2021-11-05Dodge and BurnAhuka
3461Mon2021-11-08Changes to HPR BrandingHPR Volunteers
3462Tue2021-11-09Metal marbles.one_of_spoons
3463Wed2021-11-10Clonezilla: A backup storyRho`n
3464Thu2021-11-11Being irrationalAndrew Conway
3465Fri2021-11-12Walmart Onn 7 inch tablet gen 2JWP
3466Mon2021-11-15Why HPR has less downloadsJWP
3467Tue2021-11-16Protonmail in the terminaldnt
3468Wed2021-11-17Distro upgrade intervals on my Raspberry PiMrX
3469Thu2021-11-18Linux Inlaws S01E43: The Great Battle or notmonochromec
3470Fri2021-11-19External Commands and Emergency Boot DiskAhuka
3471Mon2021-11-22The Sony Walkman WM-F41Jon Kulp
3472Tue2021-11-23consuming an AQI APIJezra
3473Wed2021-11-24My journey into Amateur Radiothelovebug
3474Thu2021-11-25H P R and Audio Funoperat0r
3475Fri2021-11-26How I Watch Everything Using Open Source Softwareminnix
3476Mon2021-11-29My mutt email setupArcher72
3477Tue2021-11-30Picking a ForthBrian in Ohio
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 20 comments in total.

\n

Past shows

\n

There are 5 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 15 comments on 11 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-November/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n\n

In the upload form there is the option to provide shows via a URL. This must be a publicly available URL that is accessible without authentication via command line tools like wget or curl.

\n

Older HPR shows on archive.org

\n

This month 115 additional shows in the range 1-870 have been uploaded.

\n

The number of shows left to upload in this range is now: 369.

\n

Tags and Summaries

\n

Hooray! There are now no more shows that need summaries or tags!

\n

See the notes for episode 3456 for a list of all the contributors to this project

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3162,'2020-09-15','Introduction to Ansible',2674,'Klaatu demonstrates some Ansible tricks, and how Ansible can be a better choice than scripting.','

\r\nIntroduction to Ansible.\r\n

',78,0,0,'CC-BY-SA','ansible,sysadmin',0,0,1), (3163,'2020-09-16','Linux Inlaws S01E13: The road to communism and freedom',3855,'Our old heroes discuss their legacy and how they arrived at open source software and communism','',384,111,1,'CC-BY-SA','open source, communism, escort services, freedom, Mach, VMS, accounts',0,0,1), (3166,'2020-09-21','Using Ansible to mirror a Git repo',1580,'Klaatu uses Ansible to mirror a Git repo on two separate Git hosts','

\r\nI came up with a way to easily clone a repo living on Github and mirror it, with all the latest commits, on another Git host. You can schedule Ansible to run periodically to ensure your mirror stays updated.\r\n

\r\n\r\n

\r\nThis is Dwayne Lee's improved implementation based on my original script.\r\n

',78,0,0,'CC-BY-SA','ansible,sysadmin,git',0,0,1), (3169,'2020-09-24','Ludwig van Beethoven with a hint of Chopin',2518,'A fine treat to satisfy your earholes.','

All music in this episode is freely available from musopen.org.

\r\n\r\n

Links

\r\n\r\n\r\n',383,22,0,'CC-BY-SA','Ludwig Van Beethoven,Fredrick Chopin,classical,energetic,music,public domain',0,0,1), (3167,'2020-09-22','A ramble with the Pentland Squires (part 1)',2547,'MrX and Dave Morriss chat from opposite sides of the Pentland Hills, Edinburgh','

Introduction

\r\n

Once again the two HPR hosts based in Edinburgh got together over Mumble to have a chat during the COVID-19 pandemic.

\r\n\r\n

We recorded this conversation in the evening of Sunday 23rd August 2020.

\r\n

The audio was quite long when we’d finished, so we decided to cut it into two similar-length pieces and the remainder is released as a second episode.

\r\n

Show title

\r\n

Although a explaining a joke can often destroy it, it’s probably worth saying that the title of this show was derived from the name of a variety of potato, Pentland Squire, and the fact that the two participants were separated by the Pentland Hills in Edinburgh! \"Where was the joke?\" you ask…

\r\n

Notes

\r\n

Some of the topics we discussed:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n',225,0,1,'CC-BY-SA','COVID-19,physical isolation,discussion',0,0,1), (3168,'2020-09-23','FreeBSD Jails and iocage',531,'Use iocage to manage freebsd jails','

FreeBSD Jails with iocage

\r\n

Introduction

\r\n

FreeBSD jails allow users to run multiple, isolated instances of FreeBSD on a single server. Iocage simplifies the management of FreeBSD Jails.

\r\n

https://en.wikipedia.org/wiki/OS-level_virtualization

\r\n

The jails will be configured to bind to an IP address on the jail host\'s internal network. The host OS will pass traffic from the external network to the jail.

\r\n

The jails will be managed with Iocage. Iocage uses ZFS properties to store configuration data for each jail, so a ZFS file system is required.

\r\n

Network setup

\r\n

These steps will:

\r\n
    \r\n
  1. Set up the internal network.
  2. \r\n
  3. Enable the pf packet filter
  4. \r\n
  5. Configure pf pass internet traffic to and from the jail.
  6. \r\n
\r\n

PF is full featured firewall, and can do more than just pass traffic to an internal network. Refer to the PF documentation for additional configuration options.

\r\n

Run the following to configure the internal network and enable pf.

\r\n
sysrc cloned_interfaces+="lo1"\r\nsysrc ifconfig_lo1="inet 192.0.2.1/24"\r\nsysrc pf_enable="YES"\r\n
\r\n

Put the following in /etc/pf.conf

\r\n
# Variables\r\n# ext_if should be set to the hosts external NIC\r\next_if = "vtnet0"\r\njail_if = "lo1"\r\njail_net = $jail_if:network\r\n\r\n# NAT allows the jails to access the external network\r\nnat on $ext_if from $jail_net to any -> ($ext_if)\r\n\r\n# Redirect traffic on port 80 to the web server jail\r\n# Add similar rules for additional jails\r\nrdr pass on $ext_if inet proto tcp to port 80 -> 192.0.2.10\r\n
\r\n

Reboot to activate the network changes

\r\n

ZFS

\r\n

The best way to use ZFS on a VPS is to attach block storage as a new disk.

\r\n

If block storage is not available, you can optionally use a file as the ZFS device.

\r\n

Enable and start ZFS.

\r\n
sysrc zfs_enable="YES"\r\nservice zfs start\r\n
\r\n

ZFS using Block storage

\r\n

List the available disks. If you are using a VPS, the block store will probably be the second disk.

\r\n
geom disk list\r\n
\r\n

Create a ZFS pool named jailstore.

\r\n
zpool create jailstore  /dev/vtbd1\r\n
\r\n

ZFS using a file

\r\n

Create the ZFS file.

\r\n
dd if=/dev/zero of=/zfsfile bs=1M count=4096\r\n
\r\n

Create a ZFS pool named jailstore.

\r\n
zpool create jailstore /zfsfile\r\n
\r\n

Install iocage

\r\n
pkg install py36-iocage\r\n
\r\n

Using iocage

\r\n
iocage activate jailstore\r\niocage fetch\r\n\r\niocage create -n www ip4_addr="lo1|192.0.2.10/24" -r 11.1-RELEASE\r\niocage start www\r\niocage console www\r\n
\r\n

Once you have a shell inside the jail, install and start Apache.

\r\n
pkg install apache24\r\nsysrc apache24_enable="yes"\r\nservice apache24 start\r\n
\r\n

Port 80 on the jail will now be accessible on the hosts IP address.

\r\n

Multiple jails.

\r\n

Additional jails can be installed using the example above.

\r\n
    \r\n
  1. Install the new jail with the iocage create command , but use a different IP address
  2. \r\n
  3. Expose the new jail to the network by adding additional rules to pf.conf.
  4. \r\n
\r\n

Book recommendation

\r\n\r\n',342,0,0,'CC-BY-SA','BSD',0,0,1), (3172,'2020-09-29','A ramble with the Pentland Squires (part 2)',2983,'Second half of the chat between MrX and Dave Morriss','

The two HPR hosts based in Edinburgh got together over Mumble on the evening of Sunday 23rd August 2020 to have a chat during the COVID-19 pandemic.

\r\n\r\n

This is the second half of the conversation. For the first part see HPR show 3167.

\r\n

Notes

\r\n

Some of the topics we discussed:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n',225,0,1,'CC-BY-SA','COVID-19,physical isolation,discussion',0,0,1), (3240,'2021-01-01','Linux Under Attack',978,'A look at how malware is now targeting Linux, especially servers','

At one time most malware targeted Windows because it was the most popular OS, but as Linux has risen in popularity, particularly in the data center, it has become a target. We look at some of the recent attacks on Linux, and note some common features of the attacks. This then suggests some ways we can protect ourselves

\r\n

Links:

\r\n\r\n',198,74,0,'CC-BY-SA','Linux, malware, ssh',0,0,1), (3174,'2020-10-01','Linux Inlaws S01E14: The big programming language panel',3174,'Our heroes host an eclectic panel of experts discussion C(++), Python and Rust. ','
Shownotes:
\r\n\r\n',384,111,1,'CC-BY-SA','C++, Python, Rust, Rainbow Escorts, Halloween',0,0,1), (3185,'2020-10-16','Pandemics In History',1062,'Infectious disease is one of the most important factors influencing human history','

This is a look at how infectious diseases have changed the course of human history. It is admittedly a bit Euro- or Western-centric since that is what I know best. But I think the point of its importance applies more broadly.

\r\n\r\n',198,100,0,'CC-BY-SA','Health, Infectious Disease, History, Pandemics',0,0,1), (3171,'2020-09-28','A Week On Soylent',735,'Lostnbronx tries eating nothing but Soylent, so you don\'t have to.','

I bought - and ate - a jar of Soylent, which is a powdered food replacement product. These are my thoughts.

\r\n',107,0,0,'CC-BY-SA','soylent, food, health, diet, lostnbronx',0,0,1), (3173,'2020-09-30','Manage your Raspberry Pi fleet with Ansible',1209,'A solution to the problem of updating difficult-to-reach Raspberry Pis in the enterprise.','

\r\nThis is the final show in the miniseries on how to manage your RaspberryPis with ansible. The goal is to produce a common base Raspberry Pi OS image that doesn\'t change often but, once it\'s installed, can automatically be customized, maintained, and managed remotely.\r\n

\r\n

\r\nWe will create the base image using the script fix-ssh-on-pi which is available on GitHub. \r\n

\r\n

\r\nThen we will identify the hosts on the network with tips from operat0r in show hpr3090 :: Locating Computers on a Enterprise Network, or for simpler networks from my own show hpr3052 :: Locating computers on a network.\r\n

\r\n

\r\nFinally we will provision the devices using tips from hpr3080 :: Ansible ping, and hpr3162 :: Introduction to Ansible \r\n

\r\n

\r\nThis show has been been simultaneously published as an article on opensource.com.\r\n

\r\n\r\n

Links

\r\n',30,0,0,'CC-BY-SA','raspberrypi, Raspbian, ansible, opensource.com',0,0,1), (3250,'2021-01-15','GIMP: Getting Started With Layers',952,'Mastering the basic tools of Layers in GIMP','

Layers are the feature that does most of the heavy lifting in GIMP. After our previous introduction, we start to get hands-on with the controls that let us work with Layers

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, images, photos, graphics, layers',0,0,1), (3260,'2021-01-29','Free, Public Domain and Creative Commons Assets',1289,'Using images and fonts that are not restricted','

In preparation for doing some sample exercises I wanted to first explain about how you can use images and fonts that are not restricted or are available under license terms that are not too restrictive. Any image that is intended for public display or for commercial purposes could be liable for copyright infringement if care is not taken. Fortunately, there are many resources available that you can use, and we look at some of the better ones.

\r\n

Links:

\r\n',198,113,0,'CC-BY-SA','Public Domain, Creative Commons, copyright, images, fonts',0,0,1), (3177,'2020-10-06','Zero cost VPN',407,'OpenVPN on a Free Tier VPS for securing phone trafic ','

A basic overview of the VPN I use

\r\n\r\n

There are a few options for the Linux server. Free tier cloud providers

\r\n\r\n

VPS with Free credits ($20-$100) for new accounts I\'ve gotten discount codes from podcasts

\r\n\r\n

VPS requirements for running a OpenVPN server are pretty are basic

\r\n\r\n

The openvpn installer is on GitHub. https://github.com/angristan/openvpn-install

\r\n

On the server as root, run

\r\n
git clone https://github.com/angristan/openvpn-install.git\r\n/openvpn-install/openvpn-install.sh\r\n
\r\n',342,0,0,'CC-BY-SA','VPN, OpenVPN',0,0,1), (3270,'2021-02-12','An Example of Using Layers',900,'Creating a new header image for my WordPress site using Layers in GIMP','

There is a point where you need to stop being abstract and start demonstrating what you are talking about, so I thought this was a good opportunity to put some things into practice by creating an image. I chose to do a header image for my site Ahuka Communications that would more accurately reflect the content. This lets us use freely licensed images, an OFL-licensed font, layers, and various tools. Note that you can download all of this stuff from my site.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layers, WordPress',0,0,1), (3178,'2020-10-07','Finishing the Recumbent Bicycle',259,'While channeling Stephen Hawking, Brian in Ohio describes finishing and riding the bike','

Websites:

\r\n\r\n

Gallery:

\r\n

1 - Bending Tools
\r\n\"1

\r\n

This is how I clamped up the conduit bending tool in the trusty workmate. In this configuration you can bend the tube to specific angles and make sure the bends stay in plane. The goal here is to create two side rails that are identical. The seat webbing is sewn on to these rails.

\r\n

2 - Needed weights
\r\n\"2

\r\n

This photo shows some more of how the bending jig was set up. Those are counter weights needed to keep the jig on the ground while the tube is being bent.

\r\n

3 - Seat rail plans
\r\n\"3

\r\n

Mr. Carson provides pdf files that you can print out to be used as templates to match your bends.

\r\n

4 - Marking tubes
\r\n\"4

\r\n

5 - Sighting down tube
\r\n\"5

\r\n

6 - Using marks
\r\n\"6

\r\n

7 - Help with angles
\r\n\"7

\r\n

8 - Matching to plans
\r\n\"8

\r\n

Pictures 4-8 show the layout of the tubes and how the marks are used to ensure you make mirror image rails for the seat.

\r\n

9 - Matching sides
\r\n\"9

\r\n

10 - Seat backs
\r\n\"10

\r\n

11 - Drilling fish mouths
\r\n\"11

\r\n

12 - Seat backs ready for trimming
\r\n\"12

\r\n

13 - Finished seat backs
\r\n\"13

\r\n

14 - Jigging up
\r\n\"14

\r\n

Pictures 9-14 outline the steps in fabricating the seat backs. The seat backs tie the rails together and are where the clamps that connect the seat to the frame grab the seat. This part of the construction can be overwhelming if you don\'t take it one step at a time. I had to constantly remind myself that building the bike was not a race but a journey, take your time and enjoy each little milestone. The last picture is the seat frame jigged up and ready for brazing.

\r\n

15 - Seat stay one
\r\n\"15

\r\n

16 - Seat stay two
\r\n\"16

\r\n

The seat stay was at first glance very intimidating. This piece connects the back of the seat down to the frame, supporting the upper part of your body. Its made of many parts, but all they are is cut up pieces of steel rod and threaded rod that are brazed together. No bending is involved only cutting and brazing and in the end it wasn\'t to difficult to fabricate.

\r\n

17 - Seat stay three
\r\n\"17

\r\n

The completed seat connected to the frame. The seat is clamped to the frame using hose clamps and clamping blocks made of conduit cut length wise and brazed together at right angles.

\r\n

18 - Seat webbing one
\r\n\"18

\r\n

19 - Seat webbing two
\r\n\"19

\r\n

The seat webbing is sewn on using fishing line as described on the website, the only challenge is getting it nice and tight. Needle, line and a few hpr episodes is all you need to get through the task.

\r\n

20 - Finished
\r\n\"20

\r\n

The last picture is the bike finished and ready for its maiden journey.

\r\n

Espeak script:

\r\n

Hello Hacker Public Radio, Brian in Ohio here.

\r\n

I am out from under my rock, and doing the last of the recumbent bike build episodes. My wife and I are visiting the land of our youth, Colorado, so my recording stuff is at home, hence the espeak rendition of the show. I finished building the bike a while ago and have been riding it around town to do errands and get exercise. I love this bike! The comfort level is unparalleled. Its like sitting in a chase lounge. No more neck strain or pain in the derriere. You don\'t need any fancy bike clothes, like padded biking shorts, in order to feel comfortable. The bike is fast and has responsive handling. Somethings I have learned so far while riding the bike. First, a rear view mirror really helps when riding on the street. Unlike upright bikes turning your head to look back to clear for traffic is not as easy. Next, the handling takes some getting used to. The long lever arm of the steering tube makes the bike feel jerky when you first ride it. After a while you\'ll see that a light hand on the tiller goes a long way to smoothing out the ride. It took me a bit of practice to gracefully get the bike started after coming to a stop. Because you can\'t stand up and hammer on the peddles, coming to a stop requires a bit of work on the gears. Being in a easy gear then shifting up as you get moving is the way to go. If you build one of these bikes, and why wouldn\'t you, you will have to think about storage because throwing a back pack on is not really an option. I found a bike rack that attaches to the back of the bike, a grocery store plastic basket and an instructive video tutorial by C J Hoyle on you tube took care of my storage needs, a link is in the show notes. The last parts that need to be fabricated to complete the bike were the seat and the handle bars, and all of there associated bits and pieces that make up these assemblies. Instead of narrating through all the pictures, I leave you, dear hacker public radio listener, that\'s interested to look at the pictures and read the captions yourself. My general impressions of building the pieces are as follows. The handle bars are relatively easy to fabricate but the big problem for me was the metal on the handle bars you use to make the tiller did not braze well with the conduit. In the end I had to resort to pop rivets and a through bolt to get a safe, sturdy connection. The seat is a collection of many parts and at first glance can be a bit overwhelming. By examining the photos on the recycled recumbent website and studying the plans, focusing on each step the seat came out fine for me, yours will too. The side rails are bent using a conduit bender and the challenge is getting the two sides close to match. Take your time and get some extra conduit, you\'re probably going to need it. The seat back stay is pretty easy to make, but it is made up of quite a few parts, requiring simple cuts and brazing to fashion it. The rest of the seat parts, the various fittings used to clamp the seat to the frame are pretty easy to make and I can\'t compliment Mr. Carsen highly enough for his ingenious design. Fitting out the bike; getting wheels, brakes and drive train together are going to be unique to every bike and will depend on how much money you want to spend, what parts you have laying around and what fittings you might have to create to attach the parts. I opted to use used parts that were at hand so I could get the bike up and running. I plan on upgrading parts, making changes and improvements after I\'ve ridden the bike for a few months and gotten a good number of miles under my belt. I\'ll do an update show in the future to let you know what I\'ve done. Will I do this again? Yes definitely I will build another bike, maybe a mach two or three, the building is fun the bike rides great. Mr Carsen sells parts, kits and completed bikes on his website. When I do it again I may opt to buy the seat from him. I would recommend this project to anyone. You can, go out and build one yourself.

\r\n

This is Brian in Ohio signing off for now reminding every one to: go fast; take chances.

\r\n',326,115,0,'CC-BY-SA','bicycle, recumbent',0,0,1), (3179,'2020-10-08','MakeMKV to back up media, and a Question',404,'Describing two ways to install MakeMKV DVD/Blu-ray backup program on Fedora 32','

Installed Fedora 32 on a spare laptop

\r\n
Quick tip
\r\n

To ignore the handle switch on the laptop triggering a power off:

\r\n

Put HandleLidSwitch=ignore in /etc/systemd/logind.conf

\r\n

Install MakeMKV from source

\r\n
dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm\r\n\r\ndnf install zlib-devel openssl-devel expat-devel ffmpeg ffmpeg-devel qt5-qtbase-devel\r\nmkdir git/makemkv.source\r\n\r\ncd makemkv.source\r\nwget https://www.makemkv.com/download/makemkv-oss-1.15.2.tar.gz\r\nwget https://www.makemkv.com/download/makemkv-bin-1.15.2.tar.gz\r\n\r\ntar xpf makemkv-oss-1.15.2.tar.gz\r\ntar xpf makemkv-bin-1.15.2.tar.gz\r\n\r\ncd makemkv-oss-1.15.2/\r\n./configure\r\nmake\r\nsudo make install\r\n\r\ncd ../makemkv-bin-1.15.2/\r\nmake\r\nsudo make install
\r\n

Install MakeMKV from flathub

\r\n
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo\r\nflatpak install flathub com.makemkv.MakeMKV
\r\n

Install ccextractor

\r\n
dnf install libtesseract-dev autoconf sysconftool\r\n\r\ngit clone https://github.com/CCExtractor/ccextractor.git\r\ncd ccextractor/linux/\r\n./build
\r\n

Enable expert mode

\r\n


\r\n

\r\n

Provide path to the ccextractor binary

\r\n


\r\n

\r\n

Re-encoding MKV file

\r\n
ffmpeg -i $1 -b:a 128k -b:v 2000k -vcodec mpeg4 -acodec aac "encoded"/"`basename -s .mkv $1`-_2000k_aac.mkv"
\r\n

Updated registration key (Good for 2 months?)

\r\n

Updated registration key for MakeMKV

\r\n

MakeMKV registration code update script (Untested)

\r\n

Github link to MakeMKV registration update script

\r\n

Other links

\r\n

How to install MakeMKV on Fedora Linux
Forum post for MakeMKV on Linux

\r\n

How to play/rip Blu-ray discs on Mplayer command line

\r\n

For DVD\'s

\r\n
mplayer dvd:///_/dvd/mount/dir_
\r\n

For Blu-ray discs
Download keydb.cfg and place it in ~/.config/aacs/
Link to keydb.cfg

\r\n
mplayer br:///_/bluray/mount/dir_\r\nie. mplayer br:////dev/sr0 <br>
\r\n

note the 3 forward slashes before the block device, as the disk will not be read otherwise

\r\n

Ripping:

\r\n
mplayer br:////dev/sr0 -alang en -dumpstream -dumpfile $movie.mpg
\r\n

Encoding:

\r\n
mkdir encoded\r\nffmpeg -i $1 -map 0:0 -map 0:1 -b:a 128k -b:v 2000k -vcodec mpeg4 "encoded"/"`basename -s .mpg $1`.mkv"
\r\n

Questions for the Community:

\r\n

Is it antiquated to want to rip Blu-ray/DVD disks to a server?

\r\n

Is there a better way to accomplish this, rather than using MakeMKV, which continues to be Beta software, and not Free and Open Source?

\r\n',318,0,0,'CC-BY-SA','dvd, blu-ray, backup',0,0,1), (3182,'2020-10-13','Yo-ho-ho, and a bottle of Cholecalciferol',4763,'From Scotland, two HPR hosts chew the fat','

Introduction

\r\n

Two HPR hosts from Scotland get together over Mumble one more time to chat about all manner of stuff.

\r\n\r\n

We recorded on Saturday 19th September 2020, which was International Talk Like A Pirate Day, we but managed to avoid any utterances of ARRRR!, and the use of marlinspikes, fids or belaying pins. Also, no timbers were shivered and no mainbraces spliced (not while recording anyway).

\r\n

Notes

\r\n

Some of the topics we discussed:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n
\r\n
\r\n
    \r\n
  1. Vitamin D3 is also known as cholecalciferol.↩︎

  2. \r\n
  3. SARS-CoV-2: SARS stands for Severe Acute Respiratory Syndrome, CoV means Corona Virus and the 2 refers to the second SARS corona virus in recent times.↩︎

  4. \r\n
  5. COVID-19: simply means coronavirus disease 19, referring to its arrival in 2019.↩︎

  6. \r\n
  7. Some clarification of the types of mask being used most commonly might be needed. Andrew was thinking of the fabric masks when speaking about this. Some research after the recording discovered a mask-related trial as follows: Human coronavirus data from four clinical trials of masks and respirators.↩︎

  8. \r\n
\r\n
\r\n',225,0,1,'CC-BY-SA','COVID-19,SARS-Cov-2,Vitamin D,6502 microprocessor,BBC Micro',0,0,1), (3181,'2020-10-12','RealVNC cloud offering',262,'JWP emails in a show about using VNC while out and about','

\r\nJust a short podcast about RealVNC cloud offering.\r\nAn interesting VNC option if you want to connect on the road or the at\r\nthe coffee shop to a server back home without putting holes in your router.\r\n

\r\n

\r\nhttps://www.realvnc.com/en/news/what-vnc-cloud/\r\n

',129,0,1,'CC-BY-SA','realvnc, remote computing',0,0,1), (3184,'2020-10-15','Linux Inlaws S01E15: IT Security and stick insects',3368,'How to secure photos of your stick insect collection and more ','

In this episode Martin discovers that protecting pictures of stick insects (rated XXX or not)\r\non USB sticks (pun intended) can be an ardous endeavour indeed. Never mind eventually turning\r\nthis into a business including web servers, shared file spaces and password storage. Additional\r\nbonus: the lovely Emma from Rainbow Escorts makes another cameo apperance supported by some Irish, um, students.

\r\n

Shownotes:

\r\n',384,111,0,'CC-BY-SA','IT Security, stick insects, Rainbow Escorts, Grumpy Old Coders',0,0,1), (3183,'2020-10-14','Don\'t trust zipfiles',277,'Zipfiles can contain all kinds of evilness and unpacking them can lead to unexpected results','

This show explains the concept of injecting symbolic links into zipfiles and how those can be used to attack a web application.

',387,74,0,'CC-BY-SA','pentesting,security,hacking,zip',0,0,1), (3186,'2020-10-19','A light bulb moment, part 2',450,'The history of lighting','

A very brief history of lighting

\r\n

Natural light first came from fire

\r\n

Then using oil and fat with a wick

\r\n

Early candles used animal fat this smelled awful and tended to spit

\r\n

Some parts of world used whole animals as candles

\r\n

These early candles gave so little light that people generally just went to bed at sunset

\r\n

Electric lighting started first by Humphry Davy in the early 1800’s using an arc, this was developed into commercial lighting in the 1840s

\r\n

Arc lighting needed a complex mechanism to gradually push the contacts together as they burnt away

\r\n

Gas lighting started around the 1850s this was improved in the 1870 with the advent of the Gas mantel.

\r\n

Thomas Edison develop the electric light bulb in 1879 using a carbon filament. It took a great deal of effort to convince people to use it because gas lighting was so well established and worked well.

\r\n

Many houses in Britain didn\'t install electric lighting until the 1930s

\r\n

Finally electricity won as it could be used for so many other things.

\r\n

The tungsten filament bulb

\r\n

The filament within the bulb is made up of a tungsten coiled coil wire. This is done because the more compactly a filament can be wound the less heat is lost to the surroundings and the brighter the bulb will glow.

\r\n

The tungsten halogen bulb

\r\n

The next progression was tungsten halogen bulb, these bulbs are more efficient and give out twice as much light as ordinary bulbs and usually last twice as long.

\r\n

All filament lights waste a lot of energy producing heat. An ordinary light bulb only gives out 10% of its energy as light, the rest is wasted as heat.

\r\n

Fluorescent neon lights

\r\n

Fluorescent neon lights were invented in 1905 by a French man called George Claude. These were used for advertising mainly in America.

\r\n

Fluorescent strip light

\r\n

The first fluorescent light was introduced in 1939 it uses the same principle as the neon light but incorporates a filament at both ends. It is filled with argon and mercury vapour. It mainly gives off ultra violet light the tube is coated on the inside with chemicals to convert the output to mostly visible light using a property called fluorescence.

\r\n

Fluorescent tubes are four times as efficient as normal incandescent light bulbs and run cool.

\r\n

The first energy efficient light bulbs were just fluorescent lights folded into a compact bulb shape.

\r\n

Sodium lights

\r\n

Sodium lights used mainly in street lighting are twice as efficient again as fluorescent bulbs they give off a rather horrible orange colour.

\r\n

The first commercial high-pressure sodium lamps were available in 1965 from companies in the United States, the United Kingdom, and the Netherlands; at introduction a 400 watt lamp would produce around 100 lumens per watt https://en.wikipedia.org/wiki/Sodium-vapor_lamp

\r\n

The next big development was LED lighting which I\'ll cover in my next episode.

\r\n',201,0,0,'CC-BY-SA','Hardware, electrical',0,0,1), (3187,'2020-10-20','Ansible for Dynamic Host Configuration Protocol',518,'How I use ansible to configure my OpenBSD router','

Ansible DHCPD and DNS

\r\n

Using Ansible to configure DHCPD and NDS on OpenBSD

\r\n\r\n

hostname-setup.yml

\r\n
---\r\n- hosts: localhost\r\n  tasks:\r\n  - name: read subnet 10\r\n    read_csv:\r\n      path: 10.csv\r\n      fieldnames: mac,ip,hostname\r\n    register: subnet_10\r\n  - name: read subnet 11\r\n    read_csv:\r\n      path: 11.csv\r\n      fieldnames: mac,ip,hostname\r\n    register: subnet_11\r\n  - name: read static\r\n    read_csv:\r\n      path: static.csv\r\n      fieldnames: hostname,ip\r\n    register: static_ip\r\n\r\n  - name: write dhcp file\r\n    template:\r\n      src: dhcpd.conf.j2\r\n      dest: /etc/dhcpd.conf\r\n      validate: dhcpd -nc %s\r\n  - name: write local.lan zone file\r\n    template:\r\n      src: local.lan.zone.j2\r\n      dest: /var/nsd/zones/master/local.lan\r\n      owner: root\r\n      group: _nsd\r\n      validate: nsd-checkzone local.lan %s\r\n  - name: nsd_conf\r\n    copy:\r\n      src: nsd.conf\r\n      dest: /var/nsd/etc/nsd.conf\r\n      owner: root\r\n      group: _nsd\r\n      validate: nsd-checkconf %s\r\n  - name: restart nsd\r\n    service:\r\n      name: nsd\r\n      state: restarted\r\n  - name: restart dhcpd\r\n    service:\r\n      name: dhcpd\r\n      state: restarted\r\n  - name: restart unbound\r\n    service:\r\n      name: unbound\r\n      state: restarted
\r\n

10.csv

\r\n
b8:27:eb:8b:7a:6d,192.168.10.100,pi3a\r\nb8:27:eb:ef:f2:d4,192.168.10.101,pi3b\r\n28:10:7b:25:d5:60,192.168.10.79,ipcam3\r\n28:10:7b:0c:fa:7b,192.168.10.80,ipcam1\r\nf0:7d:68:0b:ca:56,192.168.10.81,ipcam2
\r\n

static.csv

\r\n
tplink,192.168.10.2\r\ngate,192.168.10.10\r\nwww,192.168.10.10\r\nfox,192.168.10.17
\r\n

dhcpd.conf.j2

\r\n
option  domain-name "local.lan";\r\noption  domain-name-servers 192.168.10.10;\r\n\r\nsubnet 192.168.10.0 netmask 255.255.255.0 {\r\n        option routers 192.168.10.10;\r\n        range 192.168.10.161 192.168.10.179;\r\n        {% for host in subnet_10.list %}\r\n        host static-client { hardware ethernet {{ host.mac }};fixed-address {{ host.ip }};} #{{ host.hostname }}\r\n        {% endfor %}\r\n}\r\n\r\nsubnet 192.168.11.0 netmask 255.255.255.0 {\r\n    option routers 192.168.11.10;\r\n    range 192.168.11.72 192.168.11.127;\r\n{% for host in subnet_11.list %}\r\nhost static-client { hardware ethernet {{ host.mac }};fixed-address {{ host.ip }};} #{{ host.hostname }}\r\n{% endfor %}\r\n}\r\n
\r\n

Rendered DHCP entires

\r\n
host static-client { hardware ethernet b8:27:eb:de:2f:38;fixed-address 192.168.10.45;} #pi3a\r\nhost static-client { hardware ethernet 28:10:7b:25:d5:60;fixed-address 192.168.10.79;} #ipcam3\r\nhost static-client { hardware ethernet 28:10:7b:0c:fa:7b;fixed-address 192.168.10.80;} #ipcam1\r\n
\r\n

local.lan.zone.j2

\r\n
$TTL 3600\r\nlocal.lan. IN     SOA    a.root-servers.net. root. (\r\n                2016092901  ; Serial\r\n                3H          ; refresh after 3 hours\r\n                1H          ; retry after 1 hour\r\n                1W          ; expire after 1 week\r\n                1D)         ; minimum TTL of 1 day\r\n\r\nIN  NS  gate.\r\n\r\nIN  MX  50 gate.local.lan.\r\n\r\nlocal.lan.      IN A    192.168.10.10\r\n\r\n{% for host in static_ip.list%}\r\n{{ host.hostname }} IN A {{ host.ip }}\r\n{% endfor %}\r\n\r\n{% for host in subnet_10.list%}\r\n{{ host.hostname }} IN A {{ host.ip }}\r\n{% endfor %}\r\n\r\n{% for host in subnet_11.list%}\r\n{{ host.hostname }} IN A {{ host.ip }}\r\n{% endfor %}\r\n
\r\n

Rendered A records

\r\n
pi3b IN A 192.168.10.101\r\npi3a IN A 192.168.10.45\r\nipcam3 IN A 192.168.10.79\r\nipcam1 IN A 192.168.10.80
\r\n

Run the playbook

\r\n
ansible-playbook hostname-setup.yml
\r\n',342,0,0,'CC-BY-SA','ansible, dhcp, dns, openbsd',0,0,1), (3191,'2020-10-26','Swedish Corona Experience',969,'I will cover my experience of the Corona virus','

Swedish Health Authority Recommendation

\r\n\r\n

https://www.folkhalsomyndigheten.se/smittskydd-beredskap/utbrott/aktuella-utbrott/covid-19/

\r\n',382,100,0,'CC-BY-SA','corona, sweden',0,0,1), (3280,'2021-02-26','What We Need For the ActivityPub Network',1026,'This keynote address looks at where federated social media can go if we make it work. ','

Federated social media can open up some wonderful possibilities but we need to make it happen. In this opening keynote address Evan Prodromou, who arguably started it all off, shows that he has thought long and deeply about this, and gives us his vision for where we can take it. https://www.zwilnik.com/better-social-media/activitypub-conference-2020/activitypub-2020-evan-prodromou/

\r\n

Links:

\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub',0,0,1), (3194,'2020-10-29','Linux Inlaws S01E16: The count and the questions',4061,'Linux Inlaws S01E16: This is Linux Inlaws, a series on free and open source software, black humour a','',384,111,1,'CC-BY-SA','Count, questions, vlad, legends, Halloween',0,0,1), (3192,'2020-10-27','A light bulb moment, part 3',777,'The LED revolution','

LED History

\r\n

The history of the LED revolution is both long and complex but I\'ll do my best to cover it. Please forgive me if I mispronounce some of the materials and processes I\'m not a lighting expert as I stated right back at the beginning of this series.

\r\n

The following excerpts are from Wikipedia; the link will be in the show notes, https://en.wikipedia.org/wiki/Light-emitting_diode

\r\n

The LED or Light Emitting Diode first appeared as a practical electronic component in 1962, the earliest LEDs emitted low-intensity infrared light.[7] Infrared LEDs are used in remote-control circuits, such as those used with a wide variety of consumer electronics. The first visible-light LEDs were of low intensity and limited to red. Modern LEDs are available across the visible, ultraviolet, and infrared wavelengths, with high light output. A great deal of development and refinement was required to get to this point.

\r\n

The first commercial visible-wavelength LEDs were commonly used as replacements for incandescent and neon indicator lamps, and in seven-segment displays,[31] first in expensive equipment such as laboratory and electronics test equipment, then later in such appliances as calculators, TVs, radios, telephones, as well as watches (see list of signal uses). Until 1968, visible and infrared LEDs were extremely costly, in the order of US$200 per unit, and so had little practical use.[32]

\r\n

In 1968 Monsanto was the first organization to mass-produce visible LEDs, these were red LEDs suitable for indicators.[32]

\r\n

In February 1969, Hewlett-Packard introduced the HP Model 5082-7000 Numeric Indicator, the first LED device to use integrated circuit (integrated LED circuit) technology.[33] It was the first intelligent LED display, and was a revolution in digital display technology, replacing the Nixie tube and becoming the basis for later LED displays.[36]

\r\n

The early red LEDs were bright enough only for use as indicators, as the light output was not enough to illuminate an area. Readouts in calculators were so small that plastic lenses were built over each digit to make them legible. Later, other colors became widely available and appeared in appliances and equipment.

\r\n

The first blue-violet LED using magnesium-doped gallium nitride was made at Stanford University in 1972 by Herb Maruska and Wally Rhines

\r\n

In 1973 Pankove and Ed Miller demonstrated the first blue electroluminescence from zinc-doped gallium nitride, though the subsequent device Pankove and Miller built, the first actual gallium nitride light-emitting diode, emitted green light.[49][50]

\r\n

Today, magnesium-doping of gallium nitride remains the basis for all commercial blue LEDs and laser diodes. In the early 1970s, these devices were too dim for practical use, and research into gallium nitride devices slowed.

\r\n

In 1993, high-brightness blue LEDs were demonstrated by Shuji Nakamura of Nichia Corporation using a gallium nitride growth process.[56][57][58] In parallel, Isamu Akasaki and Hiroshi Amano in Nagoya were working on developing the important GaN deposition on sapphire substrates and the demonstration of p-type doping of GaN. This new development revolutionized LED lighting, making high-power blue light sources practical, leading to the development of technologies like Blu-ray[citation needed].

\r\n

In 1995, Alberto Barbieri at the Cardiff University Laboratory (GB) investigated the efficiency and reliability of high-brightness LEDs and demonstrated a \"transparent contact\" LED using indium tin oxide (ITO) on (AlGaInP/GaAs).

\r\n

In 2001[62] and 2002,[63] processes for growing gallium nitride (GaN) LEDs on silicon were successfully demonstrated.

\r\n

In January 2012, Osram demonstrated high-power InGaN LEDs grown on silicon substrates commercially,[64] and GaN-on-silicon LEDs are in production at Plessey Semiconductors.

\r\n

White LEDs and the illumination breakthrough

\r\n

Even though white light can be created using individual red, green and blue LEDs, this results in poor color rendering, since only three narrow bands of wavelengths of light are being emitted. The attainment of high efficiency blue LEDs was quickly followed by the development of the first white LED. In this device a cerium doped phosphor coating produces yellow light through fluorescence. The combination of that yellow with remaining blue light appears white to the eye. Using different phosphors produces green and red light through fluorescence. The resulting mixture of red, green and blue is perceived as white light, with improved color rendering compared to wavelengths from the blue LED/YAG phosphor combination.

\r\n

The first white LEDs were expensive and inefficient. However, the light output of LEDs has increased exponentially. The latest research and development has been propagated by Japanese manufacturers such as Panasonic, and Nichia, and by Korean and Chinese manufacturers such as Samsung, Kingsun, and others. This trend in increased output has been called Haitz\'s law after Dr. Roland Haitz.[79]

\r\n

Figure 1
\r\n\"Figure
\r\nIllustration of Haitz\'s law, showing improvement in light output per LED over time, with a logarithmic scale on the vertical axis

\r\n

Light output and efficiency of blue and near-ultraviolet LEDs rose and the cost of reliable devices fell. This led to relatively high-power white-light LEDs for illumination, which are replacing incandescent and fluorescent lighting.[80][81]

\r\n

Experimental white LEDs have been demonstrated to produce 303 lumens per watt of electricity (lm/w); some can last up to 100,000 hours.[82][83] However, commercially available LEDs have an efficiency of up to 223 lm/w.[84][85][86]

\r\n

Below are some comparisons for incandescent bulbs

\r\n

Some figures I found online from Wikipedia

\r\n

https://en.wikipedia.org/wiki/Incandescent_light_bulb

\r\n

(Example figure for Standard Incandescent bulb only 12.6 lm / W)

\r\n

(Example figures for Halogen bulb being 24 lm / W)

\r\n

With LEDs continuing to get cheaper and even though for now they cost more than traditional bulbs, having this huge increase in electrical efficiency means the overall cost is significantly cheaper than that of incandescent bulbs.[87]

\r\n

While indicator LEDs are known for their extremely long life, up to 100,000 hours, lighting LEDs are operated much less conservatively, and consequently have shorter lives. LED technology is useful for lighting designers, because of its low power consumption, low heat generation, instantaneous on/off control, and in the case of single color LEDs, continuity of color throughout the life of the diode and relatively low cost of manufacture. LED lifetime depends strongly on the temperature of the diode. Operating an LED lamp in conditions that increase the internal temperature can greatly shorten the lamp\'s life.

\r\n

I now use LED lighting in my own home particularly in the areas where lighting is on for extended periods such as in the living room.

\r\n

As you can see we have come an extremely long way in a relatively short space of time with advancements continuing to accelerate.

\r\n

It\'s hard to appreciate the massive impact electric lighting has had on the world.

\r\n

It\'s even harder to imagine living in a time not that long ago where an expensive candle producing a puny amount illumination was the only source of light, with the added not inconsiderable fire risk of having a naked flame sharing a room with combustible materials.

\r\n

With all these deterrents it\'s little wonder that people just went to bed when the sun went down.

\r\n',201,0,1,'CC-BY-SA','Electrical, Hacks',0,0,1), (3188,'2020-10-21','Thrift store quick fix',67,'Fixing up a dog coat for the cool weather.','

Thrift store quick fix for a dog coat.

\r\n
    \r\n
  1. Ripped out stitches on defective velcro.
  2. \r\n
\r\n

Picture 1
\r\n\"Picture

\r\n
    \r\n
  1. Re-stitched with the flat surface facing up.
  2. \r\n
\r\n

Picture 2
\r\n\"Picture

\r\n

Picture 3
\r\n\"Picture

\r\n
    \r\n
  1. Hot-glued replacement velcro.
  2. \r\n
\r\n

Picture 4
\r\n\"Picture

\r\n
    \r\n
  1. Profit
  2. \r\n
\r\n

Picture 5
\r\n\"Picture

\r\n',318,0,0,'CC-BY-SA','sewing',0,0,1), (3189,'2020-10-22','How the Dutch dig Graves',163,'Ken explains how they dig graves when the ground is essentially sand','

\r\nOn a lock down walk in the local grave yard, Ken and his Wife stumble upon a new grave. As the soil is mostly sand, the graves need to be shored up to prevent collapse.\r\n

\r\n

\r\n\r\n

\r\n

\r\n\r\n

\r\n

\r\n\r\n

',30,0,1,'CC-BY-SA','graves, sand, How Holland Works, Dutch, Netherlands',0,0,1), (3193,'2020-10-28','Meet Antithesis',1946,'Meet my new computer, a Pinebook Pro, as I explain my rationale, unbox it, and set it up.','

In this episode Paul discusses his thoughts in ordering a Pinebook Pro. During the episode he does an unboxing, and then comes back after a week of use to let us know how it preforms in practice.
\r\n\r\nYou can get one yourself here: https://www.pine64.org/

\r\n',383,57,0,'CC-BY-SA','Pinebook,Pro,64,unboxing',0,0,1), (3198,'2020-11-04','Income Life insurance and then Chopin',1381,'I talk about my thoughts on Income Life insurance, and then we listen to some Chopin','

@paul@cloud.pquirk.com

',383,0,0,'CC-BY-SA','Income,life,insurance,investment,investing,Chopin',0,0,1), (3195,'2020-10-30','For your Consideration - the ideal Ham Radio setup',3470,'Introducing a new podcast to me, with a special guest with an interest in amateur radio.','
    \r\n
  1. Host Noah Cheliah

  2. \r\n
  3. Plenty of Linux security and IP cameras talk

  4. \r\n
  5. Focus on Free Software and related news

  6. \r\n
  7. Noah brings on a guest, who describe his ideal Ham Radio setup, which includes use of Software Defined radio.

    \r\n

    https://en.wikipedia.org/wiki/Software-defined_radio

  8. \r\n
  9. Guest talking about Ham Radio starts at 00:25:42

    \r\n

    https://podcast.asknoahshow.com/200

  10. \r\n
\r\n',318,75,0,'CC-BY-NC-ND','linux, security, amateur radio',0,0,1), (3197,'2020-11-03','Pens, pencils, paper and ink - 3',1420,'Looking at another batch of writing equipment','

Introduction

\r\n

This is the third in a short series about pens, pencils, writing paper and ink.

\r\n

In this episode I look at two Chinese fountain pens, a mechanical pencil, a gel pen, some inks and some paper.

\r\n

Long notes

\r\n

The main notes for this episode, including pictures, can be viewed here.

\r\n

Links

\r\n\r\n\r\n\r\n\r\n\r\n',225,112,1,'CC-BY-SA','fountain pen,gel pen,mechanical pencil,ink,paper',0,0,1), (3201,'2020-11-09','A small intro to 3D printing',688,'Everything a newbie needs to know to start 3D printing','',369,0,0,'CC-BY-SA','3D printing',0,0,1), (3203,'2020-11-11','The Paul Quirk show: Retro Computing',1838,'I discuss the hobby of retro computing in this episode.','

Some links of interest for the listener:

\r\n',383,0,0,'CC-BY-SA','retro,computing,Paul Quirk show,Commodore 64,Commodore 128,Vic 20,Apple II,coco,8-bit,PET,Atari',0,0,1), (3199,'2020-11-05','Bad Audio Weed Eater Bugs Sprinkler and Bubbles !',1516,'Pushing the definition of \"Audible\" to the limit, join us for some home repair tips','

\r\nJoin us for some home repairs, picking up tips and tricks on the way. Sorry for the bad audio.\r\n

\r\n',36,0,1,'CC-BY-SA','home improvement,home repair,outdoors,outside ',0,0,1), (3202,'2020-11-10','A big Question',1118,'In his first show, Padraig asks a big life question. Well ok more like an undead question.','

\r\nIn his first show - recorded on Halloween night, Padraig asks a big life question. Well ok more like an undead question. Which is better a Lich, or a Vampire.\r\n

\r\n',388,95,0,'CC-BY-SA','DND, Vampires, Lich, Undead, Halloween',0,0,1), (3205,'2020-11-13','Backups of your Backups of Backups',3205,'Do you have backups of your backups? Well you better! Listen to this rant','This is a general discussion about backups and cloud storage. ',36,0,1,'CC-BY-SA','backups,cloud,spideroak,backup,cloud backup,cloud backups',0,0,1), (3211,'2020-11-23','Chainsaws',1098,'Info about chainsaws and what I know so far!','In this episode operat0r shares his experiences with chainsaws.',36,0,1,'CC-BY-SA','outdoors,outdoor,outside,mechanic,small engine repair,repair,home,home repair,chainsaws',0,0,1), (3214,'2020-11-26','Rant about websites',1880,'I go over history of websites and the complex nature of security in complex websites','

In this show I go over history of websites and the complex nature of security in complex websites

',36,0,1,'CC-BY-SA','internet,security,history,html',0,0,1), (3225,'2020-12-11','Grill repair',1027,'I go over some grill tips/repair','

A few quick tips on how to extend the life of grills.

',36,0,1,'CC-BY-SA','outdoor,outdoors,repair,home repair,grills',0,0,1), (3235,'2020-12-25','Soldering Tips',487,'What little I know about the topic you will learn','

\r\nA follow up show in the vein of hpr3016 :: Nixie tube clock and friends!. Also be sure to remove batteries from electronics in storage.

',36,103,1,'CC-BY-SA','Solder,Soldering,Electronics',0,0,1), (3245,'2021-01-08','ELECTRICITY',1843,'I talk about tips on ELECTRICITY','

An adhoc show in traffic, about how sockets and 3 way switches work.

',36,0,1,'CC-BY-SA','ELECTRICITY',0,0,1), (3216,'2020-11-30','Buying a second home in France',952,'Steps I have taken up to now for buying a second home in another country','

funda.nl

\r\n',369,0,0,'CC-BY-SA','second-house,france',0,0,1), (3204,'2020-11-12','Getting Started in 3D Printing',960,'Thaj gives his opinions and recommendations on how to get started in 3D printing','

Getting started in 3D printing

\r\n',270,0,1,'CC-BY-SA','3D Printing',0,0,1), (3206,'2020-11-16','Dungeons and Dragons for the blind',3511,'I discuss some easy workarounds to make tabletop RPGs easy for both sighted and non-sighted players','

Dungeons and Dragons, and most tabletop roleplaying games, are ideal platforms for players with low or no vision. However, because most players are sighted, you have to work-around some assumptions made by the rulebooks.

\r\n\r\n

I [currently] have vision, but I have played with a blind player before, and I\'ve played as a Dungeon Master with no materials on hand. In this episode, I discuss some easy workarounds to make tabletop RPGs easy for both sighted and non-sighted players.\r\n

\r\n\r\n

There are audiobook versions of the rule books available at https://listenrpg.com.

\r\n\r\n

The official D&D digital platform is dndbeyond.com, and it is accessible to blind players using a screen reader.

\r\n\r\n

Wizards of the Coast publishes the basic rules under the Open Game License (OGL). As a service to my players, I maintain a version of this document in plain text, with third-party OGL additions. It may or may not be useful for screen readers, depending on your workflow.

',78,95,0,'CC-BY-SA','dnd,blind,inclusive,5e,tabletop,rpg',0,0,1), (3217,'2020-12-01','Sump Minion',1106,'My first Internet of Things device, without using python','\r\n

1 introduction

\r\n

1.1 back in Ohio using my regular voice
\r\n1.2 espeak is no worse than operat0rs audio and we all love his shows.

\r\n

2 the problem

\r\n

2.1 where i live the water table is high and basement flooding is a problem https://en.wikipedia.org/wiki/Great_Black_Swamp
\r\n2.2 to counteract the water table problem houses have sumps in the basement

\r\n

sump closet
\r\n\"sump

\r\n

sump close up
\r\n\"sump

\r\n

2.2.1 sumps consist of a basin where outside water is collected
\r\n2.2.2 a pump, usually electric, that drains the sump
\r\n2.2.3 also a good sump system will have some type of backup pump

\r\n

2.3 the \'real\' problem happens when the sump pump(s) fail
\r\n2.3.1 primary pumps fail in many ways, mechanical motor failures, floats sticking electrical outage
\r\n2.3.2 secondary pumps also fail battery problems, mechanical problems
\r\n2.3.3 i wanted a notification system that would let me know that the water level in my sump was rising. i wanted it set so that if the water level hits where the secondary system kicks in i would get some ind of notification. i wanted a system that would not use python or some kind of \'home spy\' system available from some friendly corporation.

\r\n

3 the solution

\r\n

3.1 a raspberrry pi, a simple transistor circuit, a c library that allows access to the pi\'s gpio\'s, mutt mail client, some bash scripting and a cron job

\r\n

\r\nThe probe is meerly 2 wires on the end of a pvc pipe. one wire is higher up on the pipe than the other when both wires are submerged, the circuit is complete. the wires are just some old stuff from a stripped out ethernet cable. you could easily cascade anumber of these circuits and provide a water level meter something like this,
\r\n\r\n\"water
\r\n, instead of running leds, you\'d hook each end to a gpio pin on the pie.\r\n

\r\n

\r\nIn picture 2, the closeup you can see the probe its the small pvc pipe with the blue wires running along the side. I attached the end of the wires to the pipe by stripping the ends and wrapping them around a small 1/2\" self tapping screw. then I screwed one in towards the bottom and on higher up. the one higer up determines when the water alarm goes off. \r\n

\r\n\r\n\r\n

4 implementation

\r\n

4.1 raspberry pi 3b+
\r\n4.1.1 install slackware
\r\nhttps://sarpi.fatdog.eu/
\r\nslackware-arm
\r\nhttps://arm.slackware.com/
\r\npodcast
\r\nhttps://shows.acast.com/slackchat
\r\n4.1.2 access to gpio\'s
\r\n4.1.2.1 initially sysfs, its deprecated
\r\nhttps://www.kernel.org/doc/Documentation/ABI/obsolete/sysfs-gpio
\r\n4.1.2.2 i was unable to get libgpio to compile
\r\n4.1.2.3 other solutions python. wiringpi, project dead
\r\n4.1.2.4 a library pigpiod
\r\nhttps://abyz.me.uk/rpi/pigpio/pigpiod.html
\r\n4.1.2.5 slackbuilds pigpiod
\r\nhttps://slackbuilds.org/
\r\n4.1.3 the circuit
\r\n4.1.3.1 a rework of a forrest mims water alarm circuit
\r\nhttps://en.wikipedia.org/wiki/Forrest_Mims

\r\n

circuit diagram
\r\n\"circuit

\r\n

4.1.4 mutt
\r\nhttps://smalldata.tech/blog/2016/09/10/gmail-with-mutt
\r\n4.1.5 email to text
\r\nhttps://20somethingfinance.com/how-to-send-text-messages-sms-via-email-for-free/
\r\n4.1.6 the script
\r\n

\r\n
#!/bin/bash\r\n\r\nSENSOR=4\r\nRELAY=17\r\nINPUT=0\r\nOUTPUT=1\r\nON=1\r\nOFF=0\r\n\r\nADDRESS1=<your-phone-number>@vtext.com\r\n\r\n#if its 6am send system running sanity text\r\nif [ $(date | cut -c 12-16) == "06:00" ]; then\r\n\r\n#check to make sure daemon is running\r\nif [ "$(pidof pigpiod)" == "" ]; then\r\n   echo "Something is wrong, pigpiod is not running." | mutt -s "mutt message" $ADDRESS1\r\n   else\r\n   #make sure pin 4 is input, pin 17 output\r\n   if [ "$(pigs modeg $SENSOR)" = $OUTPUT ]; then\r\n      pigs modes $SENSOR R\r\n   fi\r\n   if [ "$(pigs modeg $RELAY)" = $INPUT ]; then\r\n      pigs modes $RELAY W\r\n   fi\r\n      echo "System running." | mutt -s "mutt message" $ADDRESS1\r\n   fi\r\nfi\r\n\r\n#if its the first wednesday of the month, run a system test\r\nif [ $(date | cut -c 1-3) `= "Wed" ] && [ $(date | cut -c 12-16) =' "12:00" ] && [ $(date | cut -c 9-10) -lt "8" ]; then\r\n   echo "Monthly Test." | mutt -s "mutt message" $ADDRESS1\r\n   pigs w $RELAY $ON\r\n   sleep 1\r\n\r\n   if [ $(pigs r $SENSOR) = 0 ]; then\r\n     echo "Test Passed!" | mutt -s "mutt message" $ADDRESS1\r\n   else\r\n     echo "Something is wrong!" | mutt -s "mutt message" $ADDRESS1\r\n   fi\r\nfi\r\n\r\n#check to see if water is rising, has the reading on pin 4 been driven low?\r\nif [ $(pigs r $SENSOR) = 0 ]; then\r\n   echo "Alert! The water is rising!" | mutt -s "mutt message" $ADDRESS1\r\nfi
\r\n

testing on breadboard
\r\n\"testing

\r\n

strip board
\r\n\"strip

\r\n

final installation
\r\n\"final

\r\n

5 conclusion

\r\n

5.1 fun project, shows the power of linux and floss and hope it inspires you

\r\n',326,103,0,'CC-BY-SA','raspberry pi, slackware',0,0,1), (3226,'2020-12-14','Using taskwarrior to structurize your work',970,'How using taskwarrior can help you to structure your work','\r\n\r\n\r\n\r\n',369,0,0,'CC-BY-SA','command-line,taskwarrior,timewarrior,todo-list',0,0,1), (3215,'2020-11-27','Why I Gave Away a 3-D Printer',442,'I briefly had a 3-D printer and gave it away. This is why.','

Ken Fallon asked for shows abut 3-D printers and I told him I had given mine away. So of course he asked for a show about why I had done that. This is that show.

\r\n',198,0,0,'CC-BY-SA','3D Printers, prosthetics',0,0,1), (3209,'2020-11-19','Linux Inlaws S01E17: Nextcloud',4189,'Chat with Frank Karlitschek about Nextcloud and forking your company','',384,111,1,'CC-BY-SA','Nextcloud, PHP, Golang, forking a company, technical debt',0,0,1), (3207,'2020-11-17','Fireside chat with E Nigma',3799,'Ken talks to the original HPR and Today with a Techie Admin.','

In this rambling episode, we talk to Enigma about the old days of HPR. He helped out with Today With A Techie and Droops asked him if he would like lead the project. After 300 episodes he, Dual Parallel, Droops, and StankDawg decided to pivot and rebrand as Hacker Public Radio. A nod to National Public Radio.

\r\n\r\n

Links

\r\n',30,0,1,'CC-BY-SA','HPR, TWAT, DDP, Infonomicon, Binrev, RFA',0,0,1), (3208,'2020-11-18','The Paul Quirk show: Wacom with Pinebook, and thoughts on the DMCA takedown',1120,'I got a Wacom tablet to use with my Pinebook, and then share my thoughts on the recent DMCA takedown','',383,0,0,'CC-BY-SA','Pinebook,Pro,Wacom,tablet,DMCA,takedown,Youtube,Canadian,Canada,Music',0,0,1), (3212,'2020-11-24','A Pi Model 3B as your daily driver? You must be joking.',755,'Beeza\'s laptop is away being fixed. Can he manage for a few days using just his Raspberry Pi 3B?','

My Dell laptop had to go away to have a new cooling fan fitted. I\'ve got 3 other laptops to call upon, but instead I decided to conduct an experiment I\'ve theorised about for ages. Could a Raspberry Pi 3B serve as my daily driver?

\r\n

This idea goes back some way and since then, of course, the much more powerful model 4 has been released. However, there must be thousands of 3Bs out there doing nothing, so perhaps they could have a new lease of life providing basic browsing and internet capabilities to people who might otherwise not be in a position to buy a computer.

\r\n

Hardware: Raspberry Pi Model 3B
\r\nOS: Raspberry Pi OS (current version as of 31st October 2020)
\r\nMicroSD: SanDisk 16GB

\r\n

ADDITIONAL SOFTWARE INSTALLED

\r\n\r\n',246,0,0,'CC-BY-SA','Raspberry Pi, Software Review',0,0,1), (3213,'2020-11-25','Electrical Safety',1835,'I discuss why and how I stay safe when working with electricity, with some ear candy at the end.','\r\n

Please be safe!

',383,0,0,'CC-BY-SA','Electrical,safety,code,electricity,electrocution',0,0,1), (3218,'2020-12-02','An introduction to Darktable',1574,'A brief introduction to RAW photography, the Darktable application, and then sheep may safely graze','\r\n
@paul@cloud.pquirk.com\r\n@quirk@mastodon.social
',383,0,0,'CC-BY-SA','darktable,RAW,photo,photography,editing',0,0,1), (3219,'2020-12-03','Linux Inlaws S01E18: Voice Recognition and Text to Speech',4603,'How to place fake prank calls into podcasts and what does TTS have to do with this','

\r\nIn this episode, Chris is harassed by quite a few artificial nuisance callers, among\r\ndrug lords, Irish nurses and some random Linux Inlaws Chief Financial Officer. Based\r\non these examples, our two heroes discuss the history and current state of text-to-\r\nspeech (TTS) and voice recognition. We attempted to use voice recognition software in order\r\nto produce a transcript of the show.\r\n

\r\n
Shownotes:
\r\n\r\n',384,111,1,'CC-BY-SA','voice recognition, text to speech, wavenet, tacotron 2, DeepSpeech, Lyrebird',0,0,1), (3222,'2020-12-08','Musings about writing a book about the Odoo software suite',1616,'How I started writing again after 20 years and this time about the Odoo software','

In this podcast I describe how I met another Dutch guy at the Ubucon 2018 conference in Spain. And how he asked me to write another book, this time about Odoo. How I learned how the Odoo ecosystem works, with the Odoo S.A. company and the Odoo Community Association (OCA).

\r\n

At the end I had a finished book.

\r\n

You can find the book here: https://www.lulu.com/en/en/shop/jeroen-baten/jumpstart-your-business-with-odoo-12-ennl/paperback/product-1wkzmj52.html

\r\n

If you have questions or comments, please leave a comment at the HPR site.

\r\n

Warm regards, Jeroen Baten

\r\n',369,0,0,'CC-BY-SA','odoo, writing, book',0,0,1), (3223,'2020-12-09','My COVID year summary',1090,'I summarize what I\'ve been doing for the last year','

Links

\r\n',300,100,0,'CC-BY-SA','covid,healthcare,coronavirus,laboratory',0,0,1), (3224,'2020-12-10','Adventures in Retrocomputing with the Mac Plus',1479,'I talk more about my hobby with retrocomputing, and then Greensleeves.','

Links

\r\n',383,71,0,'CC-BY-SA','Mac,Plus,Iomega,zip,drive,OS,7.5.5,6.0.8,retro,computing',0,0,1), (3501,'2022-01-03','HPR Community News for December 2021',4324,'HPR Volunteers talk about shows released and comments posted in December 2021','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Mechatroniac.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3478Wed2021-12-01Audio Wiring Hack on a Classroom PodiumJon Kulp
3479Thu2021-12-02Linux Inlaws S01E49: Version Control Systems and why bothermonochromec
3480Fri2021-12-03Darken Layer ModesAhuka
3481Mon2021-12-06HPR Community News for November 2021HPR Volunteers
3482Tue2021-12-07Introduction to Post Apocalyptic Robotics Meta TechnologyMechatroniac
3483Wed2021-12-08Pinephone64 reviewsigflup
3484Thu2021-12-09My vim setup with GnuPGArcher72
3485Fri2021-12-1050 years since the 1st Edition of Unix was publishedKen Fallon
3486Mon2021-12-13Unleash the true potential of GNU nano text editorhakerdefo
3487Tue2021-12-14Installing a cat doorRho`n
3488Wed2021-12-15Binaural 3d audio recording, please listen at normal speed with good head phones.Quvmoh
3489Thu2021-12-16Equality of structured errorsTuula
3490Fri2021-12-17The PathAhuka
3491Mon2021-12-20My Github and flickmetrixoperat0r
3492Tue2021-12-21Linux Inlaws S01E44: Pipewire Just another audio server Think againmonochromec
3493Wed2021-12-22My First Spanish HPR EpisodeClaudio Miranda
3494Thu2021-12-23Recent Generator Repairs and MaintenanceJon Kulp
3495Fri2021-12-24Podcast Recommendation: The RetroistArcher72
3496Mon2021-12-27How I record HPR Episodesnorrist
3497Tue2021-12-28Jankilators.one_of_spoons
3498Wed2021-12-29Linux Inlaws S01E45: The Big Xmas New Year bash with the Grumpiesmonochromec
3499Thu2021-12-30Fixing a noisy blower motorArcher72
3500Fri2021-12-31Contrast Layer ModesAhuka
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 14 comments in total.

\n

Past shows

\n

There are 6 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 8 comments on 7 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-December/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Older HPR shows on archive.org

\n

This month 125 additional shows in the range 1-870 have been uploaded.

\n

The number of shows left to upload in this range is now: 244.

\n

\nThanks to all HPR contributors in 2021!\n

\n

\n2BFrank, Ahuka, Andrew Conway, Anonymous Host, Archer72, arfab, b-yeezi, Beeza, BlacKernel, Brian in Ohio, clacke, Claudio Miranda, Clinton Roy, CoGo, crvs, Daniel Persson, Dave Morriss, deepgeek, dnt, Enigma, hakerdefo, Honkeymagoo, HPR Volunteers, Jezra, Jon Kulp, JWP, Ken Fallon, klaatu, Mechatroniac, minnix, monochromec, MrX, Nihilazo, norrist, o9l, one_of_spoons, operat0r, Paul Quirk, Quvmoh, Rho`n, sigflup, Some Guy On The Internet, swift110, Thaj Sara, thelovebug, timttmy, ToeJet, Trey, TrumpetJohn, Tuula, Windigo, Zen_Floater2.\n

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3526,'2022-02-07','HPR Community News for January 2022',2626,'HPR Volunteers talk about shows released and comments posted in January 2022','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3501Mon2022-01-03HPR Community News for December 2021HPR Volunteers
3502Tue2022-01-04New year Greetings and a short review of my new Juno PCTony Hughes AKA TonyH1212
3503Wed2022-01-05Configuring MumbleKen Fallon
3504Thu2022-01-06James Webb Space TelescopeDave Morriss
3505Fri2022-01-07A DX with Hotel Bravo 9 Hotel November Tangobeni
3506Mon2022-01-10HPR CONTEST 2022 01operat0r
3507Tue2022-01-11USB Turntable fix and sound journeyArcher72
3508Wed2022-01-12Differences between C# and HaskellTuula
3509Thu2022-01-13Linux Inlaws S01E46: The Matrix Project (Without Neo)monochromec
3510Fri2022-01-14Syntax, Switches, and HelpAhuka
3511Mon2022-01-17Podman like Vagrantklaatu
3512Tue2022-01-18Auld AcquaintanceJezra
3513Wed2022-01-19HB9HNT and PA7KEN on SOTA, Summits on the Airbeni
3514Thu2022-01-20Hacking Stories: Soft Drinkoperat0r
3515Fri2022-01-21ADB and scrcpyKen Fallon
3516Mon2022-01-24Rant about RXoperat0r
3517Tue2022-01-25Hp stream laptop with Lubuntu 20.04JWP
3518Wed2022-01-26Linux Inlaws S01E47: BigBlueButton and NATmonochromec
3519Thu2022-01-27Rust 101: Episode 2 - Rolling With the ErrorsBlacKernel
3520Fri2022-01-28Inversion Layer ModesAhuka
3521Mon2022-01-31Upgrades to Acer Aspire 5 SlimArcher72
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 9 comments in total.

\n

Past shows

\n

There are 4 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 5 comments on 5 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-January/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Older HPR shows on archive.org

\n

This month 120 additional shows in the range 1-870 have been uploaded.

\n

The number of shows left to upload in this range is now: 124.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3227,'2020-12-15','Fresh water Aquarium Basics',1589,'Enigma discusses the high level basics of getting into the aquarium hobby','

Enigma discusses the high level basics of getting into the aquarium hobby and what to consider when purchasing your first aquarium.

\r\n

Links:

\r\n',39,0,1,'CC-BY-SA','Aquariums',0,0,1), (3229,'2020-12-17','Linux Inlaws S01E19: Redis',4418,'Our two chaps interview Itamar Haber of Redis fame','

In this episode our two heroes interview Itamar Haber, community liaison for Redis, a popular open-source\r\nin-memory NoSQL database. Technology prevails in this episode; communism, free love and drugs\r\ntake a backseat (but only for the moment! :-). The trio discuss the legacy of redis, bemoan their old age\r\nand reveal why Itamar initially wanted to be a mermaid. Listen to the episode\r\nfor more shocking epiphanies!

\r\n
Shownotes:
\r\n\r\n\r\n\r\n',384,111,1,'CC-BY-SA','Redis, mermaids, communism, Israel',0,0,1), (3239,'2020-12-31','New Community Project Proposal',516,'Enigma discusses a project proposal called Hacker exchange','

Enigma discusses a project proposal called Hacker exchange, a proposed content sharing site that would aggregate audio/video and text based tutorials.

\r\n

Come chat about this project on irc.freenode.net #hackerexchange

',39,0,1,'CC-BY-SA','hpr, community_projects, ddp, binrev',0,0,1), (3228,'2020-12-16','YAML basics',2027,'Learn about sequence and mapping in YAML','

YAML has two data elements that serve as building blocks for complex data structures: sequences and mappings.

\r\n\r\n

Sequence

\r\n\r\n

This is a sequence:

\r\n\r\n
\r\n---\r\n- Emperor\r\n- Gentoo\r\n- Little Blue\r\n
\r\n\r\n

Mapping

\r\n\r\n

\r\nThis is a mapping:\r\n

\r\n\r\n
\r\n---\r\nPenguin: Emperor\r\n
\r\n\r\n

\r\nIn this case, Penguin is a key and Emperor is a value. This is often called a "key and value pair", but in YAML it's just called a mapping.\r\n

\r\n\r\n

Combining data blocks

\r\n\r\n

\r\nYou can embed these data types into one another. Here is a mapping that has a sequence as its value:\r\n

\r\n\r\n
\r\n---\r\nPenguin:\r\n  - Emperor\r\n  - Gentoo\r\n  - Little Blue\r\n
\r\n\r\n

\r\nHere is a sequence of mappings:\r\n

\r\n\r\n
\r\n---\r\n- Penguin: Emperor\r\n- Penguin: Gentoo\r\n- Penguin: Little Blue\r\n
\r\n\r\n

yamllint

\r\n\r\n

Use yamllint to detect errors in your YAML. To install:\r\n

\r\n\r\n
\r\n\r\n$ pip install yamllint\r\n
\r\n\r\n

Run it:\r\n

\r\n\r\n
\r\n\r\n$ yamllint good.yaml\r\n$ yamllint bad.yaml\r\nbad.yaml\r\n  1:1       warning  missing document start \"---\"  (document-start)\r\n  4:14      error    no new line character at the end of file  (new-line-at-end-of-file)\r\n
\r\n\r\n

yaml2json

\r\n\r\n

\r\nSometimes it's useful to convert your YAML to JSON so you can view the data structure in a different way. There are probably dozens of YAML-to-JSON converters out there, but here's the one I use: https://gitlab.com/slackermedia/yaml2json.git\r\n

\r\n\r\n

\r\nRun it:\r\n

\r\n\r\n
\r\n$ cat example.yaml\r\n---\r\npenguins:\r\n  - Gentoo\r\n  - Little Blue\r\n  - Rockhopper\r\ndragons:\r\n  - black\r\n  - white\r\n  - red\r\n$ ~/bin/yaml2json.py example.yaml\r\n{\"penguins\": [\"Gentoo\", \"Little Blue\", \"Rockhopper\"], \"dragons\": [\"black\", \"white\", \"red\"]}\r\n
\r\n\r\n

YAML police

\r\n\r\n

There are no YAML police. As long as yamllint finds no errors, your YAML is valid and can be parsed by any one of the dozens of YAML libraries out there. However, these YAML libraries aren't magical, so you must understand the internal logic of your own YAML data. Keep that in mind when devising a scheme for the data you\'re recording.\r\n

\r\n\r\n

YAML is a great method for creating configuration files, or storing simple data structures, and it\'s essential for Ansible playbooks.

\r\n\r\n

\r\nEnjoy!\r\n

\r\n\r\n',78,25,0,'CC-BY-SA','yaml,data,parse,lint,json',0,0,1), (3231,'2020-12-21','USB Key',120,'Turn a Thumb drive into a Key to lock/unlock your linux machine.','

Script and instruction at
\r\nhttps://james.toebesacademy.com/USBKey.html

\r\n\r\n\r\n\r\n

Compromise was unlock, then lock if key check fails.

\r\n',273,74,0,'CC-BY-SA','security, usb',0,0,1), (3232,'2020-12-22','Nextcloud',1279,'Nextcloud is easy. You should try it.','

I've been running NextCloud since it was OwnCloud. In this episode, I encourage other people to install and run NextCloud. It\'s a great way to get out of the Google ecosystem, and it doesn\'t require much to set up or maintain.

\r\n\r\n

\r\nHere\'s the script I use to update one of the Nextcloud instances I maintain, running on a dirt-cheap VPS slice from Blue Host er something:

\r\n\r\n
\r\n#/test/before/using/bash\r\n# GNU All-Permissive License\r\n# Copying and distribution of this file, with or without modification,\r\n# are permitted in any medium without royalty provided the copyright\r\n# notice and this notice are preserved.  This file is offered as-is,\r\n# without any warranty.\r\n\r\nif [ \"${1}\" == \"--help\" ]; then\r\n    echo \"usage:\"\r\n    echo \"$0 https://path-to-nextcloud.bz2\"\r\n    echo \"WARNING: You MUST put your Nextcloud instance into maintenance mode first\"\r\n    exit\r\nfi\r\n\r\nset -e\r\n\r\n# get rid of the old Nextcloud tarball from the last time you upgraded\r\ntrash nextcloud*bz2 || true\r\n\r\n# get rid of old backups as long as they are empty of actual data\r\n[[ -e cloud/data ]] && trash cloud-deleteme\r\n\r\n#download the source tarball\r\nwget \"${1}\"\r\n\r\n#rename old cloud\r\nmv nextcloud cloud-deleteme\r\n\r\n# untar source\r\n# grab your data from old cloud\r\ntar xvf nextcloud*bz2 && mv cloud-deleteme/data/ nextcloud/\r\n\r\n# copy your config\r\ncp cloud-deleteme/config/config.php nextcloud/config/\r\n\r\n# enter the cloud\r\npushd nextcloud\r\n\r\n# perform upgrade\r\nphp ./occ upgrade\r\n\r\n# leave the cloud\r\npopd\r\n
\r\n\r\n

\r\nDon\'t use my upgrade script blindly, and please do test first. It works for my setup, but has been tested ONLY on my setup. Also, it doesn\'t put your Nextcloud instance into maintenance mode (probably because I wrote it before I knew Awk...), so you must do that manually.\r\n

\r\n\r\n

\r\nHappy hacking!\r\n

\r\n',78,74,0,'CC-BY-SA','cloud,nextcloud,owncloud,server',0,0,1), (3233,'2020-12-23','HPR RPG Club reviews Shadowrun 5e',3245,'Cyberpunk + Magic and a fistful of D6','

Beni, McNalu, Klaatu, and Philip review the Fifth Edition of the Shadowrun roleplaying game.\r\n

\r\n\r\n

For more information about Shadowrun, go to ShadowrunTabletop.com.\r\n

\r\n\r\n

\r\nQuickstart rules are available for $0 from drivethrurpg.com (this is Klaatu's affiliate link, granting him some n% of the $0 sale)\r\n

\r\n\r\n

Finally, you can find lots of great Shadowrun fiction on drivethrurpg.com in EPUB format.\r\n

\r\n\r\n',78,95,0,'CC-BY-SA','rpg,cyberpunk,HPR RPG Club',0,0,1), (3243,'2021-01-06','Pictor - free and open radio astronomy',2854,'Discussion with the people that created the Pictor radio telescope.','

In this show I talk with Apostolos and Vasilis who I met at FOSDEM 2020 about the Pictor radio telescope which they created and now maintain. Using free and open source software and hardware they have made a radio telescope that anyone can operate via a simple web page and which can return results to you within a minute or two. In fact you\'ll hear me get excited during the show when I realise this and submit an observation request, the results of which came back immediately and which you can see below.

\r\n

To date Pictor has performed 3,500 observations from over 700 users from all around the world. Additionally, the PICTOR web platform is now equipped with a 3.2m antenna, which is about 4 times more sensitive than the previous 1.5m antenna, so users can observe the radio sky for free with an even more sensitive instrument.

\r\n

On top of that, after 204 hours of integration time and over 3 TB of data, they have produced a Northern Sky Hydrogen (HI) Survey produced with the PICTOR Radio Telescope. This effort actually marks the very first radio-image obtained in Greece, shown here:

\r\n

Pictor all sky images of hydrogen in our galaxy
\r\n\"Pictor

\r\n

Here are the results of the observation I performed during the show. The body of the email pictor sent back to me confirms the observation I requested:

\r\n
Your observation has been carried out by PICTOR successfully!\r\nObservation name: mcnalu first try\r\nObservation datetime: 2020-12-08 12:40:09 (UTC+2)\r\nCenter frequency: 1420000000.0 Hz\r\nBandwidth: 2400000 Hz\r\nSample rate: 2400000 samples/sec\r\nNumber of channels: 2048\r\nNumber of bins: 100\r\nObservation duration: 10 sec\r\nObservation ID: 82937104\r\nYour observation's averaged spectrum, dynamic spectrum (waterfall) and Power vs Time plot are attached in this email as an image.\r\n
\r\n

And this is the plot attached to that email:

\r\n

Graphs showing raw and corrected radio spectra for mcnalu\'s observation request
\r\n\"Graphs

\r\n

Please do have a go at using Pictor and let us know how you got on by recording an HPR show.

\r\n',268,0,0,'CC-BY-SA','science,astronomy,hardware,radio,data',0,0,1), (3546,'2022-03-07','HPR Community News for February 2022',3665,'Dave, Roan and Ken talk about shows released and comments posted in February 2022','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n takov751.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3522Tue2022-02-01Set up your Robot Building Lab and build a $0 Robot PlatformMechatroniac
3523Wed2022-02-02The Compose keydnt
3524Thu2022-02-03Wheels Addendum - How to Reliably Attach Wheels to PAR Robot PlatformMechatroniac
3525Fri2022-02-04Battling with English - part 4Dave Morriss
3526Mon2022-02-07HPR Community News for January 2022HPR Volunteers
3527Tue2022-02-08My gEeeky Experiment - Part 3Claudio Miranda
3528Wed2022-02-09Slackware on a netbookArcher72
3529Thu2022-02-10Linux Inlaws S01E48: Year Two of the Five Year Planmonochromec
3530Fri2022-02-11Filenames and ASCIIAhuka
3531Mon2022-02-14Barrier: Software KVMWindigo
3532Tue2022-02-15Self-hosting in small scale E0: Disclaimer and general ideatakov751
3533Wed2022-02-16Porridgednt
3534Thu2022-02-17Vernier caliperKen Fallon
3535Fri2022-02-18template HaskellTuula
3536Mon2022-02-21Laptop power problemsAndrew Conway
3537Tue2022-02-22getting to blinky with flashforthBrian in Ohio
3538Wed2022-02-23Installing the Tenacity audio editorArcher72
3539Thu2022-02-24Linux Inlaws S01E50: The OpenSUSE Projectmonochromec
3540Fri2022-02-25HSV Components Layer ModesAhuka
3541Mon2022-02-28The case of missing ideas.one_of_spoons
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 9 comments on\n7 previous shows:

\n\n

This month\'s shows

\n

There are 20 comments on 10 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-February/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Older HPR shows on archive.org

\n

This month 120 additional shows in the range 1-870 have been uploaded.

\n

The number of shows left to upload in this range is now: 4.

\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3234,'2020-12-24','Apple products I have owned',1397,'I talk about Apple products that I have owned over the years','',297,0,0,'CC-BY-SA','apple, technology, Mac, OS X,iOS',0,0,1), (3242,'2021-01-05','The eternal battle over how to run your chromebook is about to begin',8865,'Squirrel VS ALIEN Chromebook discussions','

As usual, I have botched up the show notes where they make absolutely no sense and I fully expect the ENTIRE HUMAN COMMUNITY from HPR to attack me endlessly over my incompetence. They just keep forgetting that I\'m a squirrel who lives in a magical forrest and not a human being and therefore does terrible show notes,

\r\n

There were so many issues brought up about chromebooks and chromiumOS that I could not prepare a detailed list of them all.

\r\n

This ENTIRE conversation was derived from the work found on GNU WORLD ORDER episode 383 for which you will find his show notes AS::: https://gnuworldorder.info/ \"Linux, Flatpaks, Android apps, and ChromiumOS on a Lenovo Chromebook.\"

\r\n

Now, if you don\'t like my show notes and you do like this aliens show notes, then may I suggest your anti-squirrel and you need to be sent to a de-programming camp for rehabilitation.

\r\n

Remember, squirrels represent planet earth.

\r\n',377,0,1,'CC-BY-SA','chromebooks,chromiumOS,Opensource,Freesoftware,cloud computing',0,0,1), (3236,'2020-12-28','The State of Linux Audio Apps in 2020',3101,'Patrick Davila and Claudio Miranda discuss the current state of Linux Audio Application in 2020','

Pat and Claudio discuss the current state of Linux audio applications in 2020. The primary focus is applications to create music. We discuss Linux sound servers (Pulse, ALSA and Jack). Software synthesizers available in Linux. Midi, sequencers and drum machines. Digital Audio Workstation applications. Impulse Responses for guitar and bass speaker emulation. Commercial vendors that support the Linux platform. Music equipment vendors that use Linux as the basis of their products.

\r\n\r\n

\r\n
\r\nThis page has been around for years. Some links might be stale or dead.
\r\nhttps://linux-sound.org/
\r\n
\r\nSome of the sound fonts I\'ve used:
\r\nhttps://midkar.com/soundfonts/
\r\nhttps://www.pvv.org/~hammer
\r\nhttps://www.michaelpichermusic.com/sample-libraries
\r\n
\r\nMIDI/Music software discussed:
\r\nJACK (JACK Audio Connection Kit)
\r\nhttps://jackaudio.org/
\r\nQtractor
\r\nhttps://qtractor.sourceforge.io/
\r\nArdour
\r\nhttps://ardour.org/
\r\nReaper
\r\nhttps://www.reaper.fm/index.php
\r\nCarla
\r\nhttps://kx.studio/Applications:Carla
\r\nDuality Bass
\r\nhttps://audio-assault.com/duality.php
\r\n
\r\nMy Soundcloud page.
\r\nhttps://www.soundcloud.com/claudiom72
\r\n
\r\nOpen source synthesizers:
\r\nhttps://www.moddevices.com/
\r\nhttps://www.linuxsynths.com/
\r\nhttps://en.wikipedia.org/wiki/Korg_OASYS (Finally found that hardware Linux-based synth.)
\r\nhttps://synthesia.sourceforge.net/
\r\nhttps://zynthian.org/ (Don\'t remember if this was mentioned, but here it is. :-p)
\r\n
\r\nPipewire
\r\nhttps://pipewire.org/
\r\n
\r\nunfa
\r\nhttps://www.youtube.com/channel/UCAYKj_peyESIMDp5LtHlH2A\r\n

',11,0,0,'CC-BY-SA','Audio, music, recording, DAW, Ardour, Jack, Pulse, ALSA, Hydrogen, Odin2, Qtractor, Carla, VST',0,0,1), (3238,'2020-12-30','Linux Inlaws S01E20: The Xmas and New Year Special',5978,'An episode on the past, present and future not just on FOSS - all will be explained','\r\n',384,111,1,'CC-BY-SA','past, present, future, artificial intelligence, b-sides, ibm, microsoft, you fill in the rest',0,0,1), (3237,'2020-12-29','Cloning a Hard Drive with Clonezilla',1057,'I had some hard drive failures recently and am getting back to the habit of cloning for backups.','

I sneak back into the HPR community with an episode about cloning the hard drive on my laptop for a backup after some recent catastrophic drive failures.

\r\n\r\n

Links

\r\n\r\n\r\n\r\n

Credits

\r\n\r\n\r\n',238,0,0,'CC-BY-SA','clonezilla, backups, hard drives, cloning',0,0,1), (3244,'2021-01-07','Interview with Anco Scholte ter Horst CEO of Freedom Internet',4223,'Could there be an ISP that wants free and open internet, for privacy, security and quality ?','

\r\nIn this interview with Anco Scholte ter Horst, CEO Freedom Internet, we discuss the history of Internet in the Netherlands. How inspired by the work as XS4All, a new ISP was founded with privacy, security and quality at its core.\r\n

\r\n

\r\nFrom: https://en.wikipedia.org/wiki/XS4ALL\r\n

\r\n

\r\nXS4ALL was sold to KPN in December 1998, but remained an independent subsidiary. In January 2019, KPN announced that it would eventually phase out the XS4ALL brand and continue operations under the KPN brand. A petition and a special action commission was started to try to revert this decision, the petition has been signed over 50,000 times, signatories include ex-board members and founders of XS4ALL. In November 2019 the committee launched a new company named Freedom Internet, meant to serve as an ideological successor to XS4ALL, and supported by a crowdfunding action that raised 2.5 million euro. Freedom Internet initially offers e-mail hosting, and is meant to roll out its first DSL connections in early 2020.\r\n

\r\n\r\n',30,78,0,'CC-BY-SA','Freedom.nl,xs4all,ISP,crowdfunding',0,0,1), (3275,'2021-02-19','D1 Mini Close Lid to Scan',430,'Use a Wemos to monitor if the lid is open or closed on a network scanner.','

wemos-close-to-scan

\r\n

Use a Wemos to monitor if the lid is open or closed on a network scanner.

\r\n\r\n

History

\r\n

In episode hpr2430 :: Scanning books, I had a bash file trigger a network scan. This required two steps, one to close the lid and the next to press a key for scantoimage.bash to trigger the next page of the scan.

\r\n

In the intervening time I looked at several solutions to improve this situation.

\r\n

The most obvious step was to put a magnetic switch on the scanner lid so that a device could detect the lid been closed.

\r\n

I tried a Raspberry PI but my scanner drivers are only available for Intel and not Arm. Then then accessing the pi using Remote GPIO, but it got very complex to setup and run.

\r\n

Inspired by hpr3077 :: Video conference Push to Talk Hosted by DanNixon on 2020-05-19, I tried using an arduino talking over serial to a Intel Compute Stick. But that was very flakey.

\r\n

Hardware

\r\n

Finally I settled on using a Clone of LOLIN D1 mini, and some Reed Contacts.

\r\n\r\n

Wiring

\r\n

Wire one end of the reed contact to 3.3v, and the other end to ground via a 10K resistor.

\r\n

Have a sensor wire go from the 10K resistor to pin D5 on the D1 Mini.

\r\n

\"circuitdiagram\"

\r\n

\"breadboard\"

\r\n

\"photo\"

\r\n

Code

\r\n

D1 Mini

\r\n

See wemos-close-to-scan.ino

\r\n

Laptop

\r\n

See wemos-scantoimage.bash

\r\n

Operation

\r\n
    \r\n
  1. Plug in D1 Mini and monitor the serial port to get its IP Address.
  2. \r\n
  3. Change the server=\"YOUR-WEMOS-IP-ADDRESS\" in wemos-scantoimage.bash to the ip address.
  4. \r\n
  5. Change the image_path=\"/PATH/TO/YOUR/SCANS/\" in wemos-scantoimage.bash to where your want the files saved.
  6. \r\n
  7. Close scanner and scan.
  8. \r\n
\r\n',30,57,0,'CC-BY-SA','Wemos, D1 Mini, network scan',0,0,1), (3289,'2021-03-11','NextCloud the hard way',1933,'A private NextCloud instance on a Pi 4x8, with lets encrypt and wireguard vpn access','

NextCloud

\r\n

I want to install NextCloud for my family, but only for my family. This means making things hard for myself by installing it behind my firewall with a private nat ipaddress. That presented problems with getting a valid Let\'s encrypt cert.

\r\n

It all now works, and thanks to timttmy I was able to get the WireGuard VPN installed and working.

\r\n

Pi 4

\r\n

Get a Pi, and a SSD, enable it. You should review Raspberry Pi 4 USB Boot Config Guide for SSD / Flash Drives, for issues with SSD drives and the Raspberry Pi.

\r\n

You can install Raspbian as normal. I already covered this in hpr2356 :: Safely enabling ssh in the default Raspbian Image, and Safely enabling ssh in the default Raspberry Pi OS (previously called Raspbian) Image.

\r\n

And then follow the instructions in How to Boot Raspberry Pi 4 From a USB SSD or Flash Drive.

\r\n

Next Cloud

\r\n

Install Apache, MariaDB, and PHP

\r\n\r\n
# diff /etc/apache2/apache2.conf /etc/apache2/apache2.conf.orig\r\n171,172c171,172\r\n<       Options FollowSymLinks\r\n<       AllowOverride All\r\n---\r\n>       Options Indexes FollowSymLinks\r\n>       AllowOverride None
\r\n

Install PHPMyAdmin

\r\n\r\n

Required Changes to nextcloud config.

\r\n
root@nextcloud:~# diff /root/nextcloud-config.php.orig /var/www/html/nextcloud/config/config.php \r\n>     1 => 'nextcloud',\r\n>     2 => '192.168.123.123',\r\n>     3 => 'nextcloud.example.com',\r\n>   'memcache.local' => '\\OC\\Memcache\\APCu',
\r\n
# diff /etc/apache2/sites-available/000-default.conf.orig /etc/apache2/sites-enabled/000-default.conf\r\n28a29,32\r\n>         RewriteEngine On\r\n>         RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]\r\n>       Redirect 301 /.well-known/carddav /var/www/html/nextcloud/remote.php/dav\r\n>       Redirect 301 /.well-known/caldav /var/www/html/nextcloud/remote.php/dav
\r\n

Required Changes to php.ini config.

\r\n
root@nextcloud:~# diff /etc/php/7.3/apache2/php.ini.orig /etc/php/7.3/apache2/php.ini\r\n401c401\r\n< memory_limit = 128M\r\n---\r\n> memory_limit = 2000M\r\n689c689\r\n< post_max_size = 8M\r\n---\r\n> post_max_size = 2048M\r\n841c841\r\n< upload_max_filesize = 2M\r\n---\r\n> upload_max_filesize = 2048M
\r\n

Upgrade

\r\n

You can upgrade using the procedure described by klaatu in hpr3232 :: Nextcloud, or as admin via the UI https://nextcloud.example.com/nextcloud/index.php/settings/user, Administration, Overview.

\r\n

You will see a lot of Warnings on Admin Page, but don\'t panic. The server is not accessible on the Internet after all.

\r\n

The errors have links to how you can fix them and some are very easy to do.

\r\n

I got an error \"Error occurred while checking server setup\". I used this tip to move root owned files out of next cloud dir.

\r\n

For me it was mostly about enabling caching via APCU, and enabling You are accessing this site via HTTP.

\r\n

The first is fixed in the nextcloud/config/config.php page, the next is fixed by installing a valid SSL cert from Let\'s Encrypt.

\r\n

SSL Let\'s Encrypt

\r\n

Based on the following article I installed it manually.

\r\n

Obtain Let\'s Encrypt SSL Certificate Using Manual DNS Verification

\r\n

Install certbot

\r\n
# apt install certbot
\r\n

Then run the script manually specifying that the challenge should be over dns.

\r\n
# certbot certonly --manual --preferred-challenges dns \r\nSaving debug log to /var/log/letsencrypt/letsencrypt.log\r\nPlugins selected: Authenticator manual, Installer None\r\nEnter email address (used for urgent renewal and security notices) (Enter 'c' to\r\ncancel): letsencrypt@example.com\r\n\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nPlease read the Terms of Service at\r\nhttps://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must\r\nagree in order to register with the ACME server at\r\nhttps://acme-v02.api.letsencrypt.org/directory\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n(A)gree/(C)ancel: A\r\n\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nWould you be willing to share your email address with the Electronic Frontier\r\nFoundation, a founding partner of the Let's Encrypt project and the non-profit\r\norganization that develops Certbot? We'd like to send you email about our work\r\nencrypting the web, EFF news, campaigns, and ways to support digital freedom.\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n(Y)es/(N)o: n\r\nPlease enter in your domain name(s) (comma and/or space separated)  (Enter 'c'\r\nto cancel): nextcloud.example.com\r\nObtaining a new certificate\r\nPerforming the following challenges:\r\ndns-01 challenge for nextcloud.example.com\r\n\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nNOTE: The IP of this machine will be publicly logged as having requested this\r\ncertificate. If you're running certbot in manual mode on a machine that is not\r\nyour server, please ensure you're okay with that.\r\n\r\nAre you OK with your IP being logged?\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n(Y)es/(N)o: y\r\n\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nPlease deploy a DNS TXT record under the name\r\n_acme-challenge.nextcloud.example.com with the following value:\r\n\r\n0c5dbJpS5t0VKzglhdfFhZ6CGmZlLHNaNnAQe2VeJyKi\r\n\r\nBefore continuing, verify the record is deployed.\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nPress Enter to Continue
\r\n

It was at this point I went to my hosting companys page and created a subdomain called nextcloud. Then I added a TXT record called _acme-challenge with the text 0c5dbJpS5t0VKzglhdfFhZ6CGmZlLHNaNnAQe2VeJyKi.

\r\n

In order to verify that we use the command:

\r\n
# apt-get install -y dnsutils\r\n\r\n$ dig -t TXT _acme-challenge.nextcloud.example.com\r\n\r\n; <<>> DiG 9.11.5-P4-5.1+deb10u2-Debian <<>> -t TXT _acme-challenge.nextcloud.example.com\r\n;; global options: +cmd\r\n;; Got answer:\r\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39298\r\n;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1\r\n\r\n;; OPT PSEUDOSECTION:\r\n; EDNS: version: 0, flags:; udp: 4096\r\n;; QUESTION SECTION:\r\n;_acme-challenge.nextcloud.example.com. IN TXT\r\n\r\n;; ANSWER SECTION:\r\n_acme-challenge.nextcloud.example.com. 3600 IN TXT "0c5dbJpS5t0VKzglhdfFhZ6CGmZlLHNaNnAQe2VeJyKi"\r\n\r\n;; Query time: 7 msec\r\n;; SERVER: 178.21.112.12#53(178.21.112.12)\r\n;; WHEN: Thu Dec 10 16:27:53 CET 2020\r\n;; MSG SIZE  rcvd: 121\r\n
\r\n

Now that the answer section is correct we can continue with the certbot script.

\r\n
Waiting for verification...\r\nCleaning up challenges\r\n\r\nIMPORTANT NOTES:\r\n - Congratulations! Your certificate and chain have been saved at:\r\n   /etc/letsencrypt/live/nextcloud.example.com/fullchain.pem\r\n   Your key file has been saved at:\r\n   /etc/letsencrypt/live/nextcloud.example.com/privkey.pem\r\n   Your cert will expire on 2021-03-10. To obtain a new or tweaked\r\n   version of this certificate in the future, simply run certbot\r\n   again. To non-interactively renew *all* of your certificates, run\r\n   "certbot renew"\r\n - If you like Certbot, please consider supporting our work by:\r\n\r\n   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate\r\n   Donating to EFF:                    https://eff.org/donate-le
\r\n

Renew

\r\n

Unfortunately the renew is not automatic. \"You don\'t have to renew Certificate with\"renew\" option. You have to run the same command you ran for Certificate creation.\"

\r\n

So I just set up a 3 monthly recurring reminder in NextCloud to do this.

\r\n

Delete

\r\n

If you need to delete the cert you can do it as follows.

\r\n
root@nextcloud:~# certbot certificates\r\nSaving debug log to /var/log/letsencrypt/letsencrypt.log\r\n\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nFound the following certs:\r\n  Certificate Name: nextcloud.example.com\r\n    Domains: nextcloud.example.com\r\n    Expiry Date: 2021-03-10 14:28:07+00:00 (VALID: 89 days)\r\n    Certificate Path: /etc/letsencrypt/live/nextcloud.example.com/fullchain.pem\r\n    Private Key Path: /etc/letsencrypt/live/nextcloud.example.com/privkey.pem\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nroot@nextcloud:~# certbot delete\r\nSaving debug log to /var/log/letsencrypt/letsencrypt.log\r\n\r\nWhich certificate(s) would you like to delete?\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n1: nextcloud.example.com\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nSelect the appropriate numbers separated by commas and/or spaces, or leave input\r\nblank to select all options shown (Enter 'c' to cancel): 1\r\n\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\nDeleted all files relating to certificate nextcloud.example.com.\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\r\n

Apache setup

\r\n

Setting up Apache is not well explained anywhere I could find.

\r\n

The good news is that moz://a SSL Configuration Generator page takes the misery out of making tea. I mean, it will help you with your configuration. If you do like misery you can of course read the Talk:Security/Server Side TLS page.

\r\n

The most helpful articles were:

\r\n\r\n

I made the following changes:

\r\n
root@nextcloud:/etc/apache2/sites-available# diff 000-default.conf.orig 000-default.conf\r\n28a29,30\r\n>         RewriteEngine On\r\n>         RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]\r\n\r\nroot@nextcloud:/etc/apache2/sites-available# diff default-ssl.conf.orig default-ssl.conf\r\n32,33c32,33\r\n<               SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem\r\n<               SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key\r\n---\r\n>               SSLCertificateFile      /etc/letsencrypt/live/nextcloud.example.com/fullchain.pem\r\n>               SSLCertificateKeyFile   /etc/letsencrypt/live/nextcloud.example.com/privkey.pem\r\n129a130,131\r\n>               # enable HTTP/2, if available\r\n>               Protocols h2 http/1.1\r\n130a133,134\r\n>               # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)\r\n>               Header always set Strict-Transport-Security "max-age=63072000"
\r\n

Testing

\r\n

To test the cert you can connect to the localhost on the server.

\r\n
root@nextcloud:/etc/apache2/sites-available# openssl s_client -crlf -debug -connect localhost:443 -status -servername nextcloud.example.com\r\nCONNECTED(00000003)\r\nwrite to 0x643cf8 [0x652568] (321 bytes => 321 (0x141))\r\n[snip...]\r\nread from 0x643cf8 [0x6492b3] (5 bytes => 5 (0x5))\r\n0000 - 48 54 54 50 2f                                    HTTP/\r\n3069898768:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../ssl/record/ssl3_record.c:332:\r\n---\r\nno peer certificate available\r\n---\r\nNo client certificate CA names sent\r\n---\r\nSSL handshake has read 5 bytes and written 321 bytes\r\nVerification: OK\r\n---\r\nNew, (NONE), Cipher is (NONE)\r\nSecure Renegotiation IS NOT supported\r\nCompression: NONE\r\nExpansion: NONE\r\nNo ALPN negotiated\r\nEarly data was not sent\r\nVerify return code: 0 (ok)\r\n---\r\n[snip...]
\r\n

I had been using systemctl restart apache2.service to restart apache, but the recommended way is to use apache2ctl.

\r\n
root@nextcloud:/etc/apache2/sites-available# apache2ctl \r\nUsage: /usr/sbin/apache2ctl start|stop|restart|graceful|graceful-stop|configtest|status|fullstatus|help\r\n       /usr/sbin/apache2ctl <apache2 args>\r\n       /usr/sbin/apache2ctl -h            (for help on <apache2 args>)\r\n\r\nroot@nextcloud:/etc/apache2/sites-available# apache2ctl restart\r\nAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message\r\n\r\nroot@nextcloud:/etc/apache2/sites-available# apache2 -t\r\n[Thu Dec 10 18:18:49.187628 2020] [core:warn] [pid 4108] AH00111: Config variable ${APACHE_RUN_DIR} is not defined\r\napache2: Syntax error on line 80 of /etc/apache2/apache2.conf: DefaultRuntimeDir must be a valid directory, absolute or relative to ServerRoot
\r\n

For some reason that fixed it.

\r\n
# openssl s_client -crlf -debug -connect localhost:443 -status -servername nextcloud.example.com\r\nCONNECTED(00000003)\r\nwrite to 0xe4918 [0xf3188] (324 bytes => 324 (0x144))\r\n[snip...]\r\nOCSP response: \r\n======================================\r\nOCSP Response Data:\r\n    OCSP Response Status: successful (0x0)\r\n    Response Type: Basic OCSP Response\r\n    Version: 1 (0x0)\r\n    Responder Id: C = US, O = Let's Encrypt, CN = R3\r\n    Produced At: Dec 22 16:04:00 2020 GMT\r\n[snip...]\r\n---\r\nCertificate chain\r\n 0 s:CN = nextcloud.example.com\r\n   i:C = US, O = Let's Encrypt, CN = R3\r\n 1 s:C = US, O = Let's Encrypt, CN = R3\r\n   i:O = Digital Signature Trust Co., CN = DST Root CA X3\r\n---\r\nServer certificate\r\n-----BEGIN CERTIFICATE-----\r\n[snip...]
\r\n

DNS Rebind Protection

\r\n

Now that everything is up and running we just need to create a new A record pointing to our internal IP Address. Unfortunately while nextcloud.example.com resolves to 192.168.123.123 externally, it fails to return an answer internally.

\r\n

A little investigation lead to the fact that my firewall, was seeing this as a DNS Rebinding attack. It correctly blocks these DNS entires. I was able to add an exception under Network > DHCP > Rebind protection > Discard upstream RFC1918 responses.

\r\n

On your router you should check under DHCP/DNS entries for RFC1918 or DNS Rebinding.

\r\n

You can verify your install as follows:

\r\n
# apt-get install -y dnsutils\r\n\r\n$ dig nextcloud.example.com\r\n\r\n; <<>> DiG 9.16.8-Debian <<>> nextcloud.example.com\r\n;; global options: +cmd\r\n;; Got answer:\r\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29350\r\n;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1\r\n\r\n;; OPT PSEUDOSECTION:\r\n; EDNS: version: 0, flags:; udp: 4096\r\n;; QUESTION SECTION:\r\n;nextcloud.example.com.          IN      A\r\n\r\n;; ANSWER SECTION:\r\nnextcloud.example.com.   3600    IN      A       192.168.123.123\r\n\r\n;; Query time: 40 msec\r\n;; SERVER: 192.168.0.71#53(192.168.0.71)\r\n;; WHEN: Thu Dec 10 16:53:39 GMT 2020\r\n;; MSG SIZE  rcvd: 65
\r\n

Completing

\r\n

Back in the admin console you should keep upgrading, and fixing errors until it says Your version is up to date. and All checks passed.

\r\n

At this point you are ready to open the server up to your users while they are outside the home, in work or school.

\r\n

Firewall setup

\r\n

timttmy has already done an episode on WireGuard where he goes into the details of how to install it manually.

\r\n

I cheated and used the PIVPN which now supports wireguard.

\r\n

This is a good walkthrough with screenshots in the article Setting up a WireGuard VPN on the Raspberry Pi.

\r\n

Once that\'s done you should have the following commands available.

\r\n
# pivpn\r\n::: Control all PiVPN specific functions!\r\n:::\r\n::: Usage: pivpn <command> [option]\r\n:::\r\n::: Commands:\r\n:::  -a,  add              Create a client conf profile\r\n:::  -c,  clients          List any connected clients to the server\r\n:::  -d,  debug            Start a debugging session if having trouble\r\n:::  -l,  list             List all clients\r\n:::  -qr, qrcode           Show the qrcode of a client for use with the mobile app\r\n:::  -r,  remove           Remove a client\r\n:::  -h,  help             Show this help dialog\r\n:::  -u,  uninstall        Uninstall pivpn from your system!\r\n:::  -up, update           Updates PiVPN Scripts\r\n:::  -bk, backup           Backup VPN configs and user profiles\r\n
\r\n

During the install process you will select a port to use. This port needs to be allowed in from the Internet to your internal server. Where this will be done is different for every router, but have a look around for port forwarding or permit access to do this.

\r\n

Setting up Client on LineageOS

\r\n

It is at this point that you will need to have accounts created in NextCloud.

\r\n\r\n

You can do this under your profile > users in an admin account.

\r\n

I created an account for each of the family members, a generic one for the house, and a readonly one for the MagicMirror.

\r\n

The house account houses (pun intended) the shared calendar, files, and contacts. All the family accounts have read and write access to these, except for the MagicMirror one which only needs to read the calendar and contacts.

\r\n

Fdroid

\r\n

Now you can install the software you will need on your phones.

\r\n\r\n

You will need to setup the NextCloud client using the url https://nextcloud.example.com/nextcloud/, username and password.

\r\n

Then you set up DAVx using another url https://nextcloud.example.com/nextcloud/remote.php/dav, but the same , username and password.

\r\n

By the way if you want to access files you can do so via davs://nextcloud.example.com/nextcloud/remote.php/dav/files/house/

\r\n

I set up the NextCloud client to automatically upload photos, and videos to the server.

\r\n

To set up WireGuard you need to create a connection for each device connecting

\r\n
root@nextcloud:~# pivpn add\r\nEnter a Name for the Client: Mobile_Worker\r\n::: Client Keys generated\r\n::: Client config generated\r\n::: Updated server config\r\n::: WireGuard reloaded\r\n======================================================================\r\n::: Done! Mobile_Worker.conf successfully created!\r\n::: Mobile_Worker.conf was copied to /home/ken/configs for easy transfer.\r\n::: Please use this profile only on one device and create additional\r\n::: profiles for other devices. You can also use pivpn -qr\r\n::: to generate a QR Code you can scan with the mobile app.\r\n======================================================================
\r\n

Then open display the qrcode as follows:

\r\n
root@nextcloud:~# pivpn qrcode\r\n::  Client list  ::\r\n1) Mobile_Worker\r\nPlease enter the Index/Name of the Client to show: 
\r\n

Pressing 1 in my case will display the QRCode.

\r\n

Open the WireGuard app on the phone and press + to add an account, and select scan from qr code.

\r\n

Point it to QRCode and that\'s it.

\r\n

If you want to remove a client, you can just use pivpn remove

\r\n
root@nextcloud:~# pivpn remove\r\n::  Client list  ::\r\n1) Mobile_Worker\r\nPlease enter the Index/Name of the Client to be removed from the list above: 6\r\nDo you really want to delete Mobile_Worker? [Y/n] y\r\n::: Updated server config\r\n::: Client config for Mobile_Worker removed\r\n::: Client Keys for Mobile_Worker removed\r\n::: Successfully deleted Mobile_Worker\r\n::: WireGuard reloaded
\r\n

MagicMirror

\r\n

The final step is to have the MagicMirror in the living room display the shared calendar.

\r\n

To display your calendar there, you need to have an ics iCalendar file.

\r\n

You can get that by login into NextCloud as the MagicMirror user via the web, going to the calendar you desire to export. Click the ... menu and select \"Copy Private Link\".

\r\n

You can then add the ?export at the end of the url to get an ical export.

\r\n

Dave gave me a tip on how to have MagicMirror serve this file, by using its own local webserver. You point it to a local directory eg: https://localhost:8080/modules/.calendars/. Don\'t forget to create it.

\r\n
mkdir -p ~/MagicMirror/modules/.calendars/
\r\n

I wrote a script that would first get a new version of the ical file, and if it is downloaded correctly would immediately overwrite the previous one.

\r\n
[magicmirror@magicmirror ~]$ cat /home/pi/bin/cal.bash\r\n#!/bin/bash\r\nwget --quiet --output-document /home/pi/MagicMirror/modules/.calendars/home_calendar.ics.tmp --auth-no-challenge --http-user=magicmirror --http-password="PASSWORD" "https://nextcloud.example.com/nextcloud/remote.php/dav/calendars/magicmirror/personal_shared_by_House/?export" > /dev/null 2>&1\r\nif [ -s /home/pi/MagicMirror/modules/.calendars/home_calendar.ics.tmp ]\r\nthen\r\n  mv /home/pi/MagicMirror/modules/.calendars/home_calendar.ics.tmp /home/pi/MagicMirror/modules/.calendars/home_calendar.ics\r\nfi\r\n[snip...]
\r\n

I then scheduled this to run every 15 minutes.

\r\n
[magicmirror@magicmirror ~]$ crontab -l\r\n*/15 * * * * /home/pi/bin/cal.bash >/dev/null 2>&1
\r\n

The final step was to update my Calendar entry in the ~/MagicMirror/config/config.js config file.

\r\n
        // Calendar\r\n        {\r\n            module: "calendar",\r\n            header: "Calendar",\r\n            position: "top_center",\r\n            config: {\r\n                colored: true,\r\n                maxTitleLength: 30,\r\n                fade: false,\r\n                calendars: [\r\n                    {\r\n                        name: "Family Calendar",\r\n                        url: "https://localhost:8080/modules/.calendars/home_calendar.ics",\r\n                        symbol: "calendar-check",\r\n                        color: "#825BFF" // violet-ish\r\n                    },\r\n                    {\r\n                        name: "Birthday Calendar",\r\n                        url: "https://localhost:8080/modules/.calendars/birthday_calendar.ics",\r\n                        symbol: "calendar-check",\r\n                        color: "#FFCC00" // violet-ish\r\n                    },\r\n                    {\r\n                        // Calendar uses repeated 'RDATE' entries, which this iCal parser\r\n                        // doesn't seem to recognise. Only the next event is visible, and\r\n                        // the calendar has to be refreshed *after* the event has passed.\r\n                        name: "HPR Community News recordings",\r\n                        url: "https://hackerpublicradio.org/HPR_Community_News_schedule.ics",\r\n                        symbol: "calendar-check",\r\n                        color: "#C465A7" // purple\r\n                    },\r\n                    {\r\n                        // https://inzamelkalender.gad.nl/ical-info\r\n                        name: "GAD Calendar",\r\n                        url: "https://inzamelkalender.gad.nl/ical/0381200000107654",\r\n                        symbol: "calendar-check",\r\n                        color: "#00CC00" // Green\r\n                    },\r\n                ]\r\n            }\r\n        },
\r\n

The contacts birthday wasn\'t available to the MagicMirror user immediately after I created it, so I was able to force an update as follows:

\r\n
root@nextcloud:/var/www/html/nextcloud# sudo -u www-data php occ dav:sync-birthday-calendar\r\nStart birthday calendar sync for all users ...\r\n    7 [============================]
\r\n

Conclusion

\r\n

With that we have a family sharing solution just like other normal house holds. Yet with the security of knowing that the data doesn\'t leave the house, and is not being used without your approval.

\r\n

You can tell it\'s a hit, because now people are scheduling tech support tasks via the app.

\r\n

Ah well.

\r\n\r\n',30,0,1,'CC-BY-SA','NextCloud, Raspbian, Apache, mariadb, PHP, myphpadmin, wireguard, DNS Rebind, magicmirror2',0,0,1), (3246,'2021-01-11','LXCast: freeing the Fairphone 3 (and many other phones) ',1744,'We look at how to get a free smartphone operating system on the Fairphone 3 (and many other phones),','\r\n

How to install it on the FP3

\r\n\r\n

Feel free to add any comments below!

\r\n

Theme Music: Jazzhar, \"Room with a View\" CC-BY-SA, check him out on Jamendo and on Free Music Archive

\r\n',285,75,0,'CC-BY-SA','LXCast, Smartphone, Android, Fairphone, FOSS',0,0,1), (3247,'2021-01-12','Saturday Morning Automotive Routine',1110,'I have developed a relaxing 10-step routine for keeping your car in running condition.','

The top ten are:

\r\n
    \r\n
  1. Gas
  2. \r\n
  3. Tires
  4. \r\n
  5. Battery
  6. \r\n
  7. Hoses/Belts
  8. \r\n
  9. Fluids
  10. \r\n
  11. External
  12. \r\n
  13. Review dates
  14. \r\n
  15. Schedule replacement parts
  16. \r\n
  17. Clean up
  18. \r\n
  19. Choose for car wash
  20. \r\n
\r\n\r\n
    \r\n
  1. A treat!
  2. \r\n
\r\n

Blog site: https://biblicaltrumpets.org

\r\n',389,0,0,'CC-BY-SA','system,lifehack,automotive,routine maintenance',0,0,1), (3255,'2021-01-22','garage door part 2',574,'tis teh season COUGH COUGH','

garage door part 2
\r\ntis teh season COUGH COUGH

',36,0,1,'CC-BY-SA','garage door,diy,home,repair',0,0,1), (3290,'2021-03-12','GIMP: More on Layer Tools and Techniques',887,'Using some additional tools for for working with Layers in GIMP','

When working with layers you often need to use additional tools and techniques to get the results you want. We cover several of the most often used ones in this tutorial, including Transparency, Opacity, Layer Groups, and Linking Layers. You will use these frequently in working with Layers.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layers',0,0,1), (3300,'2021-03-26','YouTube Channels for Learning Spanish, Part 1',984,'My reviews of some YouTube channels offering free Spanish language lessons.','

As I have been learning Spanish I have been making use of a variety of tools and aids. One of the best is YouTube, where there is a wealth of free stuff. Of course, Spanish is not the only language with good resources here, but it is the one I am studying right now. But if you are interested in learning another language, or improving your knowledge of one, you should take a look.

\r\n

Links:

\r\n\r\n',198,116,0,'CC-BY-SA','Spanish, Language learning, YouTube',0,0,1), (3310,'2021-04-09','Layer Masks',970,'We begin our look at a key tool in GIMP, Layer Masks','

One of the key tools in GIMP is Layer Masks, which allow you to make selected parts of a layer transparent, so that lower layers can come through. This is a way to get the same kinds of effects you would get with physical transparency sheets or animation gels.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layers, Layer Masks',0,0,1), (3320,'2021-04-23','YouTube Channels for Learning Spanish, Part 2',873,'My reviews of some YouTube channels offering free Spanish language lessons.','

As I have been learning Spanish I have been making use of a variety of tools and aids. One of the best is YouTube, where there is a wealth of free stuff. Of course, Spanish is not the only language with good resources here, but it is the one I am studying right now. But if you are interested in learning another language, or improving your knowledge of one, you should take a look. This is the second part covering some additional channels

\r\n

Links:

\r\n\r\n',198,116,0,'CC-BY-SA','Spanish, Language learning, YouTube',0,0,1), (3330,'2021-05-07','A Layer Mask Project',934,'We apply our knowledge of Layer Masks to create a project.','

This tutorial has us applying our knowledge of Layer Masks in combination with some other tools to make an image. We start with a photograph, and transform it into something very different, as a way to practice our GIMP skills.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layers, Layer Masks',0,0,1), (3340,'2021-05-21','Hacked?',603,'People commonly say that their own, or someone else\'s, Facebook has been hacked.','

As someone who has reasons to be on Facebook, I have gotten used to seeing people warn that their account was hacked, and we should not accept friend requests from them. It is so common that you would wonder if Facebook had no security at all. But the truth is something different, and worth knowing about.

\r\n

Links:

\r\n\r\n',198,74,0,'CC-BY-SA','Facebook, scams',0,0,1), (3249,'2021-01-14','Linux Inlaws S01E21: The Big Linux Inlaws Peep Show',3165,'The two chaps go the full monty and reveal it all','\r\n',384,111,1,'CC-BY-SA','Nudity, tracing, debugging, extended berkeley packet filter, weapons of math destruction',0,0,1), (3251,'2021-01-18','Opposing Views on Alcohol',1840,'Windigo and Mrs. Honeyhume discuss their views on alcohol','

I discuss the subject of alcohol with my partner of sixteen years, Mrs. Honeyhume. While we agree on many subjects, alcohol is not one of them.

\r\n

She believes alcohol is an important experience, one to be shared with friends, and I dislike nearly everything about it.

\r\n

We discuss what we like/dislike about alcohol, our histories with it, and present our personal anecdotal evidence.

',196,0,1,'CC-BY-SA','alcohol',0,0,1), (3350,'2021-06-04','Blending Layers',1321,'GIMP has a number of ways you can blend layers together','

This tutorial begins our discussion of how you can blend entire layers in GIMP, starting with changing the opacity of layers, then moving into Layer Modes, which use mathematical functions to allow more complex combinations to achieve certain effects. We discuss the mathematics as a background to more discussion in subsequent tutorials of the specific Layer Modes.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layers, Layer Modes, Opacity',0,0,1), (3360,'2021-06-18','Android Malware Alert',665,'A look at some security issues in Android','

A type of malware nicknamed Joker has been infecting Android devices. In this episode we dig a little deeper into what this is and how it works.

\r\n

Links:

\r\n\r\n',198,74,0,'CC-BY-SA','Android, malware',0,0,1), (3370,'2021-07-02','More Free Images?',869,'We look at some more free photo sites to see if they are really free','

This tutorial adds to our discussion of freely usable photos by looking at a list compiled on the blog of a marketing site Twenty Over Ten. They gave us their top 15 sites, but can I recommend them unreservedly? Not necessarily, you have to dig into each one of them to get to the truth.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','Stock Photos, Creative Commons, Free Photos',0,0,1), (3380,'2021-07-16','Building a Better Goodreads with ActivityPub',698,'This episode looks at the popular application Goodreads to see if it can be done better.','

Federated social media can open up some wonderful possibilities to reimagine some of the social apps we already use and find ways to do them better. In this episode I want to highlight a talk that aimed at such a reimagining involving an app I already use, Goodreads. My main use of it is to manage my book library, but it also involves a social aspect where you can be friends with people and share book reviews, recommendations, and so on. So seeing how this can be done differently with ActivityPub was very interesting to me.

\r\n

Links:

\r\n\r\n',198,108,0,'CC-BY-SA','social media, alternative, Fediverse, ActivityPub, Goodreads, library',0,0,1), (3248,'2021-01-13','SARS-CoV-2 detection by PCR explanation',1464,'This episode summarizes the process to detect the virus that causes COVID-19 by PCR','

Basic Process

\r\n
    \r\n
  1. Sample Collection
  2. \r\n
  3. Sample Transportation
  4. \r\n
  5. Nucleic Acid extraction and Purification
  6. \r\n
  7. Amplification and Detection
  8. \r\n
\r\n

Links

\r\n\r\n',300,100,0,'CC-BY-SA','PCR,COVID019',0,0,1), (3252,'2021-01-19','Simple JSON querying tool (also YAML, and to a lesser extent XML)',1137,'crvs talks about jq, yq and xq','

JSON

\r\n

Json is a cool little data serialization language, that allows you to easily and clearly demarcate blocks of data by nesting data structures such as lists (enclosed by square brackets) and key-value pairs or \"dictionaries\" (enclosed by curly braces). So that in the end you get something that looks like this

\r\n
{\r\n"first list" : [ "element1", "element2", {"element3" : "is another k-v pair", "but contains" : ["a" , "list", "of", "words"]}] ,\r\n"this value is a string" : "1" ,\r\n"and this is a number" : 23 ,\r\n"and floating point" :  1.413\r\n}
\r\n

Aside from:

\r\n\r\n

There are no restrictions to what you can do with JSON. Given how explicit the syntax is then, it makes for very easy parsing, and there are plenty of good parser out there. My favourite JSON parser is jq(1).

\r\n

A canonical representation of the JSON example above can easily be obtained with jq by simply calling jq \'\' file.json (or piping the file through stdin, or even putting the contents properly quoted as the second argument).

\r\n
{\r\n  "first list": [\r\n    "element1",\r\n    "element2",\r\n    {\r\n      "element3": "is another k-v pair",\r\n      "but contains": [\r\n        "a",\r\n        "list",\r\n        "of",\r\n        "words"\r\n      ]\r\n    }\r\n  ],\r\n  "this value is a string": "1",\r\n  "and this is a number": 23,\r\n  "and floating point": 1.413\r\n}
\r\n

You can also use jq in a shell script to obtain, for example the second element of the first list:

\r\n
$ jq '."first list"[1]' example.json\r\n"element2"
\r\n

So to get the value associated to a key you use the notation .key and to get the k-th element you use the notation [k-1]. To remove the quotes on the string you can use the -r flag which stands for raw output.

\r\n

jq(1) also gives you a few more functionalities that can be useful like getting the number of elements in a list with the length function.

\r\n
$ jq 'length'  example.json\r\n3\r\n$ jq '."first list"[2]."but contains" | length'\r\n4
\r\n

Another useful feature is getting the list of keys from a key-value pair list which can be done with the function keys

\r\n
$ jq '."first list"[2] | keys[]' example.json\r\n"but contains",\r\n"element3"
\r\n

The query language is much much more flexible than this, but for most cases this should be enough for simple configuration querying.

\r\n

YAML and XML??

\r\n

The yq project allows one to use the exact same syntax as jq to query, and emit (and therefore also transcode) yaml and XML, extending the usefulness of the query language.

\r\n

So for example looking at the previous file through yq gives:

\r\n
$ yq -y '' example.json\r\nfirst list:\r\n  - element1\r\n  - element2\r\n  - element3: is another k-v pair\r\n    but contains:\r\n      - a\r\n      - list\r\n      - of\r\n      - words\r\nthis value is a string: '1'\r\nand this is a number: 23\r\nand floating point: 1.413
\r\n

And the output of this can be of course queried with yq itself, or can be used to feed into whatever application requires a yaml input (I guess it lacks the triple dash at the top, but that is actually the only warning I get from passing that abomination to yamllint)

\r\n

Similarly xq can be used to query XML files with the same language. However, to emit these files from json you need to use yq -x like so:

\r\n
$ yq -x '' example2.json\r\n<file>\r\n  <first_list>element1</first_list>\r\n  <first_list>element2</first_list>\r\n  <first_list>\r\n    <element3>is another k-v pair</element3>\r\n    <but_contains>a</but_contains>\r\n    <but_contains>list</but_contains>\r\n    <but_contains>of</but_contains>\r\n    <but_contains>words</but_contains>\r\n  </first_list>\r\n  <this_value_is_a_string>1</this_value_is_a_string>\r\n  <and_this_is_a_number>23</and_this_is_a_number>\r\n  <and_floating_point>1.413</and_floating_point>\r\n</file>
\r\n

where the original (modified) file example2.json looks like:

\r\n
{\r\n    "file":\r\n    {\r\n      "first_list": [\r\n        "element1",\r\n        "element2",\r\n        {\r\n          "element3": "is another k-v pair",\r\n          "but_contains": [\r\n            "a",\r\n            "list",\r\n            "of",\r\n            "words"\r\n          ]\r\n        }\r\n      ],\r\n      "this_value_is_a_string": "1",\r\n      "and_this_is_a_number": 23,\r\n      "and_floating_point": 1.413\r\n    }\r\n}
\r\n

So that the root dictionary has a single key-value pair and all the keys have no spaces in them (so that they can be made into xml tags).

\r\n',385,0,1,'CC-BY-SA','json, yaml, xml, query',0,0,1), (3253,'2021-01-20','Pandas Intro',1241,'Enigma introduces one of his favorite python modules pandas','

\r\nWelcome to another episode of HPR I\'m your host Enigma and today we are going to be talking\r\nabout one of my favorite python modules Pandas
\r\nThis will be the first episode in a series I\'m naming: For The Love of Python.
\r\n
\r\nFirst we need to get the module
\r\npip or pip3 install pandas
\r\nThis will install numpy as well
\r\nPandas uses an object called a dataframe which is a two-dimensional data structure,
\r\ni.e., data is aligned in a tabular fashion in rows and columns. Think of a spreadsheet type object in memory\r\n

\r\nToday we are going to talk about:
\r\n1) Importing data from various sources
\r\nCsv, excel, sql. More advance topics like Json covered in another episode.
\r\ndf = pd.read_csv(\'file name\')
\r\n
\r\n2) Accessing data by column names or positionally
\r\nprint(df.head(5)) # print all columns only first 5 rows
\r\nprint(df.tail(5)) # print all columns only last 5 rows
\r\nprint(df.shape) # print number of rows and columns in dataframe
\r\nprint(df.columns) print column names
\r\nprint(df[0:1].head(5)) print first two columns first 5 values by column position
\r\nprint(df[\'field1].head(5)) print same column first five values by column name
\r\n
\r\n3) Setting column types.
\r\ndf[\'FieldName\'] = df[\'FieldName\'].astype(int) # sets column as interger
\r\ndf[\'FieldName\'] = df[\'FieldName\'].astype(str) # sets column to string
\r\ndf[\'DateColumn\'] = pd.to_datetime(df[\'DateColumn\']) # sets column to Datetime
\r\n
\r\n
\r\n4) Some basic filtering/manipulation of data.
\r\nSplits string at the @ for one split next two lines create 2 columns that use the pieces.
\r\nnew = df2[\"Email\"].str.split(\"@\", n = 1, expand = True)
\r\ndf2[\"user\"]= new[0]
\r\ndf2[\"domain\"]= new[1]
\r\n
\r\ndf[\'col\'] = df[\'Office\'].str[:3] # creates a new column grabing the first 3 positions of Office column
\r\ndf = df[df[\'FieldName\'] != 0] # Only keep rows that have a FieldName value not equal to zero
\r\n
\r\nSee example code that you can run at:
\r\n Pandas Working example \r\n

',39,38,0,'CC-BY-SA','python, data analytics, data science',0,0,1), (3256,'2021-01-25','Update, MS Teams, Covid 19, Raspberry PI 400 Raspberry PI 4 8GB Centos',539,'Hey guys just a short update, whats going with Centos? Raspberry PI 400 Good buy','

Hey guys I have been doing a lot of MS Teams it works on Linux not so I can have 365 on my ubuntu browser and MS teams installed. (Work complete from a linux box) (It\'s great) The Raspberry PI400 is a great box you should get it. Also I thought the Raspberry 4 8GB to be very solid.

\r\n',129,0,0,'CC-BY-SA','Centos, Oracle linux, MS Teams, Covid, Raspberry, PI 400',0,0,1), (3257,'2021-01-26','Lack of diversity in Linux and other open source communities',714,'I consider some reasons that there is a lack of diversity when it comes to open source communities. ','
    \r\n
  1. Why is there a lack of diverse voices and faces in the world of Linux and open source
  2. \r\n
  3. Free software but it\'s not made available to the very people who could really benefit from it
  4. \r\n
  5. Lack of training in schools when it comes to Linux and other open source software
  6. \r\n
',297,0,0,'CC-BY-SA','linux, race, podcast',0,0,1), (3259,'2021-01-28','Nextcloud - The easy way',482,'Self hosting a Nextcloud instance.','

https://peyanski.com/personal-cloud-from-home-nextcloud-on-raspberry-pi/#Nextcloud_initial_setup

\r\n
sudo apt-get update && sudo apt-get upgrade -y
\r\n

Start the Nextcloud on Raspberry Pi installation with the following script.

\r\n
curl -sSL https://raw.githubusercontent.com/nextcloud/nextcloudpi/master/install.sh | sudo bash
\r\n

Github script content

\r\n

https://raw.githubusercontent.com/nextcloud/nextcloudpi/master/install.sh

\r\n
\r\n#!/bin/bash\r\n\r\n# NextCloudPi installation script\r\n#\r\n# Copyleft 2017 by Ignacio Nunez Hernanz <nacho _a_t_ ownyourbits _d_o_t_ com>\r\n# GPL licensed (see end of file) * Use at your own risk!\r\n#\r\n# Usage: ./install.sh\r\n#\r\n# more details at https://ownyourbits.com\r\n\r\nBRANCH=master\r\n#DBG=x\r\n\r\nset -e$DBG\r\n\r\nTMPDIR="$(mktemp -d /tmp/nextcloudpi.XXXXXX || (echo "Failed to create temp dir.\r\nExiting" >&2 ; exit 1) )"\r\ntrap "rm -rf "${TMPDIR}" ; exit 0" 0 1 2 3 15\r\n\r\n[[ ${EUID} -ne 0 ]] && {\r\n  printf "Must be run as root. Try 'sudo $0'n"\r\n  exit 1\r\n}\r\n\r\nexport PATH="/usr/local/sbin:/usr/sbin:/sbin:${PATH}"\r\n\r\n# check installed software\r\ntype mysqld  &>/dev/null && echo ">>> WARNING: existing mysqld configuration\r\nwill be changed <<<"\r\n\r\n# get install code\r\necho "Getting build code..."\r\napt-get update\r\napt-get install --no-install-recommends -y wget ca-certificates sudo lsb-release\r\n\r\npushd "$TMPDIR"\r\nwget -qO- --content-disposition\r\nhttps://github.com/nextcloud/nextcloudpi/archive/"$BRANCH"/latest.tar.gz\r\n  | tar -xz\r\n  || exit 1\r\ncd - && cd "$TMPDIR"/nextcloudpi-"$BRANCH"\r\n\r\n# install NCP\r\necho -e "nInstalling NextCloudPi..."\r\nsource etc/library.sh\r\n\r\n# check distro\r\ncheck_distro etc/ncp.cfg || {\r\n  echo "ERROR: distro not supported:";\r\n  cat /etc/issue\r\n  exit 1;\r\n}\r\n\r\n\r\nmkdir -p /usr/local/etc/ncp-config.d/\r\ncp etc/ncp-config.d/nc-nextcloud.cfg /usr/local/etc/ncp-config.d/\r\ncp etc/library.sh /usr/local/etc/\r\ncp etc/ncp.cfg /usr/local/etc/\r\n\r\ninstall_app    lamp.sh\r\ninstall_app    bin/ncp/CONFIG/nc-nextcloud.sh\r\nrun_app_unsafe bin/ncp/CONFIG/nc-nextcloud.sh\r\nsystemctl restart mysqld # TODO this shouldn't be necessary, but somehow it's\r\nneeded in Debian 9.6. Fixme\r\ninstall_app    ncp.sh\r\nrun_app_unsafe bin/ncp/CONFIG/nc-init.sh\r\nbash /usr/local/bin/ncp-provisioning.sh\r\n\r\npopd\r\n\r\nIFACE="$( ip r | grep "default via" | awk '{ print $5 }' | head -1 )"\r\nIP="$( ip a show dev "$IFACE" | grep global | grep -oP 'd{1,3}(.d{1,3}){3}' |\r\nhead -1 )"\r\n\r\necho "Done.\r\n\r\nFirst: Visit https://$IP/  https://nextcloudpi.local/ (also\r\nhttps://nextcloudpi.lan/ or https://nextcloudpi/ on windows and mac)\r\nto activate your instance of NC, and save the auto generated passwords. You may\r\nreview or reset them\r\nanytime by using nc-admin and nc-passwd.\r\nSecond: Type 'sudo ncp-config' to further configure NCP, or access ncp-web on\r\nhttps://$IP:4443/\r\nNote: You will have to add an exception, to bypass your browser warning when you\r\nfirst load the activation and :4443 pages. You can run letsencrypt to get rid of\r\nthe warning if you have a (sub)domain available.\r\n"\r\n\r\nexit 0\r\n\r\n# License\r\n#\r\n# This script is free software; you can redistribute it and/or modify it\r\n# under the terms of the GNU General Public License as published by\r\n# the Free Software Foundation; either version 2 of the License, or\r\n# (at your option) any later version.\r\n#\r\n# This script is distributed in the hope that it will be useful,\r\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n# GNU General Public License for more details.\r\n#\r\n# You should have received a copy of the GNU General Public License\r\n# along with this script; if not, write to the\r\n# Free Software Foundation, Inc., 59 Temple Place, Suite 330,\r\n# Boston, MA  02111-1307  USA\r\n
\r\n

DuckDNS

\r\n

https://www.duckdns.org

\r\n

Enter trusted domain

\r\n

NextCloudPi panel
\r\n\"NextCloudPi

\r\n

Trusted domain 1
\r\n\"Trusted

\r\n

Trusted domain 2
\r\n\"Trusted

\r\n

Certbot script

\r\n
sudo apt install certbot python-certbot-apache -y\r\n\r\nsudo certbot --apache
\r\n

Customization External storage support

\r\n

Apps > Disabled Apps > External Storage Support > Enable

\r\n

Apps 1
\r\n\"Apps

\r\n

Apps 2
\r\n\"Apps

\r\n

Settings
\r\n\"Settings\"

\r\n

External storage
\r\n\"External

\r\n

Dark mode support

\r\n

Apps 3
\r\n\"Apps

\r\n',318,0,0,'CC-BY-SA','self hosting, cloud, linux, raspberry pi',0,0,1), (3254,'2021-01-21','The Markdown editor Retext',1494,'In this episode I cover the markdown editor ReText. I found this useful when creating show notes','

What is ReText?

\r\n

The ReText website on GitHub says that ReText is a simple but powerful editor for Markdown and reStructuredText markup languages.

\r\n

Doing a search on the HPR site returned the following two references to ReText.

\r\n

The excellent Markdown and Pandoc HPR 1832 episode by b-yeezi makes reference to ReText

\r\n

Dave Morriss mentioned using ReText as a possible tool when sending in shownotes as markdown is preferable to plain text. Refer to HPR 3167

\r\n

Retext Version Info

\r\n

As of the 1st of January 2021 I am running ReText version 7.0.1 the latest version was 7.1.0 this was last updated on the 4th of April 2020.

\r\n

Why I am covering this

\r\n

I’m covering this because in HPR show 3167 Dave Morriss said that Markdown was a preferred way to submit shownotes. Prior to this I had supplied my shownotes in plain text.

\r\n

What is Markdown?

\r\n

I guess I first must cover what markdown is I found the following definitions:-

\r\n

Description of Markdown from Wikipedia

\r\n

Markdown is a lightweight markup language for creating formatted text using a plain-text editor. John Gruber and Aaron Swartz created Markdown in 2004 as a markup language that is appealing to the human users in its source form.[9] Markdown is widely used in blogging, instant messaging, online forums, collaboration software, documentation pages, and even readme files Link https://en.wikipedia.org/wiki/Markdown

\r\n

Description of Markdown from John Gruber\'s website, one of the co founders of Markdown.

\r\n

Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).

\r\n

Example text used in the show and how it looks

\r\n
# This is a level 1 heading\r\n\r\n## This is a level 2 heading\r\n\r\n### This is a level 3 heading\r\n
\r\n

This is a level 1 heading

\r\n

This is a level 2 heading

\r\n

This is a level 3 heading

\r\n

List of useful links

\r\n

Finally here are useful links that are available from within the ReText program. They can be found within the Help / About ReText menu:-

\r\n

Link to ReText website

\r\n

Link to Markdown syntax

\r\n

Link to reStructuredText syntax

\r\n

Final thoughts

\r\n\r\n',201,0,1,'CC-BY-SA','Markdown, HPR, shownotes',0,0,1), (3265,'2021-02-05','My Chromebook Experience',525,'Adding my own perspective to the Chromebook discussion','

On January 5, 2021, Zen_Floater2 did an interesting show that you might call a virtual conversation with Klaatu. He took a show that Klaatu had done on the GNU World Order podcast about using Chromebooks, and interspersed his own comments. As I was listening I thought that I had a slightly different perspective, so I recorded this brief show about my own experience.

\r\n

Links

\r\n\r\n',198,0,0,'CC-BY-SA','Chromebooks',0,0,1), (3258,'2021-01-27','Linux Inlaws S01E22: The Linux Professional Institute',4129,'The chaps host Evan Leibovitch from the LPI','\r\n',384,111,1,'CC-BY-SA','Java screw-up, Linux Professional Institute, Zombies, Grumpies',0,0,1), (3262,'2021-02-02','My thoughts on diversity in Linux and open source',2010,'I give some of my background story and certain frustrations I have experienced in life','
    \r\n
  1. Lack of exposure to Linux and open source
  2. \r\n
  3. Lack of interest in Linux and open source
  4. \r\n
  5. Some experiences I had growing up
  6. \r\n
',297,0,0,'CC-BY-SA','linux, race, podcast, irc, telegram, technology, culture',0,0,1), (3263,'2021-02-03','My Beginnings in Tech',1157,'Rambling about how I got in to technology and linux.','

Hiya! There aren\'t any links or anything to put here, but putting something in the show notes seems important.

',390,0,1,'CC-BY-SA','Introduction, Linux, First Show',0,0,1), (3264,'2021-02-04','Intro to Nagios',1200,'Introduce some nagios basics and walk through setting up nagios on Ubuntu','

Nagios Basics

\r\n

Introduction

\r\n

I noticed nagios on the requested topics page. I am far from being an expert with nagios and there is a lot I do not know. I have a working knowledge of most of the basic nagios principles. So, hopefully, I can give a useful introduction and review some one the principles of nagios along the way

\r\n

Nagios is a network monitoring tool. You define some things for nagios to check, and nagios will alert you if those checks fail.

\r\n

Nagios has a web UI that is normally used to see the status of the checks. There are some basic administration tasks you can do from the web UI

\r\n\r\n

Nagios is primarily configured with text files. You have to edit the nagios config files for things like

\r\n\r\n

Nagios core vs NagiosXI

\r\n

NagiosXI is the commercial version of nagios. NagiosXI requires a paid license and includes support. NagiosXI has some extra features including wizards for adding hosts and easy cloning of hosts.

\r\n

I have used NagiosXI, and personally don\'t find the extra features very useful. Probably the biggest reason to use NagiosXI is Enterprise that requires commercial support

\r\n

The community version of nagios is normally referred to as nagios core This episode will focus on the nagios core

\r\n

Nagios Documentation

\r\n

I don\'t like the official nagios core documentation. A lot like man pages, It is a good reference, but can be hard to follow.

\r\n

Maybe is it possible for someone to read the documentation and be able to install and configure nagios for the first time. But it took me a lot of trial and error to get a functional nagios server following the nagios documentation

\r\n

Outside of the official documentation, Most of the nagios installation guides I found online recommend downloading and building nagios from the nagios site. My general policy is to use OS provided packages whenever possible. Normally, sticking to packages eases long the term maintenance.

\r\n

You may not always get the latest feature release, but installation and updates are usually easier. I know not everyone will agree with me here, and will want to build the latest version. Regardless of the install method, most of the nagios principles I go over will still apply

\r\n

I am making the assumption that most listeners will be most familiar with Debian/Ubuntu, so I will go over installing nagios on Ubuntu using the nagios packages from the Ubuntu repository

\r\n

Hosts and Services

\r\n

Before I go over the installation, I\'ll talk a bit about some of the pieces that make up nagios Nagios checks are for either hosts or services.

\r\n

From the Nagios documentation

\r\n
\r\n

A host definition is used to define a physical server, workstation, device, etc. that resides on your network.

\r\n
\r\n

Also from the nagios documentation

\r\n
\r\n

A service definition is used to identify a \"service\" that runs on a host. The term \"service\" is used very loosely. It can mean an actual service that runs on the host (POP, SMTP, HTTP, etc.) or some other type of metric associated with the host

\r\n
\r\n

Normally, hosts are checked using ping. If the host responds to the ping with in the specified time frame, the host is considered up. Once a host is defined and determined to be UP, you can optionally check services on that host

\r\n

Installation and setup

\r\n

Install the packages

\r\n
apt install nagios4
\r\n

One of the dependencies is the monitoring-plugins I\'ll talk more about the monitoring-plugins package when we dig in to the checks

\r\n

The primary UI for nagios is a cgi driven web app usually served via apache. Following the nagios4 installation, the web UI isn\'t functional. So we need to make a few configuration changes

\r\n

The nagios config file for apache contains a directive that is not enabled by default

\r\n

Enable 2 Apache modules

\r\n
a2enmod authz_groupfile\r\na2enmod auth_digest\r\nsystemctl restart apache2
\r\n

Nagios authentication

\r\n

Enable users in the nagios UI

\r\n

In /etc/nagios4/cgi.cfg change the line

\r\n
'use_authentication=0'
\r\n

to

\r\n
'use_authentication=1'
\r\n

Modify Apache

\r\n

In /etc/apache2/conf-enabled/nagios4-cgi.conf change

\r\n
Require all granted
\r\n

to

\r\n
Require valid-user
\r\n

And if needed, remove the IP restriction by removing the line that starts with

\r\n
Require ip
\r\n

And finally we need to add a nagios basic auth user. I normally use nagiosadmin, but it can be any username

\r\n
htdigest  -c /etc/nagios4/htdigest.users Nagios4 nagiosadmin
\r\n

Restarts

\r\n

Restart apache and nagios and the nagios UI will be fully functional

\r\n

Check commands

\r\n

Nagios uses a collection of small standalone executables to perform the checks. Checks are either OK, Warning, or Critical, depending on the exit code of the check.

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Exit CodeStatus
0OK/UP
1WARNING
2CRITICAL
\r\n

The check commands are standalone applications that can be run independent from nagios. Running the checks from the shell is helpful to better understand how the nagios checks work. The location of the check commands can vary depending on how nagios was packaged. In this case, they are in /usr/lib/nagios/plugins

\r\n

Looking at the names on the files can give you an idea of their purpose. For example, it should be obvious what check_http and check_icmp are for.

\r\n
cd /usr/lib/nagios/plugins\r\n$ ./check_icmp localhost\r\nOK - localhost: rta 0.096ms, lost 0%|rta=0.096ms;200.000;500.000;0; pl=0%;40;80;; rtmax=0.218ms;;;; rtmin=0.064ms;;;;\r\n$ ./check_http localhost\r\nHTTP OK: HTTP/1.1 200 OK - 10977 bytes in 0.005 second response time |time=0.004558s;;;0.000000;10.000000 size=10977B;;;0
\r\n

Most checks can be run with -h to print usage help

\r\n

The checks can be in any language as long as is it is executable by the nagios server. Many are compiled C but Perl and shell scripts are also common

\r\n
file check_icmp\r\ncheck_icmp: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=46badf6e4322515a70d5553c8018a20e1e9b8206, for GNU/Linux 3.2.0, stripped
\r\n

Nagios config files

\r\n

The primary nagios config file is /etc/nagios4/nagios.cfg

\r\n

nagios.cfg has a directive that will load additional user generated files

\r\n
cfg_dir=/etc/nagios4/conf.d
\r\n

I like to put all my additions to nagios in this directory and use git for both version control and backup.

\r\n

Nagios commands

\r\n

Nagios doesn\'t run the check executable directly The checks have to be explicitly defined in as a command Some predefined commands are in /etc/nagios4/objects/commands.cfg

\r\n

Debian package monitoring-plugins-basic contains several command definitions that are loaded by nagios.cfg cfg_dir=/etc/nagios-plugins/config

\r\n

Lets look in the /etc/nagios-plugins/config at ping.cfg for an example of how commands are defined

\r\n
# 'check-host-alive' command definition\r\ndefine command{\r\n    command_name    check-host-alive\r\n    command_line    /usr/lib/nagios/plugins/check_ping -H '$HOSTADDRESS$' -w 5000,100% -c 5000,100% -p 1\r\n    }
\r\n

Commands require command_name and command_line The command line is that path to the executable that will perform the check and optional arguments. Most checks require -H for the host address to check The check-host-alive command also contains arguments to set the critical and warning thresholds with -c and -w

\r\n

The check_ping command is similar the check-host-alive command except it requires 2 arguments to set the critical and warning thresholds.

\r\n
define command{\r\n        command_name    check_ping\r\n        command_line    /usr/lib/nagios/plugins/check_ping -H '$HOSTADDRESS$' -w '$ARG1$' -c '$ARG2$'\r\n        }
\r\n

Templates

\r\n

Hosts and services require a lot of reused variables. Object definitions normally use templates to avoid having to repetitively set the same variables on each host. Nagios normally ships with predefined templates for hosts and services that will work for most cases.

\r\n

In Ubuntu, the templates are defined in /etc/nagios4/objects/templates.cfg. Template definitions are the same as other object definitions, except they contain register 0 which designates the object as a template. I\'ll show how the templates are used when I go over the host and service definitions.

\r\n

Notifications

\r\n

By default, notifications are sent via email to nagios@localhost. The easiest way to get notifications is to configure the nagios server to forward emails to a monitored email address. Since many networks block sending email directly via SMTP, email forwarding may be challenging.

\r\n

In a follow up episode I will cover setting up postfix to relay mail through a mail sending service and maybe some other methods for sending alerts

\r\n

Localhost

\r\n

By default, nagios is set to monitor localhost. Having the nagios server can be useful but you probably want to add some additional servers.

\r\n

Have a look at /etc/nagios4/objects/localhost.cfg if you want to see how the checks for localhost are defined

\r\n

Adding a new host to monitor

\r\n

We will use google.com as an example and create a file named google.cfg and place it in in the cfg_dir /etc/nagios4/conf.d.

\r\n

The files can be named anything that ends in .cfg. My preference is one file per host that contains all the checks for that host. The content of google.cfg is included new the end of the show notes.

\r\n

First, we need to define the host. host_name is the only field required to be set. The remaining requirements are met by using the generic-host template.

\r\n

We can add a service check to google.com using the same file. The easiest to add is a http check host_name, service_description, and check_command have to be set the remaining requirements are met by using the generic-service template.

\r\n

Restarting Nagios

\r\n

Nagios has to be reloaded to pick up the configuration changes. Prior to restarting nagios, you can verify the nagios configuration is valid by running:

\r\n
nagios4 -v /etc/nagios4/nagios.cfg
\r\n

This will print a summary of the configuration. Any warnings or errors will be printed at the end.

\r\n

Warnings are not fatal, but should probably be looked at. Errors will keep nagios from restarting; if there are no errors, it is safe to restart nagios

\r\n

Check the nagios UI at https://SERVER_IP/nagios4 and you should see 2 hosts, localhost and google.com as well as the service checks for the hosts

\r\n

Next Episode

\r\n

Since I have already made the mistake of mentioning a follow up episode, I know I am now committed to making additional episode, Next time I will try to cover some enhancements to nagios, including

\r\n\r\n

Leave a comment if there are other aspects of nagios you would like me to try to cover. No promises, but I will do my best.

\r\n

Thanks for listening and I will see you next time.

\r\n

Files

\r\n

Playbook

\r\n
---\r\n- hosts: nagios\r\n  tasks:\r\n  - name: install nagios\r\n    apt:\r\n      name:\r\n        - nagios4\r\n      update_cache: yes\r\n\r\n  - name: Enable the Apache2 modules\r\n    command: a2enmod "{{item}}"\r\n    with_items:\r\n    - authz_groupfile\r\n    - auth_digest\r\n  - name: modify nagios cgi config to require user\r\n    replace:\r\n      path: /etc/nagios4/cgi.cfg\r\n      regexp: 'use_authentication=0'\r\n      replace: 'use_authentication=1'\r\n  - name: nagios require valid user\r\n    replace:\r\n      path: /etc/apache2/conf-enabled/nagios4-cgi.conf\r\n      regexp: "Require all  granted"\r\n      replace: "Require valid-user"\r\n  - name: remove IP restriction\r\n    lineinfile:\r\n      regexp: "Require ip"\r\n      path: /etc/apache2/conf-enabled/nagios4-cgi.conf\r\n      state: absent\r\n  - name: move auth requirements out of File restrictions\r\n    lineinfile:\r\n      path: /etc/apache2/conf-enabled/nagios4-cgi.conf\r\n      regexp: '^s*</?Files'\r\n      state: absent\r\n  - name: nagios user\r\n    copy:\r\n      dest: /etc/nagios4/htdigest.users\r\n      src: htdigest.users\r\n  - name: restart apache\r\n    service:\r\n      name: apache2\r\n      state: restarted\r\n  - name: copy nagios configs\r\n    copy:\r\n      src: "{{item}}"\r\n      dest: /etc/nagios4/conf.d\r\n    with_items:\r\n      - google.cfg\r\n  - name: restart nagios\r\n    service:\r\n      name: nagios4\r\n      state: restarted
\r\n

google.cfg

\r\n
define host {\r\n  host_name google.com\r\n  use generic-host\r\n}\r\n\r\ndefine service {\r\n  use generic-service\r\n  host_name google.com\r\n  service_description HTTP\r\n  check_command check_http\r\n}
\r\n

htdigest.users

\r\n
nagiosadmin:Nagios4:85043cf96c7f3eb0884f378a8df04e4c
\r\n',342,0,0,'CC-BY-SA','nagios, ubuntu',0,0,1), (3267,'2021-02-09','Ripping Media 2021',1000,'I go over ripping webpage media','\r\n

ffmpeg notes:

\r\n\r\n
powershell   -Exec Bypass "IEX (New-Object System.Net.WebClient).DownloadFile('https://github.com/jb-alvarado/media-autobuild_suite/archive/master.zip',"%userprofile%desktopmaster.zip");   Expand-Archive -LiteralPath  "%userprofile%desktopmaster.zip"  -DestinationPath  "%userprofile%desktop"     ;Start-Process "%userprofile%desktopmedia-autobuild_suite-mastermedia-autobuild_suite.bat" "
\r\n\r\n
git clone https://github.com/cisco/openh264.git\r\ncd openh264\r\nexport "CFLAGS=-fno-stack-protector"\r\nexport "LDFLAGS=-lssp"\r\nmake
\r\n\r\n
find / -iname "platform-mingw_nt.mk" -exec sed 's/x86_64-w64-mingw32-//g' -i.bak '{}' ;
\r\n
youtube-dl -f bestvideo+bestaudio "link to youtube video"
\r\n

If that gives you an error, try the following instead:

\r\n
youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio' --merge-output-format mp4 "link to youtube video"
\r\n

Here you download the best video and audio separately and then merge into a, in this case mp4 file. You can change the output format on the merged video as well.

\r\n',36,0,1,'CC-BY-SA','ffmpeg,hacking,youtube-dl,media',0,0,1), (3271,'2021-02-15','Interview with a 6yo child ',428,'I ask some basic questions to my 6yo','

Not really hacking but good times

',36,78,0,'CC-BY-SA','interviews,kids',0,0,1), (3269,'2021-02-11','Linux Inlaws S01E23: The first year of the five year plan',2855,'The Inlaws review the first year: the highlights, lowlights and all the bloody rest','',384,111,1,'CC-BY-SA','communism, five year plan, world domination, FOSS, Femke',0,0,1), (3279,'2021-02-25','Linux Inlaws S01E24: Legacy programming languages',3252,'The two chaps discuss why history keeps repeating itself in programming languages and beyond','\r\n\r\n\r\n',384,111,1,'CC-BY-SA','Programming languages, Legacy, old stuff, new stuff, hipster languages, coffee',0,0,1), (3268,'2021-02-10','Video Game Review - Ark Survival Evolved',532,'Enigma reviews Ark survival evolved','

\r\nEnigma reviews Ark Survival Evolved , a multiplayer survival game for the xbox, PC and ps4
\r\n
\r\nCome chat with us at irc.freenode.net #hackerexchange
\r\nFollow me on twitter @Ed_N1gma\r\n

',39,0,1,'CC-BY-SA','video, game, reviews',0,0,1), (3272,'2021-02-16','In GNU/Linux, there is no \"diversity\", we\'re all just data.',1032,'How I experienced GNU/Linux and the topic of \"diversity\".','

I\'m just Some Guy On The Internet.

',391,0,1,'CC-BY-SA','GNU/Linux, GNU/Linux diversity',0,0,1), (3273,'2021-02-17','Embrace Firefox',853,'That\'s Our Browser!','
\r\nHPR.config\r\n\r\nName: \"Darwin\"\r\nHandle: \"Some Guy on the Internet\"\r\nOccupation: \"Loiter on the Internet\"\r\nHobby: \"Freedom\"\r\n\r\nTitle: \"Embrace Firefox\"\r\nSummary: \"That’s Our Browser!\"\r\n
',391,0,1,'CC-BY-SA','Some Guy on the Internet, Darwin, Firefox',0,0,1), (3266,'2021-02-08','Upgrading Debian on my raspberry pi',2001,'In this episode I cover the process of upgrading Debian from Jessie 8 to Stretch 9 on my raspberrypi','

Pi13 upgrade from Jessie 8 to Stretch 9 - performed 15/12/20

\r\n

History

\r\n

Upgraded my raspberry pi 13, which I think had a minimal install Raspbian, Debian i.e. has no desktop installed. The Pi had a PiFaceIO board installed, refer to my previous HPR episode Hpr2901

\r\n

Backup process, in case something went wrong

\r\n

I first moved all the unnecessary files to free up as much space as possible

\r\n

Shrunk the Pi partition on the installed 128GB SD card down to 25106MB (24.52GB), (25708544K), 26,325,549,056 bytes using partition magic

\r\n

I calculated that this would be 51,417,088 blocks of 512 bytes

\r\n

I used dd to make an image file and grabbed some unallocated space after partition by using count=55417088, refer to the command below

\r\n
sudo dd if=/dev/sdb of=/home/stuart/pi-13-img-backup.img bs=512 count=55417088
\r\n

I used the following command to image files to a spare 64GB SD card

\r\n
sudo dd if=/home/stuart/pi-13-img-backup.img of=/dev/sdb bs=512 status=progress
\r\n

I then expanded the partition to fill the full 64GB of the card

\r\n

Booted from the 64GB card to make sure that I had a backup in case anything went wrong

\r\n

Removed the 64GB card which I can go back to if things don\'t work out

\r\n

Booted from 128GB card and expanded the partition using Gparted to fill 128GB SD card

\r\n

I used the 128GB SD card to perform the upgrade, remember I have 64GB card to fall back on if things go wrong

\r\n

Upgrade process

\r\n

Source of information below

\r\n

Step 1: Check available disk space

\r\n

In order to update to Raspbian Stretch, there must be enough space on the SD card. Therefore you should check the available and used disk space usage first:

\r\n
$ df -h
\r\n

Step 2: Check package status

\r\n

You must also check that all packages are in a state that is suitable for upgrade. The following command displays all packages that have the status semi-installed or configuration failed, and those with error status:

\r\n
$ sudo dpkg --audit\r\n$ sudo dpkg --get-selections | grep hold
\r\n

Step 3: Update system

\r\n

Before upgrading, the Raspbian should be completely updated:

\r\n
$ sudo apt-get update\r\n$ sudo apt-get upgrade\r\n$ sudo apt-get dist-upgrade
\r\n

Step 4: Modify Release

\r\n

For upgrading to the new Raspbian version, the package lists must be adapted to the \"Stretch\" release. To do this, only the word \"jessie\" has to be replaced by \"stretch\". In order not to overlook any position, we simply let the replacement be done by the following command:

\r\n
$ sudo sed -i /deb/s/jessie/stretch/g /etc/apt/sources.list\r\n$ sudo sed -i /deb/s/jessie/stretch/g /etc/apt/sources.list.d/*.list
\r\n

Step 5: Updating package lists

\r\n

The new package lists must then be updated and imported:

\r\n
$ sudo apt-get update
\r\n

Step 6: Update to \"Stretch\"

\r\n

Now we are ready to start the upgrade:

\r\n
$ sudo apt-get upgrade\r\n$ sudo apt-get dist-upgrade
\r\n

Step 7: Clean up installation

\r\n

Old, unnecessary packages are removed after the system update with the following commands:

\r\n
$ sudo apt-get autoremove\r\n$ sudo apt-get autoclean
\r\n

What was reported during upgrade

\r\n

repo for get_iplayer no longer available so had to comment them out. On my Pi these were located at the following location.

\r\n
/etc/apt/sources.list.d/packages.hedgrows.org.uk.list
\r\n

change to lsb_release command

\r\n

The lsb_release command no longer worked so after the upgrade I could not use it to check what version of Debian I was running.

\r\n

Link to alternative methods to check installed Debian version.

\r\n

I chose the following method

\r\n
cat /etc/os-release
\r\n

.bashrc - kept my original file

\r\n

Something about /etc/login.defs & /etc/login.defs.dpkg-new

\r\n

lots of changes in new version of ssh

\r\n

Something was mentioned about apt hashes sha1 weak \"yes\" & apt hashes ripe-md/160 weak \"yes\"

\r\n

Something about ~/.ssh/authorized_keys & ~/.ssh/authorized_keys2

\r\n

Something about key length and accepted key types

\r\n

What went wrong after the upgrade

\r\n

mocp wouldn\'t run

\r\n

I had to modify my config file in .moc folder I added the following line near the top of the file

\r\n
ALSAStutterDefeat = no
\r\n

In my .moc folder I had to also modify the my_keymap file at line 82. I think the next_search option is not available in the new version of moc 2.6-alpha3 installed with Debian Stretch. I commented out the following

\r\n
#next_search =          ^g ^n
\r\n

pifacedigitalio test.py reported an error

\r\n

multiple errors reported last line of error was:-

\r\n
pifacedigitalio.core.NoPiFaceDigitalDetectedError: No PiFace Digital board detected (hardware_addr=0, bus=0, chip_select=0)
\r\n

I changed the first line of my python script

\r\n

from

\r\n
#!/usr/bin/env python
\r\n

to

\r\n
#!/usr/bin/env python3
\r\n

This removed the original error. I stupidly thought this had solved the problem so I went about converting my script to run with Python 3 only to find at the end once I had correct everything that I ended up with the same original error.

\r\n

How I solved the pifacedigitalio test.py reported error

\r\n

The problem was solved by looking at this post

\r\n

According to the post it had something to do with the SPI serial speed changing from 500Khz to 125Mhz

\r\n

Problem was solved by modifying a file spi.py

\r\n

I found the location of the file by using the following command

\r\n
find / -iname spi.py
\r\n

The files were located at

\r\n
/usr/lib/python2.7/dist-packages/pifacecommon/spi.py\r\n/usr/lib/python3/dist-packages/pifacecommon/spi.py
\r\n

I created a copy of the original file and called it spi.py.bak

\r\n

I only modified the file in python2.7 as my program test.py runs in python2.7

\r\n

I added a comma to the end of line 68 and added the following line to line 69

\r\n
speed_hz=ctypes.c_uint32(15000)
\r\n

SSH from pifacecad stopped working

\r\n

My Raspberry pi \"Pi10\" downstairs would not SSH into my Pi13 server upstairs This made it impossible for me to remotely start and stop podcasts and audiobooks playing on my Pi13 upstairs.

\r\n

This happened because the downstairs Pi10 had DSA and RSA keys and it was using DSA keys to ssh into Pi13. I found this by looking at /var/logs/auth.log on Pi13 The log reported

\r\n
userauth_pubkey: key type ssh-dss not in PubkeyAcceptedKeyTypes
\r\n

SSH from EEEPC stopped working

\r\n

Was not able to SSH into Pi13 from EEEpc

\r\n

My EEEPC netbook only had DSA keys and that is what it was using to try and SSH into Pi13 I generated new RSA keys and added them to Pi13, this solved the problem and allowed me to ssh into Pi13 from the EEEpc

\r\n',201,0,1,'CC-BY-SA','Linux, Distros, Raspberry Pi, Debian',0,0,1), (3274,'2021-02-18','My Custom dwm Setup',2159,'Me talking about how I\'ve customised dwm, added and removed patches and written various scripts.','\r\n
    \r\n
  1. Story of ricing my own desktop:\r\n
      \r\n
    • Always been into customising look/feel, never satisfied
    • \r\n
    • Found Luke Smith and liked i3, made own version.
    • \r\n
    • Pandemic hits! Started learning Python, JavaScript but had no real use for them...
    • \r\n
    • Made a website (inspired by disconnecting from social media)
    • \r\n
    • check out richcolq.xyz and github.com/clearnitesky
    • \r\n
  2. \r\n
  3. What programs am I using?\r\n
      \r\n
    • dwm (obviously)
    • \r\n
    • dmenu
    • \r\n
    • st
    • \r\n
    • surf / brave
    • \r\n
    • sxhkd - various short cuts sorted by purpose
    • \r\n
    • dunst
    • \r\n
    • sxiv/feh
    • \r\n
    • zathura
    • \r\n
    • my status stuff using dwmstat script
    • \r\n
    • a look in ~/.local/bin
    • \r\n
    • I recently learned about awk and rewrote all icon scripts which is what inspired me to record this episode.
    • \r\n
  4. \r\n
  5. What next?\r\n
      \r\n
    • Is it necessary to patch dwm? Probably not.
      \r\nI\'ve come to believe that the real value in these experiments has come from my custom status scripts and keyboard shortcuts - not from patching new features into dwm. It does what I need it to (manage windows!)
    • \r\n
  6. \r\n
  7. Thanks for watching!
  8. \r\n
\r\n',138,0,1,'CC-BY-SA','dwm, suckless, linux, bash, cli',0,0,1), (3276,'2021-02-22','Deepgeek\'s thoughts about HD Radio',612,'Klaatu reads a post by Deepgeek','

\r\nDeepgeek\'s thoughts about HD radio.\r\n

\r\n\r\n

Links

\r\n\r\n\r\n\r\n',73,99,0,'CC-BY-SA','radio',0,0,1), (3277,'2021-02-23','Microsoft in my Debian repo',272,'microsoft, raspberry pi, bash, script','

Raspberry pi foundation added vscode repo to raspberry OS.

\r\n

Raspberry Pi OS\'s tried:

\r\n\r\n

To try later:

\r\n\r\n
sudo apt install dkms\r\n\r\ncd rtl8812au\r\n\r\nsudo make dkms_install
\r\n

References.

\r\n\r\n

The following code snippet was edited for readability.

\r\n
#Hold raspberrypi-sys-mods package\r\nsudo apt-mark hold raspberrypi-sys-mods\r\n\r\n#Redirect calls to packages.microsoft.com to localhost\r\nsudo echo "0.0.0.0 packages.microsoft.com" >> /etc/hosts\r\n\r\n#remove MS Key file\r\nsudo rm -vf /etc/apt/trusted.gpg.d/microsoft.gpg\r\n\r\n#create empty dummy key file\r\nsudo touch /etc/apt/trusted.gpg.d/microsoft.gpg\r\n\r\n#lock the dummy key file\r\nsudo chattr +i /etc/apt/trusted.gpg.d/microsoft.gpg\r\n\r\n#comment out vscode.list\r\nsudo sed -i 's/deb/#deb/' /etc/apt/sources.list.d/vscode.list\r\n\r\n#lock the vscode.list file\r\nsudo chattr +i /etc/apt/sources.list.d/vscode.list
\r\n',318,0,0,'CC-BY-SA','microsoft, raspberry pi, bash, script',0,0,1), (3278,'2021-02-24','A Minor Victory Against Designed-In Obsolescence',513,'Extracting a bit more life out of a device that Apple would rather have you dump','

The Ipad2, at over 9 years old, is unsupported with security or any other kind of updates. Few apps in the App Store will run on its old version of IOS, and that operating system cannot be upgraded.

\r\n

As far as Apple are concerned an Ipad2 should have been sent to the scrap heap years ago. If you found its 16GB of storage wasn\'t enough, you were supposed to dump it and buy a new one as you couldn\'t add more. If you found that you couldn\'t run the latest version of your favourite apps, dump it and buy a new one as you couldn\'t upgrade the operating system to the required standard.

\r\n

Is it necessary to abide by this designed-in obsolescence? Beeza inherits an Ipad2 and decides to find out if he can get any serious use out of it or whether it really does need to be dumped.

',246,0,0,'CC-BY-SA','Ipad, Apple, Obsolescence, IOS, Hardware',0,0,1), (3282,'2021-03-02','HP Laptop with AMD Ryzen 3 Mobile with Radeon Graphics',1637,'I talk about the specs of the laptop and a brief upgrade.','

HP Laptop with AMD Ryzen 3 Mobile Processors with Radeon Graphics

\r\n

HP Laptop Info.

\r\n\r\n

Specifications.

\r\n
    \r\n
  1. AMD Ryzen 3 3250U (2.6 GHz base clock, up to 3.5 GHz max boost clock, 1 MB L2 cache, 2 cores)

    \r\n
      \r\n
    • CPU Cores: 2
    • \r\n
    • CPU Threads: 4
    • \r\n
    • GPU Cores: 3
    • \r\n
    • System Memory Specification: Up to 2400MHz (No need to go big, keep it simple and cheap.)
    • \r\n
    • Launch Date: 06/01/2020 (January 06, 2020)
    • \r\n
  2. \r\n
  3. Memory/Ram: 4 GB DDR4-2400 SDRAM (1 x 4 GB)

    \r\n
      \r\n
    • ECC Type: Non-ECC
    • \r\n
    • Form Factor: SODIMM
    • \r\n
    • Pin Count: 260-pin
    • \r\n
    • PC Speed: PC4-19200
    • \r\n
    • Ram is upgradable (Two slots)\r\n
    • \r\n
    • Note:\r\n
        \r\n
      • Installed 16 GB ram but system only accepts/recognizes 14 GB ram. Attempted two different ram manufacture type (Crucial and PNY Ram)
      • \r\n
    • \r\n
  4. \r\n
  5. Video graphics: AMD Radeon Vega 3 Graphics

  6. \r\n
  7. Hard drive: 1 TB 5400 rpm SATA III HDD

    \r\n
  8. \r\n
  9. Wifi: Realtek RTL8821CE 802.11b/g/n/ac (1x1) and Bluetooth® 4.2 Combo.

    \r\n
  10. \r\n
  11. Battery Life: 9 hrs (Nope!)

    \r\n
      \r\n
    • Won\'t be seeing that in GNU/Linux.
    • \r\n
  12. \r\n
\r\n

Secure Boot!

\r\n
    \r\n
  1. Ubuntu is able to boot with secure boot enabled.\r\n
      \r\n
    • Once disabled, you can load other Distros.
    • \r\n
  2. \r\n
\r\n',391,57,0,'CC-BY-SA','HP, Ryzen, Crucial, Western Digital, Realtek',0,0,1), (3288,'2021-03-10','Linux Inlaws S01E25: The Grumpy Old Coders',3628,'Our heroes host an episode with an eclectic duo (not Waldorf or Statler)','

\r\nThis time our two heroes host an eclectic couple known as the grumpy old coders. Thomas, David, Martin and Chris\r\ndiscuss stealing, um, borrowing (and never giving back) of mottos and mascotts, programming languages including\r\nJava, Python and Rust woes and how they all arrived at podcasting. Never mind Chris revealing his true and\r\nonly heritage and other little-known secrets. Don\'t miss out on this episode for the full lowdown (never mind\r\nthe even lower down .\r\n

\r\n

Shownotes:

\r\n',384,111,1,'CC-BY-SA','OAPs, old coders, senior citizens, Bitterfeld, communism',0,0,1), (3283,'2021-03-03','HPR RPG Club reviews Dead Earth',3150,'Escape reality by pretending you live in a dystopia','

\r\nKlaatu, Beni, and Mcnalu review the tabletop RPG game Dead Earth, a game published under the GNU Free Documentation License (GFDL).\r\n

\r\n\r\n

\r\nNext up is Starfinder, a space-themed game using the 3.5 edition D&D rules.\r\nIf you\'re interested in playing, join the Hacker Public Radio mailing list or email Klaatu at this domain.\r\n

\r\n\r\n\r\n',78,95,0,'CC-BY-SA','rpg, cyberpunk, post-apocalyptic',0,0,1), (3284,'2021-03-04','Introduction to gdb',1420,'A really friendly introduction to Gnu Debugger','

\r\nFrustrated by gdb tutorials that are either too complicated or too simple? I think this might be an actually-useful tutorial to help you see how and why gdb can be useful. Anyway, it\'s the path I followed to finding a use for the mysterious gdb, so maybe it will work for you.\r\n

\r\n\r\n

\r\nTo follow along with this episode, here\'s some simple yet buggy code. This compiles but crashes when run.\r\n

\r\n\r\n
\r\n#include <iostream>\r\n#include <stdlib.h>  // rand\r\n#include <stdio.h>  // printf\r\n\r\nusing namespace std;\r\n\r\nint main () {\r\n\r\nsrand (time(NULL));\r\nint penguin = rand() % 8;\r\ncout << "This is a message from your friendly coder\\n" << endl;\r\nint kiwi = 3;\r\n\r\nprintf(\"penguin is set to is %s\\n\", penguin);\r\nprintf(\"kiwi is set to is %s\\n\", kiwi);\r\n\r\n return 0;\r\n} // main\r\n\r\n
\r\n\r\n

\r\nTo compile it and see it crash, do this:\r\n

\r\n\r\n
\r\n$ g++ example.cpp\r\n$ ./a.out\r\n
\r\n\r\n

\r\nTo compile it with debug symbols so you can step through it in gdb, do this:\r\n

\r\n\r\n
\r\n$ g++ -g -o debugtest example.cpp\r\n$ gdb debugtest\r\n
\r\n\r\n

\r\nYou can now follow along with this tutorial.\r\n

\r\n\r\n

\r\nFor extra credit, try compiling this with clang++ instead!\r\n

\r\n\r\n\r\n\r\n',78,84,0,'CC-BY-SA','programming, cpp, gdb, gcc',0,0,1), (3295,'2021-03-19','Renewing a Let\'s Encrypt cert for Home Network use',195,'How to update a cert when the automatic processes don\'t work','

\r\nBack in hpr3289 :: NextCloud the hard way, I showed you how to install a Let\'s Encrypt SSL cert for use on your home network. One of the problems was the fact that the automatic renew tools won\'t work.\r\n

\r\n

\r\nToday I got a reminder email from Let\'s Encrypt and I used the exact same command to renew it as I did to create it in the first place. The tool is smart enough to know this is a renewal process. \r\n

\r\n

\r\nOne thing I forgot to do last time was to remove the TXT record from DNS after I was done. So I had to delete the record and wait a while for the Time To Live (TTL) to expire.\r\n

\r\n

\r\nI set about doing a check list so the next time the process can be even faster.\r\n

\r\n
    \r\n
  1. Run the command
    certbot certonly --manual --preferred-challenges dns
  2. \r\n
  3. Deploy a DNS TXT record under the name _acme-challenge.nextcloud.example.com
  4. \r\n
  5. Finish the challenge.
  6. \r\n
  7. When successful, remove the DNS TXT record as it\'s not needed for another two months.
  8. \r\n
',30,0,0,'CC-BY-SA','SSL, Let\'s Encrypt, Intranet',0,0,1), (3566,'2022-04-04','HPR Community News for March 2022',5485,'Dave and Ken talk about shows released and comments posted in March 2022','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3542Tue2022-03-01The Worst Car I Ever HadBeeza
3543Wed2022-03-02Idle thoughts on web browsersdnt
3544Thu2022-03-03All my microphonesAndrew Conway
3545Fri2022-03-04How I make coffeeArcher72
3546Mon2022-03-07HPR Community News for February 2022HPR Volunteers
3547Tue2022-03-08Password ManagersSome Guy On The Internet
3548Wed2022-03-09Make a custom Git commandklaatu
3549Thu2022-03-10Linux Inlaws S01E51: git and static site generatorsmonochromec
3550Fri2022-03-11Format; Copy; Diskcopy; XcopyAhuka
3551Mon2022-03-14Bash snippet - some possibly helpful hintsDave Morriss
3552Tue2022-03-15Unboxing a PineTime development kitRho`n
3553Wed2022-03-16Freedom of speech in open sourceSome Guy On The Internet
3554Thu2022-03-17Guide to the Science and Technology Section of BitchuteMechatroniac
3555Fri2022-03-18PopKorn Episode 1: The Fallacy of the Unreasonable Effectiveness of Mathematics in the ETCBlacKernel
3556Mon2022-03-21TTS for HPRtakov751
3557Tue2022-03-22A short story about Lenovo and laptop batteriesfolky
3558Wed2022-03-23How I\'m learning HaskellTuula
3559Thu2022-03-24Linux Inlaws S01E52: The Zig Projectmonochromec
3560Fri2022-03-25LCh Components Layer ModesAhuka
3561Mon2022-03-28Employment securityArcher72
3562Tue2022-03-29Creating a new project with Haskell and StackTuula
3563Wed2022-03-30Home Coffee Roasting, part 1dnt
3564Thu2022-03-31Removing EXIF data from an imageDave Morriss
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 21 comments in total.

\n

Past shows

\n

There are 7 comments on\n7 previous shows:

\n\n

This month\'s shows

\n

There are 14 comments on 8 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-March/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Access problems from Argentina

\n

An HPR listener from Argentina reports that the HPR site is unavailable from there. This applies both to an ISP connection and on a mobile phone. It\'s not clear what is causing this.

\n

Reportedly the problem was resolved on March 30th but the next day it returned and at the time of writing the HPR site is still unavailable.

\n

Older HPR shows on archive.org

\n

As reported on the last Community News all shows in the range 1-870 had been uploaded except for shows hpr0001 - hpr0003. Shows hpr0001 and hpr0002 had been \"blocked\" by existing non-HPR items from over 8 years ago, with the names we were going to assign. Show hpr0003 seemed to have been an early attempt to upload blocks of shows since it contained the audio for shows 1-9, but no notes.

\n

We received help with clearing the slots for shows 1 and 2 from Jason Scott of the Internet Archive, and the correct shows have now been uploaded. Show hpr0003 has now been resolved by replacing the contents with the appropriate transcoded audio and the notes have been added to it.

\n

We can now consider this project to be complete!

\n\n\n\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3299,'2021-03-25','Linux Inlaws S01E26: Make your Linux harder',2985,'Ever wanted to know about AppArmor and SELinux? Then this is your show!','

In this episode our two aging heroes discuss the proper temperature to\r\ndrink beer at (spoiler: it\'s not 20 degrees as CAMRA would make you believe)\r\nand the ins and outs of basic and enhanced security on our beloved operating\r\nsystem. If you ever wanted to know more about Linux Security Modules, AppArmor\r\nand SELinux and how dames of negotiable affections relate to these concepts,\r\nthis show is for you.

\r\n

Shownotes:

\r\n\r\n',384,111,1,'CC-BY-SA','Linux Security Modules, DAC, MAC, AppArmor, SELinux, Plan 9',0,0,1), (3285,'2021-03-05','Upgrading Lubuntu on my Samsung N150 Plus netbook',1079,'Lubuntu 16.04 LTS to 20.04.1 LTS upgrade on ageing Samsung N150 Plus netbook.','

Samsung N150 Plus upgrade from Lubuntu 16.04 LTS to Lubuntu 20.04.1 - performed 17/12/20

\r\n

Backup and prep process

\r\n\r\n

Live distro 1st boot.

\r\n\r\n

Install Process

\r\n\r\n

After first boot

\r\n\r\n

General thoughts and Observations

\r\n\r\n',201,0,1,'CC-BY-SA','Linux, Distros, Netbook, Lubuntu',0,0,1), (3286,'2021-03-08','Wireguard How To',574,'My findings setting up wireguard at home and in my office at work.','

Wireguard How To

\r\n

Firstly, I am not an expert. These are just my findings setting up wireguard at home and in my office at work.

\r\n

I\'ve used a program called sshuttle for 7/8 years to attach myself to my home and work networks when on public/untrusted networks or if I need to access some resource at work from home.

\r\n

Sshuttle for the main part works great and the main benefit is that the only port you ever need to open on the server network is whichever port you have your ssh server running on.

\r\n

The downside to sshuttle is that it won\'t work with my android devices so I\'ve been using a paid for VPN called PIA on untrusted networks or just staying on 3g/4g and not have any way to connect to my home or work network.

\r\n

Sshuttle is written in python and a few weeks ago Arch Linux moved to python 3.8 which broke sshuttle. There is a workaround using pyenv and a bug has been filled with the python team and a it\'s already been fixed upstream https://bugs.python.org/issue35415.

\r\n

Anyway.

\r\n

I thought it was about time I looked at setting up a proper VPN on my work network.

\r\n

So I spent a couple of hours reading up on openVPN and creating client and server certificates making a server config on the work server forwarding the port on the router to the server.

\r\n

Then I spent a couple more hours poking around trying to figure out why it wouldn\'t work.

\r\n

I eventually gave up frustrated.

\r\n

I\'m not blaming openVPN, I know it works for many many people, but I couldn\'t see what was wrong.

\r\n

So I did what we all do in a situation like this.

\r\n

I took to social media, which in my case is my pleroma server and posted a message to the fediverse.

\r\n

\"OpenVPN has fried my brain. Need booze\"
\r\nThen I had a beer, a nice cold Stiegl goldbrau if I remember right.

\r\n

A few minutes later a message popped up from theru, it contained one word with a smiley face. Wireguard.

\r\n

Now I had looked at wireguard a while ago. You might remember it hit the headlines because Linus Torvalds had praised how beautifully written the code was for it. It turns out what he said was \"It\'s beautiful when compared to openVPN\'s code\". Back then the how to guides were really hard, for me anyway to follow.

\r\n

There were just examples of two machines on the same LAN connected together and I really struggled to get my head around it being serverless and both machines being peers to each other; after all openVPN has clients and servers and even sshuttle on my laptop connects to a server machine.

\r\n

There where a couple of wiki pages that I read on Christmas Eve that gave me a lightbulb moment and some clarity on the way it worked. So I decided to try and set it up.

\r\n

The articles acknowledge that it is a peer to peer technology and then go on to call one peer a server and the other peer the client.

\r\n

Also I would recommend for your first client use an android device with the wireguard app. It\'s more user friendly in that some of the config is auto filled for you and then you can export the config file and examine it in a text editor later to get a better handle on things.

\r\n

I\'m going to assume that you have installed the wireguard packages for your system and that you have given your server a static IP on your network.

\r\n

I\'m using Arch linux on my servers but I see the Linode Debian \'how to\' works in the same way.

\r\n

So we are going to log into the server and start the setup.

\r\n

1st create Private and Public keys

\r\n

Create directory for Keys

\r\n
cd ~\r\nmkdir wireguard\r\ncd wireguard
\r\n

Create Server Keys

\r\n
umask 077\r\nwg genkey | tee privatekey | wg pubkey > publickey
\r\n

Create sub directory for client1 keys

\r\n
mkdir client1\r\ncd client1\r\nwg genkey | tee privatekey | wg pubkey > publickey
\r\n

Repeat for as many clients as needed

\r\n

Create/edit wireguard config

\r\n

Check the interface name facing the internet is correct before copy/paste

\r\n
ifconfig
\r\n

Before you continue you will need to forwrd a port from your internet facing router to your server. Somewhere in your router settings you\'ll find a port forward setting. At home I have a Fritzbox and it\'s buried under network / permitted access. At work it\'s a Linksys ac1200 and it\'s under gaming / apps / single port forwarding. I\'m sure you will find it.

\r\n

The wireguard default port is 51820 and you\'ll find this port named in most of the how to\'s on the web. I use a different port number just to add a little bit of obsurity/security to my setup so if you choose to forward a different port from your router then remember to use that number in the configs.

\r\n

Below is the working wg0.conf file from my arch server with one client

\r\n
[root@arch-server marshall]# cat /etc/wireguard/wg0.conf\r\n[Interface]\r\nAddress = 10.0.0.1/24\r\nMTU = 1500\r\nSaveConfig = false\r\nListenPort = 8801\r\nPrivateKey = sBNF2igw+xxxxxHh0HWJL2SHZ0ltR+xxxxxaCN/Wu3o=\r\nPostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE\r\nPostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D\r\nPOSTROUTING -o enp2s0 -j MASQUERADE\r\n\r\n[Peer]\r\n# BBKey2\r\nPublicKey = Aeo8ya/wCW9dlfO1a5cEaApLTbCfqJVw/stVDi2gDh8=\r\nAllowedIPs = 10.0.0.2/32
\r\n

Below is the working wg0.conf file from my archarm server with one client

\r\n
[root@alarmpi wireguard]# cat wg0.conf\r\n[Interface]\r\nAddress = 10.0.0.1/24\r\nMTU = 1500\r\nSaveConfig = false\r\nListenPort = 8801\r\nPrivateKey = GOzcxxxxx4+Gjs/50Ln+XFrlX0XXXXXKpeuf59IDnc=\r\nPostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\r\nPostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D\r\nPOSTROUTING -o eth0 -j MASQUERADE\r\n\r\n[Peer]\r\n# BBKey2\r\nPublicKey = CSJyWwknPQyhF+dRrB6TOBX55gJXnreNIpBiz3qsSm0=\r\nAllowedIPs = 10.0.0.2/32
\r\n

Enable IPv4 forwarding

\r\n

On the server enable IPv4 forwarding using sysctl

\r\n
sysctl -w net.ipv4.ip_forward=1
\r\n

To make the change permanent. Add

\r\n
net.ipv4.ip_forward = 1
\r\n

to /etc/sysctl.d/99-sysctl.conf

\r\n

Check if everything works!

\r\n

Bring the tunnel up.

\r\n
wg-quick up wg0
\r\n

Check tunnel state and see currently connected peers.

\r\n
wg
\r\n

If it all works then use systemd to start the tunnel on boot.

\r\n
systemctl enable wg-quick@wg0.service
\r\n

If it doesn\'t

\r\n

More than likely it\'s IPv4 forwarding.

\r\n

Try running sysctl -w net.ipv4.ip_forward=1 again, or DNS on the client is set wrong.

\r\n

Arch linux

\r\n
pacman -S wireguard-tools wireguard-arch dkms linux-headers
\r\n

ArchArm dkms + headers

\r\n
pacman -S dkms wireguard-tools wireguard-dkms linux-raspberrypi-headers
\r\n

Links

\r\n\r\n',392,0,0,'CC-BY-SA','wireguard, openVPN, Arch, sshuttle',0,0,1), (3287,'2021-03-09','Quick tip',117,'Quick tip and HPR needs shows','

https://f-droid.org/en/packages/com.github.axet.audiorecorder/

\r\n

Small drinking glass
\r\n\"Small
Click the thumbnail to see the full-sized image

\r\n

Perfectly peeled eggs
\r\n\"Perfectly
Click the thumbnail to see the full-sized image

\r\n',318,93,0,'CC-BY-SA','Cooking',0,0,1), (3291,'2021-03-15','The New Audacity and Batch Processing Macros',501,'A brief look at at the new Audacity and how I got it working for me','

When Audacity upgraded it caused some changes that affected my use of it to prepare podcasts I listen to. I did find the answer, though, and I am sharing it with you.

\r\n\r\n',198,0,0,'CC-BY-SA','Audacity, macros, batch processing',0,0,1), (3390,'2021-07-30','Intro to DOS Series',803,'We begin some technological archeology to explore the old warhorse, DOS.','

This Introduction to the series also serves as a brief recap of my early history with computers, and the path that brought me to where I am today.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing',0,0,1), (3400,'2021-08-13','Normal Layer Modes: Normal, Dissolve, Color Erase',778,'We begin a look at the Layer Modes in GIMP','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We\'ll begin with the Normal modes and work our way through many, but not all, of the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.20.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes',0,0,1), (3410,'2021-08-27','Operating Systems',828,'Here we look at what an operating system is, and how they developed historically.','

While the very first computers did not have operating systems, the lack of them made computers less efficient and more difficult to use. We look at the general history of operating systems before getting into the history of DOS. Then we look at some general principles of what operating systems do.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, operating systems',0,0,1), (3420,'2021-09-10','Normal Layer Modes: Erase, Merge, and Split',606,'We continue our look at the Layer Modes in GIMP','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We\'ll begin with the Normal modes and work our way through many, but not all, of the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.20.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes',0,0,1), (3430,'2021-09-24','Booting',724,'We look in detail at how early PCs booted.','

The boot process is a very particular system for taking a dead hunk of metal and silicon and turning it into an active computer. It is kind of remarkable, and in the DOS environment you really needed to know how it worked.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, boot process',0,0,1), (3292,'2021-03-16','Squirrel FSF blog',2785,'The trouble with HUMANS and HUMAN things.... ','\r\n',377,0,0,'CC-BY-SA','banning software, banning ideology, modernizing, re-evaluating, prejudice',0,0,1), (3293,'2021-03-17','HPR RPG Club reviews Dungeon Raiders',3269,'Klaatu, Beni, and McNalu review an OSR DnD clone','

\r\nDungeon Raiders is a D&D \"retroclone\", designed to mimic old school gaming.\r\nIt\'s a simple system, but is it too simple?\r\nFind out in today\'s episode!\r\n

\r\n\r\n

\r\nYou can download Dungeon Raiders for free from Drivethrurpg.com\r\n

\r\n\r\n

\r\nYou can play games with the RPG club.\r\nSubscribe to the HPR mailing list to learn about our schedule, or email Klaatu at this domain.\r\n

\r\n',78,95,0,'CC-BY-SA','dnd,osr,tabletop,rpg',0,0,1), (3301,'2021-03-29','K S P Kerbal Space Program! (Game)',2131,'400 hours into the game I talk about howto get into Kerbal Space Program!','\r\n',36,0,0,'CC-BY-SA','Kerbal Space Program,KSP,games,space',0,0,1), (3294,'2021-03-18','Update to MakeMKV to back up media',378,'Update to MakeMKV to back up media, now on Raspberry Pi','

This is an update on my previous episode hpr3179 :: MakeMKV to back up media.

\r\n

In the past month, MakeMKV.com has been updated to include Raspberry Pi support.

\r\n

Sources:

\r\n\r\n

It was a very uneventful \"It\'s here\"

\r\n

MakeMV on Raspberry Pi (ARM)
\r\n\"MakeMV
Click the thumbnail to see the full-sized image

\r\n
wget https://www.makemkv.com/download/makemkv-bin-1.16.1.tar.gz\r\nwget https://www.makemkv.com/download/makemkv-oss-1.16.1.tar.gz
\r\n

Unpack both packages and starting from source package and do the following steps:

\r\n

For makemkv-oss package:

\r\n
./configure\r\nmake\r\nsudo make install
\r\n

For makemkv-bin package:

\r\n
make\r\nsudo make install
\r\n

Install ccextractor and necessary packages

\r\n
sudo apt install libtesseract-dev autoconf sysconftool\r\n\r\ngit clone https://github.com/CCExtractor/ccextractor.git\r\ncd ccextractor/linux/\r\n./build
\r\n

nnn: command line file browser with vim-like keybindings

\r\n

https://github.com/jarun/nnn

\r\n

Script to rip TV episodes

\r\n

makemkv.tv.sh

\r\n
#!/bin/bash\r\n#echo "Series?"\r\nseries=Battlestar\r\necho "Series: $series"\r\necho "What Season is this?"\r\nread season\r\necho "Season: $season"\r\necho "Which disc # is this?"\r\nread disknum\r\necho "This is disk #$disknum"\r\necho "Starting with which episode?"\r\nread episode\r\n\r\neject -x20\r\nmkdir ""disc."$disknum"\r\nmakemkvcon mkv --progress=-same --minlength=2100 disc:0 all ""disc."$disknum"\r\ncd ""disc."$disknum"\r\n\r\n#episode=1\r\nepisode=$episode\r\nfor track in *.mkv\r\ndo\r\n  mv $track $series"_S"$season"_D"$disknum"_E"$episode.mkv\r\n  episode=$((episode+1))\r\ndone\r\n\r\ncd ..
\r\n

Script to convert multiple episodes

\r\n

mkv2mkv_mult.sh

\r\n
#!/bin/bash\r\nmkdir encoded\r\nfor i in *.mkv\r\ndo\r\n  HandBrakeCLI --first-subtitle --subtitle-default=none -i $i -o "encoded"/"`basename -s .mkv $i`.mkv"\r\ndone
\r\n

Before and after the rename loop

\r\n

Before rename
\r\n\"Before

\r\n

After rename
\r\n\"After

\r\n',318,0,0,'CC-BY-SA','dvd, blu-ray, backup, nnn',0,0,1), (3296,'2021-03-22','Spam Bot Honey Pot',364,'Implementing a honey pot style spam filter for your HTML forms','

In this episode of Hacker Public Radio, I will describe the method I chose to combat spam bots filling out my company\'s contact form. About 99% of the submissions we receive are spam, which makes filtering for valid messages painful. After some research into different methods, I decided to go with the honey pot method.

\r\n

The honey pot method uses an extra text input field to lure the spam bot into filling it out. There are different suggestions for how to hide this extra field from valid users by using either javascript or CSS. With javascript, the honey pot section of the form is removed from the DOM when the page loads, hiding it from your users. The argument for this method is most bots don\'t implement javascript, so the honey pot field will not be hidden from them. I think that is a valid argument but I didn\'t want to include extra javascript in my page--so I went with the CSS method.

\r\n

There are references at the end of the show notes to a couple of the articles I read on implementing the honey pot with either javascript or CSS. My take away was, one, don\'t use the CSS display property set to the value of none to take the input out of the DOM. Sufficiently smart enough bots may know to scan for this, especially if applied directly to the element. Also don\'t name your classes something obvious to your intent like \"anti-spam-filter\". My guess is the majority of the bots out there aren\'t that sophisticated, but I figured it couldn\'t hurt to follow those suggestions.

\r\n

I was already using Bootstrap CSS for our site, so I decided to use Bootstrap\'s \"sr-only\" class. This class is used for elements that you only want visible to screen readers. It takes the element and uses a combination of absolute positioning, setting the size and width to 1 pixel, setting a negative left margin, and hiding content overflow to prevent the honey pot showing up visually. I figured if the bot was scanning CSS for classes or properties, this wouldn\'t trigger any warnings. It does bring up the issue of how to prevent impacting the experience of people using screen readers. I applied the aria-hidden attribute with a value of true to the label element surrounding the honey pot input field. \"[this] removes that element and all of its children from the accessibility tree.\" So we now have the field hidden both visually in the browser and from assistive technologies. Given the short end of the stick accessibility usually gets, I doubt there are any spam bots scanning for that ARIA attribute. For the minority of users who might be viewing with the classic lynx browser, I put \'For office use\' as the label text before the honey pot, hoping this would get the message across without tipping off the bot to the intended purpose of the related input field.

\r\n

The other main issue with this method is the value of the name attribute used for the input field. Some argue to use obfuscated values like \"mmxxName\" instead of \"name\", or \"sxysPhone\" for \"phone\". Apparently some bots will skip fields they don\'t recognize. By using more standard names for multiple honey pot fields, it easier to determine if it is a bot. The counter argument to this naming scheme is about the user experience, by obfuscating the name, then browsers won\'t auto-fill the valid fields of the form. This also brings up the matter of not auto-filling the spam fields by the browser of your users. This is done by setting any of your honey pot input elements\' \"autocomplete\" attributes to \"off\".

\r\n

So far this spam filtering method is working nicely. I currently send any messages flagged as spam to a different email address with the subject prepended with the words \"[Spam review]\". Once I am confident there are not that many false positives, I will just skip sending flagged messages. The one issue I have experienced with this method is when using the tab key to move through the form. Since the input field is only visually hidden, it still receives focus as you tab through. If you happen to hit another key while still in the hidden field, it will get captured by the honey pot and then the submission will be flagged as spam.

\r\n

I have created a sample form on my personal site. Please visit URL: https://www.horning.us/hpr/SpamBotHoneyPot.php to try it out. It is a simple PHP page using the GET method when submitting the form. Once you press the submit button you will see the form fields and their values, along with the result messages. I chose to use \"URL\" as the name for my honey pot input field. I use it on my example form, and I use it for my work form. For my work form, a URL is not something we ask to be submitted, and being a common field in forms, makes it very tempting for bots. In my example code, the CSS for hiding the honey pot section is from the minicss.org websites. Their \"visibility-hidden\" class is very similar to Bootstrap\'s \"sr-only\" class. I would be interested to hear if others have implemented something similar. I would also love to hear from someone who uses a screen reader. Does it prevent the honey pot section from being read?

\r\n

References

\r\n\r\n',293,0,0,'CC-BY-SA','Spam, HTML, Forms',0,0,1), (3297,'2021-03-23','Nextcloud Application Updating',136,'Automatically Update Nextcloud Applications via Cron','

Simple method to autoupdate nextcloud apps. An email is sent as summary of actions.

\r\n

Scheduled for 5 AM Sunday - Cron Entry

\r\n
MAILTO=MYEMAILADDRES@MYDOMAIN.com\r\n0 5 * * 0 /usr/bin/php /var/www/nextcloud/occ app:update --all 2>&1\r\n# * * * * * command to be executed\r\n# - - - - -\r\n# | | | | |\r\n# | | | | +----- day of week (0 - 6) (Sunday=0)\r\n# | | | +------- month (1 - 12)\r\n# | | +--------- day of month (1 - 31)\r\n# | +----------- hour (0 - 23)\r\n# +------------- min (0 - 59)
\r\n',273,0,0,'CC-BY-SA','Nextcloud,SysAdmin,Admin',0,0,1), (3298,'2021-03-24','Poisoning The Well',1505,'Shutdown the negativity in our community.','

Hot, off the cuff. You can leave feedback at Lyunpaw@gmail.com; \"hpr04\" for the subject line. Emails are seen as plain text and are filtered. Maybe I\'ll do a show on email; oops now I owe a show.

',391,0,0,'CC-BY-SA','General Content.',0,0,1), (3302,'2021-03-30','Input Methods on Ubuntu',924,'I\'m adding some input methods to a standard Ubuntu 20.04 install','

First I go to the Language Support window. Either search (press Super/Windows, then type) for\r\n\"Language Support\" and go there directly, or search for \"Region & Language\", go there, then click\r\n\"Manage Installed Languages\".

\r\n

There I click Install / Remove Languages ..., check the Chinese I want, then click Apply.

\r\n

Then I add the packages for the input methods I want, either using the command line (apt install)\r\nor the Ubuntu Software application:

\r\n\r\n

Bonus input method:

\r\n\r\n

Now for each user that wants an input method, I search for and go to Region & Language. At the\r\nbottom of the Input Sources section I click the plus button. The different input methods are found\r\nby clicking down into different sublists. Click the right choice, then Add:

\r\n\r\n

The EurKEY layout is part of the standard English language support in Ubuntu.

\r\n

Finally, to enable unicode color emoji as completion suggestions, switch to the Typing Booster mode\r\nby pressing Super/Windows+Space repeatedly until you see the rocket in your notification area. Click\r\nthe rocket -> Unicode symbols and emoji predictions -> On.

\r\n

I owe you a followup episode once I figure out how to make this work for Guix applications running\r\ninside Ubuntu.

\r\n
\r\n

This episode was based on a Fediverse thread:
https://libranet.de/display/0b6b25a8-6760-517c-52c9-654926232346

\r\n

References for your further study:

\r\n\r\n',311,0,0,'CC-BY-SA','ubuntu, input methods, guix, chinese, emoji, eurkey, pinyin, jyutping, cangjie',0,0,1), (3303,'2021-03-31','Slackware on RaspberryPi',1182,'An alternative to raspberrypi os','

a little history

\n\n

why choose slackware

\n\n

who should avoid slackware

\n\n

howto

\n\n

on the slackware documentation project website there are \'manual\' install projects

\n\n\n\n

after install

\n\n

The only mistakes you can\'t learn from are, your own fatal mistakes

\n

Links

\n\n',326,0,0,'CC-BY-SA','raspberry pi, slackware',0,0,1), (3309,'2021-04-08','Linux Inlaws S01E27: The Big Uncertainties in Life and beyond',3417,'The two chaps discuss uncertainties and beyond in this episode on probabilistic data structure','

In this episode, our two heroes explore the realm of the great uncertainties also known as probabilistic data structures. For this adventures they managed to retain one of the experts in this field from the open source realm. Check out the episode to get in on this secret and its details!

\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','Probabilistic data structures,PDS',0,0,1), (3305,'2021-04-02','Nagios part 2',1428,'Follow up to hpr3264 - Notifications, SNMP, Remote Checks','

I did not get any feed back on my first nagios episode, so I can only assume that I perfectly explained what nagios is. And my installation instructions were so good, that no one had any questions. So I will move on to some additional nagios topics.

\r\n

Why use nagios

\r\n

One thing I meant to talk about but forgot in the intro is why you may want to run nagios as a hobbyist.

\r\n\r\n

Most of the benefits of nagios are not specific to nagios. There are plenty of other options for monitoring, and all of them are worth exploring.

\r\n

Notification Options

\r\n

Email

\r\n

I had planned on discussing how to set up postfix to send emails. But, that is such a big topic I will have to skip it. I will instead talk about what I do to send email. And Maybe you can do something similar.

\r\n

Spammers have ruined the ability to directly send email. Most residential ISPs block port 25 outbound to prevent malware from sending email. Some Virtual hosting providers may not block sending mail, but many mail servers will not accept mail from VPS IP ranges.

\r\n

There are a few ways to get around this problem. I use the email delivery service Sendgrid. They do all the work of staying off the list of spammers, and most email providers trust mail send via Sendgrid.

\r\n

I wont go into the instructions for configuring postfix to relay outgoing mail via Sendgrid, but their documentation is easy to follow.

\r\n

There are plenty of services like sendgrid. And most have a free tier. So unless you are blasting out alerts you probably will not have to pay. If you want to send alerts from nagios via email, I recommend finding a email sending service that works for you.

\r\n

Push alerts

\r\n

There are a few options (besides email) for getting alerts on your phone.

\r\n

aNag

\r\n

The easiest way to get alerts is probably the aNag Android app. aNag connects to the nagios UI to get status updates. It can be configured to check in periodically and there generate notifications for failed checks.

\r\n

One downside to aNag is the phone has to be able to connect to the nagios server. So, if nagios is on a private network, you will need a VPN when you are not on the same network.

\r\n

If you decide to put nagios on a public network, be sure to configure apache to only use HTTPS. certbot makes this really easy.

\r\n

Pushover

\r\n

Another option is to us a Push Notification service that can send notifications that are triggered by API calls.

\r\n

I like to use the pushover.net You pay $5 when you download the pushover app from the app store, and then notifications are sent for free. They offer a 30 day trial if you want to evaluate the service.

\r\n

To use pushover, we will add a new contact to nagios. The command for the pushover contact is a script that calls the pushover API via curl.

\r\n

Remember from the previous episode, nagios has a conf.d directory and will load any files in that directory. So we will create a new file /etc/nagios4/conf.d/pushover.cfg and restart nagios. The contents of the pushover file will be in the show notes.

\r\n

To use pushover for specific checks, and the contact to that check. See the example in the show notes. Or if you want to use pushover for everything Modify the definitions for the host and service templates to use pushover as a contact

\r\n

The script that calls the Pushover API is at https://github.com/jedda/OSX-Monitoring-Tools/blob/master/notify_by_pushover.sh Save a copy of the script in the nagios plugins directory.

\r\n

pushover.cfg

\r\n
# 'notify-host-pushover' command definition\r\n\r\ndefine command{\r\n        command_name    notify-host-pushover\r\n        command_line    $USER1$/notify_by_pushover.sh -u $CONTACTADDRESS1$ -a $CONTACTADDRESS2$ -c 'persistent' -w 'siren' -t "Nagios" -m "$NOTIFICATIONTYPE$ Host $HOSTNAME$ $HOSTSTATE$"\r\n        }\r\n\r\n# 'notify-service-pushover' command definition\r\n\r\ndefine command{\r\n        command_name   notify-service-pushover\r\n        command_line   $USER1$/notify_by_pushover.sh -u $CONTACTADDRESS1$ -a $CONTACTADDRESS2$ -c 'persistent' -w 'siren' -t "Nagios" -m "$HOSTNAME$ $SERVICEDESC$ : $SERVICESTATE$ Additional info: $SERVICEOUTPUT$"\r\n        }\r\n\r\ndefine contact{\r\n        name                            generic-pushover\r\n        host_notifications_enabled      1\r\n        service_notifications_enabled   1\r\n        host_notification_period        24x7\r\n        service_notification_period     24x7\r\n    service_notification_options    w,c,r\r\n    host_notification_options       d,r\r\n        host_notification_commands      notify-host-pushover\r\n        service_notification_commands   notify-service-pushover\r\n        can_submit_commands             1\r\n        retain_status_information       1\r\n        retain_nonstatus_information    1\r\n        contact_name           Pushover\r\n        address1               {{ pushover_user_key }}\r\n        address2               {{ pushover_app_key }}\r\n}
\r\n

writing custom checks

\r\n

One of the big advantages of nagios is the ability to write custom checks. In the previous episode, I mentioned that the status of the nagios checks are based on exit code.

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Exit Codestatus
0OK/UP
1WARNING
2CRITICAL
\r\n

So, to write a custom check, we need a script that will perform a check, and exit with an exit code based on the results of the check.

\r\n

Verify recent log entry

\r\n

I have a server where occasionally the syslog daemon stop running,

\r\n

Instead of trying to figure out why syslog keeps crashing, I wrote a script to check the log file is being updated. The script looks for the expected log file and tests that it has been modified in the last few minutes. The script will:

\r\n\r\n

Since the server with the crashy syslog is not the same server running nagios, I need a way for nagios to execute the script on the remote server.

\r\n

Nagios has a few ways to run check commands on remote servers. I prefer to use ssh, but there are some disadvantages to using ssh. Specifically the resources required to establish the ssh connection can be heavier than some of the other remote execution methods.

\r\n

The check_by_ssh plugin can be used to execute check commands on another system. Typically ssh-key authentication is set up so the user that is running the nagios daemon can log in to the remote system without a password

\r\n

You can try the command to make sure it is working.

\r\n
cd /usr/lib/nagios/plugins\r\n./check_by_ssh -H RemoteHost -u RemoteUser \\\r\n-C /path/to/remote/script/check_log_age.sh
\r\n

The new command can be added to a file in the nagios conf.d directory

\r\n
define command {\r\n    command_name check_syslog_age\r\n    command_line    $USER1$/check_by_ssh  -u RemoteUser -C /remote/path/check_log_age.sh\r\n        }
\r\n

After adding the command definition, check_syslog_age can be added as a service check.

\r\n

The Log Check script:

\r\n
#!/usr/bin/bash\r\n\r\nTODAY=$(date +%Y%m%d)\r\nLOGPATH="/syslog"\r\nTODAYSLOG="$TODAY.log"\r\nif test `find "$LOGPATH/$TODAYSLOG" -mmin -1`\r\nthen\r\n    echo OK\r\n    exit 0\r\nelif test `find "$LOGPATH/$TODAYSLOG" -mmin -10`\r\nthen\r\n    echo WARNING\r\n    exit 1\r\nelse\r\n    echo CRITICAL\r\n    exit 2\r\nfi
\r\n

Using snmp to monitor load average and disk usage

\r\n

SNMP can get complicated and I have mixed feelings about using it. I am not going to go into the SNMP versions or the different authentication options for SNMP. But I will show a minimal setup that allows some performance data to be checked by nagios

\r\n

The SNMP authentication that I am demonstrating is only appropriate for isolated networks. If you plan to use snmp over a public network, I recommend looking into more secure versions of SNMP or tunnelling the check traffic via ssh or a VPN.

\r\n

If you want to learn more about SNMP, I recommend \"SNMP Mastery\" by Michael W Lucas. https://www.tiltedwindmillpress.com/product/snmp-mastery/

\r\n

SNMP setup

\r\n

First we need to configure the client to respond to SNMP request. On Ubuntu, apt install snmpd

\r\n

By default, snmpd listens on localhost. Replace the existing snmpd.conf with this example to set a read only community string and listen on all IP addresses.

\r\n

And don\'t forget, I do not recommend this for a Public Network. Restart snmpd and open port 161 if there is a firewall enabled.

\r\n
agentAddress udp:161,udp6:[::1]:161\r\nrocommunity NEW_SECURE_PASSWORD\r\ndisk /
\r\n

SNMP nagios checks

\r\n

The nagios plugin package installs several pre-defined snmp checks in /etc/nagios-plugins/config/snmp.cfg Look through the file to get an idea of the checks that can be performed via SNMP.

\r\n

Below is an example of a client configuration that uses SNMP. If you look at how the command definitions, most of them have an option to accept arguments to modify how the check is done The argument placeholders re represented by $ARG1$

\r\n

In most cases, the arguments are optional. This particular SNMP check for disk space requires an argument to complete the disk ID being checked.

\r\n

When the service check is defined, the arguments are separated by ! You can also see in the example how you can

\r\n\r\n
define host {\r\n  host_name ServerIP\r\n  use linux-server\r\n}\r\ndefine service {\r\n  use generic-service\r\n  host_name ServerIP\r\n  contacts Pushover\r\n  max_check_attempts 1\r\n  check_interval 1\r\n  service_description DISK\r\n  check_command snmp_disk!NEW_SECURE_PASSWORD!1!1 # first arg is disk number\r\n  # command in /etc/nagios-plugins/config/snmp.cfg\r\n}\r\ndefine service {\r\n  use generic-service\r\n  host_name ServerIP\r\n  contacts Pushover\r\n  service_description LOAD\r\n  check_command snmp_load!NEW_SECURE_PASSWORD\r\n  # command in /etc/nagios-plugins/config/snmp.cfg\r\n}\r\ndefine service {\r\n  use generic-service\r\n  host_name ServerIP\r\n  service_description Memory\r\n  check_command snmp_mem!NEW_SECURE_PASSWORD\r\n  # command in /etc/nagios-plugins/config/snmp.cfg\r\n}\r\ndefine service {\r\n  use generic-service\r\n  host_name ServerIP\r\n  service_description Swap\r\n  check_command snmp_swap!NEW_SECURE_PASSWORD\r\n  # command in /etc/nagios-plugins/config/snmp.cfg\r\n}
\r\n

Check servers for updates

\r\n

Nagios has plugins that can check if there are system updates required.

\r\n\r\n

The check plugin is installed on the remote server. The plugin for Debian based systems is nagios-plugins-contrib or nagios-plugins-check-updates for Red Hat based systems.

\r\n

The command definitions are below. Since the plugins take longer to run, you will probably need to modify the nagios plugin timeout.

\r\n
define command {\r\n    command_name check_yum\r\n        command_line    $USER1$/check_by_ssh -H $HOSTADDRESS$ -t 120 -u root -C "/usr/lib64/nagios/plugins/check_updates -t120"\r\n    }\r\ndefine command {\r\n       command_name check_apt\r\n       command_line    $USER1$/check_by_ssh -H $HOSTADDRESS$ -t 120 -u nagios-ssh -C "/usr/lib/nagios/plugins/check_apt -t60"\r\n        }
\r\n

That\'s probably all the nagios I can handle for now. Leave a comment if there are nagios topics you would like to hear about. Thanks for listening and I will see you next time.

\r\n',342,0,0,'CC-BY-SA','nagios,bash,snmp',0,0,1), (3308,'2021-04-07','let\'s talk about Thunderbird',2005,'Using Thunderbird to manage emails.','

Thunder bird, the wonderful email client. I share how I use and enjoy the Thunderbird email client.

\r\n

use `hpr391` as the subject for all emails. If not, junk filter.

',391,0,0,'CC-BY-SA','email, Thunderbird',0,0,1), (3307,'2021-04-06','Git worktree',1507,'How to use git worktree','

Create a new worktree

\r\n\r\n
\r\n$ git branch | tee\r\n* dev\r\ntrunk\r\n$ git worktree add -b hotfix ~/demo/penguin.tree trunk\r\nPreparing ../penguin.tree (identifier penguin.tree)\r\nHEAD is now at 62a2daf commit\r\n\r\n
\r\n\r\n

List existing worktrees

\r\n\r\n
\r\n$ git worktree list\r\n/home/tux/demo/penguin.git       15fca84 [dev]\r\n/home/tux/demo/penguin.tree     09e585d [trunk]\r\n\r\n
\r\n\r\n

Move a worktree

\r\n\r\n
\r\n$ git worktree move penguin.tree ~/Temp\r\n\r\n
\r\n\r\n

Remove a worktree

\r\n
\r\n$ git worktree remove penguin.tree\r\n\r\n
\r\n\r\n',78,104,0,'CC-BY-SA','git,tree,trunk,branch',0,0,1), (3311,'2021-04-12','Bradley M. Kuhn\'s article from 2019 on Richard M. Stallman',1584,'This text to speech article requires listener discretion.','
\r\n

Counter Point

\r\n

This show has a counter point: hpr3316 :: FSF and RMS on election of Richard Stallman\r\n

\r\n
\r\n\r\n

Warning This show contains information that may not be suitable for all. Listener discretion is advised.

\r\n

Recently Richard M. Stallman, announced that he has rejoined the Free Software Foundation’s board of directors. An open letter on github called for him to be removed again, and for the FSF’s entire board to resign.

\r\n

When he resigned in 2019, Bradley M. Kuhn (from the Free as in Freedom podcast) wrote an article titled \"On Recent Controversial Events\" about the issue. I am submitting that article here under the terms of the Creative Commons Attribution-Share Alike 3.0 United States License. The post contains many links and is available in the shownotes for this show. Some examples are included at the end of the blog post, and listener discretion is advised.

\r\n

\r\nOn Recent Controversial Events\r\n

\r\n

\r\nTuesday 15 October 2019 by Bradley M. Kuhn\r\n

\r\n

\r\nThe last 33 days have been unprecedentedly difficult for the software freedom community and for me personally. Folks have been emailing, phoning, texting, tagging me on social media (— the last of which has been funny, because all my social media accounts are placeholder accounts). But, just about everyone has urged me to comment on the serious issues that the software freedom community now faces. Until now, I have stayed silent regarding all these current topics: from Richard M. Stallman (RMS)’s public statements, to his resignation from the Free Software Foundation (FSF), to the Epstein scandal and its connection to MIT. I’ve also avoided generally commenting on software freedom organizational governance during this period. I did this for good reason, which is explained below. However, in this blog post, I now share my primary comments on the matters that seem to currently be of the utmost attention of the Open Source and Free Software communities.\r\n

\r\n

\r\nI have been silent the last month because, until two days ago, I was an at-large member of FSF’s Board of Directors, and a Voting Member of the FSF. As a member of FSF’s two leadership bodies, I was abiding by a reasonable request from the FSF management and my duty to the organization. Specifically, the FSF asked that all communication during the crisis come directly from FSF officers and not from at-large directors and/or Voting Members. Furthermore, the FSF management asked all Directors and Voting Members to remain silent on this entire matter — even on issues only tangentially related to the current situation, and even when speaking in our own capacity (e.g., on our own blogs like this one). The FSF is an important organization, and I take any request from the FSF seriously — so I abided fully with their request.\r\n

\r\n

\r\nThe situation was further complicated because folks at my employer, Software Freedom Conservancy (where I also serve on the Board of Directors) had strong opinions about this matter as well. Fortunately, the FSF and Conservancy both had already created clear protocols for what I should do if ever there was a disagreement or divergence of views between Conservancy and FSF. I therefore was recused fully from the planning, drafting, and timing of Conservancy’s statement on this matter. I thank my colleagues at the Conservancy for working so carefully to keep me entirely outside the loop on their statement and to diligently assure that it was straight-forward for me to manage any potential organizational disagreements. I also thank those at the FSF who outlined clear protocols (ahead of time, back in March 2019) in case a situation like this ever came up. I also know my colleagues at Conservancy care deeply, as I do, about the health and welfare of the FSF and its mission of fighting for universal software freedom for all. None of us want, nor have, any substantive disagreement over software freedom issues.\r\n

\r\n

\r\nI take very seriously my duty to the various organizations where I have (or have had) affiliations. More generally, I champion non-profit organizational transparency. Unfortunately, the current crisis left me in a quandary between the overarching goal of community transparency and abiding by FSF management’s directives. Now that I’ve left the FSF Board of Directors, FSF’s Voting Membership, and all my FSF volunteer roles (which ends my 22-year uninterrupted affiliation with the FSF), I can now comment on the substantive issues that face not just the FSF, but the Free Software community as a whole, while continuing to adhere to my past duty of acting in FSF’s best interest. In other words, my affiliation with the FSF has come to an end for many good and useful reasons. The end to this affiliation allows me to speak directly about the core issues at the heart of the community’s current crisis.\r\n

\r\n

\r\nFirstly, all these events — from RMS’ public comments on the MIT mailing list, to RMS’ resignation from the FSF to RMS’ discussions about the next steps for the GNU project — seem to many to have happened ridiculously quickly. But it wasn’t actually fast at all. In fact, these events were culmination of issues that were slowly growing in concern to many people, including me.\r\n

\r\n

\r\nFor the last two years, I had been a loud internal voice in the FSF leadership regarding RMS’ Free-Software-unrelated public statements; I felt strongly that it was in the best interest of the FSF to actively seek to limit such statements, and that it was my duty to FSF to speak out about this within the organization. Those who only learned of this story in the last month (understandably) believed Selam G.’s Medium post raised an entirely new issue. In fact, RMS’ views and statements posted on stallman.org about sexual morality escalated for the worse over the last few years. When the escalation started, I still considered RMS both a friend and colleague, and I attempted to argue with him at length to convince him that some of his positions were harmful to sexual assault survivors and those who are sex-trafficked, and to the people who devote their lives in service to such individuals. More importantly to the FSF, I attempted to persuade RMS that launching a controversial campaign on sexual behavior and morality was counter to his and FSF’s mission to advance software freedom, and told RMS that my duty as an FSF Director was to assure the best outcome for the FSF, which IMO didn’t include having a leader who made such statements. Not only is human sexual behavior not a topic on which RMS has adequate academic expertise, but also his positions appear to ignore significant research and widely available information on the subject. Many of his comments, while occasionally politically intriguing, lack empathy for people who experienced trauma.\r\n

\r\n

\r\nIMO, this is not and has never been a Free Speech issue. I do believe freedom of speech links directly to software freedom: indeed, I see the freedom to publish software under Free licenses as almost a corollary to the freedom of speech. However, we do not need to follow leadership from those whose views we fundamentally disagree. Moreover, organizations need not and should not elevate spokespeople and leaders who speak regularly on unrelated issues that organizations find do not advance their mission, and/or that alienate important constituents. I, like many other software freedom leaders, curtail my public comments on issues not related to FOSS. (Indeed, I would not even be commenting on this issue if it had not become a central issue of concern to the software freedom community.) Leaders have power, and they must exercise the power of their words with restraint, not with impunity.\r\n

\r\n

\r\nRMS has consistently argued that there was a campaign of \"prudish intimidation\" — seeking to keep him quiet about his views on sexuality. After years of conversing with RMS about how his non-software-freedom views were a distraction, an indulgence, and downright problematic, his general response was to make even more public comments of this nature. The issue is not about RMS’ right to say what he believes, nor is it even about whether or not you agree or disagree with RMS’ statements. The question is whether an organization should have a designated leader who is on a sustained, public campaign advocating about an unrelated issue that many consider controversial. It really doesn’t matter what your view about the controversial issue is; a leader who refuses to stop talking loudly about unrelated issues eventually creates an untenable distraction from the radical activism you’re actively trying to advance. The message of universal software freedom is a radical cause; it’s basically impossible for one individual to effectively push forward two unrelated controversial agendas at once. In short, the radical message of software freedom became overshadowed by RMS’ radical views about sexual morality.\r\n

\r\n

\r\nAnd here is where I say the thing that may infuriate many but it’s what I believe: I think RMS took a useful step by resigning some of his leadership roles at the FSF. I thank RMS for taking that step, and I wish the FSF Directors well in their efforts to assure that the FSF becomes a welcoming organization to all who care about universal software freedom. The FSF’s mission is essential to our technological future, and we should all support that mission. I care deeply about that mission myself and have worked and will continue to work in our community in the best interest of the mission.\r\n

\r\n

\r\nI’m admittedly struggling to find a way to work again with RMS, given his views on sexual morality and his behaviors stemming from those views. I explicitly do not agree with this \"(re-)definition\" of sexual assault. Furthermore, I believe uninformed statements about sexual assault are irresponsible and cause harm to victims. #MeToo is not a \"frenzy\"; it is a global movement by individuals who have been harmed seeking to hold both bad actors and society-at-large accountable for ignoring systemic wrongs. Nevertheless, I still am proud of the essay that I co-wrote with RMS and still find many of RMS’ other essays compelling, important, and relevant.\r\n

\r\n

\r\nI want the FSF to succeed in its mission and enter a new era of accomplishments. I’ve spent the last 22 years, without a break, dedicating substantial time, effort, care and loyalty to the various FSF roles that I’ve had: including employee, volunteer, at-large Director, and Voting Member. Even though my duties to the FSF are done, and my relationship with the FSF is no longer formal, I still think the FSF is a valuable institution worth helping and saving, specifically because the FSF was founded for a mission that I deeply support. And we should also realize that RMS — a human being (who is flawed like the rest of us) — invented that mission.\r\n

\r\n

\r\nAs culture change becomes more rapid, I hope we can find reasonable nuance and moderation on our complex analysis about people and their disparate views, while we also hold individuals fully accountable for their actions. That’s the difficulty we face in the post-post-modern culture of the early twenty-first century. Most importantly, I believe we must find a way to stand firm for software freedom while also making a safe environment for victims of sexual assault, sexual abuse, gaslighting, and other deplorable actions.\r\n

\r\n

\r\n

\r\n

\r\nPosted on Tuesday 15 October 2019 at 09:11 by Bradley M. Kuhn.\r\n

\r\n

\r\n

Submit comments on this post to <bkuhn@ebb.org>.

\r\n
\r\n

The following posts are authored by Richard M. Stallman and are taken from his personal site stallman.org. They were linked to in the piece you have just heard.

\r\n

stallman.org 31 October 2016 (Down’s syndrome) A new noninvasive test for Down’s syndrome will eliminate the small risk of the current test. This might lead more women to get tested, and abort fetuses that have Down’s syndrome. Let’s hope so! If you’d like to love and care for a pet that doesn’t have normal human mental capacity, don’t create a handicapped human being to be your pet. Get a dog or a parrot. It will appreciate your love, and it will never feel bad for being less capable than normal humans.

\r\n

stallman.org 14 December 2016 (Campaign of bull-headed prudery) A national campaign seeks to make all US states prohibit sex between humans and nonhuman animals. This campaign seems to be sheer bull-headed prudery, using the perverse assumption that sex between a human and an animal hurts the animal. That’s true for some ways of having sex, and false for others. For instance, I’ve heard that some women get dogs to lick them off. That doesn’t hurt the dog at all. Why should it be prohibited? When male dolphins have sex with people, that doesn’t hurt the dolphins. Quite the contrary, they like it very much. Why should it be prohibited? I’ve also read that female gorillas sometimes express desire for sex with men. If they both like it, who is harmed? Why should this be prohibited? The proponents of this law claim that any kind of sex between humans and other species implies that the human is a \"predator\" that we need to lock up. That’s clearly false, for the cases listed above. Making a prohibition based on prejudice, writing it in an overbroad way, is what prissy governments tend to do where sex is concerned. The next step is to interpret it too strongly with \"zero tolerance\". Will people convicted of having dogs lick them off be required to live at least 1000 feet from any dogs? This law should be changed to prohibit only acts in which the animal is physically forced to have sex, or physically injured.

\r\n

stallman.org 23 February 2017 (A \"violent sex offender\") The teenager who will have to register as a \"violent sex offender\" had a sexual meeting with a younger teenager. Why do people think there is something wrong with a sexual relationship between people of ages 13 and 18? The principal activity of human adolescents is sex.

\r\n

stallman.org 26 May 2017 (Prudish ignorantism) A British woman is on trial for going to a park and inviting teenage boys to have sex with her there. Her husband acted as a lookout in case someone else passed by. One teenager allegedly visited her at her house repeatedly to have sex with her. None of these acts would be wrong in any sense, provided they took precautions against spreading infections. The idea that adolescents (of whatever sex) need to be \"protected\" from sexual experience they wish to have is prudish ignorantism, and making that experience a crime is perverse.

\r\n

stallman.org 13 June 2017 (Sex offender registry) The sex offender registry treats any sexual crime as far worse than murder.

\r\n

stallman.org 10 October 2017 (Laws against having sex with an animal) European countries are passing laws against having sex with an animal. (We are talking about sex practices that don’t physically hurt the animal.) These laws have no rational basis. We know that some animals enjoy sex with humans. Others don’t. But really, if you smear something on your genitals that tastes good to dogs, and have a dog lick you off, it harms no one. Why should this be illegal except mindless religion?

\r\n

stallman.org 27 November 2017 (Roy Moore’s relationships) Senate candidate Roy Moore tried to start dating/sexual relationships with teenagers some decades ago. He tried to lead Ms Corfman step by step into sex, but he always respected \"no\" from her and his other dates. Thus, Moore does not deserve the exaggerated condemnation that he is receiving for this. As an example of exaggeration: one mailing referred to these teenagers as \"children\", even the one that was 18 years old. Many teenagers are minors, but none of them are children. The condemnation is surely sparked by the political motive of wanting to defeat Moore in the coming election, but it draws fuel from ageism and the fashion for overprotectiveness of \"children\". I completely agree with the wish to defeat Moore. Political Christianists such as Moore hold views that conflict essentially with human rights, just as political Islamists do. If Moore, with his extremist policies, gains public office again, he will harm millions of American women, and secondarily society as a whole. Ms Corfman says she was hurt afterward, and attributes this to feelings of guilt based on the belief that she had done something wrong (which, of course, she had not). Is this is another sign of Christianity at work? I sent a check to Doug Jones US Senate a few weeks ago. Please support his campaign too. You can mail a check here: (Address available at original link)

\r\n

stallman.org 29 October 2017 (Pestering women) A famous theater director had a habit of pestering women, asking them for sex. As far as I can tell from this article, he didn’t try to force women into sex. When women persistently said no, he does not seem to have tried to punish them. The most he did was ask. He was a pest, but nothing worse than that.

\r\n

stallman.org 30 April 2018 (UN peacekeepers in South Sudan) It sounds horrible: \"UN peacekeepers accused of child rape in South Sudan.\" But the article makes it pretty clear that the \"children\" involved were not children. They were teenagers. What about \"rape\"? Was this really rape? Or did they have sex willingly, and prudes want to call it \"rape\" to make it sound like an injustice? We can’t tell from the article which one it is. Rape means coercing someone to have sex. Precisely because that is a grave and clear wrong, using the same name for something much less grave is a distortion.

\r\n

stallman.org 17 July 2018 (The bullshitter’s flirting) We are now invited to despise the bullshitter for telling a 17-year-old woman at a party that he found her attractive. We can hardly assume that the bullshitter’s boasts were true. Even men who are usually honest on other topics have been known to lie about their sexual achievements. However, I wouldn’t assume they were false, or that he did an injustice to anyone at these parties. In a group of 50 models, there could well be some that would eagerly go to bed with a rich man, either to boost their careers or for a lark. If you condemn men for finding teenage female models attractive, you might as well condemn men for being heterosexual. The bully may be predatory, but it appears he didn’t display this overtly at those parties. There are indications that he arbitrarily chose the winners of the Miss USA beauty contest while he owned it. That would be a real wrong, since it would have made the contest dishonest. I understand the desire to condemn the bullshitter on every aspect of his life, but it is no excuse for ageism. If you can understand that we shouldn’t dictate people’s gender preferences, you should understand that we shouldn’t dictate their age preferences either. There are plenty of tremendously important reasons to condemn the bully. He is attacking workers’ rights, abortion rights, non-rich people’s pensions and medical care, the environment, human rights, and democracy, even the idea of truth. Let’s focus on those real reasons.

\r\n

stallman.org 21 August 2018 (Age and attraction) Research found that men generally find females of age 18 the most attractive. This accords with the view that Stendhal reported in France in the 1800s, that a woman’s most beautiful years were from 16 to 20. Although this attitude on men’s part is normal, the author still wants to present it as wrong or perverted, and implicitly demands men somehow control their attraction to direct it elsewhere. Which is as absurd, and as potentially oppressive, as claiming that homosexuals should control their attraction and direct it towards to the other sex. Will men be pressured to undergo \"age conversion therapy\" intended to brainwash them to feel attracted mainly to women of their own age?

\r\n

stallman.org Anti-Glossary Sexual assault: this term is so broad that using it is misleading. The term includes rape, groping, sexual harassment, and other acts. These acts are not merely different in degree. They are different in kind. Rape is a grave crime. Being groped is unpleasant but not as grave as robbery. Sexual harassment is a not an action at all, but rather a pattern of actions that constitutes economic unfairness. How can it make sense to group these behaviors things together? It never makes sense. News articles, studies, and laws should avoid that term.

\r\n

stallman.org 23 September 2018 (Cody Wilson) Cody Wilson has been charged with hiring a \"child\" sex worker. Her age has not been announced, but I think she must surely be a teenager, not a child. Calling teenagers \"children\" in this context is a way of smearing people with normal sexual proclivities as \"perverts\". They have accused him of \"sexual assault\", a term so vague that it should never be used at all. With no details, we can’t tell whether the alleged actions deserve that term. What we do know is that the term is often used for a legal lie. She may have had — I expect, did have — entirely willing sex with him, and they would still call it \"assault\". I do not like the idea of 3D-printed guns, but that issue is entirely unrelated to this.

\r\n

stallman.org 6 November 2018 (Sex according to porn) The unrealistic picture of sex presented in most porn harms men as well as women in their sex lives (though in different ways). Their sexual miseducation starts in adolescence, but many never learn better. Our society’s taboo cuts adolescents off from any way to learn about sexual relationships and lovemaking other than from porn and from other confused adolescents. Everyone learns the hard way, often slowly, and in many cases learns bad lessons. The more effective the taboo, the deeper the ignorance. In 18th century France, teenage girls of good family emerged totally sexually innocent from education in a convent. Totally innocent and totally exploitable (see Dangerous Liaisons). Contrast this with Marquesan society, where adolescents are not kept ignorant by a taboo on sex. They have various relationships with lovers of their choice, so they have many opportunities to see what pleases and what doesn’t. Any one lover can please them more, or please them less, but can’t mislead them — they have standards for comparison. In that society, even adolescents understand lovemaking better than a lot of American adults. Inevitably, everyone starts out ignorant; the question is, how can society offer people a path which leads them to learn to do things well, rather than learning painfully to do them badly.

\r\n

stallman.org 14 February 2019 (Respecting people’s right to say no) Writer Yann Moix said that he cannot be attracted to women in their 50s, and people are condemning him, claiming he has an obligation to be attracted to them. You might as well demand that a homosexual be attracted to people not of the same sex. Or that a heterosexual be attracted to people that are of the same sex. There is no arguing about tastes. If we respect people’s right to say no, we should not rebuke them when they do. Of course, many people (especially men, but not only) despise those they find unattractive. That is a mean way to treat people who haven’t done anything wrong. But being unattracted by someone is not the same as despising per. Yann Moix understands this.

\r\n

stallman.org 12 June 2019 (Declining sex rates) Many demographic categories report having sex less now than in the past. It might be due to the general stress and anxiety of life in the advanced countries. I suspect it is also due to the lack of any generally accepted way for men to express romantic or sexual interest in women. By \"generally accepted\", I mean that he can count on a woman who declines his interest not to revile him for expressing it that way.

\r\n

stallman.org 30 July 2019 (Al Franken) Al Franken now regrets resigning from the Senate. Some senators that pushed him to resign now regret that too. The first (main) article does not state clearly whether Franken touched Tweeden in the process of making the photo, but it seems he did not. If that is correct, it was not a sexual act at all. It was self-mocking humor. The photograph depicted a fictional sexual act without her fictional consent, but making the photo wasn’t a sexual act. If it is true that he persistently pressured her to kiss him, on stage and off, if he stuck his tongue into her mouth despite her objections, that could well be sexual harassment. He should have accepted no for an answer the first time she said it. However, calling a kiss \"sexual assault\" is an exaggeration, an attempt to equate it to much graver acts, that are crimes. The term \"sexual assault\" encourages that injustice, and I believe it has been popularized specifically with that intention. That is why I reject that term. Meanwhile, Franken says he did not do those things, and the other actors he previously did the same USO skit with said it was not harassment, just acting. Tweeden’s store is clearly false in many details. Should we assume Tweeden was honest? With so many demonstrated falsehoods in her accusations, and given that she planned them with other right-wing activists, and that all of them follow a leader who lies as a tactic every day, I have to suspect that she decided to falsify accusations through exaggeration so as to kick a strong Democrat out of the Senate. I have no proof of that suspicion. It is possible that she made the accusations honestly. Also, in a hypothetical world, someone might really have done them. Supposing for the moment that those accusations were true, should Franken have resigned over them? I don’t think so. They are misjudgments, not crimes. Franken deserved the chance to learn from the criticism that surprised him. Zero tolerance is a very bad way to judge people. However, the most important point is to reject the position that if B feels hurt by what A said or did, then automatically A is wrong. People judged Franken that way, and he judged himself that way. But that way degrades the concept of \"wrong\" into a mere expression of subjective disapproval. What can legitimately be asserted subjectively can legitimately be ignored subjectively too. To judge A that way is to set B up as a tyrant. If B’s feelings were hurt, that’s unfortunate – but is that A’s fault? If so, was it culpable, or just a mistake? That is what we have to judge, and if we want others to think our judgments worth following, they must be based on objective facts and objective standards, including objective standards for what words and gestures objectively mean. Traister is wrestling with a solvable problem. She says, \"When you change rules, you end up penalizing people who were caught behaving according to the old rules.\" Maybe people do, but that is a sign of carelessness. It isn’t really hard to change the rules and then judge old actions by the old rules. We just have to remember to do so.

\r\n

stallman.org 27 August 2019 (Me-too frenzy) In \"me-too\" frenzy, crossed signals about sex can easily be inflated into \"rape\". If people rush to judgment, in an informal way, that can destroy a man’s career without any trial in which to clear his name.

\r\n

stallman.org 21 September 2019 (Sex workers) Today’s Sex Workers, Like Their Victorian Sisters, Don’t Want \"saving\". Feminism today is drifting off the track into a campaign of prudery that harms everyone, except those who are asexual.

\r\n

stallman.org 11 June 2019 (Stretching meaning of terms) Should we accept stretching the terms \"sexual abuse\" and \"molestation\" to include looking without touching? I do not accept it.

\r\n\r\n',393,0,1,'CC-BY-SA','Bradley M. Kuhn, Richard M. Stallman, RMS, FSF, Free Software Foundation',0,0,1), (3304,'2021-04-01','Newsflash 21/01/04',178,'An upgrade to some standard information formats','

Introduction

\r\n

After many years of confusion it has been decided to produce a common standard for dates and times between Europe and the United States of America.

\r\n

When encountering a USA date such as 03/14/2021 (known as Pi Day in the USA) there has been ambiguity over which part of the date is the day and which the month. There can also be confusion as to the year if the two-digit form is used.

\r\n

Standardisation is a way in which these sorts of ambiguities can be resolved. Having a common method of representation avoids confusion.

\r\n

Therefore, starting in 2021, in the spirit of clarity and prevention of misunderstanding, the EU has decided to standardise on compatible formats wherever possible.

\r\n

Dates

\r\n

Henceforward dates will be represented in one of the following forms:

\r\n
MM/DD/YY    month/day of month/two-digit year\r\n\r\nYY/DD/MM    two-digit year/day of month/month
\r\n

Thus, 21/14/03 or 03/14/21 will be universally recognised as Pi Day.

\r\n

Times

\r\n

The break from the previous tyranny of large|medium|small or small|medium|large formats has been extended to 24-hour time representations.

\r\n

Henceforward 24-hour times will be represented in one of the following forms:

\r\n
SS:HH:MM    seconds:hours:minutes\r\n\r\nMM:HH:SS    minutes:hours:seconds
\r\n

Support

\r\n

Bash already introduced support last year. You will need to update to Ubuntu Falex to get the latest version.

\r\n

Future plans

\r\n

The Standardisation Working Group will be planning other measures.

\r\n

Forthcoming rationalisations will be:

\r\n\r\n',393,0,0,'CC-BY-SA','date,time,formats',0,0,1), (3312,'2021-04-13','COVID Doldrums',4288,'MrX and Dave Morriss have a chat over Mumble in these trying times','

Introduction

\r\n

Hosts:

\r\n\r\n

We had some issues with getting Mumble to work, for reasons we couldn’t quite fathom. Both ends needed to be restarted several times until all worked properly.

\r\n

We recorded this on Sunday March 7th 2021. The last time we set up a chat like this was back in August 2020, surprisingly!

\r\n

Note on the title: the term the doldrums refers to a belt around the equator where sailing ships used to be becalmed due to the lack of wind. It also means a state of inactivity or stagnation, or a dull, listless, depressed mood; low spirits.

\r\n

Topics discussed

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n',225,0,1,'CC-BY-SA','COVID-19',0,0,1), (3317,'2021-04-20','Reading a manifesto: Towards A Cooperative Technology Movement',1015,'If open source misses the point of free software philosophy, what point is free software missing?','

Three good decades ago, Richard Stallman founded the free software movement and gave it a name.

\r\n

Two good decades ago there was a fork and Eric S. Raymond, Bruce Perens and others founded the open\r\nsource software movement, and neglected to tell us who gave it a name.\r\n(it was Christine Peterson[0])

\r\n

Ever since then, the free software side of the two movements has been careful to guard the boundary\r\nbetween the two, see Richard Stallman\'s essay \"Open Source Misses the Point\".[1]

\r\n

But lately a lot of people have increasingly been feeling that free software misses the point.\r\nIronically a lot of this has been coming from the open source side of things, as the official free\r\nsoftware philosophy has been firmly anchored with Stallman, and he hasn\'t been interested in moving\r\nhis philosophy in more inclusive directions.

\r\n

For sure, there are a lot of people in free software who have been wanting to go in this direction\r\nas well. I\'ve been thinking of it as a \"free software plus\", as it builds on the free software\r\nphilosophy, but adds aspects of social responsibility. The fact that Stallman was forced to resign\r\nfrom being Free Software Foundation president two years ago was a sign that people inside free\r\nsoftware cared about more than just the code and what freedoms it gives the recipient.

\r\n

A month ago, if you are listening to this on April the 20th 2021,\r\na manifesto was published called \"Towards A Communal Software Movement\", and I\'ll get to\r\nthat in a minute. I mentioned the names of the drivers of the previous movements, but this author\r\nhas said \"I intentionally left authors\' names out of it\"[2], and I think that makes sense. Part of the\r\nproblems with previous movements has been this Great Man of History fallacy, which may have kept\r\nthem focused and on track, but it has also held them back.

\r\n

The movement is young and has already changed names once as I was writing about it. The manifesto is\r\nnow \"Towards A Cooperative Technology Movement\", and I have updated the shownotes and my commentary\r\nto reflect that.

\r\n

https://misskey.de/notes/8k0igd5tcd

\r\n

I see the difference between free software and cooperative technology similarly as the difference\r\nbetween open source and free software.

\r\n

There are certainly people within open source and on the Open Source Initiative board that look\r\nfurther than just the license, and treat open source like just another brand name for free software.

\r\n

But at its core, the Open Source Definition is all about the licensing and that document is the\r\nshared common ground for all open source. People write code for different reasons and there\'s a\r\nlicense and contribution model that allow them to come together without those differences of purpose\r\ngetting too much in the way.

\r\n

So if the software and the license is \"what\" we\'re building, the philosophical documents of free\r\nsoftware provide the guidance on \"why\" we are building it: We want to get away from proprietary\r\nsoftware, we want to control our own computing, we want the freedoms to use, learn, modify and\r\nshare, etc. Free software is about our freedoms.

\r\n

So just like \"free\" is right there in the name, maybe the \"community\" in \"communal software\" or\r\nthe \"cooperative\" in \"cooperative technology\" is\r\nall about the \"who\": Who gets the freedom, who has the influence, who is affected.

\r\n

And again, lots of people in free software do care about community principles beyond code, care about\r\nsocial responsibility, but the shared baseline is the care for formal, technical and individual user\r\nfreedom: If you receive the code, you are allowed the technical rights to update the code, the\r\ncode or license should not restrict your freedoms, you, the recipient of the software, the hacker,\r\nthe code contributor. It says nothing about practical user freedom and it says nothing about the\r\ncommunity beyond the immediate user.

\r\n
\r\n

That was my commentary. Now let\'s read the manifesto.

\r\n

https://cooperativetechnology.codeberg.page/

\r\n
\r\n

Before I saw the manifesto, I had written a draft list of aspects beyond licensing and contribution\r\nthat determine the social good of your project:\r\nhttps://libranet.de/display/0b6b25a8-3060-61f6-28df-cae554943983

\r\n

The conversations that led directly to the creation of the manifesto:\r\nhttps://social.polymerwitch.com/@polymerwitch/105934078911643041\r\nhttps://fosstodon.org/@be/105952735879246194

\r\n

[0] https://opensource.com/article/18/2/coining-term-open-source-software

\r\n

[1] https://www.gnu.org/philosophy/open-source-misses-the-point.en.html

\r\n

[2] https://fosstodon.org/@be/105952960559032774

\r\n
\r\n

Towards A Cooperative Technology Movement

\r\n

In response to the surprise, undemocratic reinstatement of Richard Stallman to the board of directors of the Free Software Foundation after his resignation in September 2019, the Free and Open Source Software movement is in the midst of a reckoning.\r\nThe authors of this document recognize and honor the contributions Richard Stallman has made to this movement while unequivocally condemning his harmful behavior which has pushed many capable, dedicated people away from the movement.

\r\n

Regardless of what happens in the Free Software Foundation, we believe it is time to reflect on the shortcomings of our advocacy so we can grow into a more effective and inclusive movement for justice.\r\nTowards this end, we believe the movement will benefit from new terminology to describe what we do and what we aim for.\r\nRichard Stallman authored the free software definition in 1986.\r\nThis term has always created difficulties communicating the ideas behind it because of the different meanings of the word \"free\" in English.\r\nMoreover, it is not the freedom of machines we are concerned with, but the freedom of humans.\r\nIn response to this and other issues, in 1998, the term open source was promoted using an adapted version of the Debian Free Software Guidelines.\r\nThe history of computing in the past 23 years have validated critiques that the term \"open source\" is insufficient for communicating the values behind it.\r\nThe term \"open source\" and the ecosystem of Free and Open Source Software (FOSS) is today used by powerful companies, governments, and other institutions to harm people on enormous scales through surveillance and violence.\r\nThese institutions use FOSS to minimize economic costs by benefitting from decades of work done by others, much of which was done by unpaid volunteers motivated by curiosity, passion, and the ideals of the FOSS movement.

\r\n

We believe a significant reason for the failures of both \"free software\" and \"open source\" to prevent this cooptation is that the men who coined and initially promoted these terms did not and do not critique capitalism.\r\nRichard Stallman has generally dodged the question of whether free software is opposed to capitalism.\r\nIn the historical context of the United States in the 1980s, that may have been a wise decision.\r\nBut that was then, and now it is 2021.\r\nThe promoters of \"open source\" emphasize its compatibility with capitalism and go out of their way to distance \"open source\" from critiques of capitalism.\r\nWe believe we need to build on the FOSS movement with an explicitly anticapitalist political movement which proactively collaborates with other movements for justice.

\r\n

We propose the term \"cooperative technology\" for this movement.\r\nBy \"cooperative technology\", we mean technology that is constructed by and for the people whose lives are affected by its use.\r\nWhile this builds on the Free and Open Source Software movement, we aim to apply the same principles to hardware as well, although the criteria by which we evaluate hardware and software will of course not be identical.\r\nIt is not sufficient to narrowly focus on the people who directly interact with computers.\r\nCooperative software which is run on a server should not be controlled solely by the administrator of the server, but also by the people who interact with the server over a network.\r\nSimilarly, the data generated by the technology and the data which it requires to function should be in the control of the people who are affected by the technology.\r\nCooperative software that uses cameras should not be controlled solely by the people who own the cameras, but also the people who are observed by the cameras.\r\nCooperative electronic medical record systems should not be designed for the interests of insurance companies or hospital administrators, but for the interests of patients and the clinicians who directly use it.

\r\n

We aim for a world in which all technology is cooperative technology and recognize that any amount of proprietary technology is in conflict with this goal.\r\nAs an anticapitalist movement, we recognize that any institution which motivates people to put money, power, or self-interest above the welfare of humans is in conflict with our goals.\r\nCorporations are beholden to their shareholders who can hold the corporation legally liable for spending money in a way that is not intended to further enrich the shareholders.\r\nOther capitalist forms of enterprise have similar problems, incentivizing the profit of an elite few over the impact their activities have on others.

\r\n

We are not opposed to exchanges of money being involved in the creation or distribution of software or hardware.\r\nHowever, we should carefully consider the motivational structures of the institutions which fund technology development.\r\nWho benefits from the technology and who determines the priorities of its development and design?\r\nThese are questions we ask about technology whether money is involved or not.\r\nIt is in our interest to use safeguards to ensure that technology always remains controlled by the community which develops and uses it.\r\nCopyleft is one such safeguard, but it is insufficient on its own to prevent cooptation of our movement.\r\nAny cooperative technology project that receives funding from a for-profit enterprise must institute governance structures which prioritize community interests over profit in case there is a conflict between the two.\r\nWe oppose business models which are in conflict with community interests such as \"open core\"/proprietary relicensing.

\r\n

Similarly, we are opposed to authoritarian and hierarchical governance structures of technology projects such as \"benevolent dictators for life\".\r\nCooperative technology is developed democratically; no single individual should have ultimate authority in cooperative projects.\r\nWhile we recognize the need for leadership and private communication, discussions regarding cooperative technology should take place in public unless there is a specific reason for communications to be private.\r\nOrganizations which advocate for cooperative technology should likewise operate democratically and transparently.

\r\n

We recognize that creating high quality technology requires much more than engineering skills.\r\nCooperative technology is not only for people who have the skills of writing code (unless the software is for writing code such as a compiler) nor the skills to design hardware.\r\nCooperative technology strives to be easy to use, including for people with disabilities, and acknowledges that this is best accomplished by continual dialog between engineers and users.\r\nProviding such feedback is a valuable way to contribute to the construction of cooperative technology without needing engineering skills.\r\nIdeally, the engineers of the technology should also be using it themselves.\r\nMoreover, there are many ways to contribute to cooperative technology without programming skills such as imagining ideas for new features, reporting bugs, writing documentation, graphic design, translation, promotion, and financial support.

\r\n

The free software movement has failed to create a world in which humans in technological societies can live without using proprietary software unless one chooses to live the ascetic lifestyle of Richard Stallman.\r\nExpecting people to not use any proprietary technology and judging people for not meeting this standard pushes people away from our movement.\r\nPeople who are coerced into using proprietary technology deserve our empathy and invitation into our movement, not condescension.\r\nLet us criticize institutions which pressure people into using proprietary technology, not the people who choose to use it.\r\nTo that end, we strive to use cooperative technology tools as much as possible in our efforts to build cooperative technology.

\r\n

The purpose of this document is not to proclaim a legalistic set of criteria for determining what technology is cooperative and what technology is not.\r\nHistory has demonstrated that this is not an effective political tactic for the reasons explained above.\r\nThe free software definition and the open source definition are useful criteria for evaluating copyright licenses for code, but an effective political movement cannot be so narrowly focused on legalistic and binary judgements of copyright licenses to judge whether certain technology aligns with our goals.\r\nWe believe the focus of the cooperative technology movement should be on the practical impacts that the use of technology has on humans and the universe we inhabit.\r\nThe scope of this extends beyond humans and must consider the environment around us.\r\nMoreover, we believe it is counterproductive to have a small self-appointed group of privileged men determine what our movement\'s terminology, goals, and tactics are.\r\nWe encourage anyone interested in building a better world through technology to engage in discussions with your own communities about what you want \"cooperative technology\" to mean.

\r\n

While we agree with the Ethical Software Movement that we must resist when our efforts are coopted for unjust purposes, we reject putting restrictions on the ways people may use software through copyright licenses as a wise tactic for achieving our goals.\r\nThe history of the Free and Open Source Software movement has shown that the proliferation of incompatible copyright licenses which prohibit software from being legally combined creates more obstacles than opportunities for our movement.\r\nAny new copyright licenses for use with cooperative software must be written with this consideration in mind to intentionally avoid fracturing the software ecosystem.\r\nAdopting incompatible copyright licenses for different software would make it easy for our adversaries to divide and suppress the movement.

\r\n

Language is constructed collectively and is always evolving.\r\nIt is counterproductive to our movement to refuse to collaborate with people because they use the words \"open source\" or \"free software\" to describe their work.\r\nThey may even disagree with the entire premise of this document.\r\nThat does not mean we should not work together towards shared goals, but we should be conscious that our goals may not perfectly align and this may cause tension in our communities from time to time.\r\nWe invite anyone to collaborate with us who is interested in building a better world and treats us and others in our communities with dignity and respect.

\r\n

This document is licensed under the CC0 license. Contributions are welcome on Codeberg. If you disagree with parts of this, feel free to fork it and say what you want to say.

\r\n',311,0,0,'CC-0','open source, free software, communal software, cooperative technology, politics, philosophy',0,0,1), (3315,'2021-04-16','tesseract optical character recognition',128,'How to use this amazing tool','

Tesseract (software)

\r\nFrom Wikipedia, the free encyclopedia\r\n

\r\nTesseract is an optical character recognition engine for various operating systems. It is free software, released under the Apache License. Originally developed by Hewlett-Packard as proprietary software in the 1980s, it was released as open source in 2005 and development has been sponsored by Google since 2006.
\r\nIn 2006, Tesseract was considered one of the most accurate open-source OCR engines then available.\r\n

\r\n
\r\n\r\n$ tesseract -l eng english-page.jpg english\r\n$ tesseract -l nld dutch-page.jpg dutch\r\n$ ls\r\ndutch.txt english.txt \r\n\r\n
',30,0,0,'CC-BY-SA','Tesseract, OCR, optical character recognition',0,0,1), (3319,'2021-04-22','Linux Inlaws S01E28: Politicians and artificial intelligence part 1',4023,'Part 1 of a miniseries on AI, ML, DL and other fun','

In this episode, our two heroes explore the realm of artificial intelligence, paying special attention to deep learning (hoping that some\r\nof the stuff may rub on them :-). In this first part of a three-part mini-series the chaps discuss the foundation including networks, neurons\r\nand other topics of advanced black magic, carefully avoiding the temptations of introducing too much maths (we\'ll leave this to the Grumpy Old Coders :-).

\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','Policitians, artificial intelligence, deep learning, convolutions',0,0,1), (3313,'2021-04-14','Zoom Update',102,'Scripted Zoom Update with History on Fedora.','\r\n

Zoom does not provide a standard Fedora repo for updating. To get around that, this script will check the zoom fedora download link. If an update is found, it will download the new version, stop the current version from running, then install the updated package. All versions are downloaded to the same folder as the script. Filename is changed to match datestamp.

\r\n

I leave my linux machine always running. I schedule this to run just after midnight. If no update, nothing happens. If zoom is not running when I unlock, I launch zoom as normal.

\r\n\r\n

james@toebesacademy.com
\r\nhttps://james.toebesacademy.com
\r\nLet me know what you think.

\r\n',273,108,1,'CC-BY-SA','zoom update,sysadmin automation',0,0,1), (3318,'2021-04-21','Modding a Wii classic with a DNS exploit',457,'Modding a Wii with a DNS exploit and using a USB drive to save games','
    \r\n
  1. Wii Options > Wii Settings
  2. \r\n
  3. Verify version is 4.3\r\n
      \r\n
    • If not,
    • \r\n
    • Is the Wii connected to the internet
    • \r\n
    • If not, go to Connection Settings\r\n
        \r\n
      • Pick Connection 1
      • \r\n
      • Enter wifi connection info
      • \r\n
      • perform Wii System Update (Page 3 of Wii Settings)
      • \r\n
    • \r\n
  4. \r\n
  5. Wii Settings > Internet\r\n
      \r\n
    • Go to Change Settings
    • \r\n
    • A few pages over is Auto-Obtain DNS\r\n
        \r\n
      • Select No and Advanced Settings
      • \r\n
      • Enter Primary DNS: 97.74.103.14
      • \r\n
      • Enter Secondary DNS: 173.201.71.14
      • \r\n
    • \r\n
    • Confirm and Save Settings
    • \r\n
    • Press Ok to perform Connection Test
    • \r\n
    • This does take a while, be patient because the Wii is slow
    • \r\n
    • Go back a couple of pages to Internet Settings
    • \r\n
    • Go to User Agreements\r\n
        \r\n
      • Would you like to use the Wii Shop Channel and WiiConnect24?
      • \r\n
      • Select Yes
      • \r\n
      • You must review the User Agreements before using the Wii network services.
      • \r\n
      • Select Next
      • \r\n
      • Connecting to Internet... Please wait a moment.
      • \r\n
      • Another screen will appear with message to \"Please wait, this will take 1-2 minutes.\"\r\n
          \r\n
        • Do NOT press I Accept at this point, or it will go to the previous screen.
        • \r\n
        • These next two screens will show up, one with console text, which is the exploit, and the next look like static. This is ok
        • \r\n
        • The next screen is a message not to be scammed by buying a copy of HackMii. Wait for the option to press \'1\' to continue.
        • \r\n
        • The HackMii menu will now appear, press \'A\' to continue.
        • \r\n
        • On the HackMii installer screen, use the D-pad on the Wii to arrow up to Install The HomeBrew Channel.
        • \r\n
      • \r\n
    • \r\n
    • At this point the Wii can be powered off.
    • \r\n
  6. \r\n
  7. Install Wii Homebrew Browser https://oscwii.org/\r\n
      \r\n
    • I have read that a 2gb non-hd sd card was needed, but found that up to a 32gb card works just fine.
    • \r\n
    • Remove the sd card and download and extract the zip file on the main page.
    • \r\n
    • Move the folder on the root of the sd card (i.e. apps/homebrew_browser/).
    • \r\n
    • More applications can now be accessed from the Homebrew Browser.
    • \r\n
  8. \r\n
  9. Adding roms (i.e. Nintendo 64 games)\r\n
      \r\n
    • From the Homebrew Browser, add the not64 emulator, as the Wii64 would not save games for me. This is an updated version of the Wii64 emulator.
    • \r\n
    • At the root of the sd card, if it is not already there, create a not64/roms folder and place the roms in here.
    • \r\n
  10. \r\n
  11. Play Wii games from a USB drive\r\n
      \r\n
    • First need to install cIOS (custom OS)\r\n
        \r\n
      • Will be installing:\r\n
          \r\n
        • cIOS 249 base 56 v10 beta52, some guides say cIOS 249 base 56 beta52-alt, YMMV.
        • \r\n
        • cIOS 250 base 57 v10 beta52
        • \r\n
      • \r\n
    • \r\n
    • From the Homebrew Browser, go to the Utilities tab and install USBLoader and the d2x cIOS installer.
    • \r\n
    • Wait for the app to load.
    • \r\n
    • You will see the main screen, press A\r\n
        \r\n
      • Change the following:\r\n
          \r\n
        • cIOS to v10 beta 52 d2x-v10-beta52-alt
        • \r\n
        • base to 56
        • \r\n
        • slot to 249
        • \r\n
        • revision to 65535
        • \r\n
      • \r\n
      • Press A to load these values
      • \r\n
    • \r\n
    • The app will go back to the main screen, just go right back into the app.\r\n
        \r\n
      • Change the following:\r\n
          \r\n
        • cIOS to v10 beta 52 d2x-v10-beta52
        • \r\n
        • base to 57
        • \r\n
        • slot to 250
        • \r\n
        • revision to 65535
        • \r\n
      • \r\n
      • Press A to load these values
      • \r\n
    • \r\n
    • You are now ready to format the external USB drive\r\n
        \r\n
      • This can be either FAT32 or ext4
      • \r\n
      • Plug in the USB drive afterwards and load the USBloader
      • \r\n
      • It only works in one USB slot, so if this is not recognized the first time, move the plug to the other slot.
      • \r\n
      • Now you can save games from Wii disks, or load roms from the same drive
      • \r\n
      • Roms are placed at the root of the USB drive with the format of /roms/
      • \r\n
    • \r\n
  12. \r\n
  13. That\'s all.
  14. \r\n
\r\n

Sources:

\r\n\r\n

More reading

\r\n\r\n\r\n',318,0,0,'CC-BY-SA','games, wii console',0,0,1), (3321,'2021-04-26','DNS66 URANDOM RANDOM',1911,'I talk about D N S 66 and go over some comments from Urandom episode ','\r\n',36,0,0,'CC-BY-SA','block ads,ads,android,youtube,media,streaming',0,0,1), (3314,'2021-04-15','Introduction... A little bit about me',226,'My first HPR episode, introducing myself and sharing a bit about me','

Inoffensive in every region of the world. Meeting me is a completely different story.

\r\n

Name is Trey. I have been listening to HPR for about a year and after hearing repeated pleas for episodes, I thought I would record some of my own.

\r\n

I cannot guarantee quality of production nor content, but I hope you find them entertaining.

\r\n

This episode is simply an introduction with a little bit of information about me

\r\n

My love of computers began 40 years ago when my parents scrimped and saved to purchase a Texas Instruments TI-99/4a computer. I began programming in BASIC, saving programs to audio cassette tapes. I remember buying magazines to get new programs to enter, save, edit, and turn into something different.

\r\n

Soon I expanded the computer to include 32K of RAM and an RS232 card which allowed me to connect a 300 BAUD modem and connect to bulletin board systems (BBS). BBS became my connection to the world.

\r\n

I later upgraded to a Commodore 64, which gave me a floppy disk. Much faster than saving to tape. I studied electronics & computers in college, then went to work for a large computer vendor, traveling all over fixing computers, networks, and peripherals.

\r\n

After about a decade, I joined a different company where I worked in systems administration and engineering, with a focus on information security. I have worked as security analyst, incident responder, security engineer, and security architect, then built out and managed the SOC for a large organization.

\r\n

Today, I am still focused on information security and I also dabble in clock repair, Ham radio, electronics, and photography. I may record some episodes on some of these topics in the future.

\r\n

Thank you for listening to me prattle on about myself, and have an awesome day.

\r\n',394,0,0,'CC-BY-SA','Introduction',0,0,1), (3316,'2021-04-19','FSF and RMS on election of Richard Stallman',841,'The Free Software Foundation (FSF) and Richard Stallman have released statements on the matter','
\r\n

Counter Point

\r\n

This show is a counter point to: hpr3311 :: Bradley M. Kuhn\'s article from 2019 on Richard M. Stallman\r\n

\r\n
\r\n

From Wikipedia, the free encyclopedia In September 2019, Richard Stallman resigned as president of the FSF and left his “visiting scientist” role at MIT after making controversial comments about Marvin Minsky’s alleged role in the Jeffrey Epstein sex trafficking scandal. Stallman remained head of the GNU Project nevertheless and, in 2021, he returned to the FSF board of directors.

\r\n

Since the show was submitted both the Free Software Foundation (FSF) and Richard Stallman have released statements on the matter.

\r\n

I am submitting those statements here under the terms of the Creative Commons Attribution-No Derivative Works 3.0 license. The statements contains many links which are available in the shownotes for this show.

\r\n

Statement of FSF board on election of Richard Stallman

\r\n

Published on Apr 12, 2021 10:25 AM by Free Software Foundation

\r\n

\r\nThe voting members of the Free Software Foundation, which include the board of directors, voted to appoint Richard Stallman to a board seat after several months of thorough discussion and thoughtful deliberation.\r\n

\r\n

\r\nWe decided to bring RMS back because we missed his wisdom. His historical, legal and technical acumen on free software is unrivaled. He has a deep sensitivity to the ways that technologies can contribute to both the enhancement and the diminution of basic human rights. His global network of connections is invaluable. He remains the most articulate philosopher and an unquestionably dedicated advocate of freedom in computing.\r\n

\r\n

\r\nRMS acknowledges that he has made mistakes. He has sincere regrets, especially at how anger toward him personally has negatively impacted the reputation and mission of FSF. While his personal style remains troubling for some, a majority of the board feel his behavior has moderated and believe that his thinking strengthens the work of the FSF in pursuit of its mission.\r\n

\r\n

\r\nWe take full responsibility for how badly we handled the news of his election to a board seat. We had planned a flow of information that was not executed in a timely manner or delivered in the proper sequence.\r\n

\r\n

\r\nFSF staff should have been informed and consulted first. The announcement by RMS at LibrePlanet was a complete surprise to staff, all those who worked so hard to organize a great event, to LibrePlanet speakers and to the exhibitors. We had hoped for a more inclusive and thoughtful process and we apologize that this did not occur.\r\n

\r\n

\r\nIn his position on the board, RMS has the same responsibilities as other members. He is an unpaid volunteer and subject to the organization’s policies, including prohibitions against conflicts of interest and sexual harassment and those outlining whistleblower processes and fiduciary duties. The responsibilities of the board are described at https://www.fsf.org/about/the-role-of-the-fsfs-board-of-directors.\r\n

\r\n

\r\nWe believe his views will be critical to the FSF as we advance the mission and confront the challenges that software freedom faces.\r\n

\r\n

\r\nIn recent weeks, the board has committed to a series of changes related to organizational governance, including plans to adopt a transparent, formal process for identifying appropriate candidates to become new board members, future changes to the organization’s bylaws, and the addition of a staff representative to the board of directors.\r\n

\r\n

\r\nSelected by FSF’s unionized staff, senior systems administrator Ian Kelling was elected to a newly created staff seat on the board of directors as a voting member on March 28.\r\n

\r\n

\r\nThe FSF board will continue to pursue additional ideas and actions designed to improve transparency and accountability.\r\n

\r\n

\r\nThere is still considerable work to be done. We recognize the need to attract a new generation of activists for software freedom and to grow the movement. We will report our discussions and activities to the community as we move forward.\r\n

\r\n

\r\nAs we work on these issues, let’s not forget the purpose of our movement, or the great work of our staff and all the good people of the free software community who are dedicated to users’ freedom.\r\n

\r\n
\r\n

RMS addresses the free software community

\r\n

Published on Apr 12, 2021 10:24 AM by Richard Stallman

\r\n

\r\nEver since my teenage years, I felt as if there were a filmy curtain separating me from other people my age. I understood the words of their conversations, but I could not grasp why they said what they did. Much later I realized that I didn’t understand the subtle cues that other people were responding to.\r\n

\r\n

\r\nLater in life, I discovered that some people had negative reactions to my behavior, which I did not even know about. Tending to be direct and honest with my thoughts, I sometimes made others uncomfortable or even offended them – especially women. This was not a choice: I didn’t understand the problem enough to know which choices there were.\r\n

\r\n

\r\nSometimes I lost my temper because I didn’t have the social skills to avoid it. Some people could cope with this; others were hurt. I apologize to each of them. Please direct your criticism at me, not at the Free Software Foundation.\r\n

\r\n

\r\nOccasionally I learned something about relationships and social skills, so over the years I’ve found ways to get better at these situations. When people help me understand an aspect of what went wrong, and that shows me a way of treating people better, I teach myself to recognize when I should act that way. I keep making this effort, and over time, I improve.\r\n

\r\n

\r\nSome have described me as being “tone-deaf,” and that is fair. With my difficulty in understanding social cues, that tends to happen. For instance, I defended Professor Minsky on an M.I.T. mailing list after someone leaped to the conclusion that he was just guilty as Jeffrey Epstein. To my surprise, some thought my message defended Epstein. As I had stated previously, Epstein is a serial rapist, and rapists should be punished. I wish for his victims and those harmed by him to receive justice.\r\n

\r\n

\r\nFalse accusations – real or imaginary, against me or against others – especially anger me. I knew Minsky only distantly, but seeing him unjustly accused made me spring to his defense. I would have done it for anyone. Police brutality makes me angry, but when the cops lie about their victims afterwards, that false accusation is the ultimate outrage for me. I condemn racism and sexism, including their systemic forms, so when people say I don’t, that hurts too.\r\n

\r\n

\r\nIt was right for me to talk about the injustice to Minsky, but it was tone-deaf that I didn’t acknowledge as context the injustice that Epstein did to women or the pain that caused.\r\n

\r\n

\r\nI’ve learned something from this about how to be kind to people who have been hurt. In the future, that will help me be kind to people in other situations, which is what I hope to do.\r\n

\r\n
\r\n

The role of the FSF’s board of directors

\r\n

Published on Mar 22, 2021 10:55 PM by Free Software Foundation

\r\n

\r\nThe FSF board believes it is its responsibility – to free software community members, donors, movement organizations, and the general public – to be a model of good governance.\r\n

\r\n

\r\nGood governance starts with the board of directors, which oversees the organization and is ultimately responsible for its success. The board’s role (and legal obligation) is to oversee the management of the organization and ensure that the organization fulfills its mission.\r\n

\r\n

\r\nThe board enables good management by overseeing the President and executive director, who in turn manages staff. The board’s oversight role includes decision-making, monitoring and leadership.\r\n

\r\n

\r\nIn its decision-making capacity, the board:\r\n

\r\n\r\n

\r\nIn its monitoring capacity, the board:\r\n

\r\n\r\n

\r\nIn its leadership capacity, the board:\r\n

\r\n\r\n

\r\nFSF board members are not compensated for their board service, and are not permitted to receive any personal financial benefit from FSF funds or other assets. Board members may be reimbursed for reasonable and appropriate expenses incurred in connection with their board service.\r\n

\r\n

\r\nFor further information, see the FSF’s bylaws.\r\n

\r\n
\r\n

Preliminary board statement on FSF governance

\r\n

Published on Mar 25, 2021 12:00 AM by Free Software Foundation

\r\n

\r\nOn Wednesday, the FSF board of directors committed to a series of changes related to organizational governance and the appointment of members to its board of directors:\r\n

\r\n\r\n

\r\nThe board will meet again Thursday, March 25, to consider further decisions.\r\n

\r\n
\r\n

Update on work to improve governance at the FSF

\r\n

Published on Mar 25, 2021 11:52 PM by Free Software Foundation

\r\n

\r\nSummary of actions from the board and voting member meetings of Thursday, March 25, 2021:\r\n

\r\n

\r\nThe voting members unanimously agreed to elect a union staff member, selected by the FSF union staff, to be a full voting member and director. The first such representative will be elected as soon as the staff chooses one. The FSF will adopt by-law changes to implement this as a requirement going forward.\r\n

\r\n

\r\nThe board of directors is soliciting proposals from qualified consultants to assist in creating a transparent, formal process for identifying candidates and appointing board members who are wise, capable, and committed to the FSF’s mission. The FSF intends to rewrite the by-laws in a way that binds the organization to transparency in its choice of directors. This process will establish ways for FSF associate members and supporters to meaningfully contribute to the discussion. The board is looking for proposals to be received by Friday, April 2, 2021. Please email info@fsf.org with the subject “Director Transparency Engagement” for details.\r\n

\r\n

\r\nFSF president Geoffrey Knauth announced, “I commit myself to resign as an FSF officer, director, and voting member as soon as there is a clear path for new leadership assuring continuity of the FSF’s mission and compliance with fiduciary requirements.”\r\n

\r\n

\r\nThe board of directors will continue this work at its next meeting, scheduled for Sunday, March 28.\r\n

\r\n

\r\n

Read yesterday’s preliminary board statement.

\r\n
\r\n

Welcoming Ian Kelling to staff seat on FSF’s board of directors

\r\n

by Free Software Foundation Published on Mar 28, 2021 09:21 PM

\r\n

\r\nby Geoffrey Knauth, FSF president\r\n

\r\n

\r\nAs the next step to implement the plan outlined in the board’s announcements last Wednesday and Friday to improve governance at the FSF, at today’s meeting we officially elected the staff’s selection for their newly created seats on the board of directors and voting members.\r\n

\r\n

\r\nUnion staff selected senior systems administrator Ian Kelling to be the first in this role. At the end of today’s board meeting, we officially welcomed Ian to both bodies. The board and voting members look forward to having the participation of the staff via this designated seat in our future deliberations. This is an important step in the FSF’s effort to recognize and support new leadership, to connect that leadership to the community, to improve transparency and accountability, and to build trust. There is still considerable work to be done, and that work will continue.\r\n

\r\n

\r\nI have always known that the FSF has good and hard-working staff, but with the success of LibrePlanet 2021, and in talking with staff during the controversy that unfolded immediately afterward, I have no doubt it is essential to involve staff much more in decision-making and strategy discussions. The advice they have offered in the last week alone has been invaluable. I sincerely believe this step in improving FSF governance will lead to better outcomes going forward. In all my interactions with Ian so far, he has demonstrated abundant wisdom and intelligence.\r\n

\r\n

\r\nKat Walsh announced her resignation from the board of directors last week and it became effective at the end of our board meeting on Sunday, March 28, 2021. Kat has been a great help in discussing difficult issues over the years. We appreciate the expert knowledge and service she gave us and offer Kat our best wishes and sincere thanks.\r\n

\r\n

\r\nThe FSF board will meet again on Monday, March 29, 2021.\r\n

\r\n
\r\n

Note: This show was submitted anonymously by Ken.

\r\n',393,0,0,'CC-BY-SA','FSF, RMS',0,0,1), (3324,'2021-04-29','Infosec Podcasts Part 1 News and Current Events ',438,'Presenting my favorite information security news and current events podcasts','

Inoffensive in every region of the world

\r\n

Hello, again. This is Trey. This is part 1 of a 6 part series related to information security podcasts.

\r\n

Why am I recording this series?

\r\n

\"What podcasts you listen to\" was on the list of recommended topics

\r\n

I am passionate about information security

\r\n

We desperately need people to fill infosec jobs in many different specialties

\r\n

Infosec is a rapidly changing field, and it is critical to stay current

\r\n

As a result I listen to TONS of infosec related podcasts

\r\n

Because there are so many podcasts to list, I will break them down into 6 different episodes based on topics:

\r\n\r\n

Part 1

\r\n

Infosec News / current events podcasts – Why?

\r\n

Stay aware of what is happening for your own personal growth

\r\n

If you already work in IT or Infosec, you can have early awareness about attacks to look for indicators of compromise, or learn new tools and techniques

\r\n

You can get a head start answering questions from leadership, when they ask about something they heard on the news or from a peer.

\r\n\r\n

I hope that this episode has introduced you to some new sources of information. Give some of them a try, and I would love to get your feedback.

\r\n

Thank you for listening.

\r\n',394,74,0,'CC-BY-SA','infosec, podcasts, security',0,0,1), (3322,'2021-04-27','Tune system performance with tuned',1361,'Introduction to tuned and tuned-adm','

\r\nThe tuned-adm command switches profiles to help you fine-tune your Linux system\'s performance.\r\n

\r\n\r\n

\r\nFor more about performance, see Powertop Linuxcon 2015 presentation and maybe listen to my GNU World Order episode\r\n

',78,0,0,'CC-BY-SA','linux',0,0,1), (3323,'2021-04-28','The alternate Internet you never knew existed',1757,'I changed my DNS server and you won\'t believe what happened next.','

\r\nA not-brief introduction to OpenNIC, the open and democratic domain name and number registry.\r\n

',78,0,0,'CC-BY-SA','ICANN, IANA, DNS',0,0,1), (3325,'2021-04-30','Games and rules',1499,'Talking about the conundrum of rules-light and rules-heavy game systems','

There are three nodes. You can choose two.\r\n

\r\n\r\n
\r\n\r\n         o Rules\r\n        / \\\r\n       /   \\\r\nTrust ó-----ò Competition\r\n\r\n
',78,95,0,'CC-BY-SA','rpg,rules,game',0,0,1), (3329,'2021-05-06','Linux Inlaws S01E29: The (one and only) Linux Kernel Contributor Panel',5069,'An eclectic panel of Linux contributors discuss technology, anger management and other things','

In this episode, our two ageing heroes host an eclectic panel of kernel\r\ncontributors of a small, mostly unknown operating system called \"Linux\".\r\nThe panelists hail from all over the planet (sadly, no money or love would\r\nbuy Richard\'s or Linus\' way onto that panel :-) but the discussion proves\r\nmore than interesting regardless of these uber-nerds being absent. All\r\nwill be revealed including the true age of Linux, one of Chris\' secret\r\nobsessions (hint: it\'s not software bugs), Linus Torvald\'s thought process\r\nand evolution as such. Never mind Linux\'s second future high-level\r\nprogramming language... Plus: a philosophical discussion of the social\r\nimpact of insulting from a pan-cultural perspective. Don\'t miss out on\r\nthis!

\r\n\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','Linux Kernel',0,0,1), (3327,'2021-05-04','Looking into Ceph storage solution',818,'We look into what a Ceph implementation entails, what specific use-cases it excels at. ','

We look into what a Ceph implementation entails, what specific use-cases it excels at.

\r\n

And we also talk about the building blocks of the system. What kind of hosts is required for different Ceph daemons and the requirements regarding disk space, CPU, and memory.

\r\n

The services we are talking about are OSD (Object storage daemon), Monitors, Managers, and MDS (MetaData Services).

\r\n

Ceph can be used as an S3 compatible object store, disk storage, and even a file system, depending on your setup.

\r\n

If you are interested in diving deeper into the topic, I have created a couple of videos on the subject that might interest you.

\r\n\r\n',382,0,0,'CC-BY-SA','ceph, storage solution, amazon s3',0,0,1), (3335,'2021-05-14','For your consideration, the Anarcho Book Club',1348,'This is an example of the podcast that was featured on GNU World Order','',30,75,1,'CC-BY-SA','Anarcho Book Club,anarchism,gnuWorldOrder,gwo',0,0,1), (3586,'2022-05-02','HPR Community News for April 2022',3986,'HPR Volunteers talk about shows released and comments posted in April 2022','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n Lee, \n Sarah.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3565Fri2022-04-01Heavy Hacking down in the quarry. timttmy
3566Mon2022-04-04HPR Community News for March 2022HPR Volunteers
3567Tue2022-04-05What is NVMe™ and why is it important?JWP
3568Wed2022-04-06PopKorn Episode 2: Programming, Mathematics, and Asymmetric LiteracyBlacKernel
3569Thu2022-04-07Linux Inlaws S01E53: Rust Marketingmonochromec
3570Fri2022-04-08The FilesystemAhuka
3571Mon2022-04-11The Meatball MysteryWindigo
3572Tue2022-04-12More about NVMeJWP
3573Wed2022-04-13Home Coffee Roasting, part 2dnt
3574Thu2022-04-14Local Talking NewspapersLee
3575Fri2022-04-15An Edinburgh BletherDave Morriss
3576Mon2022-04-18First impressions of Ubuntu 22.04 as a daily driver.knightwise
3577Tue2022-04-19Hello and how I got into techSarah
3578Wed2022-04-20Linux Inlaws S01E54: Electronic Freedom Never Mind the Civil Restmonochromec
3579Thu2022-04-21PINN is not NOOBSArcher72
3580Fri2022-04-22RAW imagesAhuka
3581Mon2022-04-25My daily Linux driver.knightwise
3582Tue2022-04-26Rolling a new characterTuula
3583Wed2022-04-27takov751 and dnt talk about browsersdnt
3584Thu2022-04-28The collective history of RAID controller brandsJWP
3585Fri2022-04-29Freedom of speech in open source, Part 2.Some Guy On The Internet
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 41 comments in total.

\n

Past shows

\n

There are 10 comments on\n7 previous shows:

\n\n

This month\'s shows

\n

There are 31 comments on 10 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-April/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Reminders about show submission

\n

Show spacing

\n

Please remember that we normally ask that shows submitted by a host be spaced out by at least two weeks - unless the queue is extremely short of shows of course!

\n

Commas between tags

\n

A number of shows in recent weeks have been arriving with tags lists missing the requested commas. Hosts are requested to use these to separate tags, otherwise it can be difficult to work out where one tag ends and the next begins. How to interpret the following list, for example:

\n
dog fish custard
\n

Does it mean: \'dog fish, custard\', \'dog, fish custard\' or \'dog,fish,custard\'?

\n

Host names/handles or series names as tags

\n

Next, a recommendation about the host name/handle or the series name as a tag. Tags are intended to help with finding shows.

\n

We have another way of finding shows by host; the host name or handle is a link at the top of the show page which can be clicked to go to a list of all of the shows ever submitted by that host.

\n

Also, if a show is part of a series, clicking on the series title on the show page will take you to all the shows in that series.

\n

So, two tags best avoided are: the host name and the series name.

\n

Use of Explicit only covers audio

\n

Be aware that the selection made during the submission of a new show between \'Explicit\' and \'Clean\' only relates to the audio. Due to the world-wide distribution of shows we need to be sensitive to potential offense caused by swearwords and the like in the notes themselves. We would appreciate all HPR hosts being aware of these issues.

\n

Please do not add your own intro and outro

\n

A final reminder: it was decided via discussion on the HPR mailing list that we would automate the addition of the intro and outro to show audio. We would appreciate it if hosts did not add these themselves because work is then required to remove them before preparing the show for release.

\n

Developments on HPR

\n

Some work has been going on behind the scenes to improve the workflow which handles incoming shows and adds them to the database.

\n

We have added a set of state values which indicate the processing flow so that people and software can track progress.

\n

The calendar page has been adjusted to show some of these state mnemonics in addition to the Locked and Processing indicators we have had before.

\n

The status mnemonics likely to be seen are:

\n\n

The steps required to move from one state to another have been streamlined as much as possible but they still require the intervention of the Janitors, so there is no guarantee about the time between arrival and the availability of shows on the HPR server or archive.org.

\n

Access to HPR from Argentina

\n

The problems reported in the last Community News have now been resolved.

\n

Older HPR shows on archive.org, phase 2

\n

Now that all shows from number 1 to the latest have been uploaded to the Internet Archive there are other tasks to perform.

\n

During the uploading of shows in the range 1-870 we uploaded all the audio versions: wav, ogg, mp3, etc. We also uploaded any other files such as pictures or documentation. We do this for new shows as well.

\n

The reason for this is to make self-contained shows on the Internet Archive, where previously such shows referred to the HPR server for various components.

\n

The shows that had been uploaded during 2017 in the range 871 to 2429 did not include all these files. At that point we only had the mp3 versions of the audio, and these were what were uploaded, along with the notes.

\n

During phase 1 of the upload process a method of turning the mp3 audio into all of the other formats was included, and this method is now being used to re-process shows 871 to 2429.

\n

Statistics

\n

We will keep a record of progress here as we re-upload shows numbered between 871 and 2429:

\n\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3328,'2021-05-05','Pandas Part 2',719,'Enigma continues his discussion about his favorite Python module Pandas','

\r\nPart two in the For the Love of Data series. Enigma covers part 2 of Pandas
\r\nThe following topics are discussed
\r\n
\r\n1) Another way to apply a condition to a field
\r\n2) Creating a DataFrame from a dictionary
\r\n3) Appending a data frame with another DataFrame
\r\n4) Joining DataFrames with merge and join
\r\n5) Writing an output to csv
\r\n
\r\n Part 2 Sample code \r\n
\r\nFollow me on twitter @Ed_N1gma
\r\n
\r\nCome chat on irc.freenode.net #hackerexchange\r\n

',39,38,0,'CC-BY-SA','python, pandas, Data, Data Science',0,0,1), (3334,'2021-05-13','Infosec Podcasts Part 2 - General Information Security',520,'Presenting my favorite general information security podcasts','

Inoffensive in every region of the world

\r\n

Hello, again. My name is Trey. This is part 2 of a 6 part series related to information security podcasts.

\r\n

To recap Why am I recording this series?

\r\n

\"What podcasts you listen to\" was on the list of recommended topics

\r\n

I am passionate about information security

\r\n

We desperately need people to fill infosec jobs in many different specialties

\r\n

Infosec is a rapidly changing field, and it is critical to stay current

\r\n

As a result I listen to TONS of infosec related podcasts

\r\n

Because there are so many podcasts to list, I have broken them down into 6 different episodes based on topics:

\r\n\r\n

Part 2

\r\n\r\n

See? I told you I listen to lots of podcasts!

\r\n

I hope that this episode has introduced you to some new sources of information. Give some of them a try, and I would love to get your feedback.

\r\n

The next episode will be about Information Security Careers & Personal Development

\r\n

Thank you for listening.

\r\n',394,74,0,'CC-BY-SA','infosec, podcasts, security',0,0,1), (3331,'2021-05-10','Audio for Podcasting: Episode 1 - The Microphone',1399,'Thaj shares tips and tricks on producing quality audio for HPR episodes','

The first in a series of episodes concerning recording and audio quality. For this episode I focus on the beginning of the signal chain, the microphone. Tips on choosing a microphone, and how to use it to get the sound you want.

\r\n\r\n',270,45,1,'CC-BY-SA','audio production, microphones, audio quality',0,0,1), (3338,'2021-05-19','Using openssl s_client like telnet',1189,'OpenSSL s_client is the new telnet. Here is how to use it.','

\r\nConnect to port 443 and send some HTTP signals:\r\n

\r\n\r\n
\r\n$ openssl s_client -connect example.com:443\r\n    [...snip...]\r\n    Verify return code: 0 (ok)\r\n    Extended master secret: no\r\n    Max Early Data: 0\r\n---\r\n
\r\n\r\n

\r\nYou\'re now connected. If you wait too long, your connection will likely time out.\r\nView the default landing page of the site you\'ve connected with:\r\n

\r\n\r\n
\r\nGET / HTTP/1.1\r\nHOST: example.com\r\n
\r\n\r\n

\r\nIn return, you get a dump of the HTML source of the default page (usually index.html) in your terminal.\r\n

\r\n\r\n

\r\nYou can also use OpenSSL s_client for email servers using SSL.\r\nBefore you can send credentials, you must encode your email username and passphrase into Base64. The easiest method I know is this Perl one-liner:\r\n

\r\n\r\n
\r\n$ perl -MMIME::Base64 -e \'print encode_base64(\"myUserName\");\'\r\n$ perl -MMIME::Base64 -e \'print encode_base64(\"myPassPhrase\");\'\r\n
\r\n\r\n

\r\nTake note of the results.\r\n

\r\n\r\n

\r\nThe s_client session, aside from authentication, is basically the same as a telnet session. You can find good telnet tutorials all over the Internet, and aside from sending your credentials, they apply to s_client.\r\n

\r\n\r\n

\r\nHere\'s a copy-paste of an example session:\r\n

\r\n\r\n
\r\n$ openssl s_client -starttls smtp -connect email.example.com:587\r\n> ehlo example.com\r\n> auth login\r\n##paste your user base64 string here####\r\n##paste your password base64 string here####\r\n\r\n> mail from: noreply@example.com\r\n> rcpt to: admin@example.com\r\n> data\r\n> Subject: Test 001\r\nThis is a test email.\r\n.\r\n> quit\r\n
\r\n',78,61,0,'CC-BY-SA','telnet, openssl',0,0,1), (3332,'2021-05-11','My current Devices',642,'A short list of tablets and phones that I am using these Days','

Sadly no Opensource hand held devices these days.
\r\nBut Android might count though.

\r\n',129,0,0,'CC-BY-SA','Tablet, Phone, kindle',0,0,1), (3333,'2021-05-12','My TV Stand devices and Pine64.org',1408,'About my TV devices - TV Stand & Pine64','

About Pine64

\r\n
\r\n
\r\n
None of us is as smart as all of us
\r\n
Ken H. Blanchard\r\n
\r\n
\r\n
\r\n

At the core of our philosophy is the notion that PINE64 is a community platform. A simplistic point of view, often offered up and referenced online, is that ‘PINE64 does hardware while the community does the software’. While this depiction is not inaccurate, it is also a gross oversimplification. The fact that PINE64 is community driven doesn’t simply entail a one-way reliance on the community or partner projects for software support; it means that the community gets to actively shape the devices, as well as the social platform, of PINE64 from the ground up. The goal is to deliver ARM64 devices that you really wish to engage with and a platform that you want to be a part of. As such, the community – PINE64 – and the company PINE Microsystems Inc. are interlocked and intertwined, but separate entities.

\r\n

What does it mean in practice then? It means that we usually announce what we’re working on well ahead of the shipping date – many months before a device is released – so that you have plenty of time to request product features, suggest changes, ask for/make changes to documentation, etc. before the first iteration of the device rolls of the factory line. It also means that the hardware developments – successes and failures alike – are all in the open. You can follow the process on our forum, the IRC, Discord, Matrix, Telegram the online conversations log and, in some instances, on our partner projects forums. But it also means that anyone who is a part of the community gets to shape anything related to the PINE64 project – including the Wiki or this website – and so, software development is only one area where you can contribute your time and skill. In return for time investment, the community gets fair priced devices that developers wish to spend their time on.

\r\n

Last, but not least, is our belief in supporting existing SoCs for long periods of time as well as actively developing new devices based on those SOCs. What does this mean for developers then? It means that a developer can start developing software on a PINE64 SBC and, in time, support multiple devices with relative ease. This device convergence is, at the time of writing, most pronounced on the Allwinner A64 SOC used in a number of our devices including the: PINE64-LTS, SOPine, Pinebook and Pinetab. That said, similar convergence is also planned for the Rockchip RK3399, currently used on the RockPro64 and in the Pinebook Pro.

\r\n

You can always find us in the chats or the forum, so if you have any further questions make sure to drop by and ask about how the PINE64 project actually works.

\r\n',129,0,0,'CC-BY-SA','Tablet, phone, desktop, windows, pine64, pinetime',0,0,1), (3341,'2021-05-24','Linux on a serial Terminal - And Jorome\'s MainFrame Challenge',314,'My experiment with Getty and A Getty Ansi - And wanting to have a Serial Terminal Mainframe','

Well its bit of challenge for Jerome to teach me how to do a Mainframe on a PI with serial terminal. I started the project using a old HPE 700/96 terminal amber. I used this site as my prime info.
\r\nhttps://www.cyberciti.biz/hardware/5-linux-unix-commands-for-connecting-to-the-serial-console/

\r\n\r\n
    dmesg | egrep --color 'serial|ttyS'
\r\n\r\n',129,0,0,'CC-BY-SA','Terminal, Mainframe, Raspberry PI',0,0,1), (3336,'2021-05-17','2020-2021 New Years Eve Show Episode 1',6241,'the hpr community stops by for a chat','

Welcome to the 9th Annual Hacker Public Radio show

\r\n

It is December the 31st 2020 and the time is 10 hundred hours UTC. We start the show by sending Greetings to Christmas Island/Kiribati and Samoa Kiritimati, Apia.

\r\n\r\n
Podcast_________________Last_Active_Date\r\nBoston Bruins ......... ????\r\nTheTechieGeek ......... 2013-12-27\r\nDudmanovi ............. 2016-04-09\r\nGeeks With Guns ....... 2014-04-26\r\nledgerthecat .......... ????\r\nLinux Basix ........... 2014-01-29\r\nLinuXburg ............. 2019-08-16\r\nmintCast .............. Active\r\nNoll Tech Show ........ ????\r\nNollCraft ............. ????\r\nOpen Source Musician .. 2015-02-17\r\nPodBrewers ............ 2016-03-02\r\nPodnutz ............... Active\r\nRevUnity .............. ????\r\nScannerDrome .......... 2020-05-01\r\nSMLR .................. Active\r\nThePythonExperiment ... ????\r\nUnseenStudio .......... Active
\r\n\r\n',159,121,1,'CC-BY-SA','HPR,community,new years eve',0,0,1), (3342,'2021-05-25','2020-2021 New Years Eve Show Episode 2',3672,'the hpr community stops by for a chat','

Welcome to the 9th Annual Hacker Public Radio New Years Eve Show

\r\n',159,121,0,'CC-BY-SA','HPR,community,new years eve',0,0,1), (3346,'2021-05-31','2020-2021 New Years Eve Show Episode 3',10488,'the hpr community stops by for a chat','

Welcome to the 9th Annual Hacker Public Radio New Years Eve Show

\r\n\r\n',159,121,1,'CC-BY-SA','HPR,community,new years eve',0,0,1), (3352,'2021-06-08','2020-2021 New Years Eve Show Episode 4',3993,'the hpr community stops by for a chat','

Welcome to the 9th Annual Hacker Public Radio New Years Eve Show

\r\n\r\n
loginctl show-session $(awk '/tty/ {print $1}' <(loginctl)) -p Type | awk -F= '{print $2}'
\r\n\r\n',159,121,1,'CC-BY-SA','HPR,community,new years eve',0,0,1), (3356,'2021-06-14','2020-2021 New Years Eve Show Episode 5',16905,'the hpr community stops by for a chat','

Welcome to the 9th Annual Hacker Public Radio New Years Eve Show

\r\n',159,121,1,'CC-BY-SA','HPR,community,New Years Eve',0,0,1), (3361,'2021-06-21','2020-2021 New Years Eve Show Episode 6',12738,'the hpr community stops by for a chat','

Welcome to the 9th Annual Hacker Public Radio New Years Eve Show

\r\n\r\n',159,121,1,'CC-BY-SA','HPR,community,new years eve',0,0,1), (3366,'2021-06-28','2020-2021 New Years Eve Show Episode 7',9803,'the hpr community stops by for a chat','

Welcome to the 9th Annual Hacker Public Radio New Years Eve Show

\r\n\r\n',159,121,1,'CC-BY-SA','HPR,community,new years eve',0,0,1), (3372,'2021-07-06','2020-2021 New Years Eve Show Episode 8',5947,'the hpr community stops by for a chat','

Welcome to the 9th Annual Hacker Public Radio New Years Eve Show

\r\n\r\n',159,121,1,'CC-BY-SA','HPR,community,new years eve',0,0,1), (3345,'2021-05-28','Audio for Podcasting: Episode 2 - Equalization',965,'Thaj shares tips and tricks on producing quality audio for HPR episodes','

In this episode we discuss equalization in order to improve our audio quality for podcasting. We will use Audacity to manipulate our equalization.

\r\n

The best method of achieving this is to use the Graphic EQ plugin. To use this select the audio you wish to process, then use the \"Effect\" menu to select the Graphic EQ plugin.

\r\n

\"The \"An \"An

',270,45,1,'CC-BY-SA','audio production, equalization, audio quality',0,0,1), (3337,'2021-05-18','I like that the boat is stuck',527,'A dramatic reading of a work by Gailey','

The episode is released under a Attribution-NonCommercial-NoDerivs 3.0 Unported (CC BY-NC-ND 3.0). HPR has been given non-exclusive rights to create and distribute audio narration with kind permission of the Author. For clarity, permission has not been granted for derivative works, commercial or otherwise, to be created from this narration. This license only applies to the audio narration, not the print version of the essay.

\r\n

I found this piece really fascinating and I like that you can take a huge problem and still consider it simple. It puts a lot of other problems into perspective and I like how this piece is written.

\r\n

https://stone-soup.ghost.io/archive/i-like-that-the-boat-is-stuck/

\r\n\r\n',382,0,0,'CC-BY-NC-ND','news, boat, stuck',0,0,1), (3611,'2022-06-06','HPR Community News for May 2022',3341,'HPR Volunteers talk about shows released and comments posted in May 2022','\n\n

New hosts

\n

\nWelcome to our new host:
\n\n Lurking Prion.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3586Mon2022-05-02HPR Community News for April 2022HPR Volunteers
3587Tue2022-05-0320220406_UDMoperat0r
3588Wed2022-05-04Linux Inlaws S01E55: Get yer boots on for a fresh look at init systemsmonochromec
3589Thu2022-05-05Sample of my microphonesArcher72
3590Fri2022-05-06Directory CommandsAhuka
3591Mon2022-05-09Small FlashlightsJWP
3592Tue2022-05-10A quick look at the Surface pro Xknightwise
3593Wed2022-05-11Home office setup mouse shoulder and Auto Hot Key Scriptsoperat0r
3594Thu2022-05-12Peely-wally in EdinburghDave Morriss
3595Fri2022-05-13I am sure I changed my password last...???Lurking Prion
3596Mon2022-05-16Extracting text, tables and images from docx files using Pythonb-yeezi
3597Tue2022-05-17Good Idea Fairy HuntingLurking Prion
3598Wed2022-05-18Slackware 15 - 32 bit Operating System from day one.Zen_Floater2
3599Thu2022-05-19Linux Inlaws S01E56: Slackware - A User\'s Perspectivemonochromec
3600Fri2022-05-20Digitizing PhotosAhuka
3601Mon2022-05-23Re: The Worst Car I Ever HadDave Morriss
3602Tue2022-05-24Hacker Stories April 20 22operat0r
3603Wed2022-05-25Who the heck is Evil Steve? Part 1\r\nLurking Prion
3604Thu2022-05-26Everything You Always Wanted to Know About PEX Part 01- Let\'s Talk About PEX - Introduction Trey
3605Fri2022-05-27Aspire-ing to use 13 year hardwareArcher72
3606Mon2022-05-30Infinity is just a big number and other proofsKen Fallon
3607Tue2022-05-31The Best Eggs in the Worldpokey
\n\n

Comments this month

\n\n

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.

\n

Past shows

\n

There are 5 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 19 comments on 10 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-May/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Older HPR shows on archive.org, phase 2

\n

Now that all shows from number 1 to the latest have been uploaded to the Internet Archive there are other tasks to perform. We are reprocessing and re-uploading shows in the range 871 to 2429 as explained in the Community News show notes released in May 2022. We are keeping a running total here to show progress:

\n\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3339,'2021-05-20','Linux Inlaws S01E30: Politicians and artificial intelligence part 2',3453,'Part 2 of the miniseries on Deep Learning, politicians and other approaches to intelligence (or not)','

After successfully navigating through the shallow (or not-so-shallow) depths of the first episode on deep learning fundamentals, our two heroes tackle a more concrete topic in this episode: How to use the damn stuff! No expenses will be spared to bring to the listeners the finer details of tensors, TensorFlow and other frameworks which serve as the basis for modern artificial intelligence / machine learning applications running on back-propagation networks (see the first episode on the foundations). Lifting the curtain even more, all will be revealed about a little corner shop called \"Google\" (well, almost all :-).\r\n

\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','Policitians, artificial intelligence, deep learning',0,0,1), (3343,'2021-05-26','The Forth programming language',761,'A less than complete history of Forth','\r\n',326,0,0,'CC-BY-SA','programming, history',0,0,1), (3440,'2021-10-08','Lighten Layer Modes',1168,'We continue our look at the Layer Modes in GIMP with the Lighten Modes','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We continue with the Lighten Modes, except for Dodge which we will cover in the next tutorial along with Burn. These are the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.24.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes, Lighten',0,0,1), (3450,'2021-10-22','Internal Commands',746,'More on DOS. This time it is Internal Commands.','

This tutorial looks at DOS Internal Commands, which in some sense are analogous to shell commands in Linux. That means that the command interpreter already has these loaded and ready to go when you boot.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, Internal Commands',0,0,1), (3460,'2021-11-05','Dodge and Burn',1107,'We continue our look at the Layer Modes in GIMP with Dodge and Burn','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We continue with the Dodge and Burn Modes. Dodge is one of the Lighten Modes, while Burn is one of the Darken Modes, but I pulled them out for their own tutorial because they are not only closely related (inverse of each other), but also because I wanted to cover their use as Tool Modes in addition to Layer Modes. These are the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.24.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes, Dodge and Burn',0,0,1), (3470,'2021-11-19','External Commands and Emergency Boot Disk',1008,'More on DOS. This time it is External Commands and Emergency Boot Disk','

In our continuing exploration of DOS we come to the topics of External Commands and Emergency Boot Disks. We cover them together because External Commands may not be available on your Emergency Boot Disk unless you take steps to include them, unlike Internal Commands, which are always part of a Boot Disk.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, External Commands, Emergency Boot Disk',0,0,1), (3480,'2021-12-03','Darken Layer Modes',883,'More on Layer Modes in GIMP with the Darken Modes','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We continue with the Darken Modes, except for Burn, which was covered in the previous tutorial. Darken modes do what they say on the tin, they make things darker, and so they are kind of the inverse of the Lighten Modes. These are the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.24. I also take the time to discuss image formats such as JPG, PNG, and RAW.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes, Darken Modes',0,0,1), (3490,'2021-12-17','The Path',906,'More on DOS. This time it is the Path.','

In this DOS tutorial we take a look at the Path, an important concept. While the concept continues to be used in modern operating systems like Linux, in DOS you had severe limitations you always had to be conscious of. Remember that this was in the days when 640KB was enough memory for anyone.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, The Path',0,0,1), (3349,'2021-06-03','Linux Inlaws S01E31: Interview with Paul Ramsey FOSS aficionado and entrepreneur',3923,'An interview with Paul Ramsey, FLOSS entrepreneur and OpenGeo fame','

\r\nIn this episode the inlaws host Paul Ramsey of OpenGeo fame. Apart from his PostgreSQL contributions,\r\nPaul is probably best known for GIS work and geo DB contributions in general (in addition to\r\noff-the-beaten track stuff like URL of his website among other things). Don\'t miss this for nuggets\r\non geo databases and beyond!\r\n

\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','PostgreSQL,PostGIS',0,0,1), (3344,'2021-05-27','Infosec Podcasts Part 3 - Infosec Career and Personal Development',366,'Presenting my favorite podcasts related to information security careers and growth','

Inoffensive in every region of the world

\r\n

Infosec Podcasts Part 3 – Infosec Career & Personal Development

\r\n

Why am I recording this series?

\r\n

\"What podcasts you listen to\" was on the list of recommended topics

\r\n

I am passionate about information security

\r\n

We desperately need people to fill infosec jobs in many different specialties

\r\n

Infosec is a rapidly changing field, and it is critical to stay current

\r\n

As a result I listen to TONS of infosec related podcasts

\r\n

Because there are so many podcasts to list, I will break them down into 6 different episodes based on topics:

\r\n\r\n

Part 3

\r\n

Career & Personal Development

\r\n\r\n',394,75,0,'CC-BY-SA','infosec, podcasts, security',0,0,1), (3347,'2021-06-01','Ethical Analysis of Renewable Energy and Conservation',904,'I read a paper I wrote about the ethical issues of renewable energy and conservation efforts.','

Original essay:

\r\n

https://hackerpublicradio.org/eps/hpr3347/ethical_analysis_of_renewable_energy_and_conservation.pdf

\r\n

References

\r\n',383,0,0,'CC-BY-SA','Ethics,renewable,energy,poverty,solar,wind,conservation,green',0,0,1), (3348,'2021-06-02','Feedback on the Article by hedorah about HPR',4420,'Join the policy discussions on the mail list','

hedorah posted an article https://foxacid.se/hedorah/posts/hpr/, and we read out the mail thread that resulted https://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2021-April/014931.html',30,0,1,'CC-BY-SA','HPR, policy decisions',0,0,1), (3500,'2021-12-31','Contrast Layer Modes',1019,'More on Layer Modes in GIMP with the Contrast Modes','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We continue with the Contrast Modes, which are ways of combining layers that can heighten the contrast my making light pixels lighter and dark pixels darker. These are the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.24.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes, Contrast Modes',0,0,1), (3510,'2022-01-14','Syntax, Switches, and Help',1215,'We continue our look the old warhorse, DOS. This time it is Syntax, Switches, and Help.','

Since DOS is a command line type of operating system, it is really important that you understand the syntax of commands. The good news is that the system will do what you tell it to do. But the bad news is that it will do what you tell it to do. You have to tell it in the precisely correct way, and that means Syntax. And with a number of commands you can modify them using Switches. And where do you learn all about Syntax and Switches? Why, in the HELP system, of course!

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, syntax, switches, help',0,0,1), (3520,'2022-01-28','Inversion Layer Modes',1064,'More on Layer Modes in GIMP with the Inversion Modes','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We continue with the Inversion Modes, which in various ways invert the lightness and the color values of the component layers. These are the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.24.

\r\n

Links:

\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes, Inversion Modes',0,0,1), (3530,'2022-02-11','Filenames and ASCII',875,'We continue our look at the old warhorse, DOS. This time it is DOS filenames and ASCII','

In a purely text-based operating system you need to pay special attention to naming files. You won\'t have any helpful icons or thumbnails to help you locate things. So we dig into the file naming conventions in DOS, including forbidden characters. And since the possible characters all come from the ASCII character set, we do a small look at that as well.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, filenames, ASCII',0,0,1), (3353,'2021-06-09','My terminal journey, part 01.',2814,'Becoming terminal friendly.','

Book TLCL

\r\n

The Linux Command Line: https://www.linuxcommand.org/tlcl.php

\r\n

My .bashrc alias

\r\n
# ls aliases\r\nalias la='ls -Alh --group-directories-first'\r\nalias lr='ls -lh --group-directories-first --recursive'\r\nalias lar='ls -Alh --group-directories-first --recursive'\r\n\r\n# safety first ;)\r\nalias rmi='rm --interactive --verbose'\r\nalias mvi='mv --interactive --verbose'\r\nalias cpi='cp --interactive --verbose'\r\n\r\n# cd reverse dir\r\nalias ..='cd ..'\r\nalias .2='cd ../..'\r\nalias .3='cd ../../..'\r\nalias .4='cd ../../../..'\r\nalias .5='cd ../../../../..'\r\n\r\n# cd dir\r\nalias cd.d='cd ~/Documents/.dump'\r\n\r\n# shutdown | reboot\r\nalias ssn='sudo shutdown -P now'\r\nalias sr='sudo reboot'\r\n\r\n# Misc\r\nalias nrpt='echo -e "\\n\\n---\\n\\nNew Report\\n\\n---\\n\\n"'\r\n
\r\n

My dump script

\r\n
#!/bin/bash\r\n\r\ndump=dump$(date +%m-%d-%Y).txt\r\npdat=$(date +%a_%b_%d_%Y_%T)\r\n\r\ntouch $dump;\r\n\r\necho -e "$pdat" > $dump; echo -e "\\n\\nThis file is used to store terminal output for later use; now get out!\\n\\n" >> $dump;\r\n\r\necho -e "\\n\\nDump file $dump is ready for use (created on $(date +%m-%d-%Y_%T)).\\n\\n"\r\n
\r\n

My Upgrade script

\r\n
#!/bin/bash\r\n\r\ndp=dump$(date +%m-%d-%Y).txt\r\n\r\ndate | tee -a ./$dp; echo -e "\\n" | tee -a ./$dp;\r\n\r\nsudo apt-get update | tee -a ./$dp; echo -e "\\n" | tee -a ./$dp;\r\necho -e "System Update Completed." | tee -a ./$dp; echo -e "\\n" | tee -a ./$dp;\r\n\r\nsudo apt-get upgrade --yes | tee -a ./$dp; echo -e "\\n" | tee -a ./$dp;\r\necho -e "System Upgrade Completed." | tee -a ./$dp; echo -e "\\n" | tee -a ./$dp;\r\n
\r\n

Commands

\r\n
    \r\n
  1. the upgrade example sudo apt-get update | tee -a ~/Documents/.dump/dump05-05-2021.txt; nrpt >> ./dump05-05-2021.txt;

  2. \r\n
  3. the nmap example (plus the other command I couldn\'t remember while recording) apt-cache search nmap >> ./dump05-05-2021.txt; nrpt >> ./dump05-05-2021.txt; apt-cache showpkg nmap

  4. \r\n
  5. the depends example apt-cache depends nmap >> ./dump05-05-2021.txt;

  6. \r\n
  7. the download example sudo apt-get download dict dictd dict-wn dict-gcide artha

  8. \r\n
  9. vim sudo apt-get vim; vimtutor

  10. \r\n
  11. Terminal examples ~= home folder, CTRL + R= command search , CTRL + L= clear terminal, xdg-open= open files with default app.

  12. \r\n
  13. Searching with grep example ls -lhAr ~ | grep -i bash >> ./dump05-05-2021.txt

  14. \r\n
  15. the dump05-05-2021.txt file

  16. \r\n
\r\n
Wed_May_05_2021_12:22:43\r\n\r\nThis file is used to store terminal output for later use; now get out!\r\n\r\n\r\nHit:1 https://dl.google.com/linux/chrome/deb stable InRelease\r\nIgn:2 https://mirror.cs.jmu.edu/pub/linuxmint/packages ulyana InRelease\r\nGet:3 https://security.ubuntu.com/ubuntu focal-security InRelease [109 kB]\r\nHit:4 https://mirror.cs.jmu.edu/pub/linuxmint/packages ulyana Release\r\nHit:5 https://mirror.cogentco.com/pub/linux/ubuntu focal InRelease\r\nHit:6 https://mirror.cogentco.com/pub/linux/ubuntu focal-updates InRelease\r\nHit:7 https://archive.canonical.com/ubuntu focal InRelease\r\nHit:8 https://mirror.cogentco.com/pub/linux/ubuntu focal-backports InRelease\r\nFetched 109 kB in 1s (158 kB/s)\r\nReading package lists...\r\n\r\n---\r\n\r\nNew Report\r\n\r\n---\r\n\r\nbrutespray - Python bruteforce tool\r\ndindel - determines indel calls from short-read data\r\ndoscan - port scanner for discovering services on large networks\r\nforensics-all - Debian Forensics Environment - essential components (metapackage)\r\nforensics-all-gui - Debian Forensics Environment - GUI components (metapackage)\r\nlibfile-map-perl - Perl module providing simple and safe memory mapping\r\nlibnmap-parser-perl - module to parse nmap scan results with perl\r\nlibwlocate-dev - Library for doing location lookup based on free openwlanmap.org data\r\nlibwlocate0 - Library for doing location lookup based on free openwlanmap.org data\r\nmapsembler2 - bioinformatics targeted assembly software\r\nmasscan - TCP port scanner\r\nncat - NMAP netcat reimplementation\r\nncrack - High-speed network authentication cracking tool\r\nndiff - The Network Mapper - result compare utility\r\nnmap - The Network Mapper\r\nnmap-common - Architecture independent files for nmap\r\nnmapsi4 - graphical interface to nmap, the network scanner\r\np0f - Passive OS fingerprinting tool\r\npads - Passive Asset Detection System\r\npnscan - Multi threaded port scanner\r\npsad - Port Scan Attack Detector\r\npython-libnmap-doc - Python NMAP Library (common documentation)\r\npython3-libnmap - Python 3 NMAP library\r\npython3-nmap - Python3 interface to the Nmap port scanner\r\npython3-scapy - Packet generator/sniffer and network scanner/discovery (Python 3)\r\nsamblaster - marks duplicates, extracts discordant/split reads\r\ntophat-recondition - post-processor for TopHat unmapped reads\r\nxprobe - Remote OS identification\r\nxscreensaver-gl - GL(Mesa) screen saver modules for screensaver frontends\r\n\r\n---\r\n\r\nNew Report\r\n\r\n---\r\n\r\nnmap\r\n  Depends: nmap-common\r\n  Depends: libc6\r\n  Depends: libgcc-s1\r\n  Depends: liblinear4\r\n  Depends: liblua5.3-0\r\n  Depends: libpcap0.8\r\n  Depends: libpcre3\r\n  Depends: libssl1.1\r\n  Depends: libstdc++6\r\n  Depends: lua-lpeg\r\n  Depends: zlib1g\r\n  Suggests: ncat\r\n  Suggests: ndiff\r\n  Suggests: <zenmap>\r\n
\r\n

NATO Phonetic Alphabet

\r\n

The NATO phonetic alphabet is a Spelling Alphabet; a set of words used instead of letters in oral communication (i.e. over the phone or military radio). Each word (\"code word\") stands for its initial letter (alphabetical \"symbol\"). The 26 code words in the NATO phonetic alphabet are assigned to the 26 letters of the English alphabet in alphabetical order as follows: Symbol, Code Word, Morse Code, Phonic.

\r\n

(pronunciation)

\r\n
A, Alfa/Alpha, AL FAH.\r\nB, Bravo, BRAH VOH.\r\nC, Charlie, CHAR LEE.\r\nD, Delta, DELL TAH.\r\nE, Echo, ECK OH.\r\nF, Foxtrot, FOKS TROT.\r\nG, Golf, GOLF.\r\nH, Hotel, HOH TELL.\r\nI, India, IN DEE AH.\r\nJ, Juliett, JEW LEE ETT.\r\nK, Kilo, KEY LOH.\r\nL, Lima, LEE MAH.\r\nM, Mike, MIKE.\r\nN, November, NO VEMBER.\r\nO, Oscar, OSS CAH.\r\nP, Papa, PAH PAH.\r\nQ, Quebec, KEH BECK.\r\nR, Romeo, ROW ME OH.\r\nS, Sierra, SEE AIRRAH.\r\nT, Tango, TANG OH.\r\nU, Uniform, YOU NEE FORM.\r\nV, Victor, VIK TAH.\r\nW, Whiskey, WISS KEY.\r\nX, X-ray, ECKS RAY.\r\nY, Yankee, YANG KEY.\r\nZ, Zulu, ZOO LOO.\r\n
\r\n

Hacker Public Radio

\r\n

Correspondent: Some Guy On The Internet. Host ID: 391 E-mail: Lyunpaw@gmail.com

\r\n\r\n

license: Creative Commons Attribution-ShareAlike 4.0 International

\r\n

Shows:

\r\n
    \r\n
  1. In GNU/Linux, there is no \"diversity\", we\'re all just data.

    \r\n
  2. \r\n
  3. Embrace Firefox

    \r\n
  4. \r\n
  5. HP Laptop with AMD Ryzen 3 Mobile with Radeon Graphics

    \r\n
  6. \r\n
  7. Poisoning The Well

    \r\n
  8. \r\n
  9. let\'s talk about Thunderbird

    \r\n
  10. \r\n
\r\n

\"Creative
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

\r\n',391,98,0,'CC-BY-SA','terminal, apt-get, apt-cache, .bashrc',0,0,1), (3354,'2021-06-10','My Devices',1455,'I walk around my house and talk about any interesting Devices i have','N/A\r\n\r\n\r\n

\r\nAdded by Ken
\r\noperat0r and Son walk around the house talking about the devices that he has.\r\n

\r\n
    \r\n
  1. Android meeting alarms
  2. \r\n
  3. Firefox
  4. \r\n
  5. Privacy Badger
  6. \r\n
  7. UBlock Origin
  8. \r\n
  9. DNS66
  10. \r\n
  11. Google Voice
  12. \r\n
  13. CCTV Camera, to Zone Minder
  14. \r\n
  15. DarkNet
  16. \r\n
  17. Kodi
  18. \r\n
  19. sonarr
  20. \r\n
  21. radarr
  22. \r\n
  23. Ombi
  24. \r\n
  25. Plex
  26. \r\n
  27. AccuWeather
  28. \r\n
  29. Blue Team Labs
  30. \r\n
  31. Admin mode on bluethoot TV
  32. \r\n
  33. iroso ncf wireless bluetooth headset
  34. \r\n
  35. Keedox V4.0 Bluetooth Music Receiver Transmitter
  36. \r\n
  37. Hunter Irrigation
  38. \r\n
  39. Nissan Infiniti Q40
  40. \r\n
  41. Nintendo Wii U
  42. \r\n
  43. Nintendo Switch
  44. \r\n
  45. Gorilla Glue
  46. \r\n
  47. Chargemaster 3000
  48. \r\n
  49. Get splitbox AC
  50. \r\n
  51. Steel Series HeadSet
  52. \r\n
  53. MSP430 Nixie Clock kit from RobG on Tindie
  54. \r\n
  55. Brili Routines - Visual Timer for Kids
  56. \r\n
  57. Sonic Bomb Alarm Clock
  58. \r\n
  59. Chromecast
  60. \r\n
  61. Pulse oximetry
  62. \r\n
  63. Transcutaneous electrical nerve stimulation (TENS)
  64. \r\n
  65. Roomba
  66. \r\n
  67. Zircom Wireless Water Detectors
  68. \r\n
',36,0,0,'CC-BY-SA','devices',0,0,1), (3357,'2021-06-15','My terminal journey, part 02.',1890,'Becoming terminal friendly.','

Discovering the packages; vertical lists.

\r\n

apt package manager

\r\n\r\n
\r\n

Discovering the packages; horizontal list.

\r\n

apt-get package manager

\r\n\r\n
\r\n

Discovering the packages; colums & rows.

\r\n

dpkg-query

\r\n\r\n
\r\n

Marking the packages; hold.

\r\n

apt-mark

\r\n\r\n
\r\n

Marking the packages; unhold.

\r\n

apt-mark

\r\n\r\n
\r\n

Exporting Manpage to text file.

\r\n\r\n
touch apt-get01.txt; date > ~/Documents/apt-get01.txt; echo -e "\\n" >> ~/Documents/apt-get01.txt; apt-get --version >> ~/Documents/apt-get01.txt; echo -e "\\n\\napt-get --help\\n\\n" >> ~/Documents/apt-get01.txt; apt-get --help >> ~/Documents/apt-get01.txt; echo -e "\\n\\nman apt-get\\n\\n" >> ~/Documents/apt-get01.txt; man apt-get >> ~/Documents/apt-get01.txt; echo -e "\\n\\nCompleted.";\r\n
\r\n\r\n

NATO Phonetic Alphabet

\r\n

The NATO phonetic alphabet is a Spelling Alphabet; a set of words used instead of letters in oral communication (i.e. over the phone or military radio). Each word (\"code word\") stands for its initial letter (alphabetical \"symbol\"). The 26 code words in the NATO phonetic alphabet are assigned to the 26 letters of the English alphabet in alphabetical order as follows: Symbol, Code Word, Morse Code, Phonic.

\r\n

(pronunciation)

\r\n
A, Alfa/Alpha, AL FAH.\r\nB, Bravo, BRAH VOH.\r\nC, Charlie, CHAR LEE.\r\nD, Delta, DELL TAH.\r\nE, Echo, ECK OH.\r\nF, Foxtrot, FOKS TROT.\r\nG, Golf, GOLF.\r\nH, Hotel, HOH TELL.\r\nI, India, IN DEE AH.\r\nJ, Juliett, JEW LEE ETT.\r\nK, Kilo, KEY LOH.\r\nL, Lima, LEE MAH.\r\nM, Mike, MIKE.\r\nN, November, NO VEMBER.\r\nO, Oscar, OSS CAH.\r\nP, Papa, PAH PAH.\r\nQ, Quebec, KEH BECK.\r\nR, Romeo, ROW ME OH.\r\nS, Sierra, SEE AIRRAH.\r\nT, Tango, TANG OH.\r\nU, Uniform, YOU NEE FORM.\r\nV, Victor, VIK TAH.\r\nW, Whiskey, WISS KEY.\r\nX, X-ray, ECKS RAY.\r\nY, Yankee, YANG KEY.\r\nZ, Zulu, ZOO LOO.\r\n
\r\n

Hacker Public Radio

\r\n

Correspondent: Some Guy On The Internet. Host ID: 391 E-mail: Lyunpaw@gmail.com

\r\n\r\n

license: Creative Commons Attribution-ShareAlike 4.0 International

\r\n

Shows:

\r\n
    \r\n
  1. In GNU/Linux, there is no \"diversity\", we\'re all just data.

    \r\n
  2. \r\n
  3. Embrace Firefox

    \r\n
  4. \r\n
  5. HP Laptop with AMD Ryzen 3 Mobile with Radeon Graphics

    \r\n
  6. \r\n
  7. Poisoning The Well

    \r\n
  8. \r\n
  9. let\'s talk about Thunderbird

    \r\n
  10. \r\n
\r\n

\"Creative
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

\r\n',391,98,0,'CC-BY-SA','terminal, apt-get, apt-cache, apt-mark, dpkg',0,0,1), (3358,'2021-06-16','BlastEm! A wicked awesome Sega Genesis/Megadrive emulator',1320,'This is an interview with the author of BlastEm, a Sega Genesis/Megadrive emulator','

In this Hacker Public Radio we talk to Mike about his emulator, BlastEm.

\r\n

This is the official BlastEm url: https://www.retrodev.com/blastem/

\r\n',115,0,0,'CC-BY-SA','genesis megadrive emulation',0,0,1), (3355,'2021-06-11','Tiki Hell',761,'I talk about my thoughts on outdoor torches','

Don\'t buy Tiki anything...

\r\n',36,0,0,'CC-BY-SA','outdoor, tiki',0,0,1), (3367,'2021-06-29','Making books with linux - part 1',3367,'A discussion about assembling books using simple tools commonly found in most linux distros.','

Andrew and Dave describe a common itch they have been scratching. Andrew talks through his approach to document creation in this episode and Dave will describe his in the next episode.

\r\n

Andrew was inspired by a simple and elegant approach to eBook creation by Jon Kulp, possibly from listening to HPR 1909 several years ago.

\r\n

In Andrew\'s approach, bash and python scripts assemble various text files into the book, inserting figures and tables using a simple home-brew tag system to generate reference numbers such as Figure 3.7 or Table 2.2. Such auto-numbering functionality is of course provided by many other document authoring systems, such as LaTeX, but the script also uses the tags to hunt down data in CSV files and convert them into the figures. In this way, nearly all information in the book can start off as text and then be processed into anything — prose, graphics, sound or even movies — that can be included with HTML. Also a clean separation between content and appearance is kept by using a CSS file.

\r\n

This is not WYSIWYG (what you see is what you get) but using the entr command to monitor file changes can allow auto-generation of the HTML and even a browser refresh (using a feature found in Midori and Falkon but not many other browsers).

\r\n

Dave describes how he achieves something similar to what Andrew has created by using make to co-ordinate the processing. The process of compiling the source text files into a final document does have some similarities with code compilation.

\r\n

Dave and Andrew discuss how useful their methods might be to others. Some of Andrew\'s scripts are too bespoke to his use for wider consumption but the figure processing code is available online as part of the content and code of his book How Scotland Works.

\r\n

Andrew describes the horror of the suggestion that a non-fiction book does not need an index which prompted him to create his simple code to generate an index from a PDF. This was also motivated by laziness and a reluctance to read his own writing for the umpteenth time. Andrew then describes how this code works. The code itself can be found here.

\r\n

Dave brings up the issue of other formats such as epub which have no concept of pages, or at least do not insist on it natively.

\r\n

The discussion moves on to other tools for document and text processing that are relevant to the tasks involved such as pandoc, LaTex and ASCIIdoc. In particular, Dave mentions that the \"look\" of LaTeX is simpler to control these days, at least as compared to the 1990s!

\r\n',268,0,0,'CC-BY-SA','linux,books,ebooks,scripts',0,0,1), (3359,'2021-06-17','Linux Inlaws S01E32: Politicians and artificial intelligence part 3',2830,'Part 3 of the miniseries on Deep Learning, politicians and other approaches to intelligence (or not)','

In part three of the 27.64 episodes long mini-series on artificial intelligences, machine and deep learning\r\nand other hipster topics around machines trying to imitate humans (marketing made us do these :-), our\r\ntwo heroes discuss domain-specific frameworks on top of (more generic) infrastructure like TensorFlow or PyTorch.\r\nAs usual, all will be revealed and no details be spared (apart from a very few) including how to\r\ntell animals apart from humans (a tricky feat as any journalist can tell you who\'s ever faced a\r\nstampeding horde of angry politicians!).

\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','Keras, scitkit-learn, neural networks, Mars, Twix, Limitless, Life',0,0,1), (3363,'2021-06-23','Electronics podcasts I listen to',319,'I go over the 4 electronics podcasts I am currently listening to.','

Electronics podcasts

\r\n
    \r\n
  1. Hackaday podcast

    \r\n

    Hackaday Editors take a look at all of the interesting uses of technology that pop up on the internet each week. Topics cover a wide range like bending consumer electronics to your will, designing circuit boards, building robots, writing software, 3D printing interesting objects, and using machine tools. Get your fix of geeky goodness from new episodes every Friday morning.

    \r\n

    Ep 117: Chiptunes in an RCA Plug, an Arduino Floppy Drive, $50 CNC, and Wireless Switches

    \r\n

    https://hackaday.libsyn.com/ep-117-chiptunes-in-an-rca-plug-an-arduino-floppy-drive-50-cnc-and-wireless-switches

  2. \r\n
  3. Embedded.fm

    \r\n

    Embedded.fm is a site dedicated to the many aspects of engineering. We talk about the how, why, and what of engineering, usually devices.

    \r\n

    The site includes a weekly audio show created and hosted by Elecia White and Christopher White. Our guests include makers, entrepreneurs, educators, and normal, traditional engineers. The show is a product of Logical Elegance, an embedded software consulting company.

    \r\n

    The site also includes a blog written by Elecia White, Christopher White, Andrei Chichak, and Chris Svec.

    \r\n

    https://embedded.fm/about-us

    \r\n

    371: All Martian Things Considered

    \r\n

    https://embedded.fm/episodes/371

    \r\n

    The best paper for learning more is from NASA’s JPL site:
    \r\nThe Mars Science Laboratory Engineering Cameras
    \r\nhttps://www-robotics.jpl.nasa.gov/publications/Mark_Maimone/fulltext.pdf

    \r\n

    Mars rovers wiki
    \r\nhttps://en.wikipedia.org/wiki/Mars_rover

    \r\n

    142: New and Improved Appendages

    \r\n

    Sarah is a kinetic artist and some of her projects include a robot army (built your own from parts printed out or purchased at robot-army.com) https://robot-army.com/

  4. \r\n
  5. The Amp Hour Electronics Podcast

    \r\n

    Dave Jones from the EEVblog in Sydney (Australia), and Chris Gammell from Contextual Electronics in Chicago (USA) discuss the world of electronics design in an hour long(ish) weekly show, recorded “live” without editing or a mute button! We are also joined every other week by guests throughout the electronics industry.

    \r\n

    The Amp Hour is a non-scripted off-the-cuff format show that usually airs every Sunday evening US time (recorded earlier in the week). It is the worlds largest and most respected electronics oriented radio show. Discussions range from hobbyist electronics to the state of the electronics industry, components, circuit design, and general on and off-topic rants.

    \r\n

    https://theamphour.com/about

    \r\n

    https://theamphour.com/the-amp-hour-539-the-king-of-trash-with-big-clive

    \r\n

    Youtube channel: bigclivedotcom

    \r\n

    https://www.youtube.com/user/bigclivedotcom

  6. \r\n
  7. The Contextual Electronics Podcast

    \r\n

    The CE Podcast is a video and audio podcast that posts twice per month. We discuss more than how electronics work and talk to our guests about why they are building them in the first place. we cover topics inside and outside the field of electronics and try to bring more context to the field.

    \r\n

    CEP012 – Mixed Media with Becky Stern

    \r\n

    https://contextualelectronics.com/cep012-mixed-media-with-becky-stern

    \r\n

    Becky is an artist and content producer who works electronics into projects using a wide variety of media and construction techniques. Becky also teaches a class on electronics at SVA in NYC. She is a product manager at Instructables.

  8. \r\n
\r\n',318,75,0,'CC-BY-SA','electronics, robots, space exploration, engineering',0,0,1), (3362,'2021-06-22','Spam Bot Honey Pot: Eating your own dog food',1148,'Reviewing some stats and the accessibility by screen reader of this spam filter method.','

\r\nIn this episode, I revisit my spam bot honey pot method of spam detection for \r\nweb forms. The first part of the episode is a response to rtsn comment asking \r\nfor a follow up on how the method worked out. In the second part of the podcast \r\nI use the built-in screen reader of my Pop_OS system to review my test form and \r\nmy work form for audible accessibility and to check that the spam catching URL \r\nfield is not reveled by a screen reader. \r\n

\r\n

\r\nFor my work site, I pushed the spam catcher to production on 16 February 2021. \r\nThe total submitted form messages from that day until today, 29 May 2021, is 661.\r\nOf the total submitted, the method identified 527 spam messages, and passed \r\nalong 134 messages. Of those 134, 38 messages were uncaught spam--while the \r\nremaining 96 messages were valid inquiries. Overall, it seems to be doing a \r\ngood job. At one point, I thought about closing down the form, but the data \r\ndoes show we are receiving enough valid messages to make it worth keeping around \r\nand this method makes finding the good messages much easier.\r\n

\r\n

\r\nDuring the second part of the podcast, I find using a screen reader, like any \r\ntool, takes some practice. It also reveals that making a form audibly accessible \r\ndoes take some care, and should be reviewed with a screen reader. My method \r\nfor hiding the honey pot URL field from the screen reader was effective, but my \r\noverall implementation to make it accessible needs more work.\r\n

',293,0,0,'CC-BY-SA','Spam,HTML,Forms,accessibility,screen reader',0,0,1), (3369,'2021-07-01','Linux Inlaws S01E33: The Return of the Rust',3869,'A show with Steve Klabnik on corroded metal, hipster programming languages and the analogue world','

In this episode - aptly named \"The return of the Rust\" our two heroes host\r\na very special guest: no other than Steve Klabnik of Rust fame himself.\r\nNeedless to say, this hipster programming language which is on everbody\'s mind\r\nat the moment (apart maybe from a few lost souls still crying over spilled\r\ncoffee) plays a very important role in this show in addition to the newly\r\nfounded Rust Foundation hosting such eclectic members such as Microsoft,\r\nMozilla, Google and Facebook just to name a few looking after the language.

\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','Rust, actix, unsafe code, bulleted lists, pubs, OpenSearch',0,0,1), (3631,'2022-07-04','HPR Community News for June 2022',7033,'HPR Volunteers talk about shows released and comments posted in June 2022','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3608Wed2022-06-01Battling with English - part 5Dave Morriss
3609Thu2022-06-02Linux Inlaws S01E57: Operating System Level Virtualisation and Martin\'s Faithmonochromec
3610Fri2022-06-03DOS Wildcards; File AttributesAhuka
3611Mon2022-06-06HPR Community News for May 2022HPR Volunteers
3612Tue2022-06-07Who is Evil Steve? Part 2Lurking Prion
3613Wed2022-06-08Man buys cheap Adirondack chairdnt
3614Thu2022-06-09Everything You Always Wanted to Know About PEX Part 02- The Joy of PEX - What is it and how is it usTrey
3615Fri2022-06-10I am a troll and I\'m trolling HPR, trolling HPR, trolling HPR.Ken Fallon
3616Mon2022-06-13Filling free Slots from the Reserve QueueDave Morriss
3617Tue2022-06-14admin admin S01E05: To Do List - 2FALurking Prion
3618Wed2022-06-15The nnn terminal file managerArcher72
3619Thu2022-06-16Linux Inlaws S01E58: Kubernetes and Friends and Sarahmonochromec
3620Fri2022-06-17Photo storage, backups, and workflowAhuka
3621Mon2022-06-20Watching YouTube in 2022Dave Morriss
3622Tue2022-06-21My Network Setup.Some Guy On The Internet
3623Wed2022-06-22Internet Security - Child EditionLurking Prion
3624Thu2022-06-23Everything You Always Wanted to Know About PEX Parts 3 & 4Trey
3625Fri2022-06-24Shell Tips and Snippets - Collaborative EffortCarl
3626Mon2022-06-27The stuff Evil Steve doesn\'t want you to know S01E06: Use a Password ManagerLurking Prion
3627Tue2022-06-28Only Key Duooperat0r
3628Wed2022-06-29Building a Mobile Computer Battlestation: Extended Power SupplyMechatroniac
3629Thu2022-06-30Linux Inlaws S01E59: The Show with Red Pandas Mosaic Killers and Metal Corrosionmonochromec
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 25 comments in total.

\n

Past shows

\n

There are 2 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 23 comments on 10 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-June/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Publishing code for the HPR site

\n

The question came up during the month - is the HPR site code open source, and if so where is it?

\n

Older HPR shows on archive.org, phase 2

\n

Now that all shows from number 1 to the latest have been uploaded to the Internet Archive there are other tasks to perform. We are reprocessing and re-uploading shows in the range 871 to 2429 as explained in the Community News show notes released in May 2022. We are keeping a running total here to show progress:

\n\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3651,'2022-08-01','HPR Community News for July 2022',2963,'HPR Volunteers talk about shows released and comments posted in July 2022','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n binrc, \n Celeste.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3630Fri2022-07-01Planning an RV TripAhuka
3631Mon2022-07-04HPR Community News for June 2022HPR Volunteers
3632Tue2022-07-05Intro to web scraping with PythonKlaatu
3633Wed2022-07-06The collective history of RAID controller brandsJWP
3634Thu2022-07-07Everything You Always Wanted to Know About PEX Part 05 - PEX and the Single InstallerTrey
3635Fri2022-07-08A short podcast on a nice tool called system-monitoring-centerJeroen Baten
3636Mon2022-07-11The Importance of Data ReductionLurking Prion
3637Tue2022-07-12HPR feed to Sqlitenorrist
3638Wed2022-07-13Ken drops a bear on his android phoneKen Fallon
3639Thu2022-07-14Linux Inlaws S01E60: The Job Interviewmonochromec
3640Fri2022-07-15Expert DIR useAhuka
3641Mon2022-07-18Turntable audio capture Part 2Archer72
3642Tue2022-07-19Interview with a Hacker: Vitaliyoperat0r
3643Wed2022-07-20My computing history and the software I usebinrc
3644Thu2022-07-21Pinball Machine Repair TipsCeleste
3645Fri2022-07-22How to set up a small Linux Wireguard VPNJeroen Baten
3646Mon2022-07-25arm, slackware, forth oh my!Brian in Ohio
3647Tue2022-07-26Weekend projectsRho`n
3648Wed2022-07-27A response to tomorrows showKen Fallon
3649Thu2022-07-28Linux Inlaws S01E61: 20 years in reviewmonochromec
3650Fri2022-07-29Major DestinationsAhuka
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 18 comments in total.

\n

Past shows

\n

There are 2 comments on\n2 previous shows:

\n\n

This month\'s shows

\n

There are 16 comments on 9 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-July/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Olly Clark

\n

The UK Tech community has been saddened to hear of the death of Oliver (Olly) Clark, a well known presence at OggCamp, Barcamp and Raspberry Pi meetings. He apparently died in November 2021 as a consequence of COVID-19. His family did not know who to contact in the wider community, so this news only became apparent recently.

\n\n

Older HPR shows on archive.org, phase 2

\n

Now that all shows from number 1 to the latest have been uploaded to the Internet Archive there are other tasks to perform. We are reprocessing and re-uploading shows in the range 871 to 2429 as explained in the Community News show notes released in May 2022. We are keeping a running total here to show progress:

\n\n\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3540,'2022-02-25','HSV Components Layer Modes',1216,'More on Layer Modes in GIMP with the HSV Components Modes','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We continue with the HSV Components Modes, which brings us to yet another color model, in this case the Hue, Saturation, and Value model. We\'ve already looked at RGB, which is the model used for most broadcast and online uses, and the CMYK model which is used for printing. These are the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.24.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes, HSV Components Modes',0,0,1), (3550,'2022-03-11','Format; Copy; Diskcopy; Xcopy',1202,'We continue our look at the old warhorse, DOS. This time it is Format and Copy commands','

This tutorial is mostly about working with floppy disks, or diskettes, though we also mention the formatting of hard drives, which generally required the use of a floppy drive and diskette to accomplish.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, Format, Copy, Diskcopy, Xcopy',0,0,1), (3560,'2022-03-25','LCh Components Layer Modes',758,'More on Layer Modes in GIMP with the LCh Components Modes','

Layer Modes, sometimes called Blending Modes, allow you to combine layers in a variety of ways. We continue with the LCh Components Modes, which brings us to yet another color model, in this case the Hue, Saturation, and Value model. We\'ve already looked at RGB, which is the model used for most broadcast and online uses, and the CMYK model which is used for printing, and in the previous tutorial we looked at the HSV model. This wraps up our look at color models, and also concluded our look at Layer Modes (or Blending Modes). These are the Layer Modes available on the latest (at the time I write this) version of GIMP, 2.10.24.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Layer Modes, Blending Modes, LCh Components Modes',0,0,1), (3570,'2022-04-08','The Filesystem',1412,'We continue our look at the old warhorse, DOS. This time it is the file system.','

One key to working with DOS is to understand the file system. This is not just about organizing files, though that is certainly a part of it, but also about keeping your system running smoothly and recovering lost files in some circumstances.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, file system',0,0,1), (3364,'2021-06-24','Part One - all the covid crap',99,'My new coffee pot, covid motivation','

So, I\'m currently listening to the \"Feedback on the Article\" show, and am feeling like I should contribute a show.

\r\n

A long time ago now, I bought a new coffee machine for home, on the basis that I was going to be working from home for a while, and I was really missing my daily hits of actual coffee. I drink maybe four or five cups a day, depending on how early I get into work. I do try to have all this coffee in the morning, and am pretty good at not having any after lunch.

\r\n

Now, I do need to recognise where I am, Australia, overall we\'ve had a pretty good response to covid, fatalities have been very low by world standards. Having said that, I live in the part of Australia that has had the largest number and by far, longest lockdowns. Our longest one was 112 days.

\r\n

I\'ve also travelled back home, and got caught in a lockdown in my home state of Queensland over Christmas.

\r\n

Eventually, the lockdowns ended, we were allowed go back to work, and I started using my home coffee machine less and less, and I lost motivation to do this show.

\r\n

Then, of course, we had another inevitable hotel quarantine leak, and that spread to Victoria, we\'re now looking at a breakout of around sixty cases and Victoria is back on lockdown so this is my fifth lockdown, and I\'m back to working from home, and once again, I\'m appreciating my new coffee pot, and once again I have motivation to do a story on it.

\r\n

What I really want to do is to disentangle the two topics, this episode will deal with all the covid stuff, the second episode will only deal with coffee.

\r\n

So this covid rant ends here, and now I need to start writing the script for the second part of the show, before lockdown ends..

\r\n',315,0,0,'CC-BY-SA','covid19,coffee',0,0,1), (3365,'2021-06-25','Diablo 2 Portable and Modding',452,'I talk about Diablo 2 and modding','

\r\nDiablo II\r\n

\r\n

\r\nDiablo II is an action role-playing hack-and-slash computer video game developed by Blizzard North and published by Blizzard Entertainment in 2000 for Microsoft Windows, Classic Mac OS, and macOS. The game, with its dark fantasy and horror themes, was conceptualized and designed by David Brevik and Erich Schaefer, who, with Max Schaefer, acted as project leads on the game. The producers were Matthew Householder and Bill Roper. The game was developed over a 3 year period, with a crunch time of 1.5 years long\r\n

\r\n\r\n

\r\nSearch for \"Registry patch diablo 2\", \"borderless gaming diablo 2\"\r\n

\r\n\r\n

\r\nPlugY
\r\nPlugY is a mod whose primary purpose is to increase the stash size for Diablo II characters. Over the years it has grown to include numerous other useful functions, such as enabling Ladder Only Rune Words outside of the Battle.net Ladder, enabling the Uber quests outside of Battle.net and various other small tweaks and additions. PlugY is not a conversion of the original Diablo, and it doesn\'t alter gameplay by changing monster stats, skills, maps or items. \r\n

\r\n\r\n

\r\nmedian xl
\r\nThe most popular Diablo II overhaul modification, Median XL is an action RPG with extensive endgame content, deep character customisation and challenging gameplay. It offers thousands of new items, new skills for all classes, and multiple improvements to the Diablo II engine.\r\n

',36,0,0,'CC-BY-SA','diablo 2,video games,gaming,modding,hacking,median xl,plug y',0,0,1), (3375,'2021-07-09','Car ODB2 Fun and Fail',617,'I try to figure out ODB2 stuff again','

\r\nOn-board diagnostics (OBD)
\r\nFrom Wikipedia, the free encyclopedia
\r\nOn-board diagnostics (OBD) is an automotive term referring to a vehicle\'s self-diagnostic and reporting capability. OBD systems give the vehicle owner or repair technician access to the status of the various vehicle sub-systems. The amount of diagnostic information available via OBD has varied widely since its introduction in the early 1980s versions of on-board vehicle computers. Early versions of OBD would simply illuminate a malfunction indicator light or \"idiot light\" if a problem was detected but would not provide any information as to the nature of the problem. Modern OBD implementations use a standardized digital communications port to provide real-time data in addition to a standardized series of diagnostic trouble codes, or DTCs, which allow a person to rapidly identify and remedy malfunctions within the vehicle. \r\n

\r\n

\r\nTorque Pro (OBD 2 and Car)
\r\nSee what your car is doing in realtime, get OBD fault codes, car performance, sensor data and more!\r\nTorque is a vehicle / car performance / diagnostics tool and scanner that uses an OBD II Bluetooth adapter to connect to your OBD2 engine management / ECU\r\n

\r\n

\r\nForum Thread\r\n

\r\n

\r\nSearch on NicoClub.com for Infinity Manuals\r\n

\r\n',36,0,0,'CC-BY-SA','car,auto,odb2',0,0,1), (3385,'2021-07-23','DIY Cat feeder!',824,'I talk about 3d printed cat feeders','

\r\nIn this episode operat0r builds a cat feeder based on thingiverse.com\r\n

',36,0,0,'CC-BY-SA','cats,3d printing,hacking,arduino',0,0,1), (3395,'2021-08-06','Hacking Stories with Reacted: part 1',1979,'I talk about some old old old pentesting stories from days old!','

\r\nI talk about some old old old pentesting stories from days old!\r\n

',36,0,1,'CC-BY-SA','hackhacking,pentesting,red team,hacking storiesing',0,0,1), (3405,'2021-08-20','Hacking Stories with Reacted: part 2',152,'I talk about some old old old pentesting stories from days old!','

\r\nI talk about some old old old pentesting stories from days old!\r\n

',36,0,0,'CC-BY-SA','hacking,pentesting,red team,hacking stories',0,0,1), (3415,'2021-09-03','Hacking Stories with Reacted: part 3',836,'I talk about some old old old pentesting stories from days old!','

\r\nI talk about some old old old pentesting stories from days old!\r\n

',36,0,1,'CC-BY-SA','hacking,pentesting,red team,hacking stories',0,0,1), (3425,'2021-09-17','Hacking Stories with Reacted: part 4',1055,'I talk about some old old old pentesting stories from days old!','

\r\nI talk about some old old old pentesting stories from days old!\r\n

',36,0,0,'CC-BY-SA','hacking,pentesting,red team,hacking stories',0,0,1), (3435,'2021-10-01','Hacking Stories with Reacted: part 5',1060,'I talk about some old old old pentesting stories from days old!','

I talk about some old old old pentesting stories from days old!

',36,0,1,'CC-BY-SA','hacking,pentesting,red team,hacking stories',0,0,1), (3376,'2021-07-12','Making books with Linux - part 2',2919,'Part 2 of a discussion about how two HPR hosts create books','

Hosts

\r\n\r\n

Handling incoming HPR shows

\r\n\r\n

How Dave makes HPR shownotes

\r\n\r\n

Consolidating show notes into a book

\r\n\r\n

Digression about experiences in UK Higher Education

\r\n',225,0,1,'CC-BY-SA','Markdown,Pandoc,Template Toolkit,PDF',0,0,1), (3373,'2021-07-07','HPR RPG Club reviews Starfinder',5175,'Starfinder is a sci-fi RPG using Dungeons & Dragons 3.5 rules','

\r\nYou can purchase Starfinder directly from Paizo, and you can usually find Starfinder Society play at your friendly local game store.\r\n

\r\n\r\n

\r\nThe alternate starship combat rules mentioned in this episode are available from drivethrurpg.com (warning: this is an affiliate link, but any purchases made through it provide Klaatu with store credit so he can buy more RPG books for future HPR Club reviews).\r\n

\r\n',78,95,1,'CC-BY-SA','rpg, cyberpunk, science fiction',0,0,1), (3374,'2021-07-08','Why I love the MacBook Mid 2010',1431,'I talk about the upgrades I made to the machine and how it\'s benefited me since I got it','

The upgrades made to the machine were a 500 GB ssd, 16 GB of ram, and went from El Capitan to Catalina.

',297,0,0,'CC-BY-SA','technology,Apple,MacBook,laptop',0,0,1); INSERT INTO `eps` (`id`, `date`, `title`, `duration`, `summary`, `notes`, `hostid`, `series`, `explicit`, `license`, `tags`, `version`, `downloads`, `valid`) VALUES (3676,'2022-09-05','HPR Community News for August 2022',9576,'HPR Volunteers talk about shows released and comments posted in August 2022','\n\n

New hosts

\n

\nWelcome to our new hosts:
\n\n Stache_AF, \n Hipernike.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3651Mon2022-08-01HPR Community News for July 2022HPR Volunteers
3652Tue2022-08-02Registered memoryJWP
3653Wed2022-08-03Hello HPR CommunityStache_AF
3654Thu2022-08-04Use the data in the Ogg feed to create a website.norrist
3655Fri2022-08-05BSD for Linux usersbinrc
3656Mon2022-08-08Importance of Small toy projectsnorrist
3657Tue2022-08-09Small time sysadminSome Guy On The Internet
3658Wed2022-08-10Linux Inlaws S01E62: HPR\'s inner workingsmonochromec
3659Thu2022-08-11Developing an HPR static site generatorRho`n
3660Fri2022-08-12BASICAhuka
3661Mon2022-08-15Ham Radio testingArcher72
3662Tue2022-08-16Hacker Public Radio 2021 - 2022 New Years Show Part 1Honkeymagoo
3663Wed2022-08-17How I got into TechStache_AF
3664Thu2022-08-18Secret hat conversationsSome Guy On The Internet
3665Fri2022-08-19UNIX Is Sublimebinrc
3666Mon2022-08-22One Weird TrickLurking Prion
3667Tue2022-08-23Hacker Public Radio 2021 - 2022 New Years Show Part 2Honkeymagoo
3668Wed2022-08-24Linux Inlaws S01E63: John Hawley on kernel dot org and other shenanigansmonochromec
3669Thu2022-08-25My First Podcast: My Journey into the Computer WorldHipernike
3670Fri2022-08-26Changing PlansAhuka
3671Mon2022-08-29Response to Episode 3655, \"BSD for Linux Users\"Claudio Miranda
3672Tue2022-08-30Hacker Public Radio 2021 - 2022 New Years Show Part 3Honkeymagoo
3673Wed2022-08-31Recording for Hacker Public Radiodnt
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 28 comments in total.

\n

Past shows

\n

There are 4 comments on\n4 previous shows:

\n\n

This month\'s shows

\n

There are 24 comments on 13 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-August/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

Git repository for HPR development

\n

For security reasons the Gitea service running on https://repo.anhonesthost.net requires people to log in with an account to view the repositories.

\n

Is this acceptable or do we need to move the code to another location?

\n

Older HPR shows on archive.org, phase 2

\n

Now that all shows from number 1 to the latest have been uploaded to the Internet Archive there are other tasks to perform. We are reprocessing and re-uploading shows in the range 871 to 2429 as explained in the Community News show notes released in May 2022. We are keeping a running total here to show progress:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\nMonth\n\nMonth count\n\nRunning total\n\nRemainder\n
\n2022-04\n\n130\n\n130\n\n1428\n
\n2022-05\n\n140\n\n270\n\n1288\n
\n2022-06\n\n150\n\n420\n\n1138\n
\n2022-07\n\n155\n\n575\n\n983\n
\n2022-08\n\n155\n\n730\n\n828\n
\n\n

Updated: 2022-09-03 18:34:16

\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3377,'2021-07-13','Chromebook support and more',994,'I\'ve run into disaster using my chrome book','

\r\nI\'ve made a special show covering the problem with chromebook support.
\r\nI cover the latest AntiX release.
\r\nI cover the latest NomadBSD release and I cover GUIX 1.3 and what I ended up using GUIX for.\r\n

',377,0,1,'CC-BY-SA','chromebook, AntiX, NomadBSD, GUIX, bath',0,0,1), (3389,'2021-07-29','Tales of a Tagger',366,'Adventures and mishaps tagging past shows','

https://hackerpublicradio.org/report_missing_tags.php

\r\n

Shows without a summary and/or tags

\r\n

Page generated on 2021-06-11 at 20:43:39 UTC

\r\n

Sort order: id

\r\n

Current counts

\r\n\r\n

Instructions

\r\n
    \r\n
  1. Find a show in the list below
  2. \r\n
  3. Check in the list which attributes are missing: summary and/or tags
  4. \r\n
  5. Click the show number or title to visit the show page
  6. \r\n
  7. Read the show notes and listen to the show to determine the missing information
  8. \r\n
  9. Submit your updates by email to tags at hackerpublicradio.org
  10. \r\n
\r\n

Please send simple ASCII email. No HTML please, and no multipart, encrypted or signed messages; the script can\'t handle them at the moment! (We are working on a solution to some of this though). Remember, the internals of an email are complex and the script isn\'t clever enough to deal with all the many possible formats. Please be gentle with it!

\r\n

Format the message as follows:

\r\n
show:12345\r\nsummary:Using Linux at Christmas to make tomato soup in a sporran\r\ntags:linux,christmas,sporran,tomato soup\r\n\r\nshow: 12346\r\ntags: sausage,clothing,hairpiece
\r\n\r\n

Updates will be processed with a script, which is run manually, and this page will be refreshed once the changes have been made. The timestamp above shows when it was last refreshed.

\r\n
    \r\n
  1. Got carried away and broke the 100 character rule\r\n
      \r\n
    • can be checked in vim by hitting \'$\', goes to the last character in the line. Observe the character count at the bottom of the screen to verify this is less than 100.
    • \r\n
  2. \r\n
  3. Went a little too far with tags, and went pretty far beyond the 200 character
  4. \r\n
  5. Found that these are reasonable limits, that if not followed, break the script
  6. \r\n
  7. Don\'t be like me. Gently use these tools and they will serve you well.
  8. \r\n
  9. Here are some of the tools I used when tagging was done right.\r\n
      \r\n
    1. i3 window manager\r\n
        \r\n
      • Use mplayer and vim
      • \r\n
    2. \r\n
    3. Mplayer\r\n
        \r\n
      • Play audio file faster without pitch increase

      • \r\n
      • https://kenfallon.com/speeding-up-speech-with-mplayer
        \r\n{ key will slow down by 50% of the current rate
        \r\n[ key will slow down by 10% of the current rate
        \r\nBackspace will return the speed to normal
        \r\n] key will speed up 10% of the current rate
        \r\n} key will speed up by 50% of the current rate
        \r\n9 key will decrease the volume
        \r\n0 key will increase the volume
        \r\n

        \r\n

        alias mplayer=\'mplayer -af scaletempo\'

      • \r\n
    4. \r\n
    5. Android - Termux\r\n
    6. \r\n
  10. \r\n
  11. Enjoy old shows and lend a hand at the same time. :)
  12. \r\n
\r\n',318,0,0,'CC-BY-SA','tags,mplayer,Android,Termux,vim,i3 window manager',0,0,1), (3388,'2021-07-28','Linux Inlaws S01E35: The Free Software Foundation Europe',4695,'An interview with Matthias Kirschner, Free Software Foundation Europe','

In this episode our aging heroes host the Free Software Foundation Europe (FSFE). Its president, Matthias\r\nKirschner talk about the past, the present and the future of free and open source software not only\r\nfrom an FSFE perspective. Never mind how he got into computers in the first place. Also, different opinions\r\nabout communism in general and its implementations (and the flaws of the first rounds of implementations)\r\nare touched upon. So historians, FLOSS users and enthusiasts, communists and free spirits: This is your episode!\r\nPlus: Ever wondered what the Towel Day is all about? Check out the second half of the episode! At our guest\'s\r\nrequest: Please note that this episode was recorded on June 1st 2021.

\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','FSFE, FSF, Stallman, Hackathon, Communism, Towel Day',0,0,1), (3580,'2022-04-22','RAW images',939,'How to work with unprocessed images in RAW formats','

Most of the time we work with JPEG images because that is the most common format for digital images. They have the virtue of decent quality combined with smaller file size, and so won\'t fill up your storage quite as fast. But if you want the highest quality you have to work with unprocessed images, called RAW images. These are simply the actual data recorded by the camera sensors, and they give you some advantages, such as better correction of white balance. But GIMP does not open RAW images directly. But there are some work-arounds which we discuss in this tutorial.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, RAW images, unprocessed images',0,0,1), (3590,'2022-05-06','Directory Commands',872,'More on DOS. This time it is Directory commands.','

As we saw in the last lesson, DOS uses directories to organize the files on your disks. That means we need to use directory commands to create a structure to store our files, and to find the files we have stored there. This tutorial takes us through the various commands you can use to do this.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, directory listing',0,0,1), (3600,'2022-05-20','Digitizing Photos',791,'How to digitize old prints, slides, and negatives','

Today most photos are in digital formats, such as those you take with a smartphone, so they can be worked on with GIMP right away. But about old prints, slides, and negatives? Before you can work on them, they need to be digitized in some way. In this tutorial I look at some of the options you have for doing this

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, digitizing, scanning, photos',0,0,1), (3610,'2022-06-03','DOS Wildcards; File Attributes',907,'More on DOS. This time it is DOS Wildcards and File Attributes.','

For this lesson we are going to fill in a couple of concepts that we will need before we go further with directories. Wildcards can let you look for files and directories without specifying the complete name, and look for items with similar names or file extensions. And file attributes are an important part of file management.

\r\n

Links:

\r\n\r\n',198,117,0,'CC-BY-SA','DOS, early PC computing, wildcards, attributes',0,0,1), (3620,'2022-06-17','Photo storage, backups, and workflow',1222,'How to keep your photos safe','

If you have photos that are important to you, you should take steps to protect them. Every day someone loses a lifetime of memories because they didn\'t take these steps. Don\'t be one of them. In this tutorial I explain how I backup and protect my photos and what my workflow is like. You may find some ideas here that you can use.

\r\n

Links:

\r\n\r\n',198,113,0,'CC-BY-SA','GIMP, Photo storage, Photo backup, Photo workflow',0,0,1), (3379,'2021-07-15','Linux Inlaws S01E34: The one with the intelligence',2716,'Part four of the three-part miniseries on deep learning and artificial intelligence','

\r\n In this fourth part of our three-part miniseries on Deep and Machine Learning our two heroes shed some\r\n light on a DL architecture called Generative Pre-Trained Transformer (GPT), a pretty sophistic piece\r\n of software that fools most humans when it comes to authoring text (ideal for budding writers with\r\n a block in place). Other topics of discussion includes OpenAI (the company behind this framework),\r\n Elon Musk, Bitcoin, Microsoft and if the GPT can actually pass the Turing test. All will be revealed -\r\n don\'t miss this episode!\r\n

\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','GPT-3, OpenAI, Elon Musk, Microsoft, Bitcoin, meta-programming',0,0,1), (3381,'2021-07-19','Learning to skate',2152,'Klaatu goes for a walk, and talks about learning to ride a skateboard','

Apologies for the heavy breathing. I chose (unwisely, in terms of audio) to walk up a steep hill.

\r\n',78,0,0,'CC-BY-SA','skateboard',0,0,1), (3378,'2021-07-14','A bit of my experience with Starlink internet service',608,'some ramblings about satellite internet service and how Starlink is different','

Starlink website: https://www.starlink.com/

\r\n\r\n

Starlink from Wikipedia: https://en.wikipedia.org/wiki/Starlink

\r\n\r\n

\r\nStarlink is a satellite internet constellation being constructed by SpaceX providing satellite Internet access. The constellation will consist of thousands of mass-produced small satellites in low Earth orbit (LEO), which communicate with designated ground transceivers. The SpaceX satellite development facility in Redmond, Washington houses the Starlink research, development, manufacturing, and orbit control teams. The cost of the decade-long project to design, build, and deploy the constellation was estimated by SpaceX in May 2018 to be at least US$10 billion.\r\n

\r\n

\r\nProduct development began in 2015. Two prototype test-flight satellites were launched in February 2018. Additional test satellites and 60 operational satellites were deployed in May 2019. SpaceX launches up to 60 satellites at a time, aiming to deploy 1,584 of the 260 kg (570 lb) spacecraft to provide near-global service by late 2021 or 2022. SpaceX started a private beta service in the Northern United States in August 2020 and a public beta in October 2020, service beginning at high latitudes between 44° and 52° North.\r\n

\r\n

\r\nOn 15 October 2019, the United States Federal Communications Commission (FCC) submitted filings to the International Telecommunication Union (ITU) on SpaceX\'s behalf to arrange spectrum for 30,000 additional Starlink satellites to supplement the 12,000 Starlink satellites already approved by the FCC.\r\n

\r\n

\r\nAstronomers have raised concerns about the constellations’ effect on ground-based astronomy and how the satellites will add to an already jammed orbital environment. In response, SpaceX has implemented several upgrades to Starlink satellites aimed at reducing their brightness during operation. The satellites are equipped with krypton-fueled Hall thrusters which allow them to de-orbit at the end of their life. Additionally, the satellites are designed to autonomously avoid collisions based on uplinked tracking data.\r\n

\r\n',243,0,0,'CC-BY-SA','internet, leo, satellites, ISP',0,0,1), (3382,'2021-07-20','How I fixed a fault on my car for free thanks to YouTube',760,'How I fixed a fault on my car for free and as an added bonus without injuring myself!','

I had a spare moment and found this show on my hard drive. Cheers MrX

\r\n

YouTube video I found that explains how to fix a rattling heat shield for free

\r\n

Picture of the fix!
\r\n\"Picture

\r\n',201,0,1,'CC-BY-SA','Car, Repair, Hack, DIY',0,0,1), (3383,'2021-07-21','My gEeeky Experiment - Part 1',1029,'ClaudioM talks about how he revived his lowly Asus Eee PC 901 netbook with OpenBSD.','\r\n

CPU on my Dell Latitude E6410 via sysctl: hw.model=Intel(R) Core(TM) i5 CPU M 520 @ 2.40GHz

\r\n',152,0,0,'CC-BY-SA','asus,eeepc,openbsd,bsd,linux',0,0,1), (3384,'2021-07-22','Page Numbers in EPUB eBook Files',1699,'Response to HPR 3367 I describe how to specify page numbers in an EPUB eBook.','

This episode is a response to hpr3367 by Andrew Conway and Dave Morriss. One of the topics they brought up was the thorny issue of page numbers in e-books. Most of the time you don\'t need to worry about page numbers in ebooks, if you\'re reading fiction for example. The whole point of an ebook is that the texts can reflow to fit the page no matter what size the screen is or what font-size you\'ve chosen. This is a major accessibility feature of all e-book formats. One reason you might want to specify actual page numbers, though, is if you\'re dealing with a technical or academic book, and you need to be able to refer to specific passages in the book by page number, as you are expected to do in academic research. Or, as Andrew and Dave were discussing, you might need to create an index in your ebook that would send your readers back to specific pages like in a paper book.

\r\n\r\n

I\'ve thought about this before but never really gotten into the weeds and figured out how to make it happen. In fact, when I was creating the new digital editions of the Counterpoint textbooks like I discussed in hpr1512, I actually took the trouble to put page number anchors through the entire thing, so that at a future date I would be able to enable real page numbers. This was a key part of the source file\'s infrastructure, which helped me quickly find the passages I was working on in my huge HTML file. Those anchors are not quite in the correct format for EPUB, but they are consistent and I will easily be able to write a script to fix them. I haven\'t done that yet, but now that I figured out how to do it on some smaller examples, this is on my to-do list.

\r\n\r\n

Anyway while I was listening to Dave and Andrew talk about this, I thought I remembered reading somewhere that in the newest ePub specification, EPUB 3, there was support for publisher\'s page numbers to deal with precisely this issue. Their discussion prompted me to see if I could make it work. I\'m happy to report success, although with some qualifications, which I will get into.

\r\n\r\n

Converting to EPUB 3

\r\n\r\n

The first thing to do is to upgrade your ebook from EPUB2 to EPUB3. There are a couple of ways to do this. The way I did it was to use the ebook editor in a recent version of Calibre. When you open up the EPUB for editing, go to the Tools menu and choose Upgrade book internals. This will create the new navigation file nav.xhtml to replace the old toc.ncx file. You\'ll need to edit this new file later to enable the page numbers.

\r\n\r\n

Insert page anchors

\r\n\r\n

Next you need to put your page anchors in there. This could be very tedious if you haven\'t done any preparatory work, such as putting visible page numbers in plain sight in square brackets [21] the way I did for a couple of ebooks. It wasn\'t very elegant, but at least it was easy to find where the page breaks were. I have a Blather voice command that triggers a python script to create these things. Here\'s an example of page number anchor, which goes in the main text of the book wherever you want to insert a page number. This will not be visible to the reader inline. This is for page 57:

\r\n\r\n
\r\n<span epub:type="pagebreak" id="page57" title="57"></span>\r\n
\r\n\r\n

Page List in Navigation File

\r\n\r\n

Finally you need to put a page list in the new navigation file. This is simply an ordered list with hyperlinks to every page anchor that you put in your ebook. This will not be visible to the reader, but it\'s critical to making everything work. Here\'s a minimal example from my first attempt. This only covers Pages 122 to 126. This is the kind of page numbering you might need if you created an ebook from a five-page article from an academic journal that appeared in the middle of the volume.

\r\n\r\n\r\n
\r\n<nav epub:type="page-list" hidden="hidden">\r\n    <ol>\r\n        <li><a href="filename.html#page122">122</a></li>\r\n        <li><a href="filename.html#page123">123</a></li>\r\n        <li><a href="filename.html#page124">124</a></li>\r\n        <li><a href="filename.html#page125">125</a></li>\r\n        <li><a href="filename.html#page126">126</a></li>\r\n    </ol>\r\n</nav>\r\n
\r\n\r\n

I\'m not sure it matters where you put this navigation block in the nav.xhmtl file, but I put mine between the table of contents and the landmarks blocks.

\r\n\r\n

Scripting the creation of page list

\r\n\r\n

It could be very tedious to create a page list like this, so of course I wrote a script to automate a lot of the heavy lifting. I\'m sure Dave can write one that\'s more elegant than this, but this is what I came up with in about 5 minutes and it did the job, with the exception of putting the right URL for each link. I did a little bit of post-production to search and replace the URLs generated in the script with what I needed for the specific eBook. I think if you added a third command-line argument with a URL, you can solve this problem. The difficulty with larger books will be when you have more than one internal HTML file in the book, you will have to go through very carefully and make sure that the link goes to the correct file. I saved the script as pagelist.sh and put it in my $PATH.

\r\n\r\n

Command to run to generate a page list from pages 42 to 61:

\r\n\r\n
\r\npagelist.sh 42 61\r\n
\r\n\r\n

And here\'s the script:

\r\n\r\n
\r\n#!/bin/bash\r\n\r\n# grab beginning and ending pages from 1st and 2nd\r\n# CLI arguments, and specify a tmp file to put stuff\r\nstart="$1"\r\nend="$2"\r\nnavfile=/tmp/navfile.txt\r\n\r\n# put the top matter for the nav block\r\necho \'<nav epub:type="page-list" hidden="hidden">\' > $navfile\r\necho "    <ol>" >> $navfile\r\n\r\n# iterate through the page numbers making list item for each one.\r\n# should replace filename with your ebook\'s actual filename\r\nfor i in $(seq $start $end); do\r\n	echo "        <li><a href=\\"filename.html#page$i\\">$i</a></li>" >> $navfile\r\ndone\r\n\r\n# close out the list and nav block\r\necho "    </ol>" >> $navfile\r\necho "</nav>" >> $navfile\r\n\r\nexit 0\r\n
\r\n\r\nThen you just need to copy and paste what was generated from the script into your editor and make sure all of the URLs are correct, then stick that navigation block into the nav.xhtml file.\r\n\r\n

Conclusions

\r\n\r\n

So, once you have the page anchors and the page list in place in your EPUB3 ebook, everything should work. The problem is that so far the only ebook reader I have found that renders the page numbers correctly on the screen is the iBooks app on iOS. I tried it on my Kobo dedicated eReader, on the Marvin ePub reader on iOS and on Overdrive on Android, and none of them displayed my shiny page numbers. iBooks was the only one, but it did so perfectly after choosing \"show publisher page numbers\" on the table of contents menu. It was pretty magical. A quick internet search confirms that there is very little e-book reader or app support for displaying these page numbers.

\r\n\r\n

However, the embedded page numbers will still be useful if what you want to do is create an index that directs readers back to specific pages. On the one hand, indexes are not as critical as they used to be because you can search through the text of e-books very easily. What you can\'t do easily is browse an eBook the way you can browse a paper book index to see what topics might catch your eye. This might be something only academics do. It\'s not uncommon for an academic to pick up a book and flip right to the bibliography and the index!

\r\n\r\n\r\n

Links

\r\n\r\n\r\n',238,0,0,'CC-BY-SA','ebooks, epub, scripting, calibre',0,0,1), (3386,'2021-07-26','What\'s for dinner?',1342,'Some scripts and a database for randomly choosing which meal to cook','

Overview

\r\n

I live on my own, but I cook for members of my family from time to time. Each week we all get together and cook dinner for Wednesday and Thursday. I usually do the cooking but we are starting to share these duties for certain meals.

\r\n

In 2019 I thought it would be useful if I had some sort of random chooser to decide what next week’s meal was going to be. I wrote a Bash script called choose_meal, using a simple CSV file of meal names and the date last eaten to avoid choosing the same one too often. The shortcomings of this approach soon became apparent!

\r\n

It wasn’t long before choose_meal was rewritten in Perl. This time I decided to use a database, and chose SQLite to create it. My database contained just two tables, one for the meals themselves (called slightly confusingly \'meal_history\'), and another for a record of the choices made (called \'meal_log\') – the ability to produce historical reports seemed like a desirable feature!

\r\n

In 2019 the design of this system was very specific to our needs: one choice per week on a Wednesday. It was not something that could be used by anyone else – which seemed like a bad idea.

\r\n

In late 2020 and early 2021 the system was redesigned, as will be discussed in the detailed notes. In May 2021 a more general design was added to the public GitLab repository and the preparation of this show was begun.

\r\n

I had never intended this system to hold recipes. This was partly because I have built a collection of recipes I have constructed from various sources and amended as I have made them. I print these and keep them in a ring-binder for reference as I cook. In some cases the meals described in the database are multi-component ones (such as the dishes that make up a curry for example), so it doesn’t seem appropriate to hold these here.

\r\n

I might rethink this in the future however.

\r\n

Long notes

\r\n

Follow this link to read the detailed notes associated with this episode.

\r\n

Links

\r\n',225,0,1,'CC-BY-SA','Perl,SQLite3,database,food',0,0,1), (3387,'2021-07-27','Infosec Podcasts Part 5 Grab bag',483,'Presenting my favorite podcasts related to various aspects of information security','

Inoffensive in every region of the world.

\r\n

Thank you to everyone who has listened to my previous episodes. I hope I am not boring you all to death!

\r\n

Why am I recording this series?

\r\n\r\n

Because there are so many podcasts to list, I have broken them down into 6 different episodes based on topics:

\r\n\r\n

Part 5

\r\n

Hacks & Attacks

\r\n\r\n

Technical information / learning

\r\n\r\n

Community / Social / History

\r\n\r\n

I hope that this series has helped introduce you to some new and interesting listening options. Give some of them a try, and I would love to get your feedback in the episode comments on the HPR website.

\r\n

The next and final episode of this series will be about Information Security Leadership podcasts.

\r\n

Thank you for listening.

',394,75,1,'CC-BY-SA','infosec, podcasts, security',0,0,1), (3399,'2021-08-12','Linux Inlaws S01E36: Open Source Licenses',3361,'The ultimate show on open source licenses or how to fall asleep without chemicals','

\r\n In this episode Chris is trying hard to get Martin to sleep by elaborating on the\r\n subject of free and open source software licenses but fails miserably. Listen to a\r\n more than riveting episode on the ins and outs of licensing FLOSS code bases in addition\r\n to banter about Brexit, plans for a reshaping of Europe after the invasion of England\r\n and Wales, Northern Ireland and Scotland leave the UK.\r\n

\r\n\r\n

Links:

\r\n\r\n',384,111,1,'CC-BY-SA','Licensing, GNU, BSD, MIT, Taking Lives, MI6, Clarkson\'s Farm, Open Source Initiative',0,0,1), (3696,'2022-10-03','HPR Community News for September 2022',3283,'HPR Volunteers talk about shows released and comments posted in September 2022','\n\n

New hosts

\n

\nThere were no new hosts this month.\n

\n\n

Last Month\'s Shows

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
IdDayDateTitleHost
3674Thu2022-09-01Emergency Show posted in 2012. MUDKlaatu
3675Fri2022-09-02Plan 9: An exercise in futilitybinrc
3676Mon2022-09-05HPR Community News for August 2022HPR Volunteers
3677Tue2022-09-06Hacker Public Radio 2021 - 2022 New Years Show Part 4Honkeymagoo
3678Wed2022-09-07\"Stupid Users\" ... no, not those users, the other \"stupid users\"Lurking Prion
3679Thu2022-09-08Linux Inlaws S01E64: Non-profits in the US: A closer look at 501(c)smonochromec
3680Fri2022-09-09EDITAhuka
3681Mon2022-09-12Rust 101 Episode 3: Functionally InsaneBlacKernel
3682Tue2022-09-13Hacker Public Radio 2021 - 2022 New Years Show Part 5Honkeymagoo
3683Wed2022-09-14Add a favourite to OSMAndKen Fallon
3684Thu2022-09-15Wake on LanJWP
3685Fri2022-09-16Budget and an Android appArcher72
3686Mon2022-09-19 Followup for HPR3675: Clarifications on the path traversal bugbinrc
3687Tue2022-09-20Hacker Public Radio 2021 - 2022 New Years Show Part 6Honkeymagoo
3688Wed2022-09-21Education, Certifications, and sipping on the SocialsLurking Prion
3689Thu2022-09-22Linux Inlaws S01E65: TerminusDBmonochromec
3690Fri2022-09-23Planning the TripAhuka
3691Mon2022-09-26Starship.rs the best prompt I don\'t useKlaatu
3692Tue2022-09-27What is a real hacker?Lurking Prion
3693Wed2022-09-28Fixing the automatic cutoff mechanism to an electric mowerRho`n
3694Thu2022-09-29Robo Tripping Ravelords of the ApocalypseMechatroniac
3695Fri2022-09-30How I watch youtube with newsboatbinrc
\n\n

Comments this month

\n\n

These are comments which have been made during the past month, either to shows released during the month or to past shows.\nThere are 39 comments in total.

\n

Past shows

\n

There are 8 comments on\n8 previous shows:

\n\n

This month\'s shows

\n

There are 31 comments on 9 of this month\'s shows:

\n\n\n

Mailing List discussions

\n

\nPolicy decisions surrounding HPR are taken by the community as a whole. This\ndiscussion takes place on the Mail List which is open to all HPR listeners and\ncontributors. The discussions are open and available on the HPR server under\nMailman.\n

\n

The threaded discussions this month can be found here:

\nhttps://hackerpublicradio.org/pipermail/hpr_hackerpublicradio.org/2022-September/thread.html\n\n\n

Events Calendar

\n

With the kind permission of LWN.net we are linking to\nThe LWN.net Community Calendar.

\n

Quoting the site:

\n
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.
\n\n

Any other business

\n

FOSDEM 2023

\n

FOSDEM 2023 will take place in Brussels, Belgium at the Université Libre de Bruxelles (or ULB) next February on the weekend of the 4th and 5th.

\n

HPR had a stand at the last in-person event, representing Free Culture Podcasts. There is a call for proposals out at the moment for those wishing to run a stand for the forthcoming event.

\n

Older HPR shows on archive.org, phase 2

\n

Now that all shows from number 1 to the latest have been uploaded to the Internet Archive there are other tasks to perform. We are reprocessing and re-uploading shows in the range 871 to 2429 as explained in the Community News show notes released in May 2022. We are keeping a running total here to show progress:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\nMonth\n\nMonth count\n\nRunning total\n\nRemainder\n
\n2022-04\n\n130\n\n130\n\n1428\n
\n2022-05\n\n140\n\n270\n\n1288\n
\n2022-06\n\n150\n\n420\n\n1138\n
\n2022-07\n\n155\n\n575\n\n983\n
\n2022-08\n\n155\n\n730\n\n828\n
\n2022-09\n\n150\n\n880\n\n678\n
\n\n

Updated: 2022-10-02 11:47:18

\n\n',159,47,1,'CC-BY-SA','Community News',0,0,1), (3392,'2021-08-03','Structured error reporting',1714,'Tuula talks about how she improved build times by breaking down error reporting to smaller parts','

Initial state

\r\n

When I originally wanted a unified error reporting on the server-side, I made one huge type that enumerated all the possible error cases that could be reported:

\r\n
-- | Error codes for all errors returned by API\r\ndata ErrorCode\r\n    -- common error codes\r\n    = ResourceNotFound\r\n    | InsufficientRights\r\n    | FailedToParseDataInDatabase\r\n    -- errors specific to news\r\n    | SpecialEventHasAlreadyBeenResolved\r\n    | UnsupportedArticleType\r\n    | SpecialNewsExtractionFailed\r\n    | TriedToMakeChoiceForRegularArticle\r\n    -- errors specific to simulation state\r\n    | SimulationStatusNotFound\r\n    | DeltaTIsTooBig\r\n    | TurnProcessingAndStateChangeDisallowed\r\n    | SimulationNotOpenForCommands\r\n    | SimulationNotOpenForBrowsing\r\n    -- errors specific to people\r\n    | StatIsTooLow Text\r\n    | CouldNotConfirmDateOfBirth\r\n    | DateOfBirthIsInFuture\r\n    | FirstNameIsEmpty\r\n    | FamilyNameIsEmpty\r\n    | CognomenIsEmpty\r\n    | RegnalNumberIsLessThanZero\r\n    -- errors specific to new person creation\r\n    | AgeBracketStartIsGreaterThanEnd\r\n    | PersonCreationFailed\r\n    deriving (Show, Read, Eq)\r\n
\r\n

Then I had some helper functions to turn any value of that type into a nice error message:

\r\n
errorCodeToStatusCode :: ErrorCode -> Int\r\nstatusCodeToText :: Int -> ByteString\r\nerrorCodeToText :: ErrorCode -> Text\r\nraiseIfErrors :: [ErrorCode] -> HandlerFor App ()\r\n
\r\n

errorCodeToStatusCode was responsible for turning ErrorCode into http status code. For example StatIsTooLow \"intrigue\" would be 400. statusCodeToText would take this code and turn it into short error message given in http response. 400 would be Bad Request. errorCodeToText would give a bit more verbose explanation of what happened, StatIsTooLow \"intrigue\" would be mapped to \"Stat intrigue is too low\". Finally raiseIfErrors would take a list of ErrorCode and use these helper functions to turn them into a http response with correct status code, error message and json body detailing all errors that had happened:

\r\n
[\r\n    { code:\r\n        { tag: "StatIsTooLow"\r\n        , contents: "intrique"\r\n        }\r\n    , error: "Stat intrigue is too low"\r\n    }\r\n]\r\n
\r\n

There’s two tags: code, which contains machine readable details about the error and error, which contains error message that can be shown to user.

\r\n

While this worked fine, there was some problems with it. ErrorCode type was growing larger and larger and the module it was defined in was referred all over the codebase. Every time I added a new error message, all the modules that used error reporting had to be compiled and it was getting slow.

\r\n

Solution

\r\n

Breaking up the ErrorCode to smaller types and moving them to different modules would means less modules were going to built when I added a new error code. The problem was that raiseIfErrors :: [ErrorCode] -> HandlerFor App () wanted a list of ErrorCode and elements in a list have to be of same type.

\r\n

I started by splitting ErrorCode to smaller types. Each of the smaller error types have automatically derived toJSON and fromJSON functions for serializing them to and from JSON:

\r\n
data PersonCreationError =\r\n    StatIsTooLow Text\r\n    | CouldNotConfirmDateOfBirth\r\n    | DateOfBirthIsInFuture\r\n    | FirstNameIsEmpty\r\n    | FamilyNameIsEmpty\r\n    | CognomenIsEmpty\r\n    | RegnalNumberIsLessThanZero\r\n    deriving (Show, Read, Eq)\r\n\r\n$(deriveJSON defaultOptions ''PersonCreationError)\r\n
\r\n

That $(deriveJSON defaultOptions \'\'PersonCreationError) is template haskell call. Basically it invokes a deriveJSON function with PersonCreationError as parameter and compiles and splices the resulting code here. This is fast and easy way of generating ToJSON and FromJSON instances and avoiding having to write them by hand. It is very similar to how Lisp macros work.

\r\n

Then I defined a type class, that has functions for getting a http status code and a error message that can be shown to user. statusCodeToText I could use as is, without any modifications:

\r\n
class ErrorCodeClass a where\r\n    httpStatusCode :: a -> Int\r\n    description :: a -> Text\r\n
\r\n

I have to have instance of ErrorCodeClass defined for each and every smaller error type. Here’s an excerpt of PersonCreationError showing how it would look like:

\r\n
instance ErrorCodeClass PersonCreationError where\r\n    httpStatusCode = \\case\r\n        StatIsTooLow _ -> 400\r\n        CouldNotConfirmDateOfBirth -> 500\r\n...\r\n\r\n    description = \\case\r\n        StatIsTooLow s ->\r\n            "Stat " ++ s ++ " is too low"\r\n...\r\n
\r\n

A little note: description = \\case relies on lambda case extension. It is just a slightly different way of writing:

\r\n
    description d =\r\n        case d of\r\n
\r\n

This allows me to turn values of these smaller error types into error messages that could be sent to the user.

\r\n

The second part of the solution is to figure out a way to put values of these smaller error types into same list. If a list is of type [PersonCreationError], it can’t contain values of CommonError and vice versa. Creating a wrapper like:

\r\n
data ECode a = ECode a\r\n
\r\n

doesn’t work, because then I would have elements of type ECode PersonCreationError and ECode CommonError, which are of different type. What I need, is a way to wrap all these different types into a wrapper that loses the type of wrapped value. Another problem is that I need to place constraints on what kind of values can be wrapped. I need them to have instances for ErrorCodeClass (for getting error information) and ToJSON (for serializing them into JSON). There’s several ways of doing this, but I chose to use generalized algebraic data types (GADTs for short):

\r\n
{-# LANGUAGE GADTs #-}\r\n\r\ndata ECode where\r\n    ECode :: (ErrorCodeClass a, ToJSON a) => a -> ECode\r\n
\r\n

Now type ECode has one value constructor, also named to ECode, which takes one parameter a. a can be anything, as long as there’s ErrorCodeClass and ToJSON instances defined for it. Calling this constructor will return ECode. If you compare this with the previous definition of ECode, you’ll notice two major differences:

\r\n\r\n

The second part means that I can wrap different types into ECode and place them into a same list without problems. Type of that list is simply [ECode].

\r\n

But having a list of error codes wrapped in ECode isn’t going to do much to us. We need to be able to turn them into http status code, text and list of error messages. Luckily we have a type class just for that:

\r\n
instance ErrorCodeClass ECode where\r\n    httpStatusCode (ECode a) =\r\n        httpStatusCode a\r\n\r\n    description (ECode a) =\r\n        description a\r\n
\r\n

httpStatusCode of ECode is httpStatusCode of the value ECode wraps. Similarly description of ECode is description of the wrapped value.

\r\n

For turning ECode into JSON, I opted for hand written instance:

\r\n
instance ToJSON ECode where\r\n    toJSON (ECode a) =\r\n        object [ "HttpCode" .= httpStatusCode a\r\n               , "FaultCode" .= toJSON a\r\n               , "ErrorDescription" .= description a\r\n               ]\r\n
\r\n

This gives me complete control over how I want to report errors to the client.

\r\n

Final piece of the puzzle is raiseIfErrors function:

\r\n
raiseIfErrors :: [ECode] -> HandlerFor App ()\r\nraiseIfErrors errors = do\r\n    when (not $ null errors) $ do\r\n        let code = fromMaybe 500 $ errors ^? ix 0 . to httpStatusCode\r\n        let msg = statusCodeToText code\r\n        sendStatusJSON (Status code msg) $ toJSON errors\r\n
\r\n

If there are any elements in the passed in list, grab the http status code and text from the first element of the list. I was considering writing some sort of logic to deduce which error code to return in case there are more than one type in the list, but decided against it. There doesn’t seem to be any easy way to decide between HTTP 400 Bad Request and HTTP 500 Internal Server Error. So I just return the first one. Body of the response contains list of errors codes:

\r\n
[\r\n    { HttpCode: 400\r\n    , FaultCode: {\r\n        Tag: "StatIsTooLow"\r\n        , Contents: "intrique"\r\n        }\r\n    , ErrorDescription: "Stat intrigue is too low"\r\n    }\r\n]\r\n
\r\n

Since manually wrapping things in ECode gets tedious after a while, I defined function for each type of error that does that for me:

\r\n
statIsTooLow :: Text -> ECode\r\nstatIsTooLow s = ECode $ StatIsTooLow s\r\n
\r\n

Now, instead of writing ECode $ StatIsTooLow \"intrigue\", I can write statIsTooLow \"intrigue\". And if I ever decide to change internals of errors again, I can change how these functions are defined and hopefully don’t have to change each and every place where they’re being used.

\r\n

Different solution

\r\n

Another way to tackle this problem is to use records instead of algebraic data types:

\r\n
data ECode = ECode\r\n    { httpCode :: Int\r\n    , description :: Text\r\n    }\r\n\r\nstatIsTooLow :: Text -> ECode\r\nstatIsTooLow s =\r\n    ECode\r\n    { httpCode = 400\r\n    , description = "Stat " ++ s ++ " is too low"\r\n    }\r\n
\r\n',364,107,1,'CC-BY-SA','haskell, error reporting',0,0,1), (3393,'2021-08-04','We need to talk about XML',1885,'An extensible markup language? This is too good to be true!','

Klaatu introduces XML.

\r\n\r\n

\r\nThe sample XML document discussed in this episode is:\r\n

\r\n\r\n
\r\n\r\n<xml>\r\n  <sol>\r\n    <planet>\r\n      <name>\r\n        Mercury\r\n      </name>\r\n      <albedo>\r\n        0.11\r\n      </albedo>\r\n    </planet>\r\n    <planet>\r\n      <name>\r\n        Venus\r\n      </name>\r\n      <albedo>\r\n        0.7\r\n      </albedo>\r\n    </planet>\r\n    <planet>\r\n      <name>\r\n        Terra\r\n      </name>\r\n      <albedo>\r\n        0.39\r\n      </albedo>\r\n    </planet>\r\n  </sol>\r\n</xml>\r\n\r\n
\r\n',78,0,0,'CC-BY-SA','xml,data,markup,markdown',0,0,1), (3394,'2021-08-05','Be an XML star with xmlstarlet',1591,'Parse XML from the terminal','

See the layout of an XML document

\r\n\r\n
\r\n$ xmlstarlet elements planets.xml\r\nxml\r\nxml/sol\r\nxml/sol/planet\r\nxml/sol/planet/name\r\nxml/sol/planet/albedo\r\nxml/sol/planet\r\nxml/sol/planet/name\r\nxml/sol/planet/albedo\r\nxml/sol/planet\r\nxml/sol/planet/name\r\nxml/sol/planet/albedo\r\n\r\n
\r\n\r\n

See content of the planet node

\r\n\r\n
\r\n$ xmlstarlet select -t --value-of \'/xml/sol/planet\' planets.xml\r\n\r\n        Mercury\r\n        0.11\r\n\r\n        Venus\r\n        0.7\r\n\r\n        Terra\r\n        0.39\r\n
\r\n\r\n

Get the third instance of the planet node

\r\n\r\n
\r\n$ xmlstarlet select -t --value-of \'/xml/sol/planet[3]\' planets.xml\r\nTerra\r\n0.39\r\n
\r\n\r\n

Get only the planets with an albedo greater than 0.25

\r\n\r\n
\r\n$ xmlstarlet select -t --value-of \'/xml/sol/planet[albedo > 0.25]\' planets.xml\r\n\r\nVenus\r\n0.7\r\n\r\nTerra\r\n0.39\r\n
\r\n\r\n

Get only the planets closer to Sol than the third planet

\r\n\r\n
\r\n$ xmlstarlet select -t --value-of \'/xml/sol/planet[position() < 3]\' planets.xml\r\n\r\nMercury\r\n0.11\r\n\r\nVenus\r\n0.7\r\n
\r\n\r\n

Learn more XPath functions at Mozilla Developer Network.

\r\n\r\n

Download xmlstarlet from xmlstar.sourceforge.net (https://sourceforge.net/projects/xmlstar/).\r\n

\r\n',78,0,0,'CC-BY-SA','xml,data,markup,markdown',0,0,1), (3441,'2021-10-11','Murphy Work Bench',842,'Operator talks about hitting his head on his work bench','\r\n\r\n\r\n

\"https://hackerpublicradio.org/eps/hpr3441/WorkBench.gif\"

\r\n',36,0,1,'CC-BY-SA','DIY,wood working,hacking',0,0,1), (3396,'2021-08-09','Card roles in Magic the Gathering',2367,'There are over 25,000 cards in MTG. You only need 60 to play.','

Cutting to the chase:

\r\n

When getting into Magic the Gathering, it's easy to get overwhelmed and confused by choice. Instead of thinking about cards, I've learnt to think about the game mechanic roles that a deck needs to have satisfied, and then I look for cards that fill those roles.\r\n

\r\n\r\n

My list is by no means definitive, but I think these are the basic universal roles you need, regardless of how you play:

\r\n\r\n\r\n\r\n

There are other card types that can be useful, but they may be best for specific strategies. The ones I list here are, I believe, pretty universal.\r\n

\r\n\r\n

You can find lists of cards that fill specific roles with a simple Internet search. For instance, if you realize you have no cards that let you replenish your hand, you might search for "best cards to draw cards MTG" and get directed to a site like TappedOut.net or magic.wizards.com.

\r\n\r\n

Go to your local game store or an online vendor to buy just the cards you need. Because there are so many to choose from in any given category, you get to control the price. I have a rule for myself that do not spend over $2 on any single card.\r\n

\r\n\r\n

When trying to fill roles, I generally aim to get 4 cards that do the thing I need. Sometimes I get exactly the same card 4 times, other times I get a variety of cards to fill the role. Either way, 4 usually feels like a good draw frequency for each role.

\r\n\r\n',78,0,0,'CC-BY-SA','magic, mtg, card, tcg',0,0,1), (3401,'2021-08-16','Mana hacks',1924,'Klaatu muses about mana ramping in Magic the Gathering','

The categories of mana ramps I have defined for myself are:

\r\n\r\n',78,95,0,'CC-BY-SA','magic, mtg, card, tcg, mana',0,0,1), (3397,'2021-08-10','What is a PineTime',595,'In this podcast I talk a little bit about the pinetime.','

\r\nThis is the first impression of a PineTime watch that I bought about a week ago and have already done some changes to the underlying code. I think this is an interesting project and open source so you can contribute.\r\n

\r\n

\r\nGithub repository:\r\nhttps://github.com/JF002/InfiniTime\r\n

\r\n

\r\nSales page:\r\nhttps://www.pine64.org/pinetime/\r\n

',382,0,0,'CC-BY-SA','open source, watch, coding',0,0,1), (3406,'2021-08-23','A study of cards in games',1633,'Currency, deterrent, coersion, clutter, rules','

What function cards have in games.

',78,95,0,'CC-BY-SA','card, game',0,0,1), (3402,'2021-08-17','Reading a manifesto: Declaration of Digital Autonomy',877,'Reading and brief commentary and background on Molly DeBlanc\'s and Karen Sandler\'s techautonomy.org','

This episode, as its source material, is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license.

\r\n

Previously

\r\n\r\n

Free Software Timeline

\r\n\r\n

Further sources for timeline:

\r\n\r\n

People

\r\n

Molly DeBlanc

\r\n

https://deblanc.net/blog/about/

\r\n\r\n

Karen Sandler

\r\n

https://en.wikipedia.org/wiki/Karen_Sandler

\r\n\r\n

Manifesto

\r\n

https://techautonomy.org/

\r\n

Declaration of Digital Autonomy (draft 0.1)

\r\n

We demand a world in which technology is created to protect and empower the people who use it. Our technology must respect the rights and freedoms of those users. We need to take control for the purpose of collectively building a better world in which technology works in service to the good of human kind, protecting our rights and digital autonomy as individuals.

\r\n

We have become more reliant than ever on technology that we intertwine into every aspect of our lives. That technology is currently made not for us, those using it. Rather, it is for the companies who intend to monetize its use and whoever owns the associated copyrights and patents. Services are run via networked software on computers we never directly interact with. Our devices are designed to only function while broadcasting our intimate information regardless of whether the transmission of that information is necessary functionality. We generate data that we do not have access to, that is bought, sold, and traded between corporations and governments. Technologies we\'re increasingly being forced to use reinforce and amplify social inequalities. As schools and jobs go online, high speed computing, centralized services and Internet become inescapably necessary. Technology is designed and implemented to oppress, often with sexist, classist, and racist implications. Rather than being served by these tools, we are instead in service to them. These gatekeepers of our technology are not individual people or public organizations who think about the wellbeing of others, but instead are corporations, governments and others with agendas that do not include our best interests. Our technology has become the basic infrastructure on which our society functions, and yet the individuals who use it have no say or control over its function.

\r\n

It\'s time to change our digital destiny.

\r\n

We believe it is necessary for technology to provide opportunity for: informed consent of use; transparent development and operation; privacy and security from bad actors; interaction without fear of surveillance; technology to work primarily on the terms of the people using it; functionality inside and outside of connected networks; use with other services and other software, repair; and connection, and not alienation, from the technology itself and that which is created from it.

\r\n

We therefore call for the adoption of the following principles for ethical technology:

\r\n\r\n

We, as individuals, collectives, cultures, and societies, are making this call in the rapidly changing face of technology and its deepening integration into our lives. Technology must support us as we forge our own digital destinies as our connectivity to digital networks and one another changes in ways we anticipate and in ways we have yet to imagine. Technology makers and those who use this technology can form the partnerships necessary to build the equitable, hopeful future we dream of.

\r\n

We\'d love to hear what you think! Let us know by emailing thoughts@ this domain.

\r\n

The Declaration of Digital Autonomy is (c) Molly de Blanc and Karen M. Sandler, 2020, licensed under Creative Commons Attribution-ShareAlike 4.0 International.

\r\n',311,0,1,'CC-BY-SA','manifesto, community, free software, open source, politics, philosophy, digital autonomy',0,0,1), (3398,'2021-08-11','Anacron',949,'Put down that crontab and get started with anacron','

Setup

\r\n\r\n
\r\n$ mkdir -p ~/.local/etc/cron.daily ~/.var/spool/anacron\r\n
\r\n\r\n\r\n

Create a file called anacrontab:

\r\n\r\n
\r\n$ touch /.local/etc/anacrontab\r\n
\r\n\r\n

Set it up to trigger scripts in your cron.daily folder:\r\n

\r\n\r\n
\r\nSHELL=/bin/sh\r\nPATH=/sbin:/bin:/usr/sbin:/usr/bin\r\n1  0  cron.daily   run-parts $HOME/.local/etc/cron.daily/\r\n
\r\n\r\n

\r\nValidate your anacrontab:\r\n

\r\n\r\n
\r\n$ anacron -T -t ~/.local/etc/anacrontab -S ~/.var/spool/anacron\r\n
\r\n\r\n

Start anacron in a file that gets triggered at login, such as ~/.profile:\r\n

\r\n\r\n
\r\nanacron -t $HOME/.local/etc/anacrontab -S $HOME/.var/spool/anacron\r\n
\r\n\r\n

Using

\r\n\r\n

Now that everything is set up, just put scripts you want to run regularly in cron.daily, and make them executable.\r\n

\r\n\r\n

You can set up a weekly directory, too. Just set the time interval in your anacrontab to:\r\n

\r\n\r\n
\r\nSHELL=/bin/sh\r\nPATH=/sbin:/bin:/usr/sbin:/usr/bin\r\n7  0  cron.weekly   run-parts $HOME/.local/etc/cron.weekly/\r\n
',78,0,0,'CC-BY-SA','cron, linux, service, automation',0,0,1), (3411,'2021-08-30','Dominion card game',1673,'Klaatu talks about the Dominion card game','

Dominion is a card game. Lots of fun. You should try it.

\r\n\r\n

You can even play online for free at dominion.games\r\n

',78,95,0,'CC-BY-SA','card, game',0,0,1),