Site Map - skip to main content - dyslexic font - mobile - text - print

Hobby Public Radio

Your ideas, projects, opinions - podcasted.

New episodes Monday through Friday.

Welcome to HPR the Community Podcast Network

We started producing shows as Today with a Techie on 2005-09-19, 13 years, 4 months, 9 days ago. Our shows are produced by listeners like you and can be on any topic that "are of interest to hobbyists". If you listen to HPR then please consider contributing one show a year. If you record your show now it could be released in 7 days.

Meet the team

Please help out tagging older shows !

Call for shows

We are running very low on shows at the moment. Have a look at the hosts page and if you don't see "2019-??-??" next to your name, or if your name is not listed, you might consider sending us in something.

hpr queue showing an graph showing how few shows we have

There are files ready to process on the FTP server.

Latest Shows

hpr2733 :: Writing Web Game in Haskell - News and Notifications

tuturto talks about the game they're writing in Haskell and convoluted news system they made.

Hosted by tuturto on 2019-01-23 is flagged as Clean and released under a CC-BY-SA license.
Tags: haskell, yesod.
Listen in ogg, spx, or mp3 format. Comments (0)


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.

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.

Server interface

Server has three resources for news, although we’re concentrating only one here:

/api/message           ApiMessageR      GET POST
/api/message/#NewsId   ApiMessageIdR    DELETE
/api/icon              ApiMessageIcons  GET

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.


Database is defined in /config/models file. For news, there’s only one table:

News json
    content Text
    factionId FactionId
    date Int
    dismissed Bool
deriving Show Read Eq

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.

Domain objects

There are many kinds of messages that players might see, but we’ll concentrate on one about discovering a new planet

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.

data NewsArticle =
    StarFound StarFoundNews
    | PlanetFound PlanetFoundNews
    | UserWritten UserWrittenNews
    | DesignCreated DesignCreatedNews
    | ConstructionFinished ConstructionFinishedNews

data PlanetFoundNews = PlanetFoundNews
    { planetFoundNewsPlanetName :: Text
    , planetFoundNewsSystemName :: Text
    , planetFoundNewsSystemId   :: Key StarSystem
    , planetFoundNewsPlanetId   :: Key Planet
    , planetFoundNewsDate       :: Int

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:

parseNews :: News -> Maybe NewsArticle
parseNews =
    decode . toLazyByteString . encodeUtf8Builder . newsContent

Because parsing arbitrary JSON might fail, we get Maybe NewsArticle, instead of NewsArticle. It is possible to write the same code in longer way:

parseNews news =
        content = newsContent news
        utf8Encoded = encodeUtf8Builder content
        byteString = toLazyByteString utf8Encoded
        decode byteString

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:

parseNewsEntity :: Entity News -> (Key News, Maybe NewsArticle)

parseNewsEntities :: [Entity News] -> [(Key News, NewsArticle)]

Writing JSON encoding and decoding is tedious, template Haskell can help us here:

$(deriveJSON defaultOptions ''PlanetFoundNews)
$(deriveJSON defaultOptions ''NewsArticle)

Turning Articles into JSON

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).

First step, define our types (concentrating on planet found news here):

data NewsArticleDto =
    StarFoundDto StarFoundNewsDto
    | PlanetFoundDto PlanetFoundNewsDto
    | UserWrittenDto UserWrittenNewsDto
    | DesignCreatedDto DesignCreatedNewsDto
    | ConstructionFinishedDto ConstructionFinishedNewsDto
    deriving (Show, Read, Eq)

data PlanetFoundNewsDto = PlanetFoundNewsDto
    { planetFoundNewsDtoPlanetName :: Text
    , planetFoundNewsDtoSystemName :: Text
    , planetFoundNewsDtoSystemId   :: Key StarSystem
    , planetFoundNewsDtoPlanetId   :: Key Planet
    , planetFoundNewsDtoDate       :: Int
    deriving (Show, Read, Eq)

We need way to move data into dto and thus define a type class for that operation:

class (ToJSON d) => ToDto c d | c -> d where
    toDto :: c -> d

For more information about functional dependencies, check following links: and

Writing instances for our type class:

instance ToDto PlanetFoundNews PlanetFoundNewsDto where
    toDto news =
        PlanetFoundNewsDto { planetFoundNewsDtoPlanetName = planetFoundNewsPlanetName news
                           , planetFoundNewsDtoSystemName = planetFoundNewsSystemName news
                           , planetFoundNewsDtoSystemId = planetFoundNewsSystemId news
                           , planetFoundNewsDtoPlanetId = planetFoundNewsPlanetId news
                           , planetFoundNewsDtoDate = planetFoundNewsDate news

instance ToDto NewsArticle NewsArticleDto where
    toDto news =
        case news of
            (StarFound x) -> StarFoundDto $ toDto x
            (PlanetFound x) -> PlanetFoundDto $ toDto x
            (UserWritten x) -> UserWrittenDto $ toDto x
            (DesignCreated x) -> DesignCreatedDto $ toDto x
            (ConstructionFinished x) -> ConstructionFinishedDto $ toDto x

Finally, we want to wrap our news into something that has all the common info (id and link to icon to show)

data NewsDto = NewsDto
    { newsDtoId    :: Key News
    , newsContents :: NewsArticleDto
    , newsIcon     :: Text
    deriving (Show, Read, Eq)

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:

instance ToDto ((Key News, NewsArticle), (IconMapper NewsArticleDto)) NewsDto where
    toDto ((nId, article), icons) =
            content = toDto article
        NewsDto { newsDtoId = nId
                , newsContents = content
                , newsIcon = runIconMapper icons content

Sideshow: IconMapper

IconMapper is a function that knows how to retrieve url to icon that matches the given parameter (for example NewsArticleDto in this case):

newtype IconMapper a =
    IconMapper { runIconMapper :: a -> Text }

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:

iconMapper :: (Route App -> Text) -> IconMapper UserNewsIconDto -> IconMapper NewsArticleDto
iconMapper render userIconMapper =
    IconMapper $ article ->
        case article of
            PlanetFoundDto _->
                render $ StaticR images_news_planet_png

            UserWrittenDto details ->
                runIconMapper userIconMapper $ userWrittenNewsDtoIcon details

Back to JSON

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.

instance ToJSON NewsDto where
    toJSON (NewsDto { newsDtoId = nId
                    , newsContents = contents
                    , newsIcon = icon }) =
        object [ "id" .= nId
               , "contents" .= contents
               , "tag" .= jsonTag contents
               , "icon" .= icon
               , "starDate" .= newsStarDate contents

instance ToJSON PlanetFoundNewsDto where
    toJSON (PlanetFoundNewsDto { planetFoundNewsDtoPlanetName = pName
                               , planetFoundNewsDtoSystemId = sId
                               , planetFoundNewsDtoPlanetId = pId
                               , planetFoundNewsDtoSystemName = sName
                               }) =
        object [ "planetName" .= pName
               , "systemName" .= sName
               , "planetId" .= pId
               , "systemId" .= sId

Time to put it all together

Handler function authenticates user, check they’re member of a faction and then loads all the news:

getApiMessageR :: Handler Value
getApiMessageR = do
    (_, _, fId) <- apiRequireFaction
    loadAllMessages fId

Loading messages involves multiple steps:

  • retrieve News from database
    • correct faction, not dismissed, sort by date
  • parse them into ( Key News, NewsArticle )
  • get Url render function
  • create mapper for user icons
  • map all NewsArticles into ( NewsArticleDto, IconMapper )
  • turn them into JSON and return that to client
loadAllMessages :: Key Faction -> HandlerFor App Value
loadAllMessages fId = do
    loadedMessages <- runDB $ selectList [ NewsFactionId ==. fId
                                         , NewsDismissed ==. False ] [ Desc NewsDate ]
    let parsedMessages = parseNewsEntities loadedMessages
    render <- getUrlRender
    let userIcons = userNewsIconMapper render
    return $ toJSON $ map (toDto . (flip (,) (iconMapper render userIcons))) parsedMessages

hpr2732 :: Storytelling formula compliance

Telling a story? want a reaction? USE THE FORMULA

Hosted by klaatu on 2019-01-22 is flagged as Explicit and released under a CC-BY-SA license.
Tags: story, character, plot, writing.
Listen in ogg, spx, or mp3 format. Series: Information Underground | Comments (0)

Storytelling 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.

Here is the literal formula, in pseudo code:

{A} Reinforced


{A} Returned


{Z} Returned

You 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.

Really obvious examples are any given romantic comedy:

{A} Jack is A="single and free"
{A} Scene to reinforce that Jack is in relationships with no strings attached. Jack is {A}.

{Z} Jack meets Jill, realises she makes him happy. He decides he's had enough of being {A} and want to be {Z=married}

{A} Reunion with old school mate makes Jack question his resolve. He leaves Jill so he can be {A}

{B...Y} Plot happens. Jack does stuff, Jill does stuff. Funny? Tragic? You decide!

{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.

You can also try it with the old Evil Empire plot line.

{A} Jill is an {A=obedient citizen}. Loves her mama, loves Jesus and America, too.
{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}.

{Z} Jill meets Jack, an outlaw and rebel against the Empire. He's in trouble, so she helps him evade the police.

{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.

{B...Y} Plot happens. Action, laser guns, laser swords, nationalism, motorcycle gangs.

{Z} Jill, seeing the devastation her allegiance has caused, realises that the Empire is actually Evil. She joins the rebels to fight for freedom.

Now go practice this. Soon you will be telling stories, jokes, and anecdotes that have a clear beginning, a clear conflict, and a clear ending.

hpr2731 :: My 8 bit Christmas

I got an new, old computer for Christmas - an Acorn BBC microcomputer model B.

Hosted by Andrew Conway on 2019-01-21 is flagged as Clean and released under a CC-BY-SA license.
Tags: retro,BBC,8bit,assembler.
Listen in ogg, spx, or mp3 format. Comments (0)

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.

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.

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.

hpr2730 :: Resizing images for vcard on Android

Automating the steps needed to get images formatted for VCard import into Android phones

Hosted by Ken Fallon on 2019-01-18 is flagged as Explicit and released under a CC-BY-SA license.
Tags: GraphicsMagick, ImageMagick, VCard, Android, LinageOS.
Listen in ogg, spx, or mp3 format. Comments (0)

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.

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.

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.

Stack exchange

I tried a 720x720 on a few phones but decided to settle on 256x256 for now.

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.

My requirements were:

  • The images should be scaled so that the maximum height/width shrinks to 256, maintaining the aspect ratio.
  • The images should always be 256x256 in size.
  • Scaled images should be padded and centered on a white background.
  • All color profile information should be removed.

To use an example I took the following image and saved it as Linus_Torvalds.jpg

By Krd (photo)Von Sprat (crop/extraction) - File:LinuxCon Europe Linus Torvalds 03.jpg, CC BY-SA 4.0, Link

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.

$ gm convert -size 256x256 "Linus_Torvalds.jpg" Linus_Torvalds_1.jpg
$ gm identify Linus_Torvalds_1.jpg Linus_Torvalds_1.jpg JPEG 366x509+0+0 DirectClass 8-bit 56.1Ki 0.000u 0m:0.000002

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.

$ gm convert -size 256x256 "Linus_Torvalds.jpg" -resize 256x256 Linus_Torvalds_2.jpg
$ gm identify Linus_Torvalds_2.jpg
Linus_Torvalds_2.jpg JPEG 184x256+0+0 DirectClass 8-bit 47.7Ki 0.000u 0m:0.000001s

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.

The solution to this is to use the -extent command.

$ gm convert -size 256x256 "Linus_Torvalds.jpg" -resize 256x256 -extent 256x256 Linus_Torvalds_3.jpg
$ gm identify Linus_Torvalds_3.jpg
Linus_Torvalds_3.jpg JPEG 256x256+0+0 DirectClass 8-bit 48.0Ki 0.000u 0m:0.000001s

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.

$ gm convert -gravity center -size 256x256 "Linus_Torvalds.jpg" -resize 256x256 -extent 256x256 Linus_Torvalds_4.jpg
$ gm identify Linus_Torvalds_4.jpg
Linus_Torvalds_4.jpg JPEG 256x256+0+0 DirectClass 8-bit 48.5Ki 0.000u 0m:0.000001s

Finally we remove all profile information using +profile which should make the image more generic.

$ gm convert -gravity center -size 256x256 "Linus_Torvalds.jpg" -resize 256x256 -extent 256x256 +profile "*" Linus_Torvalds_5.jpg
$ gm identify Linus_Torvalds_5.jpg
Linus_Torvalds_5.jpg JPEG 256x256+0+0 DirectClass 8-bit 5.7Ki 0.000u 0m:0.000001s

Putting it all together we get.

gm convert -gravity center -size 256x256 "big-image.jpg" -resize 256x256 -extent 256x256 +profile "*" "256x256_image.jpg"

You should now be able to add these images to vcards without any problem.

Here is a one liner to create 96x96 256x256 and 720x720 thumbnails of all the jpg images in a directory.


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

Also available here

hpr2729 :: Bash Tips - 18

Arrays in Bash (part 3)

Hosted by Dave Morriss on 2019-01-17 is flagged as Explicit and released under a CC-BY-SA license.
Tags: Bash,array,indexed array,associative array,parameter expansion.
Listen in ogg, spx, or mp3 format. Series: Bash Scripting | Comments (0)

Bash Tips - 18 (Extra auxiliary Bash tips)

Arrays in Bash

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.

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.

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.

Long notes

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

hpr2728 :: The Unreliable Narrator In Storytelling

Lostnbronx looks at unreliable narrators and narrative techniques in stories.

Hosted by lostnbronx on 2019-01-16 is flagged as Clean and released under a CC-BY-SA license.
Tags: stories,storytelling,narration,lostnbronx.
Listen in ogg, spx, or mp3 format. Series: Random Elements of Storytelling | Comments (1)

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

hpr2727 :: Passwords

How to do passwords better.

Hosted by Edward Miro / c1ph0r on 2019-01-15 is flagged as Clean and released under a CC-BY-SA license.
Tags: Information Security for Everyone.
Listen in ogg, spx, or mp3 format. Series: Privacy and Security | Comments (0)


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.


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?

For me personally I employ and advise a three faceted approach:

  1. Complex passwords
  2. Unique passwords
  3. Two-factor authentication (where available)

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:

Password Managers

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.

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.

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.

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:

Take a poem, song lyrics or phrase that is easy for you to remember. For this example I’ll use the phrase:

"The stars at night are big and bright. Deep in the heart of Texas."

Then I take the first letters from each word and that gives me:


Then I swap out the vowels for some numbers/special characters. And that gives me:


I checked that password on Dashlane’s Password Strength Checker, and got the following results:

It would take a computer about 204 million years to crack your password

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.

2FA (two-factor authentication)

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.

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.

A few closing thoughts

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.

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.

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.

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:

  1. Setup a password manager with a strong master password.
  2. Change all your passwords using the built in password generator in your password manager and save them in your vault as you go.
  3. 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.

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.

I also linked SplashData’s “The Top 100 Worst Passwords of 2018”. PLEASE don’t use anything on this list.

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.

Thank you and have a safe 2019!

hpr2726 :: Home Theater - Part 2 Software (High Level)

I go over a high level of my notes for the software on my Media box as it relates to TV/Movies/Music

Hosted by operat0r on 2019-01-14 is flagged as Clean and released under a CC-BY-SA license.
Tags: kodi, deluge,Sonarr,Plex,Subsonic,SpiderOakONE,Zoneminder,Borg Backup,rclone,Redshift,Audacity.
Listen in ogg, spx, or mp3 format. Comments (0)

  • Future Eps for Series:
    • Sonarr / Filename Fixes
    • SABnzbd
    • Subsonic / /Audio Fixes

Local copy of the shownotes

hpr2725 :: The Illumos Shutdown Command Explained

A short pod cast about the Illumos shutdown command

Hosted by klaatu on 2019-01-11 is flagged as Clean and released under a CC-BY-SA license.
Tags: sys admin,systems,unix,illumos.
Listen in ogg, spx, or mp3 format. Comments (1)

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.

The quick version:

  • shutdown
  • -i sets the destination init state (5 to shutdown, 6 to reboot, and so on; see man init for more)
  • -y to answer "yes" to the safeguard prompt asking you whether you really want to shutdown
  • -g to set how many seconds until shutdown. Default is 60.

In practise, I don't even use the shutdown command. I use poweroff, which does a shutdown and poweroff.

Both shutdown and poweroff require root permission. On OpenIndiana, you can either use sudo bash or pfexec bash to get a root prompt.

Some links:

OpenIndiana handbook

Sun Microsystem docs (with Oracle branding on it)

hpr2724 :: Using a DIN Rail to mount a Raspberry Pi

I created DIN rail fittings for attaching my RPi 3B+ and an SSD disk

Hosted by Dave Morriss on 2019-01-10 is flagged as Explicit and released under a CC-BY-SA license.
Tags: 3D printing,DIN rail,Raspberry Pi.
Listen in ogg, spx, or mp3 format. Comments (0)


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.

See the Wikipedia article on the subject for full details.

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.

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.

Long notes

I have provided detailed notes and pictures for this episode, and these can be viewed here.

Previous five weeks

hpr2723 :: Using Elm in context of 4X game client hosted by tuturto

Released: 2019-01-09. Duration: 00:44:31. Flag: Clean.
Tags: elm.
tuturto talks their decisions on structuring Elm application

hpr2722 :: RAID 6 a short description hosted by JWP

Released: 2019-01-08. Duration: 00:02:30. Flag: Explicit.
Tags: Raid6.
How Raid 6 works

hpr2721 :: HPR Community News for December 2018 hosted by HPR Volunteers

Released: 2019-01-07. Duration: 01:10:47. Flag: Explicit. Series: HPR Community News.
Tags: Community News.
HPR Volunteers talk about shows released and comments posted in December 2018

hpr2720 :: Download youtube channels using the rss feeds hosted by Ken Fallon

Released: 2019-01-04. Duration: 00:24:07. Flag: Explicit.
Tags: youtube, youtube-dl, channels, playlists, xmlstarlet.
Ken shares a script that will allow you to quickly keep up to date on your youtube subscriptions

hpr2719 :: Bash Tips - 17 hosted by Dave Morriss

Released: 2019-01-03. Duration: 00:34:16. Flag: Explicit. Series: Bash Scripting.
Tags: Bash,array,indexed array,associative array.
Arrays in Bash (part 2)

hpr2718 :: Genre In Storytelling hosted by lostnbronx

Released: 2019-01-02. Duration: 00:12:30. Flag: Clean.
Tags: stories,storytelling,genre,lostnbronx.
Lostnbronx takes a look at the importance of genre in storytelling.

hpr2717 :: Mobile Device Security hosted by Edward Miro / c1ph0r

Released: 2019-01-01. Duration: 00:10:21. Flag: Explicit.
Tags: Mobile Device Security.
Cell phone cyber security 101

hpr2716 :: Really Simple YouTube hosted by Thaj Sara

Released: 2018-12-31. Duration: 00:07:21. Flag: Clean.
Tags: RSS, YouTube, PeerTube, TInyTinyRSS, Internet Video.
Thaj explains how he makes YouTube come to him using RSS feeds

hpr2715 :: About ONAP hosted by JWP

Released: 2018-12-28. Duration: 00:10:18. Flag: Explicit. Series: Networking.
Tags: Networking,ONAP,Open Networking Automation Platform.
The Linux foundations ONAP project all about it

hpr2714 :: Airplane stalls and Angle of Attack hosted by Brian in Ohio

Released: 2018-12-27. Duration: 00:16:35. Flag: Clean.
Tags: aircraft,flight,stall.
A primer on why airplanes quit flying

hpr2713 :: Resources in 4x game hosted by tuturto

Released: 2018-12-26. Duration: 00:20:52. Flag: Clean.
Tags: haskell.
One way to implement data types for raw resources in Haskell

hpr2712 :: Steganography hosted by klaatu

Released: 2018-12-25. Duration: 00:21:30. Flag: Clean.
Tags: steganography,message,secret decoder ring.
Klaatu wraps up his miniseries about steganography.

hpr2711 :: Raspberry Pi 3A+ Review hosted by Yannick the french guy from Switzerland

Released: 2018-12-24. Duration: 00:05:36. Flag: Clean.
Tags: raspberry pi, review.
In this episode of HPR, I will do a quick review of the Raspberry Pi 3A+.

hpr2710 :: Youtube downloader for channels hosted by Ken Fallon

Released: 2018-12-21. Duration: 00:14:04. Flag: Explicit.
Tags: youtube, youtube-dl.
A followup to hpr2675 how you can download an entire youtube channel for local playout

hpr2709 :: Bash Tips - 16 hosted by Dave Morriss

Released: 2018-12-20. Duration: 00:24:00. Flag: Explicit. Series: Bash Scripting.
Tags: Bash,array,indexed array,associative array.
Arrays in Bash (part 1)

hpr2708 :: Ghostscript hosted by klaatu

Released: 2018-12-19. Duration: 00:22:31. Flag: Clean. Series: Privacy and Security.
Tags: pdf, ebook, bloat, print.
Klaatu talks about manipulating PDFs with gs and pdf-stapler

hpr2707 :: Steganalysis 101 hosted by Edward Miro / c1ph0r

Released: 2018-12-18. Duration: 00:14:24. Flag: Clean.
Tags: Steganalysis, steganography.
Steganalysis is the process of identifying the presence of, and decrypting, steganography.

hpr2706 :: Why I love the IBM AS/400 computer systems hosted by Jeroen Baten

Released: 2018-12-17. Duration: 00:28:34. Flag: Explicit.
Tags: as400, ibm, computing, midrange.
A short talk about how I came to love the IBM As/400 systems and why.

hpr2705 :: Evidence-based Medicine hosted by Ahuka

Released: 2018-12-14. Duration: 00:16:53. Flag: Clean. Series: Health and Healthcare.
Tags: Health, Medicine, Evidence, Science.
Medicine should be based on objective scientific evidence

hpr2704 :: Intro to Scribus hosted by klaatu

Released: 2018-12-13. Duration: 00:39:40. Flag: Clean. Series: Privacy and Security.
Tags: design, steganography, scribus, layout.
Klaatu provides an overview of Scribus in part 1 of a mini-series about steganography

hpr2703 :: Fog of war in Yesod based game hosted by tuturto

Released: 2018-12-12. Duration: 00:25:15. Flag: Clean.
Tags: haskell, yesod.
How to implement fog of war system in turn based web game

hpr2702 :: Audacity set up and response to episode 2658 hosted by Tony Hughes AKA TonyH1212

Released: 2018-12-11. Duration: 00:01:47. Flag: Clean.
Tags: audio,Audacity.
Just a quick responce to Ep2658

hpr2701 :: First impressions of the Odroid-go hosted by dodddummy

Released: 2018-12-10. Duration: 00:32:06. Flag: Clean. Series: Hobby Electronics.
Tags: Odroid-go.
I ramble on about my first impressions of the odroid-go

hpr2700 :: Episode 3000 hosted by Ken Fallon

Released: 2018-12-07. Duration: 07:27:10. Flag: Clean.
Tags: TWaT, HPR, 3000.
We commemorate the 300 Today with a Techie and 2700 Hacker Public Radio shows

hpr2699 :: Bash Tips - 15 hosted by Dave Morriss

Released: 2018-12-06. Duration: 00:29:54. Flag: Explicit. Series: Bash Scripting.
Tags: Bash,loop,ls,pipe,pipeline,find,extglob.
Some of the pitfalls when using loops in Bash

hpr2698 :: XSV for fast CSV manipulations - Part 1 hosted by b-yeezi

Released: 2018-12-05. Duration: 00:30:37. Flag: Clean.
Tags: CSV,XSV.
Written in Rust, xsv is my new favorite tool for manipulating csv files

hpr2697 :: The Linux Shutdown Command Explained hosted by JWP

Released: 2018-12-04. Duration: 00:06:42. Flag: Clean.
Tags: Linux,shutdown.
A short pod cast about the linux shutdown command

hpr2696 :: HPR Community News for November 2018 hosted by HPR Volunteers

Released: 2018-12-03. Duration: 01:11:57. Flag: Explicit. Series: HPR Community News.
Tags: Community News.
HPR Volunteers talk about shows released and comments posted in November 2018

hpr2695 :: Problems with Studies hosted by Ahuka

Released: 2018-11-30. Duration: 00:13:18. Flag: Clean. Series: Health and Healthcare.
Tags: Health, Medicine, Medical Studies, Evaluating Studies.
Some principles for evaluating medical studies

hpr2694 :: Bandit Update hosted by NYbill

Released: 2018-11-29. Duration: 00:11:39. Flag: Clean.
Tags: Hacking, War games, Linux.
NYbill does a quick episode to mention there are new Over the Wire, Bandit levels out.

hpr2693 :: Getting started with web based game in Haskell and Elm hosted by tuturto

Released: 2018-11-28. Duration: 00:19:06. Flag: Clean.
Tags: haskell, yesod.
First steps in writing 4x space exploration game

hpr2692 :: YouTube URL tricks hosted by desearcher

Released: 2018-11-27. Duration: 00:07:16. Flag: Clean.
Tags: YouTube,URL,Chrome,Roku,Smart TV.
URL tricks for YouTube to enhance viewing experience and an overview of my viewing methodology

hpr2691 :: DerbyCon Interview - John Strand hosted by Xoke

Released: 2018-11-26. Duration: 00:02:40. Flag: Clean. Series: Interviews.
Tags: DerbyCon, Interview, Blockchain.
John Strand talks about behavoural analytics and blockchain

hpr2690 :: A chat about the HiveMQ Broker hosted by Ken Fallon

Released: 2018-11-23. Duration: 00:07:05. Flag: Clean. Series: Interviews.
Tags: MQTT, HiveMQ, dc-square GmbH.
Ken talks with Florian Raschbichler and Anja Helmbrecht-Schaar about HiveMQ

hpr2689 :: Bash Tips - 14 hosted by Dave Morriss

Released: 2018-11-22. Duration: 00:28:08. Flag: Explicit. Series: Bash Scripting.
Tags: Bash,loop,for,break,continue.
More about loops - the 'for' loop, 'break' and 'continue'

hpr2688 :: Explaining the controls on my Amateur HF Radio Part 5 hosted by MrX

Released: 2018-11-21. Duration: 00:17:19. Flag: Explicit. Series: HAM radio, QSK.
Tags: HF, Ham, Amateur Radio.
In this episode I cover the remaining Receiver section controls of the TS940S.

hpr2687 :: Some Additional Talk About Characters -- 02 hosted by lostnbronx

Released: 2018-11-20. Duration: 00:12:30. Flag: Clean.
Tags: stories,storytelling,characters,lostnbronx.
Lostnbronx takes a look at what sorts of characters work best for certain types of tales. Part 02.

hpr2686 :: (NOT) All About Blender - Part the Second hosted by m1rr0r5h4d35

Released: 2018-11-19. Duration: 00:40:13. Flag: Explicit.
Tags: Blender.
A meandering conversation to sooth the nerves, and warm the soul - part 2!!

hpr2685 :: Scientific and Medical Reports hosted by Ahuka

Released: 2018-11-16. Duration: 00:14:14. Flag: Clean. Series: Health and Healthcare.
Tags: Health, Medicine, Medical Studies, News Reports.
We need to be careful about evaluating news reports about medical studies

hpr2684 :: Making a remote control visible hosted by Ken Fallon

Released: 2018-11-15. Duration: 00:01:17. Flag: Explicit.
Tags: Life hacks.
Yet another amazing life hack !!!

Older Shows

Get a full list of all our shows.