Hacker Public Radio

Follow Hacker Public Radio
Share on
Copy link to clipboard

Hacker Public Radio is an podcast that releases shows every weekday Monday through Friday. Our shows are produced by the community (you) and can be on any topic that are of interest to hackers and hobbyists.

feedback@NOSPAM-hackerpublicradio.org (HPR Feedback)


    • Jun 11, 2026 LATEST EPISODE
    • weekdays NEW EPISODES
    • 1,446 EPISODES


    Search for episodes from Hacker Public Radio with a specific topic:

    Latest episodes from Hacker Public Radio

    HPR4659: Command Line Fun - Recording a show

    Play Episode Listen Later Jun 11, 2026


    This show has been flagged as Clean by the host. In this episode Kevie does a step-by-step approach to record an episode of HPR using the FFMPEG tool on the Linux command line. Before beginning please ensure that FFMPEG is installed, it is available in the vast majority of Linux repositories. Start by making a new folder to keep all your files in and move into the new folder (these will be numerous by the end of your recording): mkdir Podcast cd Podcast To start recording audio use the command: ffmpeg -f pulse -i default file01.flac and finish the recording by pressing ctrl+c. I would recommend recording a test piece of audio to ensure that you are recording from your desired microphone and that the levels are to your liking. To listen to the audio file we use ffplay: ffplay file01.flac Once all of the files have been recorded, to reduce the need for editing I would recommend recording several short segments, we need to put these together using: ffmpeg -i file01.flac -i file02.flac -i file03.flac -i file04.flac -i file05.flac -filter_complex "[0:a][1:a][2:a][3:a][4:a]concat=n=5:v=0:a=1" filedone.flac Not that the number of sets squared brackets [] should be the same as the number of files (these start at zero) and the number after n= should be the actual number of files you wish to combine. To remove any extended periods of silence then we can use: ffmpeg -i filedone.flac -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-45dB filefinished.flac Please note that this is a bit flaky at the time of recording (my results have been mixed) and it will re-encode the audio file so never do this with a lossy file such as ogg or mp3 as this will reduce the quality, keep this for lossless versions such as flac or wav files. If you want to spend a bit more time editing the files and getting a better final audio file then the most effective way (but not quick) is to trim the audio from the end and beginning. Listen to the audio files and note the times of any periods of silence. As these normally are at the beginning and end, especially when we are recording in short segments then I will limit the instructions to avoid these becoming silly in length. Firstly clip off the end silences first, if you start with the beginning then it will change the starting position of the end silences. To remove audio from the end of a track use: ffmpeg -i file01.flac -vn -acodec copy -to 00:01:30 file01cut.flac In this example anything after 1 minute and 30 seconds will be removed. The edited audio file will then be saved as file01cut.flac. This method does not re-encode the audio so there is no loss of quality. To remove audio from the start of a track use: ffmpeg -ss 30 -i file01.flac -c copy file01cut.flac In the above example the first 30 seconds of the file will be removed and saved as file01cut.flac Once you have edited each audio file then they will need to be merged together again to make a complete show. Provide feedback on this episode.

    HPR4658: Audio Revisited

    Play Episode Listen Later Jun 10, 2026


    This show has been flagged as Clean by the host. 01 Introduction This is a follow up to my 4 part series on simple podcasting. In this episode I will discuss a number of experiments with audio filtering. These experiments were inspired by comments by listeners and by other discussions about audio on HPR. I am not an audio expert, so I am doing this partly in order to learn something, but mainly in order to have a bit of fun. I hope that you find this entertaining as well. In a comment on the first episode a listener mentioned something called Solocast and said that the method bore a resemblance to the method that I was using. Here is his comment -------------------- 02 Comment #3 posted on 2026-04-03 07:49:58 by Reto It reminds me about Solocast Hi Whiskeyjack, I really liked your podcast and the topic. I cannot remember about your last, but the sound quality of this one was good on my mobile speakers :) The concept reminded me about the program from Norrist (another host on HPR), while similar does it have some differences HPR 3496 https://hackerpublicradio.org/eps.php?id=3496 As I am not on the future feed, I look forward to your next episode. Cheers, Reto -------------------- 03 End of comment. I did not recall having heard the episode on Solocast, but this sounded very interesting. Solocast was in HPR episode 3496 and was released by norrist on the 27th of December 2021. I listened to that episode and does indeed use use the same basic concept of recording short segments of audio and combining them later instead of creating one big recording and editing it with an audio editor. 04 The main difference is that the work flow that I described involves a lot of manual steps, while Solocast is a short Python program that automates the entire process of presenting your script, recording the segments, combining the segments, and filtering and normalizing the result. I won't try to describe Solocast in detail, instead I would recommend just listening to HPR episode 3496 to get norrist's explanation directly. -------------------- 05 While I wanted to make sure that I credited norrist with having come up with this concept four years before I did, this won't be the focus of this episode. Instead I will talk about audio filtering and various experiments that I ran on several different methods. 06 While looking at the source code for Solocast I noticed that it used a filtering method that resembled one used by Jivetalk, a podcast production program that caught the attention of one of the HPR community news presenters. This method involves taking a sample of quiet audio where there is no speaking taking place, and then using this as input to a noise reduction filter which is applied to the voice recording. The filter subtracts the quiet sample from the voice audio, which should theoretically remove the ambient noise. 07 I decided to apply this method to a number of different audio test recordings which were recorded under different circumstances using different hardware. In this way I could see if the method worked equally well under all circumstances or if there were some sorts of noise which it was suited to and some sorts that were not. 08 While I was at it, I also picked several other filter methods to see how they worked as well. Potentially, some methods may be better under some conditions while other methods were better suited to others. -------------------- 09 I won't present all of my experiments, as that would be a bit dull to listen to. Instead I will describe each method and then present audio samples which illustrate my conclusions. There are two pieces of audio software involved, both of which were also used in my series on simple podcasting. 10 The first is Sox, spelled s o x , and which is short for Sound Exchange. Sox is a command line program for audio manipulation. Sox is Free Software, released under the GPLv2 or later. The other is FFMPEG, which is also a command line program. FFMPEG is also Free Software, released under the LGPL V 2.1 or later, and GPL v 2 or later. Sox actually uses FFMPEG for certain operations. -------------------- 11 Audio Hardware For recording hardware I used the following. 12 Maxwell Headset The first is a cheap Maxwell headset that has an electrical noise problem. Unfortunately I don't have a model number for this headset. I described this hardware, the noise problems that I had with it, and how I created filters to deal with the noise in my series on simple podcasting. Briefly though, this is a headset that has a build in microphone on a boom which allows the microphone to be positioned close to the mouth. It connects with a USB cable. 13 Borne Earpiece and In-line Microphone This is a set of earplugs that go in your ears and connected by wires and a very small microphone built into a small bulge in the cable. It connects using a 3.5mm jack. The model number seems to be BUD250-BL. 14 XTrike Headset This is a gaming headset similar to the Maxwell headset described above. The model number is GH-510 It uses a USB connection. 15 Yanmai Condenser Microphone This is a microphone that comes with a small tripod stand. The model number is SF-910 It uses a 3.5mm audio jack. -------------------- 16 This is not a review of the hardware. Rather, I was trying to create audio problems so that I could test ways to fix them. Therefore, do not take the above list as a recommendation of what to buy. However, you can see that I am not using any expensive audio hardware. If you want to make an HPR podcast, you do not need professional level hardware. -------------------- 17 Audio Samples The audio samples are as follows 18 Quiet This was recorded in a quiet environment at my desk. This is my normal podcasting environment and represents optimal conditions. The main reason for this method is to see how the various filter methods perform when dealing with the electrical noise from the Maxwell headset. 19 Small fan This is a small USB powered table fan approximately 10 cm in diameter. It was located roughly 40 cm or less to the left of the microphone, although this varies depending on the microphone. 20 Traffic This was along a busy street with traffic noise in the background. -------------------- 21 Filter Methods Sox noisered Filter with Audio Profile This method uses the Sox noisered filter. Here is a brief quote from the Sox documentation on this filter. Quote Reduce noise in the audio signal by profiling and filtering. This effect is moderately effective at removing consistent background noise such as hiss or hum. To use it, first run SoX with the noiseprof effect on a section of audio that ideally would contain silence but in fact contains noise - such sections are typically found at the beginning or the end of a recording. End of quote For these tests I recorded a separate noise profile to go with each test. -------------------- 22 Basic Manual Filter This is a basic high and low pass filter pair based on the work I had done in my previous series on simple podcasting. However, based on the tests that I have done for this episode, I decided to get a bit more aggressive in terms of filtering. I use a high pass filter of 120 Hz, and low pass filter of 8 kHz. The each filter is then applied twice to increase its effect. I also added band reject filters to deal specifically with 50 and 60 Hz line noise. -------------------- 23 Complex Manual Filter This uses the manually constructed filter described in my series on simple podcasting. This uses the basic manual filter plus a series of custom bandreject filters to fix specific noise problems with the Maxwell headset. -------------------- 24 FFMPEG afftdn Filter The documentation describes this as "Denoise audio samples with FFT." -------------------- 25 FFMPEG arnndn Filter The documentation describes this as "Reduce noise from speech using Recurrent Neural Networks." -------------------- 26 FFMPEG agate Filter I will pronounce this as "agate" for convenience. The documentation describes this as "A gate is mainly used to reduce lower parts of a signal. This kind of signal processing reduces disturbing noise between useful signals." -------------------- 27 Method The experimental method used was to take each noise sample and apply the different filter methods to it. Where there are parameters which can be adjusted, a script was used to generate a series of different sample files with different parameter values. Not all possible parameters were experimented with, as the goal is to see which method produces what sorts of results under different circumstances, not to get the best possible result for the samples that I happen to have. The method in each case was as follows 28 Step 1 Convert the audio file to FLAC if it is not already in that format. 29 Step 2 Apply a basic high and low pass filter described previously to each sample. The reason for this basic filtering is that it eliminates at least some undesired noise in a fairly fool proof manner, leaving less for the more advanced filter to deal with. This should allow for a better test of the filter under realistic conditions. 30 Step 3 Apply the noise reduction filter being tested. 31 Step 4 Normalize the filtered sample to 17 LUFS according to the EBU R128 standard. The EBU standard is described in my series on simple podcasting. Normalizing adjusts the audio signal to a desired loudness level. This allows for more more consistent sound levels and allows us to hear the results under realistic conditions. I normalize the audio individually for each sample as different recording hardware requires different amounts of loudness adjustment. This is different from the typical podcast process where normalizing takes place as the very last step in the process, but it was necessary in this case. 32 Step 5 Concatenate selected sample audio files to one another to allow for better review and comparing. -------------------- 33 Results The results are grouped according to the type of noise which is being mitigated. This allows for easier comparison of the effectiveness of each technique under different circumstances. I have only picked a few examples of interest out of the numerous experiments that I conducted. -------------------- 34 Quiet Recording Environment with Maxwell Headset This compares how well the various filtering methods work on the noise induced by the electronics in the Maxwell headset. This electronic noise consisted of a noise spike every 1 kHz. This should be representative of electronic noise caused by problems in recording hardware. 35 Manual Filter The manual filter applied a narrow band reject filter every 1 kHz from 1 kHz to 12 kHz. This completely removed the otherwise audible whine caused by the noise. 36 FFMPEG afftdn This method allows for setting a noise floor and then specifying how much the noise floor should be reduced by. The method is very sensitive to getting the noise floor correct for that recording. Set the floor too low and nothing happens. Set it too high, and some distortion results. However it seemed to be moderately effective, but it would seem to require checking it and possibly adjusting it each time it is used. 37 FFMPEG agate This method allows setting a noise floor and then suppressing all sound which falls below that level. This method is very sensitive to getting the noise floor correct for that recording. If set too low (or quiet), it is ineffective. If set too high (or loud), it distorts words which come after a pause, which would typically be between sentences. 38 When set correctly, it completely removes noise in the silences between sentences. However, the noise is still audible during speech. This is because the noise in this case is a higher frequency than normal speech, and so stands out more. It may not be a significant problem for noise which is closer to the main vocal frequency band. Overall, this method is not suitable for this particular problem. 39 FFMPEG arnndn This method used the standard model. A variety of different noise reduction models are available. I only tested it with one, std.rnnn It does not seem to introduce much distortion in the voice signal even with a high amount of mix parameter. 40 However, it is only slightly effective at removing the whine from the signal, even with a high amount of mix parameter. Overall, this method does not appear to be useful for this sort of noise problem. 41 Sox noisered Filter This was effective in removing noise between words, but noise can be heard while words are being spoken. It was better than agate however. 42 Overall Conclusion for the Maxwell Headset Noise When dealing with narrow noise bands that occur at known frequencies, the manual filter is leagues ahead of any of the other tested alternatives. 43 Sample Audio Here is a sample audio recording showing the best overall results The sample is repeated, first with only basic low and high pass filtering, and then with the manually constructed filtering. In the first sample you should hear a high pitched background whine. In the second sample, the high pitched whine is completely removed. 44 (Audio sample inserted here.) -------------------- 45 Traffic Noise This was recorded using the Borne in-line microphone connected to a mobile phone while walking along beside a busy street. This was in dry cool spring weather, and the road was paved with asphalt. This should be reasonably representative of podcasting while walking outdoors in a noisy environment. 46 Basic Manual Filter This used the basic manual filter with high and low pass filters. This did nothing very useful in this case as the signal was already filtered within those limits by the recording hardware anyway. The low sample rate of 8 kHz in the phone limited the upper frequency to 4 kHz. Recall that the sample rate has to be twice the highest frequency that you want to detect. Overall, this is not suitable for this sort of problem. 47 FFMPEG afftdn With a high noise floor, background noise is reduced, but not eliminated. There was not much distortion in the voice. This is only slightly useful for this sort of problem. 48 FFMPEG agate With a high threshhold, background noise is reduced, but not eliminated. There was some distortion in the voice. The background noise could also be heard when speaking, but because the frequency of the background signal was similar to the louder voice signal, it was not as noticeable as it would have been if the two were very different. This is moderately useful for this sort of problem. It may be more useful in situations where the background noise was not quite as loud. 49 FFMPEG arnndn With high amounts of noise reduction, much of the background noise is suppressed, but there is not a lot of distortion in the voice. The background traffic noise is still present, but is significantly less. This offers only a moderate improvement. 50 Sox noisered Filter With small amounts of noise reduction voice is clear but traffic noise is present as a very significant continuous warbling sound in the background. This is no improvement on the original and in fact could be seen as making it worse. With moderate amounts of noise reduction, traffic noise is mostly gone, but there are still various squeaks present. Voice is noticeably distorted. With large amounts of noise reduction, traffic noise is gone but voice is highly distorted. This is moderately useful for this sort of problem, but requires careful adjustment. 51 FFMPEG arnndn Followed by FFMPEG agate This combined two different filters. First, it used arnndn to suppress the background noise to a lower level without much voice distortion. Then it applied the agate filter to suppress the noise levels between words still further. This used the same amount of mix and threshold as was found to be most effective when each of these filters was used on its own. The background noise is almost completely gone while distortion of the voice signal is low. 52 Overall Conclusion for Traffic Noise The arnndn combined with agate filters was the most successful at suppressing background noise while limiting the amount of voice signal distortion. 53 Sample Audio Here is an audio sample for what I felt to be the best overall results, the arnndn filter combined with the agate filter. First is the original audio with basic filtering. This is followed with the same audio after being passed through the arnndn and agate filters. 54 (Insert arnndn plus agate audio sample here) 55 Another Sample Here is a second audio sample showing the Sox noisered profile based filter. I have included this to show how a profile based filter can make things worse if you are not careful how you use it. This repeats the test audio 4 times. The first is with basic filtering only. The second uses low amounts of noise reduction. The third uses moderate amounts of noise reduction. The fourth uses high amounts of noise reduction. 56 (Insert noisered audio sample here) -------------------- 57 Small Fan Noise with Yanmai Microphone This was recorded using the Yanmai condenser microphone. A small fan was set up behind and to the left of the microphone. This is intended to represent situations where someone may have a fan or air conditioner running in the background due to hot weather, or has a loud computer fan. 58 A condenser microphone was used for this test as they are more prone to picking up unwanted noise. However, for practical recording purposes, this sort of microphone is unsuitable for this type of environment. 59 Basic Manual Filter This used the basic manual filter with high and low pass filters. This did nothing useful as the fan noise was in the same frequency range as the voice signal. This may be of more help in cases where the noise is below the 120 Hz cut off used in the low pass filter. 60 FFMPEG afftdn With high amounts of noise reduction, much of the background noise is suppressed, but there is some distortion in the voice. The background fan noise is still present, but is significantly less. Overall this is moderately effective. 61 FFMPEG agate This was effective in removing noise between words, but noise can be heard while words are being spoken. However, this was a small voice sample and it is possible that more problems could occur. With less fan noise than was in this sample this technique may work much better. 62 FFMPEG arnndn With high amounts of noise reduction, much of the background noise is suppressed, but there is not a lot of distortion in the voice. The background fan noise is still present, but is significantly less. Overall this was fairly effective. 63 Sox noisered Filter With small amounts of noise reduction voice is clear but fan noise is present as a slight warbling sound in the background. With moderate amounts of noise reduction, fan noise is gone, but voice is somewhat distorted. With large amounts of noise reduction, fan noise is gone but voice is very distorted. 64 In general this method is fairly successful at dealing with this sort of problem. However, there is a trade off between background noise and voice quality. Getting that trade off correct takes experiment and judgment for each specific situation. 65 FFMPEG arnndn Followed by FFMPEG agate This combined two different filters. First, it used arnndn to suppress the background noise to a lower level without much voice distortion. Then it applied the agate filter to suppress the noise levels between words still further. This got rid of virtually all of the background noise between words. If you listen carefully however, there is a slight buzzing sound in the voice signal. 66 Overall Conclusion for Fan Noise with Yanmai Microphone. Of the methods tested, the arnndn followed by agate filter seemed to offer the most improvement for the least effort and least voice distortion. The arnndn filter on its own seemed the next most preferable to me despite leaving some fan noise in the background. 67 Audio Sample Here is an audio sample for what I felt to be the best overall results, the arnndn filter combined with the agate filter. First is the original audio with basic filtering. This is followed with the same audio after being passed through the arnndn and agate filters. 68 (Insert audio sample here) -------------------- 69 Small Fan Noise Recorded with Headset The following is an observation rather than a filtering technique. When a recording was made using the Maxwell headset and listened to on the headset later or with speakers, the fan was virtually inaudible. When the same recording was listened to with the XTrike headset, it was barely audible with careful listening and only identifiable as a fan because I knew it was there. 70 In situations where there is ambient noise, the best noise reduction technique is probably to move the microphone as close to your mouth as possible, although not directly in front of it, and reduce the gain if there is a gain adjustment in the microphone. This will work far better than trying to remove the noise later. If you are recording an HPR episode at a desk, then an inexpensive headset with boom mike may do the job just fine with minimal effort and expense. -------------------- 71 Conclusions I have tested three noise scenarios - Electronic noise in the audio hardware at specific frequencies. Recording outdoors with an inline microphone in a noisy traffic environment. A noisy fan creating background noise in an office. My conclusions on these are as follows. 72 Electronic Noise in the Audio Hardware at Specific Frequencies If you can use Audacity or some other means to find the frequencies which are causing the noise, the best solution, assuming you don't just replace the hardware, is to manually construct filters to remove those specific frequencies. This is the safest solution in terms of only doing what you tell it to and not producing unexpected surprises some time down the road when something changed in the environment. 73 If you are looking for a fairly automatic filtering method, the Sox noisered profile based filter seems to work fairly well. There is an equivalent filter in ffmpeg, but I did not include that in my experiments as it is harder to use in a script because it does not use a separate noise profile file. 74 Recording Outdoors with an Inline Microphone in a Noisy Traffic Environment. In this situation, the FFMPEG arnndn combined with agate filters seem to be the most successful. The Sox noisered filter may work, but at the cost of more distortion in the voice than is seen in the other methods. 75 An inherent problem with any profile based noise reduction method is that if the background noise is not constant, which it seldom is in that sort of environment, the profile may not represent the background noise which is present later on in the recording. This risks adding more distortion in the voice as the profile and later environments diverge. 76 However, for this application a different microphone that provided a better recording would appear to be advisable. A solution which brought the microphone much closer to the mouth and so resulted in a better ratio of voice signal compared to background noise would appear to be necessary, after which the question of what sort of noise reduction to use would need to be re-evaluated. 77 A Noisy Fan Creating Background Noise in an Office. The Sox noisered filter and the FFMPEG arnndn, afftdn, and agate methods all work to some degree. However, they all need correct selection of parameters to achieve the proper results. When I compared all four methods side by side, I found the arnndn combined with the agate filter to be preferable in terms of the trade off between background noise reduction and distortion of the voice signal. The arnndn filter on its own seemed the next most preferable to me despite leaving some fan noise in the background. 78 However, that is a subjective judgment of a specific noise sample when recorded using a specific microphone. Keep in mind though that many listeners will not be listening in an idea environment. They may be doing things where background noise is present rather than in a very quiet room and so may find a small amount of background noise in the recording to be less of a problem than distortion in the voice signal which may make some words harder to understand. 79 When I conducted the same experiment recorded with the XTrike headset I found that arnndn seemed to offer no noticeable improvement. This may be because the amount of audible fan noise was far less with the XTrike headset to begin with. In other words, there is no single best solution here, and you may have to be prepared to try different options to see which one works in your situation. The important thing is to avoid making things worse by applying filtering that is not appropriate for that situation. The best method may be to use a recording method that doesn't pick up the fan noise to begin with. This can include just using a gaming headset with boom mic. 80 I have one final observation on this point regarding headsets. The Maxwell headset has a foam cover over the microphone while the XTrike headset does not. There was some slight audible wind buffeting noise picked up by the XTrike headset that was not observed with the Maxwell. This seemed to cause particular problems with the Sox noisered profile based filter, as this noise was irregular and after filtering would show up as a warbling sound. If you use a headset and plan to use it in conjunction with a fan, it may be advisable to apply some sort of wind cover over it. 81 Combining Complex Filters In several cases I found that combining several complex filters offered better results than using any single one on its own. The basic strategy though is to first use a method which is good at reducing undesirable noise without introducing excessive voice distortion. Then apply a different filter which is good at reducing small levels of background noise to an even lower level while affecting the voice signal as little as possible. This uses the relative strengths of different filter types to compensate for the weaknesses of the other. 82 Different combinations of filters were most effective for different types of problems. I did not try all possible combinations however. Perhaps a further exploration of this would be worth doing in a later podcast. -------------------- 83 Case Study - Noise in Another HPR Episode Audio In the comments to my second episode on Simple Podcasting (which is HPR4618) where I discussed basic filtering, a couple of listeners brought up an interesting point. Antoine mentioned "declicking" in a post. -------------------- Vance replied 84 Antoine, thanks for mentioning the click removal capability in Audacity! While I already knew about its noise removal filter, I wasn't aware it also had click removal. It might have helped me for HPR4637, where some sort of electromagnetic signal was picked up by my microphone/recorder, a Zoom H2 (the tapping sound was *not* present in the room where I recorded). While click removal does seem to distort speech when applied to it (though to my ears, it doesn't sound as weird as when noise removal is done with speech), I could have applied the filter only to the pauses, where the "tapping" is most noticeable. I will consider doing this in the event that I'm not able to eliminate the source of interference in the future, which would be the best way to go. -------------------- 85 End of quote. I found this interesting as it sounded like another audio problem that could be experimented with. I found a sample of the episode which had the clicks and cut a copy of that segment out to experiment with. These sounds are a series of clicks, or "ticks" would be another way to describe them, in the quiet part of the audio between sentences or phrases. 86 Next I used Audacity to study the sound spectrum. I found a massive 60 Hz noise spike. However, my speakers won't reproduce sound that low, and filtering this out didn't reduce the clicks. The clicks turned out to be bursts of noise across the 100 to 800 Hz band, which is right where the main vocal band also is. This makes it difficult to filter based on frequency. The most promising approach would seem to be to filter based on sound level. 87 I tried all of the individual audio filter techniques mentioned in the other experiments above. None produced satisfactory results except for agate, which makes quiet audio quieter. This completely suppressed the clicks. However, when applied to the entire episode it also distorted the start of a few sentences which began with single short syllables. 88 The agate filter has a number of parameters which could be adjusted to try to deal with these cases, although I did not spend the time to do so. Another solution to this distortion problem is to simply not apply the filter to those parts of the audio which are affected. If you record the audio as a series of small individual files, it would be easy enough to filter before concatenating the files together while skipping those files which contain audio which is not suited to this method. Here are the results of the experiments. 89 FFMPEG afftdn This reduces the size of of the ticks, but they are still present. However, they may be reduced to a level which is considered acceptable. 90 FFMPEG agate This was very effective in removing ticks with the right parameters. However, it can introduce some voice distortion in the form of cutting out the start of a few sentences which began with single short syllables. This can be corrected with a very short "attack" parameter to turn off the filter when it detects sound above a set threshhold. 91 FFMPEG arnndn This was relatively ineffective. 92 Sox noisered This was effective in removing the sounds between phrases. However, it introduces some distortion in the voice signal. 93 I also tried combining filters. FFMPEG afftdn Followed by agate This combined two different filters. First, it used afftdn to suppress the background noise to a lower level without much voice distortion. Then it applied the agate filter to suppress the noise levels between words still further. This got rid of virtually all of the background noise between words. 94 Here is a short audio sample from HPR4637. First is the unfiltered audio. Second is the filtered audio using the combined afftdn plus agate filters. Since the "clicks" are very quiet, you may not hear them unless you are in quiet environment. Quite a few listeners would probably not be aware of the perceived audio problem in this episode if it had not been discussed here. None the less, it makes for an interesting experiment. Here it is: 95 (Insert sample audio here) 96 Overall Conclusion for Noise "Ticks" The afftdn combined with agate filters seemed to offer the best overall results when used with the right parameters. However, the author, Vance, speaks very clearly and evenly, and so his voice is ideally suited for use with this filter. Another author's voice may not be as suited to this filter. 97 The Sox noisered profile based filter offers various degrees of trade off between suppressing noise and distorting the voice signal. As to whether this is an acceptable trade off depends on the particular voice in question and how easily understood it is under normal circumstances with out additional distortion. The afftdn filter may be a fairly safe filter to use on its own while producing acceptable if not perfect output. -------------------- 98 Overall Conclusions I have presented only a few of the experiments that I conducted. My overall conclusion after all of this is that there is no universal audio filtering method that works best in all circumstances. There are instead a number of tools in the toolbox, and picking the right one for the job takes a bit of trial and error. 99 However, if you have a repeatable recording environment, then once you have decided what tool you need you should create a script for it so you can have a repeatable processing setup. These conclusions apply to voice podcasting. Music has a different set of criteria and techniques that work well with basic voice podcasting may produce poor results when applied to music which has a broader range of frequency and just as importantly, a broad range of loudness. 100 If you are used to using filters and effects in Audacity, many of the settings on those correspond to arguments in the command line version of ffmpeg. It is worth learning how to use ffmpeg directly to automate your recording process. 101 The experiments that I conducted were greatly assisted by writing scripts which created multiple versions of audio files with different settings, thereby allowing me to try many different alternatives relatively easily. It also allowed me to concatenate different audio samples into a single audio file and so listen to different versions in quick succession, making subjective listening judgments more reliable. 102 It is important to keep in mind in all this that I am playing with audio filtering mainly to have fun. It is not necessary to do any of this if you think your podcast episode sounds just fine without it. So, don't let any of what I have talked about in all this discourage you from simply recording a podcast and sending it in as is. I will include copies of the filters I have described here in the show notes. -------------------- 103 Related Matters Hardware Characterization Using Audio Signals I found it useful to characterize the hardware that I had in order to understand its limitations better before starting the experiments. This involved playing a signal out through a set of speakers and then recording it through a microphone. 104 I used two types of signal for this. One is type of signal is known as a "chirp" signal. This is a sine wave that steadily increases in frequency as it sweeps across the audio spectrum. The standard audio range is 20 Hz to 20 kHz, but for my purposes I limited the upper frequency to 15 kHz to save time as anything beyond that is not very useful for voice podcasts. 105 By recording the chirp signal with a microphone and analyzing it with a Fourier transform, I could quickly see what each device was capable of. See my previous series on simple podcasting for an explanation of what a Fourier transform is and what software to use to see the results of it. Here is a chirp signal. 106 (Insert Audio Sample Here) 107 In addition to a chirp signal, I also used a series of simple tones of specific frequencies. By using these tones of known frequency I could gain an understanding of the limitations of my speakers and headphones, and just as importantly, my own ears. By understanding these limitations I was able to narrow the range of frequencies that I need to deal with quite considerably and set the high and low pass filters accordingly. These tones are a series of flac files generated with ffmpeg. 108 Here is a a sample audio tone at a 2 kHz frequency. 109 (Insert Audio Sample Here) 110 Copies of the script to create the chirp signal and the tones are in the show notes. -------------------- 111 A "Not a Review" of some of the Hardware that I Used I said that I would not do a review of the hardware that I used. However, some of it deserves mention for either how good or bad it was. I will record each section using the hardware being described. 112 Maxwell Headset This is my original recording hardware. This is a headset with boom mic and USB connection. There is no model number on it, so I don't know the model. This probably cost somewhere between 10 and 25 dollars. The earpieces sit on the ears and do not fully enclose them. This makes it light weight and comfortable to wear for extended periods of time. It has a problem however with electronic noise consisting of a noise spike every 1 kHz. I was able to fix this with a series of filters using FFMPEG. Fixing this problem is what got me started in understanding audio. I will probably continue to use this headset to make podcasts. 113 XTrike Headset, Model GH-510 This is also a headset with boom mic and USB connection. I purchased this headset for the purposes of experimentation for this podcast episode. It cost $12.88. I found it to be surprisingly good for the price. It has fully enclosed ear pieces however, which may make it uncomfortable to wear in hot weather. I may try doing some of my future podcasting using this headset. 114 Borne Earpiece and In-line Microphone This is a set of earplugs that go in your ears and connected by wires and a very small microphone built into a small bulge in the cable. It connects using a 3.5mm jack. The model number seems to be BUD250-BL. It cost approximately $3.00. I bought several sets of these and use them for listening to podcasts from an MP3 player. The ear pieces are pretty good for listening with. The microphone works reasonably well when used in a quiet location. It is less good when in a noisy environment. It is very important however to secure the microphone to your lapel or other location reasonably near your mouth and to point the microphone (that is the small hole) outwards and not simply let it dangle freely. If you let it just hang, you will get poor quality and inconsistent audio. 115 Yanmai Condenser Microphone, Model SF-910 I purchased this microphone for the purposes of experimentation for this podcast episode. It cost $3.88. As it is a condenser microphone, it is prone to picking up background noise more and as such is probably not a good choice for podcasting by single person sitting at a desk. However, it is none the less a surprisingly good microphone for surprisingly little money. 116 iCan USB Microphone, Model M-306 I purchased this microphone for the purposes of experimentation for this podcast episode. This has a USB connection. This was also relatively inexpensive at $7.99, or roughly twice the price of the Yanmai microphone. Unlike the Yanmai however, it is absolutely wretched. There was such a high degree of distortion when recording through it that I found I could not use it in the fan experiments which I had bought it for. I ended up buying the Yanmai microphone for that instead. -------------------- 117 Easy Effects Software The techniques described so far all involve recording audio files and then processing them later to produce the desired result. This is probably the simplest and most straightforward way of doing things if you are making a typical podcast. However, there may be instances where you want to apply filtering or other effects on the "live" signal immediately and not after the fact. 118 There is audio software which can hook into your computer's audio system and do this with a live signal. For Linux, there is a package called "Easy Effects". This is Free Software and comes under a GPL V3 or later license. I installed it from the Debian repository under Ubuntu 24.04. 119 You can create various filters and even chain them together to combine them. I played with it a bit but do not know enough about it to discuss it seriously at this time. However, I thought it would be worth mentioning for the sake of those who may wish to try it out themselves. -------------------- 120 Episode Conclusion After having had some fun with audio and listening to other HPR members talk about audio, I thought I would have some more fun by playing with noise reduction filters. I have no intention of becoming an audio professional, but by doing some experiments I learned a few things and had some fun doing it. I hope that the rest of you found this interest as well. I will see you all again later in another episode of Hacker Public Radio. -------------------- Scripts Basic Filter This shows basic high and low pass filters ( 120 Hz and 8 kHz respectively) and band reject filters for 50 and 60 Hz. # The high and low pass filters. hlpfil="highpass=f=120, highpass=f=120, lowpass=f=8000, lowpass=f=8000" # Band reject filters filter for 60Hz and another for 50Hz. linefil="bandreject=f=60:width_type=h:w=20, bandreject=f=50:width_type=h:w=20" # Filter using ffmpeg. ffmpeg -i inputfile.flac -af "$hlpfil, $linefil" outputname.flac # ====================================================================== afftdn Filter # noisefloor should be between 20 and 80. noisefloor=$1 # Run the noise reduction. ffmpeg -i testrec-filtered.flac -af "afftdn=nr=10:nf=-""$noisefloor" tmptestrec.flac # ====================================================================== agate Filter # threshold shoud be between 10 and 80. threshold=$1 # Run the noise reduction. ffmpeg -i testrec-filtered.flac -af "agate=threshold=-"$threshold"dB:range=-60dB" tmptestrec.flac # ====================================================================== arnndn Filter # mix should be between 0 and 1. mix=$1 # Run the noise reduction. ffmpeg -i testrec-filtered.flac -af 'arnndn=model=std.rnnn:mix='"$mix" tmptestrec.flac # ====================================================================== sox noisered Filter # Generate the noise profile from a sample of background noise. sox silencefiltered.flac -n noiseprof noise.prof # nramount shoudl be between 0 and 1 sox testrec-filtered.flac noiseout-testrec.flac noisered noise.prof "$nramount" # ====================================================================== Manual Filter for Maxwell Headset Noise # Create a series of band reject filters, from 1 kHz to 11 kHz. ftemplate="bandreject=f=%s000:width_type=h:w=100" kilospikefil=$( seq 1 11 | xargs printf "$ftemplate," ) # Using ffmpeg ffmpeg -i testrec-filtered.flac -af "$kilospikefil" tmptestrec.flac # ====================================================================== Create a "chirp" signal # Start frequency. f0=20 # End frequency. f1=15000 # Duration of signal. duration=10 ffmpeg -f lavfi -i "aevalsrc=sin(2 * PI * (0.5 * ($f1 - $f0)/$duration * t^2 + ($f0 * t))):s=44100:d=$duration" -c:a flac -af "aformat=sample_fmts=s16" chirp.flac # ====================================================================== Generate Audio Tones toneout () { printf -v freqval "%05d" $1 ffmpeg -f lavfi -i "sine=frequency=$freqval:duration=3" tmptone.flac # Normalize ffmpeg -i tmptone.flac -af loudnorm=I=-17:TP=-2.0:LRA=4.0 -ar 44.1k -sample_fmt s16 tone$freqval.flac rm tmptone.flac } # List of frequencies in hertz. freqlist="50 60 100 120 130 140 150 160 170 200 500 1000 2000 3000 4000 5000 6000 7000 8000 9000" for freq in $( echo $freqlist ); do toneout $freq done # ====================================================================== Provide feedback on this episode.

    HPR4657: UNIX Curio #8 - Comparing Files

    Play Episode Listen Later Jun 9, 2026


    This show has been flagged as Clean by the host. This series is dedicated to exploring little-known—and occasionally useful—trinkets lurking in the dusty corners of UNIX-like operating systems. Most users of UNIX-like systems are probably familiar with the diff utility. It is widely used with source code to compare two files and see what the differences are between them. Non-programmers, like me, also use it to examine what has changed in different versions of scripts or configuration files. Quite a few pieces of newer software can compare different versions of data and express changes in a format either identical to or similar to diff output. However, there are two other long-standing tools for this purpose that are far less known and deserve in my view to be termed UNIX Curios. The first of these is cmp 1 . While diff is primarily intended to be used on text files and compares them line by line, cmp compares files byte by byte. In my experience, its main use is to see whether two binary files are in fact identical—if they are, cmp outputs nothing and returns an exit status of 0. Back when methods of transferring files were not as reliable as they are today, this was a tool I would reach for sometimes. For example, you could use it to confirm that the data on a CD-ROM you burned was the same as the original. If there is a difference between the files, cmp will return an exit status of 1. By default, it will also print the location (byte and line number) of the first differing byte. When used with the -l option, it will print the location and value of every byte that differs. There is one exception to these: if the files are the same except that one is shorter than the other, it will print a message to that effect. The exit status will still be 1 in that case. Using the -s option with cmp will cause it to be totally silent and output nothing. Only the exit status will indicate whether the files are the same, different, or if the exit status is greater than 1, that an error occurred. This makes it useful for scripting, for example in case you wanted to confirm that a file copied to another location arrived fully intact. It is worth noting that diff is also capable of comparing binary files—however, it is not required by POSIX to report what is actually different or where differences occur. The same exit status as in cmp is returned: 0 if the files are the same, 1 if they are different, or greater than 1 if an error occurred. While many implementations offer an option to suppress the output, this is not in the standard 2 so the most portable method would be to instead redirect output to /dev/null . On my system the diff utility is three times the size of cmp , so if you don't need its extra capabilities, it is a less efficient way of doing the job. The other UNIX Curio for today is comm , and this utility 3 is also intended to compare two files to see what is common between them. Ken Fallon briefly talked about it a few years ago in HPR episode 3889 . Compared to the others, it has a much more specific use case. The two files are expected to be text files that are already sorted. What comm will do is print a tab-separated list of all the lines appearing in either or both files. Lines only in the first file will appear in the first column, lines only in the second file will be in the second column, and lines in both files will be in the third column. Any combination of the options -1 , -2 , and -3 can be used with comm to suppress printing of the first, second, or third column respectively. Using all three options at the same time is supported but it results in no output, so that isn't very useful. Unlike the other utilities, the exit status of comm doesn't tell you anything about the two files. It will be 0 if the program ran successfully, and greater than 0 if it didn't. I'm not sure if I have ever actually used comm for anything practical. I find its default output a bit difficult to meaningfully interpret, plus you need to ensure the two files are already sorted. It seems to be best suited to comparing lists, and one use case that Ken Fallon mentioned would be comparing two lists of files to see if any are missing. The command comm -3 listA listB would print files that only appear in listA in the first column and those only in listB in the second column. This would let you ignore all the filenames that appear in both and focus on those that were absent from one or the other. If on the other hand you only wanted to see the filenames that are on both lists, comm -12 listA listB would give you that. Some more frivolous potential uses also come to mind. If for some reason the cat utility is broken on your system, you could use comm listA /dev/null to print the file listA instead. If you want to insert tab characters before every line of a file but have an aversion to using sed or awk , then comm /dev/null listA would output listA with one tab before each line, and comm listA listA would insert two tabs. A bit silly, but it would work. The GNU implementation of comm even lets you choose something other than a tab to separate the columns 4 , so you could go wild with that. According to the POSIX specifications for cmp and comm , one of the two filenames given as arguments, but not both, can be a " - ", in which case standard input will be used for that "file" in the comparison. Also, the results are undefined if both arguments are the same FIFO special, character special, or block special file. Some implementations might not have these limitations, but you shouldn't rely on that everywhere. All three of these were developed quite early. The cmp utility appeared in 1971's First Edition UNIX 5 , while comm and diff seem to have made their debut in Fourth Edition UNIX 6,7 from 1973. The original versions might not have behaved exactly like their modern counterparts, and newer implementations (especially of the diff utility) have acquired additional options and capabilities, but the basic operation of each has stayed the same. The next time you need to compare files against each other, consider whether cmp or comm might be appropriate before automatically reaching for diff . They all have their uses in different situations. References: Cmp specification https://pubs.opengroup.org/onlinepubs/009695399/utilities/cmp.html Diff specification https://pubs.opengroup.org/onlinepubs/009695399/utilities/diff.html Comm specification https://pubs.opengroup.org/onlinepubs/009695399/utilities/comm.html GNU coreutils manual: comm https://www.gnu.org/software/coreutils/manual/html_node/comm-invocation.html First Edition UNIX cmp manual page http://man.cat-v.org/unix-1st/1/cmp Fourth Edition UNIX comm manual page https://www.tuhs.org/cgi-bin/utree.pl?file=V4/usr/man/man1/comm.1 Fourth Edition UNIX diff source https://www.tuhs.org/cgi-bin/utree.pl?file=V4/usr/source/s1/diff1.c Provide feedback on this episode.

    HPR4656: My review of musicozy sleep/exercise bluetooth headband

    Play Episode Listen Later Jun 8, 2026


    This show has been flagged as Clean by the host. Sound quality, ease of use, comfort, battery life, price https://themusicozy.com/products/headband/index.htmlProvide feedback on this episode.

    HPR4655: Tips for Glasses

    Play Episode Listen Later Jun 5, 2026


    This show has been flagged as Clean by the host. HPR and Glasses HPR community members are nerds We know from movies that nerds wear glasses We can conclude that HPR community members wear glasses Cleaning Background I have very oily skin and am constantly smudging my glasses All lenses wipes are too small. I accidentally touch the lenses with my fingers when I am trying to clean them And smudge them up again I heard an eye doctor say, the best way to clean glasses is with dish soap and dry with a microfiber cloth I tried this method It is a great solution because you wash glasses and fingers tips at the same time Cleaning Method Hand soap is OK to use on glasses. get the soap on you fingertips Then hold your glasses one of the lenses Use your thumb and finger tips to clean the glasses the soap removes the excess oil from your fingertips no smudges when you dry with the microfiber cloth Progressives With regular progressives the top of the lenses is for distance vision and the bottom of the lenses is for up close vision There is a zone in the middle for medium distance, but it is very narrow Using a computer at work I kept having to move my head up and down to find the best position for working. Computer Glasses have more space for intermediate distances From https://iotlenses.com/blog/eight-types-of-progressive-lenses.html Computer progressive lenses, also known as occupational designs or enhanced readers, are optimized for intermediate and near vision, making them ideal for tasks like prolonged computer work or activities at mid-range distance Provide feedback on this episode.

    HPR4654: What's in my component Box?

    Play Episode Listen Later Jun 4, 2026


    This show has been flagged as Explicit by the host. Background This episode describes the contents of an old fishing tackle box I got as a birthday present very many years ago. I used it over the years to gather a pile of mostly useless electronic components and junk. I came across it recently when we were doing a clear out. Mrs X wanted to throw it out. I had a lot of sentimental value due to the long time I've had it. I am a bit of a hoarder and it took a bit of persuasion on my part to be able to keep it especially since I could not think of a single use for any of the contents! I've not had time to add links against all the items. Hopefully I've managed to add links to most of the more unusual items. Apologies if I've missed any. Contents of Box Top row left to right, back to front Compartment 1 Stereo Jack plug & socket Double pole double throw (2-way) switch 12V dc relay from RS 3 legged semiconductor (voltage regulator?) Compartment 2 Multiple fuses mostly for cars Compartment 3 Small silica jelly pouch Micro Switch Reed switches (Not reed relays as I call them in my show) Compartment 4 Potentiometers, Rheostat, variable resistors https://en.wikipedia.org/wiki/Potentiometer Control knobs Compartment 5 Large selection of miniature panel mounted toggle switches https://en.wikipedia.org/wiki/Switch#Toggle_switch Compartment 6 Two crocodile clips https://en.wikipedia.org/wiki/Crocodile_clip Half of a Hi Fi speaker plug https://en.wikipedia.org/wiki/File:Speaker_din_male_and_female.jpg Washer Compartment 7 Mostly chocolate block connectors https://en.wikipedia.org/wiki/File:Leuchterklemme_75dpi.jpg Small selection of glass cartridge Fuses Single 13 Amp mains fuse for UK plug Assortment of soldering iron tips Crocodile clip Air adapter for foot pump for blowing up an air bed or similar Spare nozzle for a de-soldering tool. Made from PTFE https://en.wikipedia.org/wiki/Desoldering#/media/File:Vacuum_plunge.jpg https://en.wikipedia.org/wiki/Polytetrafluoroethylene Ferrite ring https://en.wikipedia.org/wiki/Ferrite_bead Compartment 8 Rubber Grommets and a heatsink Middle row left to right, back to front Compartment 1 Large selection of glass cartridge fuses Compartment 2 Another large selection of glass cartridge fuses Small selection of diodes, some quite Large https://en.wikipedia.org/wiki/Diode Compartment 3 Two multi turn precision variable resistors https://en.wikipedia.org/wiki/Potentiometer#/media/File:Beckman_Helipot_potentiometer_SA1400A_2007.075.002.jpg Cheap variable resistor with in built switch Compartment 4 Bag of multi coloured LED's (Cheap for Pi add on board) 2 inch 8 ohm speaker Compartment 5 Panel mounted heavy duty toggle switch, two pole one way Compartment 6 Light Dependent Resistor (LDR) https://en.wikipedia.org/wiki/Photoresistor Large Tricolour LED Compartment 7 Variable capacitors PCB (Printed Circuit board) mounted Spare nozzle for de-soldering tool. Made from PTFE Light Dependent Resistor (LDR) Panel mounted heavy duty rotary switch, two pole one way Bag of various fuses Halogen 12V car headlight bulb Variable resistor with long plastic spindle, panel mount Heatsink possibly for heavy duty transistor Compartment 8 Variable resistor PCB (Printed circuit board) mounted Bottom row This is just a big jumble of stuff, listed in no particular order DC red and black power lead with inbuilt fuse Small solder-less breadboard for prototyping https://en.wikipedia.org/wiki/Breadboard Bag of various plugs & connectors mostly Jack plugs and sockets Bag of quartz crystals and a components receipt from 1985 I added crystals to an old PMR (Private mobile radio) boot mount radio. Possible a Pye Westminster Radio. I looked but couldn't find picture of the radio Several bits of Perfboard or strip board https://en.wikipedia.org/wiki/Perfboard 1 Watt audio amplifier kit with instructions not built! D-type serial port mounted to PCB with screw down connections Bag of resistors https://en.wikipedia.org/wiki/Resistor Large bag of LED panel mount holders Electronic Instruction guide XH79L (Maplin) price 25p Chocolate block connecting block https://en.wikipedia.org/wiki/File:Leuchterklemme_75dpi.jpg Telephone pickup for recording phone calls. (Never worked) https://www.amazon.co.uk/Black-Telephone-Pickup-Sensitive-Microphone/dp/B000L1OZG8 Multi coloured ribbon cable Plastic trimming tool screwdriver set. https://www.amazon.co.uk/C-K-T4857-Precision-Plastic-Trimmer/dp/B000WKIYTW Panel mounted BNC socket (Baby Neill Constant) https://en.wikipedia.org/wiki/BNC_connector Provide feedback on this episode.

    HPR4653: Starting the Habit of Reading

    Play Episode Listen Later Jun 3, 2026


    This show has been flagged as Clean by the host. Openreads is a privacy oriented and open source cross-platform app written in Flutter available for Android and iOS for keeping track of your books. There are four lists provided so you won't get confused: books you finished, books you are currently reading, books you want to read later, books you didn't finish. You can use custom tags and filter through them. A book can be added by: looking it up in the Open Library database, scanning its barcode, adding its details manually. You can also view some cool statistics! Links: Battletech: Mercenary's Star by William H. Keith Permaculture for the Rest of Us by Jenni Blackmore Piranesi by Susanna Clarke Battletech: The Price of Glory by William H. Keith The Urban Homestead by Kelly Coyne Battletech: The Sword and the Dagger by Ardath Mayhar Battletch: Warrior En Garde by Michal A. Stackpole Sisterhood of Dune by Brian Herbert and Kevin J. Anderson Fundamentals of the Wudang Sword Method by Scott M. Rodell Battletech: Warrior Riposte by Michal A. Stackpole The Cardio Code by Kenneth Jay Mentats of Dune by Brian Herbert and Kevin J. Anderson How to Grow More Vegtables by John Jeavons Provide feedback on this episode.

    HPR4652: simon says

    Play Episode Listen Later Jun 2, 2026


    This show has been flagged as Clean by the host. From https://en.wikipedia.org/wiki/Simon_(game) Simon is an electronic game of short-term memory skill invented by Ralph H. Baer and Howard J. Morrison, working for toy design firm Marvin Glass and Associates, with software programming by Lenny Cope. The device creates a series of tones and lights and requires a user to repeat the sequence. If the user succeeds, the series becomes progressively longer and more complex. Once the user fails or the time limit runs out, the game is over. The original version was manufactured and distributed by Milton Bradley and later by Hasbro after it took over Milton Bradley. Much of the assembly language code was written by Charles Kapps, who taught computer science at Temple University and also wrote one of the first books on the theory of computer programming. Simon was launched in 1978 at Studio 54 in New York City and was an immediate success, becoming a pop culture symbol of the 1970s and 1980s Provide feedback on this episode.

    HPR4651: HPR Community News for May 2026

    Play Episode Listen Later Jun 1, 2026


    This show has been flagged as Explicit by the host. New hosts There were no new hosts this month. Last Month's Shows Id Day Date Title Host 4630 Fri 2026-05-01 Playing Civilization V, Part 11 Ahuka 4631 Mon 2026-05-04 HPR Community News for April 2026 HPR Volunteers 4632 Tue 2026-05-05 Hackerpublic Radio New Years Eve Show 2026 Episode 6 Honkeymagoo 4633 Wed 2026-05-06 Ham Radio Licence Lee 4634 Thu 2026-05-07 Upgrade Failsause operat0r 4635 Fri 2026-05-08 What did I do at work today? Part 3 Section 1 Lee 4636 Mon 2026-05-11 7 seconds memory Antoine 4637 Tue 2026-05-12 UNIX Curio #6 - at and batch Vance 4638 Wed 2026-05-13 Simple Podcasting - Episode 3 - Analyzing and Filtering Whiskeyjack 4639 Thu 2026-05-14 NLUUG Spring Conference 2026 Ken Fallon 4640 Fri 2026-05-15 Robert A. Heinlein Ahuka 4641 Mon 2026-05-18 Technical Dutch Open Source Event (T-DOSE) Ken Fallon 4642 Tue 2026-05-19 Hackerpublic Radio New Years Eve Show 2026 Episode 7 Honkeymagoo 4643 Wed 2026-05-20 HPR Beer Garden 13 - Triple IPA Kevie 4644 Thu 2026-05-21 Response to comments on HPR4424: Newsboat... Archer72 4645 Fri 2026-05-22 ZERO HOUR: FRIDAY AFTERNOON APK HACKING operat0r 4646 Mon 2026-05-25 Mobile Gaming Elsbeth 4647 Tue 2026-05-26 UNIX Curio #7 - Compression Vance 4648 Wed 2026-05-27 Simple Podcasting - Episode 4 - Audio Analysis Fun Whiskeyjack 4649 Thu 2026-05-28 What did I do at work today? Part 3 Section 2 Lee 4650 Fri 2026-05-29 Playing Civilization V, Part 12 Ahuka Comments this month Past shows hpr4424 (2025-07-17) "How I use Newsboat for Podcasts and Reddit" by Archer72. أحمد المحمودي said: "How did I find HPR" (2026-05-12 17:16:07) candycanearter07 said: "Re: How did I find HPR" (2026-05-12 19:36:04) hpr4502 (2025-11-04) "Cheap Yellow Display Project Part 3: Reverse beacon network " by Trey. Archer72 said: "Morse code" (2026-05-19 15:00:39) hpr4567 (2026-02-03) "Movie Recommendations for Hackers" by Deltaray. Antoine said: "Some watched!" (2026-05-27 03:33:12) hpr4587 (2026-03-03) "UNIX Curio #1 - Shell Archives" by Vance. Dave Morriss said: "Great reminder! I had forgotten shar" (2026-05-07 18:18:05) Vance said: "Color printing" (2026-05-08 22:02:23) hpr4607 (2026-03-31) "UNIX Curio #3 - basename and dirname" by Vance. Vance said: "Correction" (2026-05-12 01:03:12) hpr4618 (2026-04-15) "Simple Podcasting - Episode 2 - Basic Filtering" by Whiskeyjack. Henrik Hemrin said: "Generating sine wave" (2026-05-14 19:59:46) Whiskeyjack said: "Reply to Henrik Hemrin on Sine Waves in HPR4618" (2026-05-15 15:22:16) hpr4627 (2026-04-28) "UNIX Curio #5 - Faster, Pussycat! Kill! Kill!" by Vance. Steve Barnes said: "Thanks for the context!" (2026-05-21 05:28:05) hpr4628 (2026-04-29) "Nuclear Power Technology Follow Up" by Whiskeyjack. Antoine said: "o/" (2026-05-17 00:24:23) Whiskeyjack said: "Reply to Antoine on HPR4628" (2026-05-17 18:08:18) This month's shows hpr4631 (2026-05-04) "HPR Community News for April 2026" by HPR Volunteers. Whiskeyjack said: "Response to Ken Fallon in HPR4631 Community News" (2026-05-04 05:13:02) candycanearter07 said: "new episodes" (2026-05-04 18:47:39) Ken Fallon said: "new candycanearter07 episodes" (2026-05-05 09:00:00) أحمد المحمودي said: "Thanks for the encouragement" (2026-05-12 17:18:20) hpr4634 (2026-05-07) "Upgrade Failsause" by operat0r. YourName said: "Why is the audio so bad OMG sorry" (2026-05-06 20:05:43) Ken Fallon said: "Already reported and fixed" (2026-05-06 20:35:49) hpr4637 (2026-05-12) "UNIX Curio #6 - at and batch" by Vance. candycanearter07 said: "still useful!" (2026-05-13 03:43:37) norrist said: "at for scheduled reboots" (2026-05-16 19:41:04) Vance said: "Good points" (2026-05-17 03:03:47) Whiskeyjack said: "At and batch in HPR4637" (2026-05-17 18:35:11) hpr4640 (2026-05-15) "Robert A. Heinlein" by Ahuka. Antoine said: "Nice tips" (2026-05-17 00:22:01) Kevin O'Brien said: "I enjoyed doing it" (2026-05-17 19:14:19) hpr4646 (2026-05-25) "Mobile Gaming" by Elsbeth. candycanearter07 said: "my opinion of mobile gaming" (2026-05-27 00:24:58) hpr4647 (2026-05-26) "UNIX Curio #7 - Compression" by Vance. xmanmonk said: "Great Series" (2026-05-27 00:29:32) candycanearter07 said: "thoughts" (2026-05-27 13:20:13) Mailing List discussions Policy decisions surrounding HPR are taken by the community as a whole. This discussion takes place on the Mailing List which is open to all HPR listeners and contributors. The discussions are open and available on the HPR server under Mailman. The threaded discussions this month can be found here: https://lists.hackerpublicradio.com/pipermail/hpr/2026-May/thread.html Events Calendar With the kind permission of LWN.net we are linking to The LWN.net Community Calendar. Quoting the site: This is the LWN.net community event calendar, where we track events of interest to people using and developing Linux and free software. Clicking on individual events will take you to the appropriate web page. Provide feedback on this episode.

    HPR4650: Playing Civilization V, Part 12

    Play Episode Listen Later May 29, 2026


    This show has been flagged as Clean by the host. In our sample game we look at playing as Austria and aiming for a Diplomatic Victory. And our focus is on puppeting Citty-States, but be I misunderstood and instead of making a Diplomatic Victory easier, it makes it harder. I still managed to get my Diplomatic Victory, but a Science or Domination Victory would definitely have been easier in this scenario. Playing Civilization V, Part 12 A Diplomatic Victory Strategy Civilization V introduced a new Victory type and I thought it might be fun to try this strategy for a sample game to see broadly how this would work. I decided I would play as Austria on Prince level, which means that all players are equal and no one is favored. For my map I chose Fractal, Map Size = Standard, Game speed = Standard. My only Advanced Option was Quick Combat, because I didn't need to see that drawn out, particularly since I plan to avoid combat as much as necessary. My leader is Maria Theresa, and her Austria has a unique ability called Diplomatic Marriage. This allows us to either Annex or Puppet any city-state that has been allied to us for 5 turns with the proper expenditure of Gold. My plan was to use this to Puppet the city-states to control their votes for the Diplomatic Victory, but that was a misunderstanding. I actually implemented one of the hardest ways to win a Diplomatic Victory. But that is what I did. Now to get them to ally with me the most effective way to do this is with cash and lots of it, and of course even more cash to actually effect to Puppeting of them. So my overriding objective in this game is to amass a large Treasury. But of course I cannot ignore my military either, since a weak military invites attacks form greedy neighbors. And I may need to “liberate” the occasional city-state if another player conquers them. Austria also has a Unique Unit, the Hussar, which replaces the Cavalry unit. It can move after attacking, has a flanking bonus, and has one extra movement. And the Unique Building is the Coffee House, which increases the generation of Great People in the city by 25%. So you can expect me to build these in every city as well. With that in mind, I started the game and settled in place, I had Mountains nearby, but also Sheep and Silver within my city, so some useful resources. I immediately started to produce a Scout as my first unit, and sent my Warrior out to explore. In the very early stage I focus on exploring the surrounding area and finding any Goody Huts, i.e. Ruins. My initial city site is not exactly ideal, as it is all hilly with Jungle nearby. After building my two Scouts, my next priority was to build a Worker unit to increase the productivity of my city. And for my first social policy I unlocked Tradition. When I got my second policy I picked Oligarchy, and plan to complete all of the Tradition tree. I cleared out a Barbarian encampment, and then discovered my first City-state, Vilnius. Then I needed to clear out another Barbarian encampment that was blocking me from finishing my exploration. Meanwhile I am focusing on getting techs for sailing the ocean blue, because that is how I plan to get trade routes, discover City-states I can puppet, and so on. Because money is key to my strategy I made a beeline for Currency in the my Science research. And while headed there I completed the Tradition tree. When I can get there I will work on the Commerce tree to maximize my cash, but until then the Patronage tree will let me improve my City-state relations, which is important for improving my relationships with City-states. After all, you need to be allies with them for 5 turns before you can puppet them. I now have three cities, and can probably squeeze out a few more, which should be sufficient to my needs. At Turn 141 I have 6 cities, which is all I will build in this game. I now have the technology to build Workshops, which are the first productivity boosters available, so I set all my cities to building them. For Research my immediate object was to get to Compass so I could build the Galleass, which would let me do more ocean exploration. But to go into deep Ocean I will need to go further to get Astronomy, which will let me build the Caravel which can enter deep ocean. Once I got that I switched to Banking, not just for the money, but as a prerequisite to building the Forbidden Palace, which grants two additional delegates in the World Congress/United Nations. When I get Banking I'll go back to Astronomy, and then Navigation, to advance my seagoing capabilities. By Turn 216 I had gotten Banking and started on the Forbidden Palace. And by luck, just as I got started I got a Great Engineer. I am holding him in reserve in case I need to hurry production, since Great Engineers are the only way to do that in Civ 5. I also picked up Astronomy, which will let me build Caravels to explore the whole ocean. My next research priority will be Gunpowder since it is time to beef up my defenses. At Turn 240 my Caravels started to come out, and I found several new City-States. And since my Treasury is healthy (I started with 6,000 gold, and I'm bringing in 100 each turn), I began the process of puppeting the City-states. Puppeting City-states as Austria Let's look at this in detail since it is important. The requirements are 2 things: Be allied with the City-state for 5 consecutive turns Have the cash needed. This amount is not too much early on, but it rises over time. So, how do you become allies with a City-state? There are a number of things you can do to improve your relationship. You can take on a quest that a City-state has published, which can be things like “Find another Natural Wonder” or “Create a Great Admiral”. These quests pop up continuously throughout the game, and you are free to ignore them, but fulfilling one will improve your relationship. Trade will also improve your relationship, so in this game all of my Trade routes were made with City-states. If you are in a position to have a successful war, you can find a former City-state that was conquered by one of the other Empires, liberate it, and then it will be your ally for the rest of the game. Giving them presents is how I usually do it, though. You can give them units or money. If your purpose is to get allies, money works best. But I do gift units in 2 circumstances. First, if I have obsolete units, giving them away might be better then deleting them. Second, if a City-state is under attack by another Empire. Gifting them units might help them hold out and make life difficult for a rival. The place where all of this is done is the City-state screen which opens up when you click on the bar above the City-state, which is where you handle all of your relationships. At the top of this screen you see your current status, which more often than not will be Neutral, which is how all City-state relationships start out. But you can get them angry by, for instance, moving a unit of your into their territory. If you only do it once, and give them time to get over it, they will go back to Neutral. You can also improve the relationship by pledging to protect them, but be careful. If they get attacked and you do not try to protect them, they will get very angry. Giving a gift opens a pop-up to say what kind of gift: 250 gold, 500 gold, 1000 gold, or a Unit. Note that a Unit is only worth 5 influence points, while 250 Gold is worth 20, so as I said Money is more powerful if your aim is to improve your status with them. So at Turn 242 I found the City-state of Singapore, and it appears that I was the first Empire to find them. So I immediately pledged to protect them. My Influence with them was 20, which is Neutral. We just met, and that is where things stand on first meeting. The be Friends you need to get to 30, and to be allies you need to get to 60. When I clicked Next Turn, I got a Quest from Singapore. They were worried about a Barbarian Encampment nearby, and if I cleared it out I would get additional influence with them. In this case, though, I let that go by. I want to move more quickly, and Singapore is across the Ocean from me. My influence with them at this point was 21, so only a modest increase. But I have 6038 Gold in my Treasury, and I am bringing in 102 per turn. So let's see what a gift of 500 Gold will do. It brings me to 65 influence, so we are now Allies. But when I mouse-over Singapore, the pop-up window reminds me that my Influence will decrease by 1.12 per turn. For an Empire other than Austria this would mean a regular infusion of cash to keep up your status. And I have won Diplomatic victories with other Empires by saving up a lot of cash and dumping it on City-states just before the United Nations vote. But for Austria you have special ability called Diplomatic Marriage that lets you turn the City-state into a Puppet, and that is permanent. But it also presents some obstacles as we will see. We are allies now, but my influence will drop by 1 each turn, and I might lose my allyship before I can puppet them. But I can gift a unit and get another 5, and I happen to have a very obsolete Warrior unit that will serve the purpose. However, it takes three turns for the Unit to arrive, so I lose few more points. At Turn 247 I can now use the diplomatic Marriage option to make a puppet of Singapore. Prior to doing this I was fourth in score with 604, while the leader had 729. My Happiness Level was +25, and I now had 5833 Gold in my Treasury. Then I made Singapore a puppet, and now I am third in the game with a score of 664. My Treasury has fallen to 5258, which means it cost me 575 Gold. But most significant is that my Happiness fell from +25 to +9, which is a huge loss. I have enough gold to puppet 4-5 more City-states at this time but if I did I would have rebellions breaking out and my Empire would eventually collapse. This is the obstacle that Austria has to face. We need to promote Happiness before we go much further with making puppets. Civ is always a game of balances. Links https://civilization.fandom.com/wiki/City-state_(Civ5) https://civilization.fandom.com/wiki/Austrian_(Civ5) https://www.palain.com/gaming/civilization-v/playing-civilization-v-part-12/ Provide feedback on this episode.

    HPR4649: What did I do at work today? Part 3 Section 2

    Play Episode Listen Later May 28, 2026


    This show has been flagged as Explicit by the host. It is suggested reviewing the episode What did I do at work today? Part 3 Section 1 prior to listening Test driven development - a way of writing code that involves writing an automated unit-level test case that fails, then writing just enough code to make the test pass, then refactoring both the test code and the production code, then repeating with another new test case. - https://en.wikipedia.org/wiki/Test-driven_development Joplin - Joplin is an open source, cross platform note-taking app. - https://joplinapp.org/ PHP - A popular general-purpose scripting language that is especially suited to web development. Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world. - https://www.php.net/ MySQL - MySQL is an open-source relational database management system. MariaDB is a community developed fork of MySQL, often installing the MySQL package on a Linux distribution will actually install MariaDB. - https://en.wikipedia.org/wiki/MySQL - https://mariadb.org/ - https://www.mysql.com/ Sublime Text - Cross platform text editor - https://www.sublimetext.com/ Nmap - Network Mapper is a free and open source utility for network discovery and security auditing - https://nmap.org/ Markdown Fenced code blocks - "A code fence is a sequence of at least three consecutive backtick characters (`) or tildes (~). (Tildes and backticks cannot be mixed.) A fenced code block begins with a code fence, preceded by up to three spaces of indentation. The line with the opening code fence may optionally contain some text following the code fence; this is trimmed of leading and trailing spaces or tabs and called the info string. ... Although this spec doesn't mandate any particular treatment of the info string, the first word is typically used to specify the language of the code block." ```ruby def foo(x) return 3 end ``` from CommonMark Spec at https://commonmark.org/ (CommonMark is a standard, interoperable and testable version of Markdown.) Writing to a Database with PHP The following PHP method is implemented within a database access class: function create_with_id($id, $name) { $born = time(); $id = mysqli_real_escape_string($this->db, $id); $name = mysqli_real_escape_string($this->db, $name); $sql = "INSERT INTO object (object_id, display_name_text, born, died) VALUES ($id, '$name', $born, 0); "; db_run_sql($this->db, $sql); } Note db_run_sql is a helper function defined elsewhere, not a built in function, and the property db is a previously initialized mysqli object. Provide feedback on this episode.

    HPR4648: Simple Podcasting - Episode 4 - Audio Analysis Fun

    Play Episode Listen Later May 27, 2026


    This show has been flagged as Clean by the host. 01 This is the fourth episode in a four part series on simple podcasting. 02 Introduction In this episode we will discuss alternatives to Audacity when it comes to analyzing audio spectrums to find the sources of unwanted noise. I previously promised some gratuitous hackery, and we will get into that in this episode. 03 Recall that with Audacity you first import the audio file, then select the part of the audio you wish to analyze (or ctrl-A for all), and then select analyze > plot spectrum. This is in fact the only feature of Audacity that I know how to use. I am definitely not an audio expert. I do however have some background in processing and analyzing other signals, so some of the basics are familiar to me. 04 We can accomplish the same thing that Audacity does in this instance provided we can do the following. First, we need to get the data out of the audio file and into a form which we can import into other software. Second, we need to perform certain mathematical operations on this data. Finally, we need to be able to plot the results of these calculations on a chart. -------------------- 05 Fourier Transforms First though, we need a bit of mathematical background. What Audacity is doing when it shows a plot of frequency versus amplitude is that it is showing the results of a Fourier Transform. A Fourier Transforms is a mathematical operation that converts the time domain into the frequency domain. Any complex signal, audio or otherwise, can be broken down into a collection of sine waves of various frequencies. For example, a simple square wave signal of say 100 hertz can be represented as a sine wave of frequency 100 hertz plus a collection of higher frequency sine waves which add together to give the sharp corners. 06 A Fourier Transform finds these sine waves and sorts them out into separate bins, with each bin representing an individual frequency or a collection of closely related frequencies, depending on how fine grained the sorting is. 07 This is exactly what we want when we are trying to figure out how to filter out noise. Recall that earlier in this series we had to solve a problem with a high pitched background noise which was originating in my cheap microphone. Analyzing this audio by frequency showed that it was a series of individual tones at 1 kHz intervals. We were then able to use filters targeted at those frequencies to get rid of that noise. 08 There are several optimized versions of the Fourier Transform algorithm. A very common one is the Fast Fourier Transform, common abbreviated to just "FFT". This is so common that the term "FFT" is often used to simply mean any Fourier Transform even though this is not technically correct. 09 Typical FFT algorithms require that the number of data samples is exactly a power of two. So the number of samples we need may be something like 4096, 8192, or 65536, to give a few random examples. When we transform from the time domain to the frequency domain, each sample becomes a single frequency "bin". So the more samples we have, the finer the resolution we get in terms of frequency. 10 If we assume we are dealing with flac files recorded at a 44.1 kHz sample rate, that is, 44100 samples per second, then if we have 32768 samples, each "bin" represents slightly more than 1 hertz. If we have 65536 samples, then each "bin" represents a fraction of a hertz. For our purposes we will pick 65536 samples. That means we need 1.48 seconds of data. For simplicity's sake we will record at least 2 seconds of data and then just discard the samples that we don't need. 11 There is a further complication here. Fourier Transforms normally work with complex numbers. Recall from your school days that as well as integers and real numbers there are complex numbers. Each complex number consists of two parts, a real component and an imaginary component. I won't go into the details of this, just accept that each sample needs to have two components. Fortunately, if we don't have complex number data we can just set the imaginary component to zero and use that. This is enough talking about the theory, let's get into the practical details. -------------------- 12 Extracting Data from Audio Files First we will look at how to extract the data from the audio files. Fortunately, one of the programs which we have already been using can do this. To do this we will use Sox. I am not aware of an equivalent feature in ffmpeg. 13 Sox calls itself "SoX - Sound eXchange, the Swiss Army knife of audio manipulation" Sox is free software and is licensed under the GPLV2 or later. In this case we want to use a feature which allows us to convert a binary audio signal file to a text data file. To convert the file to text data we just give the output file a ".dat" file extension and Sox will do this for us. 14 Here is a command example. sox inputfile.flac tdata.dat 15 This gives us a file in the following format, assuming this is a mono audio recording. ; Sample Rate 44100 ; Channels 1 0 0.045471191406 2.2675737e-05 0.055023193359 4.5351474e-05 0.048217773438 6.8027211e-05 0.053192138672 etc. The first line states the sample frequency The second line states that the data is for channel 1. The data starts on the third line. Column 1 is the time in seconds. Column 2 is the waveform data point. 16 To analyze the data we want a subset of these samples. When we convert from the time domain to the frequency domain, our resolution will be determined by the number of samples. We would like therefore to have at least as many samples as the sampling rate. We also want the samples size to be an even multiple of two. The number of points we want to have is equal to the next even multiple of two above our chosen sampling rate, 44,100 Hz. This number would be 65536. 17 To extract this data from the file we can do the following. tail tdata.dat -n+3 | head -n65536 | awk '{printf "%sn", $2}' > tdata.csv 18 We use tail to skip over the first three lines. We use head to take the next 65536 lines and discard the rest. We use awk to extract the second column which we will use as the real component. We now have this data as a csv file in one column. -------------------- 19 Analyzing the Data To analyze the data we need software which can calculate FFTs. I will now show two examples of this, a very simple case using Libre Office Calc, and a more complex but more complete one using GNU Octave. 20 Using Libre Office We can do fourier analysis and plot charts using Libre Office. Take the csv file of data that we previously created. For this example I used data from a recording of silence so that I could see what internal noise was being generated by the headset. Open the csv file and import it into Libre Office Calc. 21 Now select all 65536 rows of column A. The Fourier function will automatically fill the imaginary component with zeros if we don't provide an column of imaginary numbers, so we don't need to provide a column of zeros. Then select Data > Statistics > Fourier Analysis. 22 A window will open allowing you to select various parameters. For Results to:, enter "D1". Grouped by Columns. Select OK. 23 New data should now appear starting in cell D1. The first line will say " Fourier Transform" The second line will state the input range. The third line will state "Real" in column D, and "Imaginary" in column E. The data will start in row 4. 24 For our simple example we will ignore the imaginary data and just use the real data, which will form our Y component when we plot it on a chart. We now need to create the X axis data. 25 Each cell is a "bin" of frequencies. Each cell therefore represents (sample frequency) / (Number of samples) Hz. 26 To create the X axis data showing frequency, enter the following formula in to column C to the left of each D column number. =((44100/65536) * (ROW() - 4) 27 We can now create an XY chart showing the frequency analysis. You may need to exclude the first couple of dozen rows as very low frequency components which cannot be heard may otherwise overwhelm the data we are interested in. Also, you only need the first half of the chart. The FFT mirrors the data from the first half of the array into the second half. 28 Because characterizing a sine wave requires a minimum of 2 points, although we have a sample frequency of 44.1 kHz, we really only have sound waves up to a maximum of half that, or 22.05 kHz. Create the chart with lines only. If you followed the above instructions, you should see something resembling what we saw in Audacity, except with each bin more sharply defined. 29 In the data that I had from a recording of unfiltered headset noise, I could see a distinct noise spike every 1000 hertz. 30 However, we have taken several shortcuts. First, the imaginary component of the data was ignored. Second, the magnitude (that is, Y axis) has both positive and negative peaks. Third, the data is not scaled to dB sound units, so we just have a relative measure. However, that by itself is enough to tell us where the frequencies are that we need to construct filters to deal with. 31 We could refine this spreadsheet a bit more to deal with the above issues, but I think we have demonstrated the basic principle, and working with a spreadsheet can be a bit awkward. However, if working with a spreadsheet is what you want to do, then you can add more columns and more formulae to improve on it. -------------------- 32 Other Analysis Software I will go on to GNU Octave in a moment, but I want to get a few other alternatives out of the way first. I won't go into any detail on them other than to point them out to people who want to have a go at trying these themselves. 33 Grace There is math and plotting software called Grace. This is free software, released under the GPL V2. According to the documentation, it seems to have the features we need, including an FFT function. However, I could not get it to work properly on Ubuntu 24.04. I could not get it to load a data file and plot data. 34 The error messages were vague and unhelpful. The file navigation system didn't work. There was no obvious path to success, and if it isn't easy to use then there is no point to it. This is fairly old software, designed for X Window and Motif. I gave up on it as not suitable for this series as I am looking for some fairly low effort things for people to try themselves. If someone else can get it to work on their PC, perhaps they could do an HPR episode on this themselves. 35 Command Line FFT Packages There are several command line FFT packages. They will read data from std in or from a file and output the FFT. However, these are not packaged for Ubuntu and appear to be distributed as C source code which you would download and compile. You can experiment with those if you wish, but I felt they were a bit out of scope for discussion here as I am looking at common tools that are ready to use. 36 Here are two examples. One is Command-line Fast Fourier Transform utility https://github.com/gregfjohnson/fft Another is cli-fft https://github.com/jonolafur/cli-fft 37 I have not tried these and cannot say whether they are any good or not. Similarly, there are a number of FFT packages that are libraries for languages such as Python. If you want to take the time to write a short program to go with them, you can create a dedicated FFT command line program. However, I felt that this too was out of scope for what I was trying to do here. 38 Doing it the Hard Way Hypothetically, it may be possible to write an FFT function in bash bc, which is the arbitrary precision calculator language which is part of the standard shell package. I say hypothetically, because I have not tried it. I think it would be an interesting challenge, but I don't have the time at the moment to try it. If anyone feels motivated to give it a try, they're welcome to give it a go and then do a podcast episode on it. -------------------- 39 GNU Octave We have seen that as well as using features built into Audacity to analyze the audio spectrum to see the frequencies of undesired noises, we were able to do the same using a Libre Office spreadsheet. 40 Now we'll look at another bit of software, GNU Octave. GNU Octave is free software, licensed under the GPL V3 or later. It is a mathematical scripting language, very similar to Matlab. People use it for mathematical, engineering, and scientific work. It can be found in most Linux distros and is available for some other operating systems as well. 41 Octave has two features built in that we need for our purposes. It does FFTs, and it has a plotting system built in to produce graphs. -------------------- 42 We will take the same audio test file that we used with Audacity and Libre Office and use it here as well. The bash script to convert the flac file to text data is essentially the same, with the exception that file extension on the output file as is ".txt" instead of ".csv". This latter change was an arbitrary decision on my part. 43 As a quick review, this bash script uses sox to convert a flac file to a text ".dat" file. Then it uses tail, head, and awk to extract the first 65536 rows of data, skipping over the header information and ignoring the first column of time data. This script will be in the show notes. -------------------- #!/bin/bash # This version is for use with the GNU Octave script. sox hsnoisemono.flac hsnoisemono.dat tail hsnoisemono.dat -n+3 | head -n65536 | awk '{printf "%sn", $2}' > hsnoisemono.txt -------------------- 44 We now have a 1.1 MB file containing 65536 samples of data in text format. Now the next thing we need to do is to create a short Octave script file. I will just give a brief overview of the script here, the full script will be in the show notes. 45 I put the script in a file called "octavespectrum.m". I have never used Octave before now, but the convention seems to be to give the script a ".m" ending. The "she-bang" line is "#!/usr/bin/env octave". If you make the file executable you can run it like any other script, or you can type "octave" and then the name of the script to run. 46 I won't read out the script in detail, as that would be too hard to following along in a podcast. However, I pass several arguments to the script including the name of the data file, and then two integers that I use to limit the display area in the Y and X axes so I can have the chart focus on the areas of interest that I want to see. I also pass a string containing the name of the graphic file that I want the chart exported to. This was an arbitrary decision on my part and you can just hard code these values in if that is what you want to do. 47 The arguments are accessed by calling the "args()" function, which returns an array of strings. Next, it reads in the specified file using the "dlmread()" function. This reads all of the data into an array. 48 Next, it performs a hamming windowing function on the data. I'll explain that briefly. It is standard practice when doing FFT signal processing to "window" the signal. Since the signal sample is of finite length, it will stop at each end of the array. 49 Unless you were lucky enough for this to happen exactly at a zero crossing, this would produced an abrupt transition in the data which looks like "noise" to the FFT. The solution is to taper the signal off gradually towards the ends so that when it gets cut off the signal is fairly small at that point anyway. There are a variety of different windowing functions, but "hamming" seems to be the most commonly used. 50 Next, it does an FFT using the "fft()" function. 51 This gives us real and imaginary outputs. These are combined by summing the squares of each corresponding real and imaginary element and then taking the square root of each and storing that in a new array. This gives a single array of the same length as the originals, but combining the two output components. If anyone wants to tell me that this isn't how things are done in the audio world, they're welcome to make an HPR episode telling us all the right way to do things. 52 Then it does some scaling and selection of subsets of data so we get the X axis in hertz and just the number of samples that we wish to look at. If you are looking at the script, the thing to keep in mind is that Octave will work on entire arrays of data in a single operation. You don't need to write explicit loops for this. The looping is handled implicitly as part of the syntax. 53 It also does various other things that make the chart easier to read. The comments in the script describe these in more detail. Since this is a script it's easier to add these sorts of refinements than is the case for a spreadsheet so I have made the effort to add them. Finally it calls the "plot()" function. If an output graphics file name was provided, it also creates a PNG file containing the same image using the "saveas" function. 54 We now see the chart, and it looks more or less as expected. However, this chart is interactive. You can zoom and pan the data, something that you can't do with either Audacity or Libre Office. The chart window doesn't have a function for exporting the resulting chart to a "png" file, it will only save to an ".ofig" file. The ofig file is not a standard graphics file, it is a serialization of the chart data that can only be looked at using the Octave chart viewer. 55 Alternatively, you can just take a screenshot of the chart after you have interactively zoomed and panned to a point of interest. At the bottom left of the chart window is a pair of x-y coordinates which tell you the current position of the mouse pointer in chart units. This is very handy as it can be used to get the exact (or close to exact) frequency of each noise spike. 56 The Y axis is not scaled in any particular units such as dB, as I'm not sure how to do that according to audio industry conventions. On the other hand, I'm not sure that it's really necessary, as I don't know what dB means in tangible terms anyway. It does show relative sizes, so it helps to determine whether you have one noise frequency or multiple frequencies to worry about. 57 If anyone is familiar with how to scale the raw data from a flac file as exported by Sox into dB units according to audio industry convention, then they are welcome to create an HPR episode telling us how to do it. -------------------- 58 Comments on GNU Octave I had never used GNU Octave before this, although I had heard of it and it is quite a significant piece of software for a specific segment of users. 59 The syntax is a bit odd especially in how it deals with array operations, but I was able to google various examples and answers to eventually get this working. A few other peculiarities are that it uses the percent "%" character to denote a comment, and leaving out the semi-colon at the end of the line causes it to print the answer to the console after executing the statement. 60 The GNU Octave solution was harder to get working than the Libre Office method. However, once it was working it is easier to use repeatedly. If I were to want to automatically generate audio files with different filtering or other options and wanted to script the creation of a large number of images showing the results, this would be the way to do it. 61 When your run the Octave script you may get a warning which says something like "QSocketNotifier: Can only be used with threads started with QThread". This is apparently a routine warning message from the Qt graphics system which has no real significance in this context and can be ignored for our purposes. -------------------- 62 We now have a bash script which will use sox to extract the data from a flac file, and a GNU Octave script which can be used to display the resulting frequency spectrum. This does more or less the same thing as "Plot Spectrum" does in Audacity, but allows for zooming and panning to get a more detailed look at the data. 63 However it doesn't give you an absolute reading of the sound levels in dB, something that Audacity does provide. What I wanted it for though was to find the frequencies of the audible noise in the signal, something that it does quite well. -------------------- #!/usr/bin/env octave % Perform an FFT on the data in a file and plot the results. % ====================================================================== % The sampling frequency. This must be changed to accommodate the % actual sampling frequency if it was something else. samplefreq = 44100; % Thickness of line on plot. linewidth = 2; % ====================================================================== % The name of the data file is passed as a argument. args = argv(); if length(args) < 3 quit endif % File name. fname = args{1}; % Clip the peak values. peakclip = str2double(args{2}); % How much data to show, in kHz. rbound = str2double(args{3}) * 1000; % The optional file name to save a chart image to. if length(args) > 3 chartfile = args{4}; else chartfile = ""; endif % ====================================================================== % Read the data in from the file. sampledata = dlmread(fname); % Number of samples. samplecount = length(sampledata); % ====================================================================== % Window the data. This helps deal with the discontinuity of data at % each end of the array and the effects this has on introducing apparent % noise into the signal. windoweddata = (hamming(samplecount) .* sampledata); % ====================================================================== % Do the actual FFT. fftresults = fft(windoweddata); % Get real component. r = real(fftresults); % Get the imaginary component. i = imag(fftresults); % Combine the real and imaginary. In order to square each element of each % array, we must use the ".^" operator, not just "^". rfft = sqrt(r.^2 + i.^2); realfft = rfft(1:samplecount); % ====================================================================== % Scale factor for frequency. fscale = samplefreq / samplecount; % X axis scale, scaled to frequency. f = (0:samplefreq/2) * fscale; % Take a subset of the data if specified. rbound has to be re-scaled % from kHz to array increments. freq = f(1:min(rbound / fscale,length(f))); % y axis. We take the absolute value and then limit (clip) the peaks % so that a few large peaks don't obscure the smaller ones. mag = min(abs(realfft(1: length(freq))), peakclip); % Plot the results. figure; whandle = plot(freq, mag, 'LineWidth', linewidth); title(["Audio Spectrum of ", fname]); xlabel("Frequency (Hz)"); ylabel("Unscaled Magnitude"); grid on; % If the appropriate optional argument was specified, save the chart % to a file of that name. if length(chartfile) > 4 saveas(gcf, chartfile, "png"); endif % Need this so the plot window stays open. waitfor(whandle); % ====================================================================== -------------------- This is the shell script used with the above Octave script. The arguments are 1 - the file name for the input data file. 2 - The value to clip the peaks at. 3 - The upper frequency bound in kHz. 4 - The output graphics file name. #!/bin/bash octave octavespectrum.m hsnoisemono.txt 10 12 hsnoisemono.png -------------------- 64 Episode Conclusion In this episode we covered the following topics. What Fourier transforms are. Extracting data from audio files using Sox. Analyzing the data using Libre Office. Analyzing the data using GNU Octave. And, several alternative analysis methods. 65 Series Conclusion This is the end of a four part series on simple podcasting. In the first episode, we covered a simple podcast recording method. This first episode is all you really need to make a podcast. 66 In the second episode we covered basic filtering and a few other simple topics. The methods discussed in that episode provide basic improvements to your audio if you feel the need for it. 67 In the third episode we covered how to analyze audio noise problems using Audacity and additional filtering techniques to deal with specific problems that we may find. We also covered command line recording, playback, and getting information about an audio recording. 68 In the fourth episode we engaged in a bit of gratuitous hackery for the fun of it and showed how to use alternative software methods to analyze audio signals. 69 I hope that this series has been both useful and entertaining and that you will use the knowledge gained here to create and submit your own HPR podcast episodes. -------------------- -------------------- Provide feedback on this episode.

    HPR4647: UNIX Curio #7 - Compression

    Play Episode Listen Later May 26, 2026


    This show has been flagged as Clean by the host. This series is dedicated to exploring little-known—and occasionally useful—trinkets lurking in the dusty corners of UNIX-like operating systems. In UNIX Curio #4 ( HPR episode 4617 ), I teased the subject of file compression. Today I'm circling back to that. The history of data compression goes back at least to the 1970s, and in contexts outside UNIX and computers, probably even earlier. Somehow, it is refreshing to learn that humans have always struggled to have enough storage space to keep all the data they want to hang on to. One way around this limitation is to use some form of compression. I am only going to dive into lossless compression for this episode—that is, a compression method that can be reversed and will spit out the original data bit for bit. Lossy compression methods also have their places: you might be familiar with their use for audio (such as Ogg Vorbis or MP3); it's also used for images (such as JPEG). Lossy compression allows some of the original data to be thrown away, resulting in a smaller file than is possible with lossless compression, but the intent is for the result to still sound or look "good enough" to a human observer. Also, I am going to limit my discussion to generic methods used for many types of data; while FLAC does lossless compression, it is specifically designed just for audio. I should make clear that I have never studied computer science or information theory, so this episode will not get into the science behind various types of compression algorithms and how they differ. But in general, these methods take advantage of the fact that many types of data have recurring patterns. English text mostly consists of words that often re-appear many times—source code similarly has keywords and variable names that recur. Compression is accomplished by representing a piece of data that occurs multiple times with a symbol that is shorter in length. The first compression program in the UNIX world I could find is called pack , from 1978 1 . It was shortly followed in 1979 by a similar program called compact 2 . Both of these used a technique called Huffman coding, but with some differences between them. Files compressed with pack were given a .z extension and compact gave filenames a .C extension. Roughly every five or ten years after this, a new program would come along and achieve lasting popularity. There were, and still are, two opposing forces facing any new form of compression. Working in favor was the advantages it provided—first among these was achieving a better compression ratio, but performance improvements such as speed or reduced memory usage could also be compelling. The force against any new method was the fact that it was not yet widely supported—it doesn't much help to have a smaller file if the people you share it with cannot decompress it. The next major advance in compression arose out of three scientific papers: two in 1977 and 1978 by Abraham Lempel and Jacob Ziv (called LZ77 and LZ78), and one by Terry Welch in 1984 which built on LZ78. This last method is typically referred to as LZW. Our UNIX Curio for today is a program called compress 3 that implements the LZW method. Files compressed this way are named with the extension .Z . I had always assumed that this was to honor Jacob Ziv, but now that I've researched the history, it seems more likely to be a follow-on from how files compressed by pack were named. Since pack did not use any of the Lempel-Ziv methods, I would guess that it used .z because that wasn't already taken by anything else, but that's pure speculation. I do recall encountering .Z files in the wild, but feel certain that hasn't happened in the last 25 years, maybe longer. If you need to expand one of these, uncompress 4 is the program to use ( GNU's gunzip can also handle them 5 ). However, there was a serious problem that arose with the LZ78 and LZW compression methods. Both of them were patented, and the owner became aggressive in seeking payment from developers and users. The compress utility was developed within two months of the publication of Welch's 1984 paper and was included in Bell Laboratories' Eighth Edition UNIX before these shakedowns started. The paper did not disclose that a patent had been filed, and apparently Spencer Thomas and the other developers of compress were unaware of it. The utility became popular for a while, and was even standardized by POSIX, but people moved away from LZW once the legal threats started. Another important advance came in 1991 and was called the DEFLATE compression method. It combined the un-patented LZ77 method with Huffman coding to achieve a similar level of compression as LZW (actually, often better) without the legal trouble. DEFLATE was developed for PKZIP and was soon adopted by the GNU project's gzip compressor. While Phil Katz (the "PK" in PKZIP ) patented one way of implementing the DEFLATE method, it was possible to write a compressor and decompressor without infringing 6 ; also, he apparently never tried to enforce the patent 7 . As I mentioned in UNIX Curio #4, .zip is both an archive and a compression format. Each archive member can be compressed with one of several possible methods (or stored without compression). Unlike a tar file where compression can be applied to the entire archive, in .zip each archive member is compressed individually. This often means a .zip file will be slightly bigger than a tar file with the same contents compressed with gzip , because the .zip format cannot take advantage of duplication that occurs among more than one member of the archive. The vast majority of .zip files use only the DEFLATE and uncompressed storage methods and these are the only options if you want to follow the profile standardized in ISO/IEC 21320-1. Actually, since they both use DEFLATE, gzip is able to extract a .zip file in the special case where it only holds one member compressed with that method. From the 1990s onward, people paid significant attention to avoiding patent landmines, so only methods that didn't have that problem became broadly popular. While the patents on LZ78 and LZW have since expired, I feel like their most successful legacy was in discouraging people from using those methods, leading to DEFLATE taking the popularity crown. The next step came in 1996 and 1997 with the development of bzip and bzip2 by Julian Seward. The original method was quickly followed by bzip2 , which was the version that achieved true popularity. They use the Burrows-Wheeler transform, which does not itself compress data but re-arranges it to make it more compressible; this is combined with other techniques 8 . (At least, that's my understanding. I told you, I'm not up on information theory.) This provides a significant reduction in the compressed size of the data compared to earlier methods—however, it is slower than DEFLATE both during compression and decompression. Separate projects have developed parallel versions of gzip and bzip2 that can take advantage of multi-processor machines, but the original utilities run single-threaded. Another five years later, in 2001, Igor Pavlov added the Lempel-Ziv-Markov chain algorithm (LZMA), an enhancement to LZ77, to his 7-Zip compression tool. This was followed a few years later by LZMA2, a container format that allowed for LZMA compression to be split between multiple threads. Broad LZMA2 support came to the UNIX world in 2009 with the xz utility 9 . It offers roughly similar compression ratios to bzip2 , though it can be better or worse depending on the data to be compressed. While compression generally takes even longer than bzip2 , decompression is significantly faster (though still not as fast as gzip ). The Linux kernel relatively quickly supported booting from xz-compressed images 10 because it was a good match for that use case—compression, the time-consuming activity, only has to be done once while the more frequent decompression during boot happens relatively fast. The last method I will cover is Zstandard 11 , often written as zstd . This came about in 2015, and is another variation on LZ77 that uses finite-state entropy (which means nothing to me, but you might understand it). It performs about as well as DEFLATE in terms of compression ratios, but is much faster both when compressing and decompressing data. I should say that these statements are true with the typical default settings—depending on the compression level selected, it can compress more slowly, but compress the data smaller. However, decompression is always speedier than DEFLATE. This makes it attractive for some uses, and it is heavily promoted by Meta/Facebook, where Yann Collet developed it. For example, shipping large amounts of actively-used data between machines in a data center can go more quickly when the size is reduced; however, if the compression and decompression steps take too long that benefit is lost. A speedy method can be valuable even if it doesn't result in the greatest reduction in size. This use case stands in contrast to, say, a compressed backup file which might only be accessed in a disaster recovery scenario or never accessed at all, making size more important than speed. Both the xz and zstd utilities have some built-in support for multi-threading, but the default is to run in a single thread. While xz can use multiple threads for decompression (but only if the file was compressed in multi-thread mode), the reference zstd utility can only use more than one thread for compression, not decompression. There are many other methods of lossless compression that have been developed over the decades, but I believe these are the ones you are most likely to encounter in the world of UNIX-like systems. This is a personal opinion, and others might choose a different set. As mentioned, it can be tough for a new method to gain popularity and 35-year-old DEFLATE is still probably the most commonly used despite not being the fastest or offering the greatest reduction in size. Even systems like FreeBSD, NetBSD, and OpenBSD that do not like to include GNU tools supported it by developing their own version of gzip based on the permissively-licensed zlib library. Technically, the LZW method used by the compress utility is still standardized by POSIX, so one might expect it to have the widest support. However, aggressive patent enforcement discouraged adoption, especially by Free and Open Source Software systems—even though the patent has expired, it is still out of favor compared to DEFLATE. For this reason, I feel justified in calling it a curio. References: Eighth Edition UNIX pack.c https://www.tuhs.org/cgi-bin/utree.pl?file=V8/usr/src/cmd/pack/pack.c 2.9BSD compact.c https://www.tuhs.org/cgi-bin/utree.pl?file=2.9BSD/usr/src/ucb/compact/compact.c Compress specification https://pubs.opengroup.org/onlinepubs/009695399/utilities/compress.html Uncompress specification https://pubs.opengroup.org/onlinepubs/009695399/utilities/uncompress.html GNU Gzip manual https://www.gnu.org/software/gzip/manual/gzip.html RFC 1951: DEFLATE Compressed Data Format Specification version 1.3 https://tools.ietf.org/html/rfc1951 History of Lossless Data Compression Algorithms: The Rise of Deflate https://ethw.org/History_of_Lossless_Data_Compression_Algorithms#The_Rise_of_Deflate bzip2 https://en.wikipedia.org/wiki/Bzip2 XZ Utils https://en.wikipedia.org/wiki/XZ_Utils 2.6.38 merge window part 2 https://lwn.net/Articles/423541/ zstd https://en.wikipedia.org/wiki/Zstd Appendix The table below demonstrates the results of compressing different types of data using tools described in this episode. While not totally rigorous, I did run each compression and decompression multiple times to ensure I was getting consistent results. The laptop I used has an Intel Core i5-6200U CPU running at 2.30GHz, and the system had at least 5 GB of free memory for each run. While this processor has two cores and can run four simultaneous threads, all utilities were run single-threaded. The term "best" means the highest level of compression available (the exact level used is shown). For bzip2 , the default is the best. For zstd , "best" is -19, which is the highest "normal" level, but "ultra" levels that are even higher also exist. Ratios are the percentage of the original size that the file was reduced to (other sources might instead express the compression ratio as the reduction in size achieved). In all results, smaller numbers are better. ┌────────────────────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐ │ │ gzip │ gzip │ bzip2 │ xz │ xz │ zstd │ zstd │ │ │(default -6) │ (best -9) │ (-9) │(default -6) │ (best -9) │(default -3) │ (best -19) │ ├──────────────┬─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │Size (ratio) │ 22,036,508 │ 21,891,623 │ 15,795,698 │ 13,487,768 │ 12,938,464 │ 20,454,657 │ 13,709,078 │ │ │ │ (24%) │ (24%) │ (17%) │ (15%) │ (14%) │ (23%) │ (15%) │ │English Text ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │(90,532,092 │Compression │ 4.8s │ 7.6s │ 8.5s │ 49.8s │ 58.8s │ 0.6s │ 65.2s │ │bytes │time │ │ │ │ │ │ │ │ │uncompressed) ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │Decompression│ 0.7s │ 0.8s │ 3.7s │ 1.2s │ 1.2s │ 0.4s │ 0.4s │ │ │time │ │ │ │ │ │ │ │ ├──────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │Size (ratio) │ 125,291,122 │ 124,189,544 │ 98,016,512 │ 84,882,492 │ 81,954,344 │ 120,604,855 │ 87,298,645 │ │ │ │ (21%) │ (21%) │ (17%) │ (14%) │ (14%) │ (20%) │ (15%) │ │Source Code ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │(590,008,320 │Compression │ 22.0s │ 39.3s │ 54.8s │ 241s │ 298s │ 3.7s │ 348s │ │bytes │time │ │ │ │ │ │ │ │ │uncompressed) ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │Decompression│ 5.1s │ 5.1s │ 20.3s │ 8.1s │ 7.8s │ 2.4s │ 2.4s │ │ │time │ │ │ │ │ │ │ │ ├──────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │Size (ratio) │ 32,830,905 │ 32,371,241 │ 26,856,579 │ 20,717,288 │ 20,352,880 │ 28,538,810 │ 23,154,582 │ │ │ │ (19%) │ (19%) │ (16%) │ (12%) │ (12%) │ (17%) │ (13%) │ │Binary Program├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │(171,972,264 │Compression │ 6.4s │ 22.4s │ 18.6s │ 62.2s │ 67.8s │ 0.8s │ 111s │ │bytes │time │ │ │ │ │ │ │ │ │uncompressed) ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │Decompression│ 1.5s │ 1.5s │ 5.6s │ 2.3s │ 2.3s │ 0.7s │ 0.7s │ │ │time │ │ │ │ │ │ │ │ ├──────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │Size (ratio) │ 146,397,772 │ 146,397,757 │ 144,485,451 │ 131,950,232 │ 130,926,780 │ 147,154,979 │ 145,703,840 │ │ │ │ (89%) │ (89%) │ (88%) │ (80%) │ (80%) │ (90%) │ (89%) │ │WAVE Audio ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │(164,396,302 │Compression │ 9.2s │ 9.2s │ 25.1s │ 70.4s │ 97.7s │ 0.7s │ 58.3s │ │bytes │time │ │ │ │ │ │ │ │ │uncompressed) ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │Decompression│ 2.0s │ 2.0s │ 13.5s │ 12.2s │ 12.1s │ 0.6s │ 0.8s │ │ │time │ │ │ │ │ │ │ │ ├──────────────┴─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ │ │ gzip │ gzip │ bzip2 │ xz │ xz │ zstd │ zstd │ │ │(default -6) │ (best -9) │ (-9) │(default -6) │ (best -9) │(default -3) │ (best -19) │ └────────────────────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘ English text consists of Titles 1 through 10 of the 2020 U.S. Code of Federal Regulations . Source code consists of a tar file containing the Linux kernel source, version 4.0. Binary program consists of an ELF-format executable of the pandoc application, version 2.17.1.1 found on Debian 12. Audio consists of a 24-bit Signed Integer PCM WAVE file with 2 channels at 44.1kHz, about 10:21 in length. For comparison, the audio-specific flac lossless compression utility reduced this file to 97,962,711 bytes (60%) in 2.6 seconds at the default (-5) level and to 97,714,876 bytes (59%) in 5.4 seconds at the highest (-8) level. Provide feedback on this episode.

    HPR4646: Mobile Gaming

    Play Episode Listen Later May 25, 2026


    This show has been flagged as Explicit by the host. Games Mentioned Tile Survive - https://tilesurvivegame.com/en Monopoly Go - https://apps.apple.com/us/app/monopoly-go/id1621328561 Arrows Go - https://apps.apple.com/us/app/arrows-go-arrow-puzzles/id6758326278 Apologies, Lee's mic is a bit metallic due to filtering out background noise from a fan Provide feedback on this episode.

    HPR4645: ZERO HOUR: FRIDAY AFTERNOON APK HACKING

    Play Episode Listen Later May 22, 2026


    This show has been flagged as Explicit by the host. WARNING AI GENERATED NOTES AHEAD YMMW Here is a summary of the recorded training session regarding Android hacking from Hacker Public Radio, including web references for the main topics discussed. Overview The recording features a security consultant performing a live assessment of an Android application. The consultant uses a custom tool suite called "Jamboree" and various other utilities to test a location-sharing and vehicle management app. The session highlights the increasing complexity of mobile app security, specifically dealing with SSL pinning, encrypted traffic, and anti-tampering mechanisms 1 . Environment and Tools The assessment is conducted on a rooted Android emulator. The speaker utilizes several tools to set up the environment and intercept traffic: Jamboree : A custom automation tool developed by the speaker over six years to handle rooting, proxy setup, and app installation within minutes 1 . Burp Suite : The primary interception proxy used to analyze traffic between the app and the production server 1 . Frida : Used to bypass anti-root detection and SSL pinning 1 . Ghidra : A decompiler used to analyze the app's code, specifically helpful for patching the Flutter-based application 1 . Android Debug Bridge (ADB) : Used for troubleshooting, debugging, and analyzing logs ( logcat ) to extract user IDs and location data 1 . Technical Challenges: SSL Pinning and Flutter The target application is built using Flutter and implements rigorous security controls, including SSL pinning, which prevents standard Man-in-the-Middle (MitM) attacks. The app's HTTP client ignores system and user-installed certificates, and it does not respect device Wi-Fi proxy settings 1 . To overcome this: Traffic Redirection : The speaker uses iptables commands to force all HTTP and HTTPS traffic through the proxy's IP address at the network layer, bypassing the app's proxy ignorance 1 . Patching with AI : The speaker leverages AI (specifically mentioning Claude and access to "Kuro") to assist in patching the APK. The AI helped navigate Ghidra and generate Python scripts to bypass the app's protections, allowing the modified APK to trust the auditor's certificate 1 . Frida Scripts : "Frida anti-root SSL pinning" scripts are executed to further mitigate detection mechanisms 1 . Key Vulnerabilities Identified 1. Geolocation Spoofing The consultant successfully spoofed the device's GPS location using emulator settings (e.g., setting the location to Puerto Rico or Costa Rica). The application accepted this falsified location data as valid, indicating a lack of server-side verification for location origin 1 . 2. Insecure Direct Object Reference (IDOR) / Broken Access Control The most critical finding involves the app's user tracking feature. The consultant discovered that the API allows querying a user's location via a user_id . By intercepting traffic and analyzing adb logcat logs, the consultant extracted their own user_id and the user_id of a second test account 1 . While authenticated as one user, the consultant was able to send a request substituting the user_id with the target's ID. The server responded with the target's GPS coordinates. This confirms that an authenticated user can track any other user's real-time location if they possess the target's ID 1 . Proof of concept was created by copying the request as a curl command to demonstrate the exploit 1 . 3. Potential Information Disclosure The consultant began testing a feature that allows users to add vehicles by license plate. The concern is that querying a license plate might return excessive PII (Personally Identifiable Information), such as VIN numbers or registration details, beyond what the UI strictly requires (least privilege issue) 1 . 4. Access Control (Calendar Feature) The consultant tested whether calendar events could be accessed by switching user_id parameters. This test resulted in a "401 Unauthorized" error, indicating that this specific endpoint had proper access control in place 1 . Web References and Resources Below are references for the main tools and concepts discussed in the training: Hacker Public Radio : https://hackerpublicradio.org/ Burp Suite (Web Security Testing) : https://portswigger.net/burp Frida (Dynamic Instrumentation Toolkit) : https://frida.re/ Ghidra (Software Reverse Engineering) : https://ghidra-sre.org/ Android Debug Bridge (ADB) : https://developer.android.com/tools/adb OWASP Mobile Top 10 : https://owasp.org/www-project-mobile-top-10/ OWASP Testing for Insecure Direct Object References (IDOR) : https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/04-Authorization_Testing/04.1-Testing_for_Insecure_Direct_Object_References Flutter (UI Toolkit) : https://flutter.dev/ Provide feedback on this episode.

    HPR4644: Response to comments on HPR4424: Newsboat...

    Play Episode Listen Later May 21, 2026


    This show has been flagged as Clean by the host. Hi this is your host, Archer72 for Hacker Public Radio. In this episode I share some of my findings about a problem with the Newsboat naming of the HPR feeds, which was brought up in comments about my Newsboat show, HPR4424. hpr4424: How I use Newsboat for Podcasts: comment #6 : download-filename-format for HPR podcasts Ken already had some findings of his own about the ccdn.php extension in the feed. hpr4424: comment #10 : Summary of findings I thought that this might be able to be fixed on an invididual basis, and set out to ask Claude.ai a few questions. But first, some colaboration from Dave Morriss about a good renaming format. This was definitely more on Dave's side than mine, but came up with this. You can tell Dave's handywork from the short variable names, which stems from his extensive experience on Unix type machines in the University days. exif-rename-hpr-dave.sh #!/bin/bash URL="$(cat /tmp/hpr-url.txt)" echo "DEBUG URL: $URL" >> /tmp/hpr-debug.log AUDIO_URL="$(curl -s "$URL" | grep -Eo 'https?://[^"]*.(ogg|mp3)' | head -1)" echo "DEBUG AUDIO: $AUDIO_URL" >> /tmp/hpr-debug.log if [[ -z "$AUDIO_URL" ]]; then echo "ERROR: Could not find audio URL from: $URL" >> /tmp/hpr-debug.log exit 1 fi # Changed destination to HPR-queue DEST=~/podcasts/hub.hackerpublicradio.org/HPR-queue/ # Record files present before download BEFORE="$(ls "$DEST"*.{ogg,mp3} 2>/dev/null | sort)" wget -nc --content-disposition -P "$DEST" "$AUDIO_URL" cd "$DEST" # Record filename just downloaded (new file not in BEFORE) AFTER="$(ls "$DEST"*.{ogg,mp3} 2>/dev/null | sort)" DOWNLOADED="$(comm -13 /dev/null | sort)" RENAMED="$(comm -13 /tmp/hpr-url.txt && ~/bin/download-and-rename-hpr.sh"; open-in-browser ; set browser "your-normal-browser" A few Claude questions later… After asking to add a function to the macro in order to add the resulting downloaded file to the queue, the file name hpr1234.ogg was being added to the queue instead of the renamed file. Two things to fix: The renamed file isn't being found because ls -t runs before the rename has fully settled, or the glob isn't matching the new filename format (which includes spaces and semicolons) The existing queue entries show the correct format: "url" "path" downloaded — we need to match that, with downloaded status and the full renamed path including extension Exif rename script #!/bin/bash # ~/bin/download-and-rename-hpr.sh URL="$(cat /tmp/hpr-url.txt)" echo "DEBUG URL: $URL" >> /tmp/hpr-debug.log AUDIO_URL="$(curl -s "$URL" | grep -Eo 'https?://[^"]*.(ogg|mp3)' | head -1)" echo "DEBUG AUDIO: $AUDIO_URL" >> /tmp/hpr-debug.log if [[ -z "$AUDIO_URL" ]]; then echo "ERROR: Could not find audio URL from: $URL" >> /tmp/hpr-debug.log exit 1 fi DEST=~/podcasts/hub.hackerpublicradio.org/HPR-newsboat-test/ # Record files present before download BEFORE="$(ls "$DEST"*.{ogg,mp3} 2>/dev/null | sort)" wget -nc --content-disposition -P "$DEST" "$AUDIO_URL" cd "$DEST" # Record filename just downloaded (new file not in BEFORE) AFTER="$(ls "$DEST"*.{ogg,mp3} 2>/dev/null | sort)" DOWNLOADED="$(comm -13 /dev/null | sort)" RENAMED="$(comm -13 /tmp/hpr-url.txt && ~/bin/download-and-rename-hpr.sh"; open-in-browser ; set browser lynx Provide feedback on this episode.

    HPR4643: HPR Beer Garden 13 - Triple IPA

    Play Episode Listen Later May 20, 2026


    This show has been flagged as Clean by the host. Dave and Kevie continue the Beer Garden series with a look at a relatively new style of IPA known as a Triple. Dave samples Triple Hazy Jane by Brewdog , whilst Kevie tries out Glory Triple IPA by Northern Monk . Connect with the guys on Untappd: Dave Kevie Provide feedback on this episode.

    HPR4642: Hackerpublic Radio New Years Eve Show 2026 Episode 7

    Play Episode Listen Later May 19, 2026


    This show has been flagged as Explicit by the host. PFSense https://www.pfsense.org/ Chromebook https://www.google.com/chromebook/discover-chromebook/ AMD Sempron 140 https://www.techpowerup.com/cpu-specs/sempron-140.c820 Trinity https://www.trinitydesktop.org/ XFCE https://www.xfce.org/ Chrome OS https://chromeos.google/ SSH https://www.ssh.com/ Onshape https://www.onshape.com/en/ TinkerCAD https://www.tinkercad.com/ Thorium OS https://thorium.rocks/thoriumos Tech And Coffee https://techandcoffee.info/ Panera https://www.panerabread.com/en-us/home.html IHOP https://www.panerabread.com/en-us/home.html Waffle House https://www.wafflehouse.com/ In And Out Burger https://www.in-n-out.com/ Economies Of Scale https://www.investopedia.com/terms/e/economiesofscale.asp Dunkin Donuts https://www.dunkindonuts.com/en F-Droid https://f-droid.org/en/ Cheap Yellow Display https://blog.decryption.net.au/posts/cyd-for-beginners.html NTP Server https://www.ntppool.org/en/ Beagle (Dog) https://www.akc.org/dog-breeds/beagle/ Siamese Cat https://www.life-with-siamese-cats.com/ Bsides InfoSec Conference - Knoxville, TN https://www.papercall.io/bsides-knoxville-2026 CI/CD Pipeline https://circleci.com/blog/what-is-a-ci-cd-pipeline/ Strace Command https://www.geeksforgeeks.org/linux-unix/strace-command-in-linux-with-examples/ High Pass Filter https://www.izotope.com/en/learn/6-ways-to-use-a-high-pass-filter-when-mixing Waters & Stanton - Radio Shop https://www.hamradiostore.co.uk/ Home Assistant https://www.home-assistant.io/ ESP 32 https://www.espressif.com/en/products/socs/esp32 EMF Camp https://www.emfcamp.org/ YAML https://yaml.org/ ChatGPT https://chatgpt.com/ TOR https://www.torproject.org/ IPTables https://linux.die.net/man/8/iptables https://ccrma.stanford.edu/planetccrma/man/man8/ipchains.8.html RSYNC https://linux.die.net/man/1/rsync SYM Link https://stackoverflow.com/questions/1951742/how-can-i-symlink-a-file-in-linux CDN (Content Delivery Network) https://www.cloudflare.com/learning/cdn/what-is-a-cdn/ Mastadon https://joinmastodon.org/ DuoLingo https://www.duolingo.com/ Fedora https://en.wikipedia.org/wiki/Fedora Pea Coat https://www.artofmanliness.com/style/clothing/mans-guide-pea-coat/ Haiku https://www.haiku-os.org/ Hunt Brothers Pizza https://www.huntbrotherspizza.com/ Papa Johns Pizza https://www.papajohns.com/omni/en PIzza Hut https://www.pizzahut.com/ Dominos Pizza https://www.dominos.com/ Marcos Pizza https://www.marcos.com/ Little Ceasars Pizza https://littlecaesars.com/en-us/ Hungry Howies Pizza https://www.hungryhowies.com/ MOD Pizza https://modpizza.com/ Papa Murphys Pizza https://www.papamurphys.com/ Wolfman Pizza https://wolfmanpizza.com/ Fuel Pizza https://www.fuelpizza.com/ Shallow Hal https://www.rottentomatoes.com/m/shallow_hal South Coast Pizza https://southcoastpizza.com/ Casa Dora https://www.casadoraitaliancusinepizzeria.com/ National Pizza Day https://www.nationaldaycalendar.com/national-day/national-pizza-day-february-9 Sagitarius https://www.zodiacsign.com/zodiac-signs/sagittarius/ Alexa https://alexa.amazon.com/userProfile?redirectTo=%2F Gemini https://gemini.google.com/app Netscape https://isp.netscape.com/ Seamonkey https://www.seamonkey-project.org/ Thunderbird https://www.thunderbird.net/en-US/ ULC Minister https://www.ulc.org/ Church Of Spiritual Humanism https://spiritualhumanism.org/ Oberon Zelle Ravenheart https://en.wikipedia.org/wiki/Oberon_Zell-Ravenheart Temple of Wicca https://www.wiccanfamilytemple.org/ Church Of All Worlds https://caw.org/ Progressive Universal Life Church https://www.thepulc.com/ Pine Time https://pine64.org/devices/pinetime/ AmazFit Watch https://us.amazfit.com/ Zepp App https://play.google.com/store/apps/details?id=com.huami.watch.hmwatchmanager&hl=en_US&pli=1 Pegasus Mail https://www.pmail.com/ Eudora https://en.wikipedia.org/wiki/Eudora_(email_client) Proton Mail https://proton.me/mail AOL https://www.aol.com/ OpenSuse https://www.opensuse.org/ Mandrake Linux https://www.mandrakelinux.org/ Virtualbox https://www.virtualbox.org/ Bitcoin https://bitcoin.org/en/ Norway https://www.visitnorway.com/ XFCE https://www.xfce.org/ Provide feedback on this episode.

    HPR4641: Technical Dutch Open Source Event (T-DOSE)

    Play Episode Listen Later May 18, 2026


    This show has been flagged as Clean by the host. Technical Dutch Open Source Event (T-DOSE) Ken interviews Peter van Ginneken who is chair of the Technical Dutch Open Source Event (T-DOSE) . It is a free conference to promote the use and development of Open Source software. This event has is organized yearly since 2006 in the Brainport region, near Eindhoven, The Netherlands. During this event, Open Source projects, developers and visitors can exchange ideas and knowledge. T-DOSE wil take place on 6 and 7 June 2026 at the Weeffabriek in Geldrop (near Eindhoven). https://t-dose.org/2026/ Contact Information Peertube Libera.chat IRC, #t-dose Mastodon LinkedIn Facebook Instagram Travel Times Country Typical Travel Method Example Destination Approx Duration Typical Budget Cost (One Way) Belgium Train / Flixbus Antwerp 1–1.5h €10–25 Germany Train / Flixbus Cologne 1.5–2h €20–40 United Kingdom Ryanair flight London Stansted 1h05 €20–70 Ireland Ryanair flight Dublin 1h40 €25–80 Denmark Transavia flight Copenhagen 1h25 €40–100 Austria Ryanair flight Vienna 1h40 €30–90 Czech Republic Transavia flight Prague 1h20 €35–90 Poland Ryanair / Wizz Air Kraków 1h50 €25–80 Hungary Wizz Air Budapest 1h55 €30–90 Italy Ryanair flight Milan Bergamo 1h35 €25–85 Spain Ryanair / Transavia Barcelona 2h05 €35–120 Portugal Ryanair / Transavia Porto 2h40 €45–130 Croatia Ryanair flight Zagreb 1h50 €35–90 Slovakia Ryanair flight Bratislava 1h40 €25–70 Romania Wizz Air Cluj-Napoca 2h20 €40–110 Bulgaria Ryanair / Wizz Air Sofia 2h35 €35–100 Albania Ryanair / Wizz Air Tirana 2h30 €35–110 Provide feedback on this episode.

    HPR4640: Robert A. Heinlein

    Play Episode Listen Later May 15, 2026


    This show has been flagged as Clean by the host. Robert A. Heinlein Robert A. Heinlein was the author who many people claim kicked off the Golden Age, though that can be the subject of many a barroom argument. E.E. “Doc” Smith was already an established writer by this time, and A.E. van Vogt was contemporaneous with Heinlein. But Heinlein managed to outshine everyone in very short order. He was widely known as “The Dean of Science Fiction Writers,” which testifies to his stature in the community, and along with Arthur C. Clarke and Isaac Asimov he was one of the Big Three of the Golden Age. He was the first person to be named a Science Fiction Grand Master in 1974. Four of his novels won Hugo Awards (Double Star, Starship Troopers, Stranger in a Strange Land, and The Moon is a Harsh Mistress), and 7 more works were given Retro-Hugo awards, which are awarded for works that were written before the Hugos were established. He also had many more works nominated for both awards, as well as many other awards like Nebula Awards. In short, he was a big deal to the science fiction community at large, and to me personally. I was, for a short time, managing the web site for The Heinlein Society, and I have read every work of his that I am aware of. Heinlein Background Robert Anson Heinlein was born in 1907 in Butler, Missouri, and grew up in Kansas City, Missouri, which he described as the middle of the Bible Belt, and this background is reflected in some of his stories, particularly the later ones. His family tradition had it that the Heinlein's had fought in every American war beginning with the War of Independence, and Robert and his brothers all joined the armed forces. Robert lied about his age when he was 16 in order to enlist in the Missouri National Guard, and a few years later obtained an appointment to the Naval Academy, graduating in 1929 with the equivalent of a bachelors degree in engineering (the Naval Academy did not award degrees at the time). His engineering background is very apparent in his writings. He served on several ships, rising to the rank of Lieutenant, before being discharged in 1934 due to pulmonary tuberculosis. It seems likely that if he did not contract this illness he would have continued his career in the Navy, and with World War II coming, well, who knows what might have happened. But he did get ill, and had to find things to do. He notably got involved with Upton Sinclair's socialist organization EPIC (End Poverty in California). He ran for office unsuccessfully, running as a left-Democrat in a conservative district. And while he had a disability pension from the Navy, he turned to writing to pay off his mortgage. Heinlein's Writing Heinlein was originally known as a “hard” science fiction writer, meaning one who puts plausible and accurate science at the heart of the story. But looking at his entire career, he was equally comfortable writing fantasy, though not the faux medieval kind that many writers. In fact, he coined the term “speculative fiction” to describe the kind of stories he wrote. And if he wanted to he was quite capable of mixing the hard science and the fantasy, particularly in his later novels. And his output was very substantial. Asimov wrote more than Heinlein, but Heinlein stuck to fiction, while Asimov wrote in a variety of fields, so Heinlein's output in the general area of science fiction/fantasy is the greater. And he is known for works of all lengths from short stories to novels. A useful guide to his works is the book Robert A. Heinlein: A Reader's Companion, by James Gifford. This book covers all of his science fiction/fantasy works known as of 2000, and gives additional information about the writing and circumstances of the stories. But in 2003 an early work was discovered and published. It was a novel called For Us The Living, and while you can see the germ of Heinlein's style in this novel, it is also a very early work written in 1938 and is not one of his best. He would get a lot better than this. In any case, it was not published at the time, and is mostly of interest to Heinlein superfans or scholars. Heinlein got his real start in 1939 with a short story called Life-line, which was published in John W. Campbell's Astounding magazine. Isaac Asimov had published a few stories by this time, and his first for John W. Campbell's Astounding was in the previous month, July 1939, so as you can see this was a very fertile time in the development of the genre. Heinlein's story was about a scientist who developed a technology to predict a person's time of death. This totally threatens the insurance industry, and one of the CEO's put out hit on the scientist, which he of course already knows about having tested himself. This is not the best short story, but it was quite competent, and John W. Campbell immediately asked for more. More short stories followed. In the November 1939 issue of Astounding the story Misfit appeared. It introduces the character of Andrew Jackson “Slipstick” Libby, a young man with little education but a great ability to do mathematics in his head. And his ability turns out to be just what is needed during a construction project in space when things go wrong. And in 1940 he had 9 more stories published. And at this point he faced a problem. He was becoming so prolific that for a number of reasons he had to employ pseudonyms for some of his stories. One reason was that he couldn't have too many stories in one magazine in his name, it made the editor look bad. In any case all of the stories are now published under Heinlein's name. And of the 9 stories, 6 were either nominated for or won Retro Hugo awards, and several also won Prometheus Hall of Fame Awards, for the best libertarian or anti-authoritarian works. So you can see that his was a talent that exploded on the scene, so that you could legitimately divide the science fiction history into pre-Heinlein and post-Heinlein periods. 11 more stories of various lengths followed in 1941, and 5 in 1942. There were mostly short stories, but a few novellas and novelettes appeared. But he was really a short fiction writer at this time, and there are some extraordinary stories in this group. He was the most successful writer of speculative fiction of the time, and passed along some advice to anyone who wanted to be a successful writer. Heinlein's Rules of Writing Because he was so successful, it should come as no surprise that aspiring writers frequently wrote to him for advice, and in response he formulated his Rules of Writing. This is taken from his On The Writing of Speculative Fiction : You must write. Finish what you start. You must refrain from rewriting, except to editorial order. You must put your story on the market. You must keep it on the market until it has sold. He goes on to say in this article : “The above five rules really have more to do with how to write speculative fiction than anything said above them. But they are amazingly hard to follow—which is why there are so few professional writers and so many aspirants, and which is why I am not afraid to give away the racket!” This is very good advice, but as Heinlein points out his rules are indeed hard to follow. For example, Rule #1: You must write. Many people want to be a writer, but not as many really want to write, and there is a very distinct difference. Just as many people want to be a rock star, but don't want to spend years dead broke playing in dive bars to get there. But it is also fair to point out that Heinlein was a rare talent, and I doubt if simply following his rules would make anyone else a similar success. They are good rules, no doubt, but Heinlein was already very familiar with and well-read in the field before he started writing. That finishes this particular exploration of where Heinlein came from and how be began his career. And since it all started with short fiction, I next want to focus on that. beginning with his Future History. This starts our look at the works of Robert A. Heinlein, the third of the Big Three authors of the Golden Age. Links: https://en.wikipedia.org/wiki/Robert_A._Heinlein https://www.amazon.com/Robert-Heinlein-Readers-Companion/dp/0967987407 https://www.amazon.com/Us-Living-Comedy-Customs/dp/074325998X/ref=tmm_hrd_swatch_0 https://en.wikipedia.org/wiki/On_the_Writing_of_Speculative_Fiction https://www.palain.com/science-fiction/the-golden-age/robert-a-heinlein/ Provide feedback on this episode.

    HPR4639: NLUUG Spring Conference 2026

    Play Episode Listen Later May 14, 2026


    This show has been flagged as Clean by the host. NLUUG Spring Conference 2026 "NLUUG is the association of (professional) Open Source and Open Standards users in the Netherlands" You can follow them on @nluug@nluug.social on Mastodon. I was particularly interested to attend their 2026 Spring Conference 2026 as our own Jeroen Baten was giving a talk on "Getting started with CI/CD using Forgejo Actions and why this is important AF" He assures me he will post it as a show. cough owes me a show cough . While there the urge to record came upon me, so I was able to snag a few interviews. Ronny Lam representing NLUUG NLUUG is the association for (professional) developers, administrators and users of UNIX/Linux, Open Source, Open Source, Open Systems and Open Standards in the Netherlands. The NLUUG community includes, system administrators, programmers and network specialists. If you are working as an open professional, then NLUUG is the excellent association where you can keep track of your technical knowledge, for example during our six-monthly conferences. The aim of NLUUG is to disseminate the application and knowledge of open standards and UNIX/Linux. NLUUG maintains close ties with many organizations and individuals who pursue the open mind. https://nluug.nl/organisatie/personen/ronny-lam/ https://nl.wikipedia.org/wiki/NLUUG https://nluug.nl/ Nico Rikken representing the FSFE The Free Software Foundation Europe is a charity that empowers users to control technology. Software is deeply involved in all aspects of our lives. Free Software gives everybody the rights to use, understand, adapt, and share software. These rights help support other fundamental rights like freedom of speech, freedom of press, and privacy. Learn more While we are no strangers to chatting with the Free Software Foundation Europe ( hpr857 , hpr1957 , hpr2223 , hpr2945 , hpr2946 , hpr3388 , hpr3407 , hpr3833 ), this was the first time we had a chance to interview Nico Rikken . We chat about freedom and Ada and Zangemann - A Tale of Software, Skateboards, and Raspberry Ice Cream by Matthias Kirschner and Sandra Brandstätter . Geert-Jan Meewisse representing Coalition for Fair Digital Education The Coalition for Fair Digital Education (CEDO) is a group of concerned parents, IT professionals, teachers, and privacy advocates committed to enabling fair and sovereign digital education. The coalition operates as a working group within Internet Society Netherlands (ISOC). We have drafted a manifesto calling for improvements in digital education. Today, children in education receive an online account from a foreign Big Tech company at an early age. Through this account, data can be collected, profiles can be built, and personal information can be used and exploited by these companies. This profiling leads to children being categorized and receiving tailored content that companies deem relevant—before they even discover things for themselves. And that's not the only issue. Since schools exclusively use “standard” Big Tech solutions, children do not learn about alternative programs or tools. As a result, real digital skills and critical thinking are not developed, making children dependent on a company that profits from their data. The privacy and sovereignty of digital education are under severe pressure, affecting not only students but also teachers and parents, who are forced to use the same systems. Other countries are already ahead in this regard: in Denmark, Google products have been banned in schools in Helsingør municipality, and the German state of Baden-Württemberg has prohibited Microsoft 365. We advocate for the development of an open-source digital infrastructure for learning and educational tools, based on public values such as autonomy, equality, sovereignty, democracy, transparency, accessibility, academic freedom, and privacy-by-design. To achieve this, raising awareness among students, parents, teachers, and school boards is crucial. Additionally, we aim to involve policymakers by presenting our manifesto. https://eerlijkdigitaalonderwijs.nl/english/ A working group of the Internet Society , Geert-Jan was here to tell us of their work to build a FLOSS alternative for Education. You can get in touch with him at gj -at- eerlijkdigitaalonderwijs .nl , or @geert-jan:matrix.org Conclusion I had great conversations with the sponsors who were a little shy about doing an interview. They do have a range of jobs available for those of us with Dutch nationality, and have lived in the Netherlands for the last 10 years. The event was fantastic, professional, held in a great venue, and the closest thing to real life xkcd: Shibboleet as you are likely to get. I would like to thank the NLUUG team, volunteers, venue staff and of course the attendees for a wonderful day. With any luck this will not be the last time you hear about this team on HPR. The recordings will be available on the NLUUG FTP Server Provide feedback on this episode.

    HPR4638: Simple Podcasting - Episode 3 - Analyzing and Filtering

    Play Episode Listen Later May 13, 2026


    This show has been flagged as Clean by the host. 01 This is the third in a four part series on simple podcasting. 02 In this episode we will cover the following topics: Analysis of audio noise problems and filtering methods used to deal with specific problems that we may find. Command line recording. Command line playback. Getting information about an audio recording. 03 Introduction When I did my first couple of podcasts I didn't notice that there was a quiet high pitched whine or buzz in the background. Nobody complained about it, but I thought I could do better in subsequent episodes. 04 Creating an Audio Sample If you have a similar problem, the first step is to find out where it is coming from. If there is no audible noise where you are recording, there is a good chance the problem is in the microphone or another part of the audio system. Plug in your microphone and record 2 or 3 seconds of quiet audio where you do not speak into the microphone or make other noise. 05 You will need a minimum amount of data in order to analyze it. For a flac file sampled at 44.1 kHz, 2 to 3 seconds of data should be enough. To get a sample of just electronic noise you can put the microphone in a drawer or somewhere like that if you want to be sure of getting a quiet signal. Any sound recorded in this way should be mainly from the microphone or other electronic elements in the analogue pathway. To get a sample of possible ambient noise, such as fans, make sure the microphone is in the open air in an area which is representative of where it will be when you are recording. -------------------- 06 Analyzing using Fourier Transforms Next you need to look at the wave form. At this point I will describe this using Audacity. I will show other ways later, but Audacity is actually the easiest if you are starting from nothing. You don't need to become an expert in Audacity to use it, just follow the steps I will describe. I myself don't know how to use Audacity beyond using this one feature. 07 We are going to analyze the sound spectrum in our sample. The technique being used is a Fourier Transform. A Fourier transform, often called an "FFT" for fast fourier transform, is a mathematical method of showing a signal in terms of frequency along the x axis instead of time. This allows us to spot troublesome noise frequencies which appear when we don't want them to. The FFT is a very common mathematical technique which is widely used in signal processing, not just in audio. 08 There is software which will create pretty coloured animations of sound waves, but this is not what you want. These are simply decorative patterns and won't tell us what we want to know. -------------------- 09 Using Audacity Install Audacity if you haven't already. Start Audacity. Select file > import > audio, then navigate to your sample and select "open". The file should load. 10 In the wave form part of the window, click anywhere and then type Ctrl-S to select all data points. The chart should turn a slightly darker colour. From the menu, select Analyze > Plot Spectrum. A new window will open, showing magnitude in db on the Y axis, and frequency in hertz on the x axis. For "algorithm" be sure it is set to "spectrum" 11 There are now two settings that we need to play with while we look for problems. One is "size" The default for this is 1024. The other is "axis". The default for this is "log frequency". -------------------- 12 What to Look For What we are looking for are large obvious spikes that stand out in the data. Since our test signal has very little to no actual audio data, any spikes should represent electrical or other noise that doesn't belong there. 13 I have found two combinations of settings to be most helpful in finding problems. These are Size 2048, axis linear frequency. Size 32768, axis log frequency. 14 A small size value can help very narrow spikes stand out from the background more, while a large size value can help separate spikes from surrounding noise. A linear frequency axis can help with seeing all spikes across the full frequency range, while a log frequency axis can help to better see what is happening in the often very crowded lowest frequency range. -------------------- 15 A Real Example of an Audio Problem If you have good audio equipment you may find nothing obvious. If you cannot hear any noise in the signal, there may be none of any consequence and there is nothing for you to do. 16 However, in my case I found two main problems and one lesser one. One problem was a spike at 60 Hz, which is the AC line frequency. There is also a lesser problem of a collection of a broad frequency range of noise below 60Hz. Both of these however will be taken care of by the basic filtering that we looked at earlier so we do not need to worry about them here. 17 The other main problem is I had a large spike at every 1 kHz interval from 1 kHz to 19 KHz. This was noise generated within the head set electronics, or the result of noise on the USB power supply. This is the product of a cheap headset. 18 These spikes are not very large compared to the volume of my voice, but if I do the same sort of analysis of samples where I am speaking, they appear in the intervals between words. This results in a high pitched whine or buzz. This was the source of the background noise or buzz in my first two podcast episodes. I need to get rid of this. 19 One option would be to get a better microphone, but, well, that wouldn't be any fun would it. It would also cost money and I don't want to spend any of that if I don't have to. If you analyze your own signal, you may find a different pattern, or even no noise at all. If you did not find anything when shielding your microphone from ambient audio noise, repeat the same test but with the microphone exposed to acoustic noise in the room. -------------------- 20 Advanced Filtering The next step is to figure out how to get rid of this noise. I have called this section "advanced filtering", but we are actually just making use of a technique that was already covered in basic filtering. 21 To deal with the remaining spikes we can use additional "band reject" filters, each of which removes a specific frequency at 1 kHz intervals from 1 kHz to 12 kHz. We will use this in combination with the filtering that we have already done previously, so we don't need to worry about anything above 12 kHz as we already remove that with a low pass filter. After a small amount of experimenting I came up with the following. 22 Because I am applying a total of 16 filters, 4 for basic filtering and 12 to deal with the specific microphone problems that I have, I have broken up the filters into separate strings. I then generate the 12 new band reject filters from a template. Note that I don't show the "de-esser" filter here. I would recommend adding it as a separate step after doing the sort of filtering we are talking about here. 23 Rather than reading out multiple lines of bash script, I will post them in the show notes. I will give a brief description of them here which you can refer to when reading the show notes. The FFMPEG and Sox versions are very similar in concept so I don't need to go over the Sox version in detail. See the show notes for it. FFMPEG Version Here's the FFMPEG version. # The high and low pass filters. hlpfil="highpass=f=80, lowpass=f=12000" # Band reject filters filter for 60Hz and another for 50Hz. linefil="bandreject=f=60:width_type=h:w=20, bandreject=f=50:width_type=h:w=20" # Create a series of band reject filters, from 1 kHz to 12 kHz. # Change or remove this part if your recording hardware does not require it. ftemplate="bandreject=f=%s000:width_type=h:w=100" kilospikefil=$( seq 1 12 | xargs printf "$ftemplate," ) # Using ffmpeg ffmpeg -i input.flac -af "$hlpfil, $linefil, $kilospikefil" output.flac 24 There are a total of 5 lines of bash script. In the first line, we create a string called "hlpfil" which is just the high and low pass filters copied from our previous discussion on basic filtering. In the second line, we create a string called "linefil" which is just the simple bandreject filters to cover 50 and 60 hertz AC line noise filters also from basic filtering. 25 In the third and fourth lines, we create a string called "kilospikefil" containing the new filters. The "f" parameter represents the frequency we are targeting. The "w" parameter represents the "width" of the frequency range we are filtering in terms of hertz. The filter is applied gradually rather than with a sharp cut-off, so to get more filtering action we need to have larger width. In this case I decided to hammer the spike quite aggressively and so used a relatively wide width of 100 hertz. Testing with a voice file did not show any noticeable distortion, so it's an acceptable solution. 26 For this filter we need to create a dozen filter command so we use the shell "seq" command to generate a sequence of numbers from 1 to 12. We then pipe that into the xargs command which applies each number to the next command. The next command is "printf", which takes the number it gets from xargs and applies it to the "ftemplate" string template in a manner very similar to C programming printf string templates. 27 We also have a comma in there to separate each of the individual filters. We then surround this with a $ and () so we can run the command and capture the output into a variable. Then we call ffmpeg and pass it the filters we created by putting the variable names inside a double quoted string, separated by commas. All of this will be in the show notes, so don't worry about trying to get the exact details right now. Sox Version Here's the Sox version. # The high and low pass filters. sxhlpfil="highpass 80 lowpass 12000" # Band reject filters filter for 60Hz and another for 50Hz. sxfilter="$sxhlpfil $sxkilospikefil bandreject 60 20 bandreject 50 20" # Create a series of reject filters filters, from 1 kHz to 12 kHz. sxftemplate="bandreject %s000 100" sxkilospikefil=$( seq 1 12 | xargs printf "$sxftemplate " ) # Using SOX. sox input.flac output.flac $sxhlpfil $sxfilter $sxkilospikefil 28 The Sox version is very similar with the exception that the command arguments representing the filters must not be in quoted strings as Sox wants to see them as separate arguments instead of parsing a string. -------------------- 29 Confirming the Effect If we apply the above filters and look at this headset noise output file in the Audacity spectrum analyzer we will now see that these noise spikes are almost completely gone. We can now confirm how well this works by using a test audio file. Any normal short voice audio file will do for this. Just talk into the microphone normally and create a voice sample file that is 5 or 10 seconds long, or whatever you feel comfortable with. 30 With the original unfiltered voice audio I can hear a distinct high pitched whine overlaying the voice. With the filtered audio that whine or hum is not detectable. If we then look at the voice file in the Audacity spectrum analyzer, we can see distinct "notches" at the 50 Hz and 60 Hz frequencies, and at every 1 kHz from 1 kHz to 12 kHz. These notches are narrow enough that they won't cause a noticeable problem with voice signals. If we apply this filter to voice samples, the buzz or whine is gone and the voice signal sounds fine. Despite using a very cheap microphone, I now have acceptable quality audio for a podcast. 31 Again I want to emphasize that in this instance I am dealing with deficiencies with my hardware instead of buying a better microphone. These additional filters are intended to deal with the specific hardware problem I am facing. You don't need these additional filters if you cannot detect an audible problem. On the other hand, if you have a different problem you may wish to deal with a different set of frequencies. Finding these problems is the reason for using a spectrum analyzer. 32 FFMPEG has other filtering methods as well. However, as I didn't end up using them I can't really do an adequate job of describing them. If anyone has used them successfully, they are welcome to make a podcast on the subject. -------------------- 33 Completing the Process With these new filters added into the middle of the processing steps, you can now complete the processing by doing the de-essing, normalizing, and review steps as described in the previous episode. -------------------- 34 Command Line Recording I will now cover a separate topic, which is recording using command line programs. I am covering it in this episode as it is a short topic and it is convenient to talk about it here. 35 As well as using GUI based recording programs such as Gnome Sound Recorder, it is possible to record podcast episodes using command line tools such as FFMPEG. As for why you may wish to use command line tools to record audio, there are several reasons. One is that you may simply prefer to do it this way because it pleases you to do so. Another is that it allows the recording step to be included in a script that encompasses other parts of the process, automating what may have otherwise been separate manual steps. 36 However, if you don't find these arguments particularly compelling, then I'm not going to attempt to persuade you to use the command line to record audio. I am doing this part of this episode out of a desire to have a bit of fun and I probably won't be using it much myself. I will however use one of these methods to record this part of this episode. 37 Recording with FFMPEG - The Basics One of the common command line tools you can use is FFMPEG, a package which I have previously mentioned with respect to filtering audio files. Here is an example of how to record using FFMPEG. We call FFMPEG specifying the audio input system as the FFMPEG input, and then specify a file to output to. 38 # Record audio. ffmpeg -f pulse -i default ff.flac 39 Press 'q' to stop. This uses pulse audio on Linux for input "-f pulse", and the default input "-i default". However, this does not specify the the sample rate or mono recording. To do that we need to add a few more parameters as in the following 40 ffmpeg -f pulse -i default -ac 1 -ar 44100 ff.flac 41 "-ac 1" specifies mono output "-ar 44100" specifies 44.1 khz bit rate. 42 Playback with FFMPEG - The Basics FFMPEG can also play back music. In this case however we need to call the "ffplay" program rather than FFMPEG itself. To play an audio file, simply call ffplay and give it the name of the audio file as an argument to the command. For example: 43 # Play an audio file. ffplay podcast.flac 44 We can also call it with the "autoexit" option, which tells ffplay to automatically exit when the audio file has finished playing. ffplay -autoexit ff.flac 45 -autoexit means Exit when the audio file is done playing. 46 To exit in the middle of the recording, press "q' or ESC. To pause the playback, press "p" or space bar. To decrease the volume press "9" or "/". To increase the volume press "0" or "*". 47 To seek forward 10 seconds, press the right cursor button. To seek backward 10 seconds, press the left cursor button. To seek forward 1 minute, press the up cursor button. To seek backward 1 minute, press the down cursor button. 48 The "0" and "9" keys mentioned above are those on the top row of the keyboard, not the ones on the separate numeric pad. 49 While the recording is playing, a graphical window will open which shows a cascading waveform based on the current content. This is purely decorative and does not serve any particularly useful purpose. -------------------- #!/bin/bash # Record a podcast episode segment. # Get the next file name. # First we check if any matching file patterns exist. If they don't, # then we create the first one starting counting at 1. fcount=$( ls [0-9][0-9].flac 2>/dev/null | wc -l ) if (( $fcount < 1 )); then fname="01.flac" else # If there are any matching file patterns, we find the highest number # and increment it by 1. filenum=$( ls [0-9][0-9].flac 2>&1 | cut -d. -f1 | sort | tail -1 ) newfilecount=$(( 10#$filenum + 1 )) fname=$( printf "%02d.flac" $newfilecount ) fi echo "Recording to: $fname" # Record using ffmpeg. # This makes use of pulse audio and the input is the default audio input. # The sample rate is set to 44.1 kHz, and it is recorded as mono (1 channel). ffmpeg -f pulse -i default -ar 44100 -ac 1 $fname echo "Recorded audio to: $fname" # Report on basic information about the audio file that was just recorded. ffprobe -hide_banner $fname -------------------- 50 Sox - Not so Good I did not find the recording or playback features of Sox to be as useful as those of FFMPEG, so I won't bother to cover them here. -------------------- 51 Getting Information About an Audio Recording There are also command line tools which can be used to retrieve information about audio recordings. 52 FFMPEG Version With FFMPEG this is called "ffprobe". For example: 53 ffprobe hpr4566.mp3 54 This will print out a lot of information about FFMPEG itself. To skip that use the hide_banner option. 55 ffprobe -hide_banner hpr4566.mp3 56 This will print out information about the audio recording. This will include things like the duration, bit rate, sample rate, stereo or mono, etc. If the author added metadata tags to the file, it will also show those. HPR add things like the title, author, copyright license, comment, etc. You can extract the ones you want using something like grep and cut. 57 Sox Version Sox has a similar feature, called "soxi". 58 soxi ff.flac 59 However, it may not work on mp3 files if you do not have an mp3 handler for it installed. -------------------- 60 Conclusion In this episode we took a brief look at an example of how to solve an audio problem through filtering. We looked at how to use Audacity to find where the problems were. We then looked at how to apply filters to remove these sources of noise. We also looked at how to record podcasts and get information about audio files using command line tools. 61 In the next episode we will look at alternatives to Audacity for analyzing audio. While Audacity works just fine, this is an opportunity to have a bit fun with some gratuitous hackery. 62 This has been the third episode in a four part series on simple podcasting. -------------------- -------------------- Full Audio Processing Pipeline This version includes the special filters used to fix my headset problems. Use the version from the previous episode if you do not have the same audio hardware problems. #!/bin/bash # Full processing pipeline for making simple podcasts. # ====================================================================== # Concatenate multiple flac files into a single flac file. # This is used to combine podcast recorded segments into a single # flac file for uploading to HPR. concataudio () { outputname="$1" # First create the list file. printf "file '%s'n" [0-9][0-9].flac > podseglist.txt # Now concatenate them ffmpeg -f concat -safe 0 -i podseglist.txt "$outputname" rm podseglist.txt } # ====================================================================== # Basic and advanced filters. filter () { inputfile=$1 outputname=$2 # Using ffmpeg. # The high and low pass filters. hlpfil="highpass=f=80, lowpass=f=12000" # Band reject filters filter for 60Hz and another for 50Hz. linefil="bandreject=f=60:width_type=h:w=20, bandreject=f=50:width_type=h:w=20" # Create a series of band reject filters, from 1 kHz to 11 kHz. ftemplate="bandreject=f=%s000:width_type=h:w=100" kilospikefil=$( seq 1 11 | xargs printf "$ftemplate," ) # Using ffmpeg ffmpeg -i $inputfile -af "$hlpfil, $linefil, $kilospikefil" $outputname } # ====================================================================== # De-Essing. deessing () { inputfile=$1 outputname=$2 option=$3 # De-essing filter. ffmpeg -i $inputfile -filter_complex "deesser=i=0.5:m=0.5:f=0.5:s=$option" -b:a 336k -sample_fmt s16 $outputname } # ====================================================================== # Normalizing the audio to EBU R128 standard for review using ffmpeg. normffmpeg () { inputfile=$1 outputname=$2 # Normalize to EBU R128 standard. ffmpeg -i $inputfile -af loudnorm=I=-17:TP=-2.0:LRA=4.0 -ar 44.1k $outputname } # ====================================================================== # Output an MP3 version to help with reviewing. mp3convert () { inputfile=$1 # Get the name of the file and then create the output file name. j=$( basename $inputfile ".flac" ) outputname="$j"".mp3" # Convert to MP3. ffmpeg -i $inputfile $outputname } # ====================================================================== # Concatenate the separate audio files. concataudio fullpod-unfiltered.flac # Basic filtering. filter fullpod-unfiltered.flac filtered.flac # De-essing. This is the version to send for publishing. # The third argument should be "o" for de-essing, or "i" for pass through without de-essing. deessing filtered.flac fullpod.flac o # Normalized for review. normffmpeg fullpod.flac fullpod-norm.flac # Output an MP3 copy for review. mp3convert fullpod-norm.flac -------------------- -------------------- Provide feedback on this episode.

    HPR4637: UNIX Curio #6 - at and batch

    Play Episode Listen Later May 12, 2026


    This show has been flagged as Clean by the host. This series is dedicated to exploring little-known—and occasionally useful—trinkets lurking in the dusty corners of UNIX-like operating systems. I would imagine that most users of UNIX-like systems have heard of cron —certainly any system administrator should have. Briefly, cron is a way of running a job repeatedly based on the time and date; for example, a job could run every hour, at 5:00am every Tuesday, or the 3rd of every month. It is commonly used for administrative or maintenance tasks that should be done on a regular schedule, such as checking for software updates, rotating log files, or updating the database for the locate command. As well-known as cron is, there is a similar utility that very few seem to be aware of: at . This is the word "at", and has nothing to do with the at symbol "@". An at job is very much like a cron job, except that an at job only runs one time. A job is submitted by running at timespec 1 , where timespec is the time and date the job is to be run. The linked POSIX specification page describes acceptable formats for timespec ; some examples are " now ", " 14:00 ", " noon tomorrow ", " 14:00 + 3 months ", and " 14:00 January 19, 2038 ". The utility then waits on standard input for you to enter a set of commands to be run in the job. You end input by typing Control-D to mark the end of text. (As an alternative to typing in the job, you could instead use the "

    HPR4636: 7 seconds memory

    Play Episode Listen Later May 11, 2026


    This show has been flagged as Explicit by the host. There are two themes of the human experience that influence greatly our feelings and our behaviours: the memory, and the pain. Today we are going to talk about the first. Clive Wearing was a conductor, a musician, that lost a part of his brain. A virus, herpes simplex, that causes fever, in his case trespassed the barrier between blood and brain and caused an inflammation that damaged permanently the hypothalamus, responsible for memory. Immediately — after being cured of the infection by antiviral medicine —, he was a man with no memory. He couldn't recognize his children — who, later, recognized they kind of abandoned the father, ceased the visits to him, because that condition was too sad for them. In the first moments, Clive was too angry, “I can't think” was a constant. “Prisoner of the consciousness”, is the title of the TV documentary produced on him soon after the event. His wife — the second, not the mother of his two sons and one daughter — was his fullest “item” of memory — if we could picture memory as drawings in a piece of furniture, what of course is inexact, to say the minimum. He could still know, ever, that she, Deborah, was his wife; and, apart from his own's, Deborah's name was the only one he still knew. His angriness was surplice by a calm and gentle and gistful personality. Like, apart from the loss of memory, he kept two thirds of this personality: he definitely was Clive. (That observation is from one of his sons, in the documentary made 20 years after the first, called “7 seconds memory”). That is why Deborah, after divorcing him, and couldn't having find another love (she was searching for Clive in other experiences, which she couldn't find), later renewed the wedding vows with her husband; even though they couldn't live together because of his need of constant supervision. The doctors — as the 2nd documentary, that is the line for this program, says — could not explain how he became more peaceful. I have a guess. Clive lost memory of events, he could not live in his mind any happenings. He knew her wife was his wife, but had no memory of the wedding; remembered having worked for BBC, but not one thing, not one activity, that he has done or participated. Maybe he have retained a little bit of what we could call (and I lack any technical precision here) descriptive memory. He could retain the old relations of a name with a characteristic, a face with the level of proximity he had with the person, as long as they (these relations) were verbalized in his understanding. Because he could not evoke any fact, he lost the (other term with precision) narrative memory — but words still made sense to him. So, in living the same day every day, with no time, no continuity, maybe some perception could have been engraved in his mind, unconsciously or not, even with the damaged memory, in the direction of going on (letting go) without despair. This is only a guess. Thank you. Provide feedback on this episode.

    HPR4635: What did I do at work today? Part 3 Section 1

    Play Episode Listen Later May 8, 2026


    This show has been flagged as Explicit by the host. This is part of the documentation of an API class, documenting a particular a feature:- **Field:** actions **Value:** Create extra relationships e.g. set the type to 'contact' ``` { "trigger": "update", "action": "add", "relationship": "7024", "child": "2085"} ``` *Currently "update" is the only trigger and "add" is the only action.* Tools Joplin - Joplin is an open source, cross platform note-taking app. - https://joplinapp.org/ PHP - A popular general-purpose scripting language that is especially suited to web development. Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world. - https://www.php.net/ MySQL - MySQL is an open-source relational database management system. MariaDB is community driven fork of MySQL, often installing the MySQL package on a Linux distribution will actually install MariaDB. - https://en.wikipedia.org/wiki/MySQL - https://mariadb.org/ - https://www.mysql.com/ Sublime Text - Cross platform text editor - https://www.sublimetext.com/ Typora - A simple yet powerful markdown reader - https://typora.io/ Ubuntu / KUbuntu - https://en.wikipedia.org/wiki/Ubuntu Google Drive / Google Docs - Cloud based workspace, storage and office tools. - https://en.wikipedia.org/wiki/Google_Drive - https://en.wikipedia.org/wiki/Google_Docs Graph databases - A graph database is a database that uses graph structures for semantic queries with nodes, edges, and properties to represent and store data. A key concept of the system is the graph (or edge or relationship). The graph relates the data items in the store to a collection of nodes and edges, the edges representing the relationships between the nodes. - https://en.wikipedia.org/wiki/Graph_database Autojump - autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line - https://github.com/wting/autojump Object Oriented Programming - a programming paradigm based on the concept of objects. Objects can contain data (called fields, attributes or properties) and have actions they can perform (called procedures or methods and implemented in code). - https://en.wikipedia.org/wiki/Object-oriented_programming Grep, Silver Searcher & RipGrep - grep is a command-line utility for searching plaintext datasets for lines that match a regular expression. The Silver Searcher is a code searching tool similar to ack, with a focus on speed. ripgrep is a line-oriented search tool that recursively searches the current directory for a regex pattern. - https://github.com/ggreer/the_silver_searcher - https://github.com/BurntSushi/ripgrep Swagger & OpenAPI - The OpenAPI Specification defines a standard, language-agnostic interface to HTTP APIs which allows both humans and computers to discover and understand the capabilities of the service. - https://swagger.io/specification/ Zeal - an offline documentation browser for software developers. - https://zealdocs.org/ Ollama - a tool to get up and running with large language models, especially allowing installation on a local machine. - https://ollama.com/ SSH Config - A file typically with the path '~/.ssh/config' used for setting options of the secure shell client that connects the terminal to remote computers. - https://man7.org/linux/man-pages/man5/ssh_config.5.html Provide feedback on this episode.

    HPR4634: Upgrade Failsause

    Play Episode Listen Later May 7, 2026


    This show has been flagged as Clean by the host. https://rufus.ie/en/ Kasa Smart Plug Mini with Energy Monitoring, Smart Home Wi-Fi Outlet Works with Alexa, Google Home & IFTTT, Wi-Fi Simple Setup, No Hub Required (KP115), White INIT STUFF Sudoers Apps apt update && apt install -y psmisc screen net-tools snapd pipx xbindkeys xbindkeys-config git nmap mono-runtime etherwake cloudflare-ddns mlocate samba # python pipx gahh su plex - pipx install python-kasa # sudo mkdir /root/PYTHONVENV/ python3 -m venv /root/PYTHONVENV/ pipx install python-kasa pipx ensurepath # update db mount -a sed 's//media//g' -i.bak /etc/updatedb.conf updatedb Contab 0 0 * * * /usr/local/bin/cloudflare-ddns --update-now 0 7 * * * /usr/local/bin/etherwake -i enp1s0 -D "d8:bb:c1:a2:2c:0b" 0 3 * * * /usr/bin/veracrypt -d 0 0 5 * * /usr/local/sbin/BSA.sh Mounts cat /etc/fstab UUID=2317187b-c592-46a7-8d8e-45c7d1eae7fc / ext4 errors=remount-ro 0 1 UUID=61A0-586A /boot/efi vfat umask=0077 0 1 UUID=db166a45-1afb-47dc-85cd-cbfcb06a9766 none swap sw 0 0 # data UUID=dbb20dc6-9487-4510-9ab1-c7bbc3014cdb /media/data ext4 defaults,nofail,noatime 0 2 # moredata UUID=5df24408-36ae-4205-8ecb-9d523dc4d820 /media/moredata ext4 defaults,nofail,noatime 0 2 # backup UUID=c1aac0d2-73ca-4d95-883f-5e1f43b5cd13 /media/backup ext4 defaults,nofail,noatime 0 2 Tunefs sudo tune2fs -c 5 -i 7d -C 1 /dev/sdd2 sudo tune2fs -c 5 -i 7d -C 1 /dev/sdb1 sudo tune2fs -c 5 -i 7d -C 1 /dev/sda1 sudo tune2fs -c 5 -i 7d -C 1 /dev/sdc1 XFCE Autologin # /etc/lightdm/lightdm.conf [Seat:*] autologin-user=plex autologin-user-timeout=0 # Enable service systemctl enable lightdm UPower ( do not run pwrstatd ) cat ./UPower/UPower.conf [UPower] EnableWattsUpPro=false NoPollBatteries=false IgnoreLid=false UsePercentageForPolicy=true PercentageLow=10 PercentageCritical=3 PercentageAction=2 TimeLow=1200 TimeCritical=300 TimeAction=120 CriticalPowerAction=HybridSleep PLEX RESTORE/BACKUP /home/plex/Library /media/moredata/_PLEX/usr/lib/plexmediaserver/ Backup ? https://github.com/sinicide/ansible-vm/blob/master/roles/plex/files/pms-backup.sh Autostart Plex /home/plex/.config/autostart# cat PLEX_STARTUP.desktop [Desktop Entry] Encoding=UTF-8 Version=0.9.4 Type=Application Name=KODI_STARTUP Comment=KODI_STARTUP Exec=/home/plex/.local/bin/Plex.sh OnlyShowIn=XFCE; StartupNotify=false Terminal=false Hidden=false RunHook=0 OMBI Sabnsbd+ IDK ... ?!!?!?!? 251 pipx install git+https://github.com/sabnzbd/sabnzbd.git 252 pipx install sabnzbd 253 pipx inject sabnzbd feedparser configobj cherrypy portend chardet cheetah3 puremagic guessit babelfish tmdbsimple 254 pipx install sabnzbd 255 python3 -m venv venv 256 source venv/bin/activate 257 pip install -r requirements.txt 258 cat > ~/sabnzbd/sabnzbd-wrapper.sh ~/sabnzbd/sabnzbd-wrapper.sh

    HPR4633: Ham Radio Licence

    Play Episode Listen Later May 6, 2026


    This show has been flagged as Clean by the host. "The Foundation licence is your gateway to the world of amateur radio The course and exam that leads to the licence provides you with an exciting introduction to the hobby while ensuring you can operate safely and without causing issues to other radio users. The licence entitles you to a unique call sign which you use to identify yourself when transmitting. Foundation licences are issued by Ofcom, the UK's communications regulator." From: https://rsgb.org/main/clubs-training/for-students/foundation/ Provide feedback on this episode.

    HPR4632: Hackerpublic Radio New Years Eve Show 2026 Episode 6

    Play Episode Listen Later May 5, 2026


    This show has been flagged as Explicit by the host. Sauced https://www.urbandictionary.com/define.php?term=sauced Chevrolet Vega https://en.wikipedia.org/wiki/Chevrolet_Vega Chevrolet small-block engine (first- and second-generation) https://en.wikipedia.org/wiki/Chevrolet_small-block_engine_(first-_and_second-generation) https://www.chevrolet.com/performance-parts/crate-engines/small-block-engines/350-engine Straight-six engine https://en.wikipedia.org/wiki/Straight-six_engine Half marathon https://en.wikipedia.org/wiki/Half_marathon Mammoth March https://www.mammothmarch.com/ What Is Sleep Apnea? https://www.nhlbi.nih.gov/health/sleep-apnea https://en.wikipedia.org/wiki/Apnea Spaceballs https://en.wikipedia.org/wiki/Spaceballs https://www.imdb.com/title/tt0094012/ Ale 8 One Special Edition Cherry Zero Sugar https://ale8one.com/varieties/ https://www.amazon.com/Ale-One-Special-Bottles-Kentucky/dp/B09JBBDKM1 https://www.kroger.com/p/ale-8-one-zero-sugar-cherry-soda-bottles/0007227546202 Alcoholism https://en.wikipedia.org/wiki/Alcoholism https://www.cdc.gov/nchs/fastats/alcohol.htm Jitsi https://jitsi.org/ https://en.wikipedia.org/wiki/Jitsi Surface Pro 6 https://support.microsoft.com/en-us/surface/surface-pro-6-specs-and-features-ade5cfc2-e99a-6fd1-abbe-c0e8a8a3942d Xfce Desktop Environment https://www.xfce.org/ https://en.wikipedia.org/wiki/Xfce Trinity Desktop Environment https://www.trinitydesktop.org/ https://en.wikipedia.org/wiki/Trinity_Desktop_Environment Cheese https://wiki.gnome.org/Apps/Cheese Altered https://www.imdb.com/title/tt32123395/ Final fireworks sales take off with a bang as countdown begins. https://www.dutchnews.nl/2025/12/final-fireworks-sales-take-off-with-a-bang-as-countdown-begins/ https://www.theguardian.com/world/2026/jan/09/dutch-netherlands-fireworks-ban-new-years-eve Fireworks policy in the Netherlands https://en.wikipedia.org/wiki/Fireworks_policy_in_the_Netherlands Quarter of idiom https://www.merriam-webster.com/dictionary/%28a%29%20quarter%20of LinuxLugCast https://linuxlugcast.com/ Needs must idiom https://www.phrases.org.uk/meanings/needs-must.html Tech and Coffee. https://techandcoffee.info/ January 6 United States Capitol attack https://en.wikipedia.org/wiki/January_6_United_States_Capitol_attack OggCamp 2026 https://www.oggcamp.org/ List of benchmarking methods and software tools https://en.wikipedia.org/wiki/List_of_benchmarking_methods_and_software_tools Watchhouse https://watchhouseband.com/ Proper feline supervision (Just because) https://blog.catbandit.com/why-does-my-cat-always-watch-me-exploring-the-reasons-behind-feline-observation/ https://www.cats.org.uk/cats-blog/why-does-my-cat-stare-at-me https://thepurrfectguide.com/cat-supervised-introduction-guide/ https://catvets.com/clinical-resources/practice-guidelines/ WYSIWYG https://pl.wikipedia.org/wiki/WYSIWYG Pandoc a universal document converter https://pandoc.org/ Rendering on the Web https://web.dev/articles/rendering-on-the-web F-Droid https://en.wikipedia.org/wiki/F-Droid https://f-droid.org/en/ Get UTC time in seconds https://stackoverflow.com/questions/24547655/get-utc-time-in-seconds Content delivery network https://en.wikipedia.org/wiki/Content_delivery_network Audio feedback https://en.wikipedia.org/wiki/Audio_feedback Loopback https://en.wikipedia.org/wiki/Loopback List of conspiracy theories https://en.wikipedia.org/wiki/List_of_conspiracy_theories Jason Scott https://en.wikipedia.org/wiki/Jason_Scott Bug vs Feature https://devrev.ai/blog/bug-vs-feature-request-a-distinction-without-a-difference https://blog.codinghorror.com/thats-not-a-bug-its-a-feature-request/ chronic dehydration https://en.wikipedia.org/wiki/Dehydration https://www.nhs.uk/conditions/dehydration/ https://medlineplus.gov/dehydration.html https://www.healthline.com/health/chronic-dehydration Atlantic Highly Migratory Species Fishery Compliance Guides https://www.fisheries.noaa.gov/atlantic-highly-migratory-species/atlantic-highly-migratory-species-fishery-compliance-guides https://www.fisheries.noaa.gov/highly-migratory-species https://www.ecfr.gov/current/title-50/chapter-VI/part-635 Federal Bridge Gross Weight Formula https://en.wikipedia.org/wiki/Federal_Bridge_Gross_Weight_Formula https://ops.fhwa.dot.gov/FREIGHT/publications/brdg_frm_wghts/index.htm Convenience store https://en.wikipedia.org/wiki/Convenience_store Listing Linux Users and Groups: A Comprehensive Guide https://linuxvox.com/blog/list-linux-users-and-groups/ Plugable 250x Digital USB Microscope with Observation Stand https://plugable.com/products/usb2-micro-250x What's the difference between Medicare and Medicaid? https://www.hhs.gov/answers/medicare-and-medicaid/what-is-the-difference-between-medicare-medicaid/index.html https://www.medicare.gov/basics/costs/help/medicaid Provide feedback on this episode.

    HPR4631: HPR Community News for April 2026

    Play Episode Listen Later May 4, 2026


    This show has been flagged as Explicit by the host. New hosts There were no new hosts this month. Last Month's Shows Id Day Date Title Host 4608 Wed 2026-04-01 Simple Podcasting - Episode 1 - Preparation and Recording Whiskeyjack 4609 Thu 2026-04-02 Proper Date Format Ahuka 4610 Fri 2026-04-03 Playing Civilization V, Part 10 Ahuka 4611 Mon 2026-04-06 HPR Community News for March 2026 HPR Volunteers 4612 Tue 2026-04-07 Hackerpublic Radio New Years Eve Show 2026 Episode 4 Honkeymagoo 4613 Wed 2026-04-08 Adding functionality to an Odoo installation Jeroen Baten 4614 Thu 2026-04-09 Dauug|18: Faster Than a '286, but Inspectable Like a Soroban Marc W. Abel 4615 Fri 2026-04-10 Clicking through an audit Lee 4616 Mon 2026-04-13 Thoughts about age control and further suggestions Trollercoaster 4617 Tue 2026-04-14 UNIX Curio #4 - Archiving Files Vance 4618 Wed 2026-04-15 Simple Podcasting - Episode 2 - Basic Filtering Whiskeyjack 4619 Thu 2026-04-16 HPR Beer Garden 12 - Baltic Porter Kevie 4620 Fri 2026-04-17 The Second Doctor, Part 1 Ahuka 4621 Mon 2026-04-20 Android volume control help operat0r 4622 Tue 2026-04-21 Hackerpublic Radio New Years Eve Show 2026 Episode 5 Honkeymagoo 4623 Wed 2026-04-22 A brief infodump on the Broadcast Address and Routing Jon The Nice Guy 4624 Thu 2026-04-23 Cheap Yellow Display Project Part 7: GUI Trying a Simple Hello World Trey 4625 Fri 2026-04-24 Site Specific Browsers Lee 4626 Mon 2026-04-27 Cable Management / PC Speakers operat0r 4627 Tue 2026-04-28 UNIX Curio #5 - Faster, Pussycat! Kill! Kill! Vance 4628 Wed 2026-04-29 Nuclear Power Technology Follow Up Whiskeyjack 4629 Thu 2026-04-30 What did I do at work today? Part 2 Lee Comments this month Past shows hpr4424 (2025-07-17) "How I use Newsboat for Podcasts and Reddit" by Archer72. Ken Fallon said: "Summary of findings" (2026-04-05 14:09:24) Archer72 said: "Not fixed from أحمد المحمودي" (2026-04-25 11:02:26) hpr4569 (2026-02-05) "Kiosk with guest mode on Linux" by Klaatu. 0xf10e said: "Preconfiguring browsers profiles? and re-replies ;)" (2026-04-17 09:56:49) hpr4585 (2026-02-27) "mpv util scripts" by candycanearter. candycanearter07 said: "perpetually updated script(s)" (2026-04-14 20:41:28) hpr4596 (2026-03-16) "Adding voice-over audio track created using text to speech on the movie subtitles" by Ken Fallon. Windigo said: "Great usability win" (2026-04-24 19:33:03) hpr4600 (2026-03-20) "The First Doctor, Part 5" by Ahuka. Kevin O'Brien said: "Maybe I will" (2026-04-12 16:16:00) hpr4603 (2026-03-25) "On the Erosion of Freedom in Open Source Software" by HopperMCS. Trollercoaster said: "Hopper did time traveling!" (2026-04-09 05:46:52) hpr4605 (2026-03-27) "Lee locks down his wifey poo" by Elsbeth. Lee said: "Quotation" (2026-04-05 15:59:54) Paulj said: "Thanks!" (2026-04-06 16:44:28) hpr4606 (2026-03-30) "My Nerdy Childhood: From Floppy Disks to Dial-Up Dreams" by Trollercoaster. Trollercoaster said: "Damn you Nerdy Nostaliga!" (2026-04-06 15:28:34) This month's shows hpr4608 (2026-04-01) "Simple Podcasting - Episode 1 - Preparation and Recording" by Whiskeyjack. Archer72 said: "Listening ahead" (2026-04-01 10:06:46) Whiskeyjack said: "Reply to Archer72 on HPR4608" (2026-04-01 12:27:46) Reto said: "It reminds me about Solocast" (2026-04-03 07:49:58) Whiskeyjack said: "Response to Reto comment on HPR4608" (2026-04-04 18:19:25) Whiskeyjack said: "Further response to Reto comment on HPR4608" (2026-04-04 22:21:38) hpr4609 (2026-04-02) "Proper Date Format" by Ahuka. Jim DeVore said: "It is the only proper date format" (2026-04-04 14:19:15) candycanearter07 said: "sensical date format" (2026-04-06 09:37:47) hpr4611 (2026-04-06) "HPR Community News for March 2026" by HPR Volunteers. candycanearter07 said: "misattributed comment" (2026-04-06 03:24:30) Ken Fallon said: "Fixed" (2026-04-06 13:50:17) hpr4614 (2026-04-09) "Dauug|18: Faster Than a '286, but Inspectable Like a Soroban" by Marc W. Abel. Jim DeVore said: "Is this the best approach for privacy?" (2026-04-12 03:15:44) candycanearter07 said: "interesting!" (2026-04-13 16:43:22) hpr4616 (2026-04-13) "Thoughts about age control and further suggestions" by Trollercoaster. Antoine said: "'Jus'do the age verification'" (2026-04-20 01:37:33) candycanearter07 said: "good strategy" (2026-04-22 13:24:48) Trollercoaster said: "Looking forward at next steps" (2026-04-25 15:37:22) Antoine said: "Our State. The Invitation." (2026-04-26 23:55:45) hpr4618 (2026-04-15) "Simple Podcasting - Episode 2 - Basic Filtering" by Whiskeyjack. Antoine said: "Applying filters - exp. with declicking - Compression?" (2026-04-20 12:50:09) Whiskeyjack said: "Response to Antoine on de-essing in HPR 4618" (2026-04-22 15:59:57) Vance said: "Click removal" (2026-04-25 14:31:40) Whiskeyjack said: "Reply to Vance in HPR4618 - Click Removal" (2026-04-27 00:48:11) Vance said: "To Whiskeyjack - Click Removal" (2026-04-28 00:43:11) Whiskeyjack said: "Reply to Vance on Click Removal in HPR4618" (2026-04-28 17:16:54) hpr4619 (2026-04-16) "HPR Beer Garden 12 - Baltic Porter" by Kevie. Gan Ainm said: "Störtebeker - again" (2026-04-17 16:37:29) hpr4621 (2026-04-20) "Android volume control help" by operat0r. candycanearter07 said: "intended double entendre?" (2026-04-21 18:58:54) hpr4624 (2026-04-23) "Cheap Yellow Display Project Part 7: GUI Trying a Simple Hello World " by Trey. Ken Fallon said: "Great to hear your success" (2026-04-23 08:36:28) hpr4625 (2026-04-24) "Site Specific Browsers" by Lee. candycanearter07 said: "electron charged opinion" (2026-04-24 03:38:13) hpr4627 (2026-04-28) "UNIX Curio #5 - Faster, Pussycat! Kill! Kill!" by Vance. Antoine said: "kill and killall" (2026-04-29 11:57:27) candycanearter07 said: "killer episode" (2026-04-29 15:14:31) Vance said: "Glad you enjoyed it" (2026-04-29 20:58:44) candycanearter07 said: "Re: Glad you enjoyed it" (2026-04-30 18:58:50) Mailing List discussions Policy decisions surrounding HPR are taken by the community as a whole. This discussion takes place on the Mailing List which is open to all HPR listeners and contributors. The discussions are open and available on the HPR server under Mailman. The threaded discussions this month can be found here: https://lists.hackerpublicradio.com/pipermail/hpr/2026-April/thread.html Events Calendar With the kind permission of LWN.net we are linking to The LWN.net Community Calendar. Quoting the site: This is the LWN.net community event calendar, where we track events of interest to people using and developing Linux and free software. Clicking on individual events will take you to the appropriate web page. Provide feedback on this episode.

    HPR4630: Playing Civilization V, Part 11

    Play Episode Listen Later May 1, 2026


    This show has been flagged as Clean by the host. In our final look at the game mechanics for Civilization V we look at all of the players and their unique attributes. This helps you to see that certain Empires can be better suited for particular victory strategies. Playing Civilization V, Part 11 The Players By the time you got to the last expansion and all of the DLC, there are 43 possible Empires you can play as. But they are not all alike. Each Empire has a particular Leader, a Unique Ability, and a Unique Unit. In addition most of them have some kind of Starting Bias, and many have a Unique Building or a Unique Improvement. Understanding how to make use of these is important to your strategy. If you let random chance assign you to an Empire, you need to know what kind of strategy will work with that Empire. And if you want to pursue a particular strategy you will want to know how to pick an appropriate Empire to fit strategy. There is a chart that lists all 43 Empires with all of their parameters at the Civilization Fandom Wiki and you might want to bookmark that page for future reference. Also, you want to know what to expect concerning your opponents in a game. Leader You don't have a choice of leaders. When you choose a particular Empire you get the Leader that comes with it. But these leaders are distinct in various ways. To see what I mean, go to the Leader page for one by clicking on the link under the Leader picture. You will see a long list of AI Traits. These describe in numerical terms how competitive the Leader is various ways, how prone to war, which kinds of units it will build, and so on. It is a long list, so your eyes may glaze over, but the significance is that it may give you some insight if this Leader is one of your opponents in a game. This list is how the AI is programmed. There is also more approachable summary under Personality and Behavior, and here is what it says about Pedro II of Brazil: “Pedro will most commonly try for a cultural victory. If he pursues a different victory condition, he is likely to choose a diplomatic one over a scientific or domination victory. Pedro is exceptionally friendly and loyal, and will readily befriend anyone but the most warlike leaders. He is more willing to denounce than to wage war himself, but will maintain a defensive militia comprised of a variety of units. He also has a habit of building a fairly large navy. Fittingly, Pedro's highest priority is the Happiness of his people, followed by the development of his lands and Culture. He will not claim a large territory, but his cities will be highly populated and the land and water around them will be full of improvements. He will sometimes try to build wonders that enhance his Culture and Tourism output. Pedro is friendly toward city-states in his sphere of influence and will often pledge to protect them. He will hardly ever attack or bully them.” Now, the point is that this describes your AI opponent. If you choose to play as Pedro II of Brazil, you can make entirely different decisions from what the AI would do Starting Bias Each Empire will spawn on the map in ways that reflect their Starting Bias, if any. Some Empires (e.g. China, France, etc.) have no Starting Bias at all, which means they can spawn anywhere on the map, though there is programming to ensure that the location is not a disaster, like all Tundra and Ice, or the middle of the ocean. So it will certainly be playable. Still some players like to try 2,3, or 4 times to spawn to see if they can get a good place to start.. For the Empires with a Starting Bias, it can be either positive or negative. For example, the Mongolian Empire has a bias towards starting on plains, which makes sense historically since they came from the plains of Central Asia. The Russian Empire has a bias to start in Tundra, which again seems to fit. The Songhai Empire has a negative Starting Bias, which is to avoid Tundra. The Songhai Empire historically was an empire in sub-Saharan Africa, so this makes sense. And the Siamese Empire avoids Forests. The Roman and Shoshone Empires have no Starting Bias at all, so they could spawn anywhere. This Starting Bias will apply to whichever Empire you choose to play, so if you would prefer to not play with a lot of Tundra, you would de well to not choose Russia. But Russia can do more with Tundra than some other Empire might, so it all balances out. Unique Ability Generally speaking each Empire will have a Unique Ability. For example, the Austrian Empire has the Unique Ability called Diplomatic Marriage, which allows them to spend Gold to annex or puppet any City-State that they have been allied to for at least 5 turns. If the City-State is annexed, it becomes part of the Austrian Empire, but if it is puppeted the City-State technically remains separate but is under the control in some ways of the Austrian Empire. India has a Unique Ability called Population Growth. This doubles the unhappiness caused by more cities, but reduces by 50% the unhappiness caused by increased population. So if you were playing India it is even more important to build Tall rather than Wide. Unique Units Every Empire has at least one, and sometimes two Unique Units. These units replace a normal unit, but are a little better in some respect. They are worth having, but some are more useful than others. And a key factor is when they are available to you. For example, the Celtic Empire gets the Pictish Warrior, which replaces the Spearman. Since the Spearman is generally the first unit you learn to build, it comes very early in the game. So if you were interested in a strategy of early warfare, this might matter to you. The Pictish Warrior is actually weaker than the Spearman in one respect, though, in that it gets no bonus against mounted units. So if you are the Celts, and you are facing the Mongols, you will have a problem. But the Pictish Warrior can pillage without any movement cost. Normally when you use a unit to pillage it ends your turn, but the Pictish Warrior could pillage and then move if it still had movement left. And the Pictish Warrior also has the Foreign Lands Bonus, which gives it a 20% bonus when fighting outside of Celtic territory. And finally the Pictish Warrior gets a Faith bonus when it kills an enemy unit, equal to 50% of the killed unit's strength. The American Empire is one that has 2 Unique Units. One is the B-17 bomber, which replaces the regular Bomber. It comes with 2 promotions (Siege I, and Evasion), and is slightly stronger (70 vs. 65). The problem with this is that it comes so late in the game that it is hard to see what good it will do you. If you are pursuing a Domination strategy you should have already gone most of the way to conquering the world before you actually get the B17. The other Unique Unit the Americans get is the Minuteman, which replaces the Musketman. It comes with a Drill I Promotion, ignores Terrain restrictions, and earns points towards a Golden Age. This is more useful than the B17, but not useful enough to push you towards a Domination victory. But since you need good units for any strategy, if only for defense, it is worth having. Personally, if I was playing as the Americans I would rather go for a Science victory. Unique Buildings/Improvements The last parameter for these Empires is the possible Unique Building or Unique Improvement. Some Empires, such as the Byzantines or the Japanese, do not have one, but they can be useful. For example, the Portuguese Empire has a unique building called the Feitoria which has the interesting property of being built outside of Portugal's territory. The Feitoria, which becomes available once you discover Navigation, can be built in the territory of a Coastal City-State on a Coastal Land tile that has no resources on it. It has three properties: Portugal gets one copy of each Luxury Resource the City-State has. This is great for either increasing Happiness or as something that can be traded with other Empires. +50% defensive strength for any combat units on the tile. Pillaging the Freitoria constitutes an Act of War against Portugal, which means Portugal gets no penalties for going to war. Another example is the Dutch Polder, which can be built on any Marsh or Flood Plain tile. It gives +3 Food, and once you discover Economics it will also yield +1 Production and +1 Gold. Summary Studying the chart of the Empires can help you in picking strategies for the Empire you are playing, or help you to pick an Empire that is well suited to the strategy you want to try. And knowing how the AI is programmed for other Empires helps you to know what to expect in your game. But here are some suggestions. Note that you can win with any Civ, but these are ones that lend themselves to a particular strategy. That said, I usually let the game give me a random choice and then formulate my strategy when I see what I get. Domination Germany Japan Rome Songhai Mongols Science Babylon Korea Poland America Culture Brazil Polynesia Poland France Diplomatic Greece Arabia Portugal Links: https://civilization.fandom.com/wiki/Civilizations_(Civ5) https://www.palain.com/gaming/civilization-v/playing-civilization-v-part-11/ Provide feedback on this episode.

    HPR4629: What did I do at work today? Part 2

    Play Episode Listen Later Apr 30, 2026


    This show has been flagged as Clean by the host. This show is about developing features for a web application. The technology used is ASP.Net WebForms , the programming language is Visual Basic .Net along with HTML and CSS and the development environment is Windows 11 running under a virtual machine in Linux, with Visual Studio and SQL Server as the database. Other tools used are Git , Github , Joplin and Dropbox , Google Gemini and a tool called Beyond Compare . ResourceRowControl.ascx.vb Public WriteOnly Property ResourceObject As Resource Set(obj As Resource) If obj IsNot Nothing Then HiddenResourceID.Value = CStr(obj.ResourceID) HiddenResourceTypeID.Value = CStr(obj.ResourceTypeID) Resource.Text = obj.ResourceName Type.Text = obj.ResourceTypeName Available.Checked = obj.ResourceAvailable End If End Set End Property Private Sub Available_CheckedChanged(sender As Object, e As EventArgs) Handles Available.CheckedChanged Dim objResource As New Resource With objResource .ResourceID = ResourceID .ResourceName = Resource.Text .ResourceTypeID = ResourceTypeID .ResourceAvailable = Available.Checked End With objResource.Add() End Sub ResourceRowControl.ascx Provide feedback on this episode.

    HPR4628: Nuclear Power Technology Follow Up

    Play Episode Listen Later Apr 29, 2026


    This show has been flagged as Clean by the host. -------------------- 01 Introduction This is a follow up to my 8 part series on nuclear power. In this episode I will answer questions posed by listeners in the comments to the series. I would like to start by thanking these people for taking the time to submit interesting questions. -------------------- Costs of Small Versus Large Reactors 02 brian-in-ohio asked two questions The first was for a cost comparison between large and small reactors. The second was for nuclear plant safety compared to conventional power plants. 03 Answer I think that any answer to the second question is going to be perceived by some people as politically controversial, so it's probably not a good topic for HPR to address. 04 The first question though about cost of small versus large reactors is an interesting one, although not one that is easy to give an answer to. I will restrict the answer to just grid scale electric power production and ignore use cases such as industrial process heat or power for remote mines and communities. 05 This question comes down to economies of scale versus economies of replication. Economies of scale centre around increased efficiencies of use of materials and labour when making something bigger. For example, the amount of steel used by a pipe increases linearly with its diameter, but the amount of fluid that it transports increases with the square. 06 Economies of replication come from increasing efficiencies which result from serial production. As you repeat the same design over and over again, you learn how to do things better and make fewer mistakes. 07 The exact same principles apply to shipbuilding. Indeed, a lot of the inspiration for Small Modular Reactors comes from the shipbuilding industry. If you build a series of identical ships, then each subsequent ship will cost less and be built faster. There are of course diminishing returns to this process, so the improvements are less with each additional unit and after a sufficient number of units the cost and time reductions level off. 08 However, this doesn't discount the benefits of economies of scale. What it does mean is that there are two ways of approaching the problem, and which way works in any given scenario depends on such conditions as how big the local electricity market is how fast the demand for electricity is growing, the ownership and financing structure of the electricity market, and the geography of the area, which may pose limits on the number of sites. 09 According to the finance people who have crunched the numbers, there are two sizes of reactor which make the most sense in the above context. These are 300 MW and 1000 MW. However, take those as very rough numbers rather than immutable laws of nature and other sizes may work as well. 10 The key point is that there are cases to be made for both small and large reactors, with the large reactor being several times the size of the small one. 11 An additional factor is that building only one reactor does not reap the benefits of efficiency of replication. You need to build a series of them on the same site. So if you are building a power plant, you don't build a power plant that has just one reactor unless you are in a small market which can only use that much power. Instead, you should build between 4 and 6 reactors in sequence next to one another. 12 If you are supply a large population with a growing demand for electricity, then 4 or 6 large 1000 MW reactors gains both economies of scale and economies of replication. If you are supplying a smaller population with slow growth in demand for electricity, then 4 or 6 300 MW reactors at least gets you economies of replication. 13 There is what could be viewed as an interesting example in terms of the above taking place just east of Toronto. There they are building four 300 MW SMRs on a site next to an existing nuclear power plant. 14 Here are the cost estimates from the Government of Ontario. All costs are in Canadian dollars. Unit 1 is $6.1 billion, plus $1.6 billion in costs which are shared by all four unit.s Unit 2 is $4.9 billion. Unit 3 is $4.2 billion. Unit 4 is $4.1 billion. 15 As you can see, building a series of reactors sequentially on the same site results in declining overall costs. They are very confident in these costs as they used data from a series of major nuclear power plant refurbishment projects in Ontario which have been coming in on time and on budget. 16 Construction began last year and the plant is expected to have a 65 year operating life. 17 However, the province of Ontario also has plans for expansion of electrical generation by about 15,000 MW by 2050 in order to meet net zero targets. 18 Given the heavy concentration of population in the Toronto region, and the very high cost and difficulty of building long distance transmission lines, and the limited number of sites which could host new power generation facilities of any sort, I suspect it is quite likely that subsequent reactors will be large 1,000 MW ones rather than SMRs. 19 The Wesleyville site (which is further east of Toronto) is tentatively scheduled for a 10,000 MW nuclear power plant. That would seem to make ten 1,000 MW reactors more likely than 34 300 MW reactors. 20 I don't have a comparable set of numbers for building large reactors to give an exact apples to apples comparison of costs. Different countries use different accounting and financing systems, and finance makes a huge difference to overall costs for nuclear power as operating costs are a relatively small share of the total. 21 Now to look at another side of this equation, the provinces of Saskatchewan and New Brunswick wish to replace their coal fired power plants with nuclear power plants. The populations of these provinces are too small to absorb a large new power plant into their grids, and studies assuming large reactors have foundered on this issue. 22 New Brunswick already have a nuclear power plant, but it was build in the days when reactors were much smaller. Both provinces however are very interested in small reactors, even individual ones, in order to replace the coal fired plants that are of similar size. 23 I think this covers the cost versus size issue. The more I look into it, the more it becomes apparent that there is no simple one size fits all answer but rather there are a series of trade-offs which must be taken in light of local circumstances. -------------------- MOX Fuel in the USA 24 The next question comes from mnw who asked about the use of MOX fuel in the USA. 25 mnw asked I am enjoying and look forward to the rest of the series. Do you think the US will ever wake up and start recycling its spent fuel? It seems like such a huge waste just to try and keep a small amount of fuel away from"the bad guys" or whatever they are imagining. Answer 26 My answer to this is as follows. I think I've addressed this in the original series, although not directly with respect to the US so I can provide some more detail on that aspect of it. 27 First though I will review what plutonium-uranium mixed oxide (MOX) fuel is. As mentioned in previous episodes, military grade plutonium is not the same as the plutonium which comes out of commercial power reactors. Just as military grade uranium requires nearly pure U-235 isotope, military grade plutonium requires nearly pure Pu-239 isotope. 28 What comes out of a commercial power reactor as spent fuel is not usable for weapons purposes as the proportion of Pu-239 is much too low. However, plutonium recovered from spent fuel can be used as fuel for nuclear reactors in place of uranium 235 when mixed with uranium 238 either left over from enrichment or extracted from spent fuel. This is what is known as MOX fuel. 29 To look at the US history of this however, here's the sequence of events. The US banned fuel reprocessing in 1976. However, this ban was repealed in 1981. 30 In 2005, the US began building a mixed-oxide (MOX) fuel plant at Savannah River in the state of South Carolina. However, this plant was not intended as a normal commercial operation and it was not intended to recycle commercial nuclear power plant fuel. It was instead intended to convert surplus military grade plutonium into commercial fuel in order to get rid of it as part of an arms control program. 31 The program was suspended in 2018. There were apparently many complex political issues involved in these on-again off-again decisions and I won't pretend to have the time or interest to explore all the details nor do I think most listeners would be interested in hearing abou them. 32 As of March 2026, the US are looking at reviving part of the Savannah River plant to produce limited amounts of fuel for testing of advanced reactors. The issue driving this is the shortage of uranium enriched to just below 20%. This fuel is used in certain types of small SMR. 33 The main commercial supplier of this material was a plant in Russia, but "certain events in Europe in recent years" shall we say, have resulted in that supply no longer being available to commercial operations in the US. MOX fuel based on surplus weapons grade plutonium is intended as a short term quick fix for that problem. 34 Another driving force is legal requirements following from domestic commitments for the US government to dispose of certain stockpiles of weapons grade plutonium from certain sites in the US where it is "temporarily" stored, and the solution to that is seen as burning it up in power reactors. 35 So the history is the US banned fuel reprocessing. Then a few years later they un-banned it. Then the US government started building a MOX plant which was intended to get rid of surplus weapons grade material by burning it up in power reactors. Then they decided they didn't want to do that. Then they decided they may want to make MOX fuel after all to replace supplies of special grades of fuel for experimental or prototype reactors. 36 What is missing from the above history is any actual interest from the US commercial nuclear industry in MOX fuel. The reason for this is, as mentioned in the previous episodes, uranium is so cheap and abundant that fuel made from fresh uranium is cheaper than MOX fuel. 37 Some countries such as France wish to recycle spent fuel to reduce their dependence upon imports. Recall that France's drive to build nuclear power plants was in response to the 1970s era energy crisis when oil imports from the Middle East were suddenly cut off. However, the US are not concerned about this issue and so do not make it national security policy as France did. 38 As a result, US commercial demand is for cheaper fuel made from fresh uranium rather than for MOX fuel. Until such time as fresh uranium greatly increases in price there is little economic incentive for the use of MOX fuel in the US. 39 However, there is another aspect to this. If you recall in previous episodes I described molten salt reactors which used dissolved uranium fuel. These reactors inherently reprocess fuel as part of their normal operation. They just do it as part of maintaining the molten salt chemistry at the correct values rather than doing it as a separate process. 40 If these types of reactors become widely used then they would be achieving the same thing as creating MOX fuel, but without an explicit separate step. 41 As a final footnote to the above, the US has almost exclusively use enriched uranium light water reactors. As mentioned in previous episodes, there are ways of recycling spent fuel from light water reactors which do not involve chemically reprocessing it to make MOX fuel. 42 Experiments have been done involving South Korea, China, and Canada which take spent fuel from light water reactors and repackage it to fit it into natural uranium heavy water reactors. What is used up or "spent" fuel for a light water reactor is high grade fuel to a natural uranium reactor. However, the US has, for whatever reason, never built commercial natural uranium reactors such as are used in a number of other countries around the world. 43 If they were to do so, then nuclear fuel could be used twice, once in a light water reactor, and again in a natural uranium reactor, all without having to turn it into MOX fuel in a separate reprocessing step. However, this particular alternative would likely face the same issue in the sense that fresh fuel would still be cheaper than reusing spent fuel. -------------------- A Variety of Questions from Clinton 44 Next we have a variety of questions from Clinton. Clinton asked I would like some commentary in the current situation, why has hinkley gone off the rails, the new american approach, the odd things done after fukushima, the new radiation rules in the states. 45 Question 1 why has hinkley gone off the rails, 46 Answer The question refers to cost overruns at the Hinkley Point nuclear power project in the UK. The UK government looked into this issue in a more general sense in 2025. They published a report on it titled Nuclear Regulatory Review 2025 Enabling nuclear delivery through regulatory reform John Fingleton There is a link to the report in the show notes. https://assets.publishing.service.gov.uk/media/692080f75c394e481336ab89/nuclear-regulatory-review-2025.pdf 47 As the report is 162 pages long, I won't try to cover it all in this answer. I will however give a few simple examples. The report focuses on civilian nuclear power and the defence nuclear industry as well. However it also draws examples from outside the nuclear industry to show that the problem is not limited to nuclear. It shows that the same problems exist in the offshore wind industry, and in the HS2 High Speed Rail project. 48 In the view of the authors of the report, the essence of the problem seems to be a lack of any degree of proportionality in terms of mitigating negative effects from any project. Big nuclear projects make the headlines because they are inherently big projects, but as I have just mentioned, they affect things like wind power development and rail transport as well. 49 I will pick one example from Hinkley Point specifically. This is "Case Study: Hinkley Point C Fish Protection" A summary of this is that they spent £700 million of additional money on the cooling water intakes to protect an estimated 0.083 salmon per year, along with 0.028 sea trout, 6 river lamprey, 18 Allis shad, and somewhere between 100 and 528 twaite shad. The report points out that there are ways to protect far more fish for far less money by spending it in other areas, and gives some examples. Again, this problem is not limited to nuclear power, and they give similar examples connected with offshore wind development and HS2 High Speed Rail. 50 I would like to emphasize that I am not expressing an opinion on whether or not any of these decisions were good or bad ones or whether the money was well spent. I am just summarizing the report's explanation of why large projects of all sorts initiated and approved by the UK parliament were not turning out as initially expected. I will leave it up to people in the UK to decide whether or not they are satisfied with the current situation. 51 Question 2 the new american approach, 52 Answer The US have apparently announced changes to their regulatory system. I don't know enough about the subject to really judge the practical effects of regulation within the US. However, I have read and listened to many interviews of people from both the industry and the regulatory side of things who are from outside the US but are familiar with it. They generally contrast two different approaches to regulation. On the one hand there is the US approach, which they see as being more of a box ticking exercise than an in depth safety review. This makes it very hard to get a design other than a traditional PWR or BWR approved in the US. 53 It has the advantage from the regulator side of things though in that it reduces the amount of work required as it primarily requires just following a set of defined procedures. These people then contrast that approach with the one used in the UK and in Canada, both of which they see as being very similar to one another. In those two countries, regulators work with industry to review designs from basic principles rather than just seeing if it meets a pre-defined list of criteria. This is a results oriented system rather than a process oriented system as used in the US. 54 As a result of this, designers of new nuclear reactors are going to the UK and Canada first to go through preliminary review there, and only going to the US later. What designers are looking for is feedback on their design as they go along in order to align the design with what safety regulators see as being required from their standpoint. They want to go into a review process before the design is finalized so they can get guidance on how they should approach things rather than trying to add safety as additional features on top of a finished design. 55 It would take someone with deep familiarity with nuclear regulation systems to understand the practical effects of recent changes in US regulatory systems, but it is quite possible that people within the regulatory structure in the US have been taking the above on board and trying to adapt to current circumstances. However, I can only speculate on that. This is about the best answer that I can give. 56 Question 3 the odd things done after fukushima, 57 Answer This covers a lot of topics, some of which are probably political and so are not suited to HPR. I will try to list a few events however. As a brief summary if the Fukushima events go however, a historic scale earthquake and tsunami in Japan in 2011 caused huge loss of life and widespread damage. About 20,000 people were killed by the earthquake and tsunami. Three nuclear reactors based on 1960s era GE BWR designs were seriously damaged by hydrogen explosions caused by loss of power to backup generators when they were flooded by the tsunami. However, there were no radiation related deaths or cases of radiation sickness. 58 Following events in Japan was a general review of designs around the world, with various improvements made in some areas, particularly backup generators and hydrogen management. It seems to be conventional wisdom that the Fukushima event caused a number of countries to decide to phase out nuclear power. 59 However, when I tried to make a list of such countries for this episode I found things were not as is often heard. The countries which decided to get rid of nuclear power had largely started down that road at least a decade before then and generally for reasons unrelated to any specific events outside of their own country. In other cases they reversed that decision or are in the process of doing so. Japan itself has restarted many of their nuclear power plants and plant to replace decommissioned nuclear power plants with new ones, although many of the older and smaller ones were considered not economically worth upgrading at this point in their life to restart them. 60 The one possible exception to this may be Taiwan which decided to phase out nuclear power in 2016. However, I don't know enough about Taiwanese politics to state with any confidence that their decision in 2016 was based on anything related to events in Japan, or whether in fact they were a byproduct of other political changes within Taiwan and the shut down of nuclear plants happened to be carried along with those. Currently Taiwan get their electricity primarily from natural gas and coal. 61 Meanwhile across mainland Asia from Turkey to China, large numbers of nuclear power plants were built or are under construction. Taken together on a global scale, did anything really change after Fukushima, or did the countries which had already decided to close down their nuclear power plants simply continue to do so, and those countries who decided they wanted more of them continue to build them? That's a good question for which I don't think anyone has the perspective to answer at this point. 62 Another side of this which is hard to disentangle from it though is the increased use of natural gas for electric power generation which was happening at around the same time. Increased use of fracking in a number of countries, plus increased supplies from Russia and LNG from the Middle East and other places resulted in falls in natural gas prices in many places. Since combined cycle natural gas turbines form the main competitor to nuclear power, anything which improves the economics of natural gas will act to reduce demand for nuclear power. This makes it hard to decide to what degree the reduction in the number of reactors being built was due to the political effects of the earthquake and tsunami and to what degree it was due to cheaper natural gas through fracking and other means. I'll leave that question at that. 63 Question 4 the new radiation rules in the states. 64 Answer I'm not deeply familiar with US radiation rules, but I will attempt to answer the question. Apparently there are wide variety of different things being addressed, only some of which have any relevance to the nuclear power industry. One of these is an epidemiological study on the current exposure limits for workers in the nuclear industry. This study will take place over about 5 years. In the end it may not result in any changes. This is for a number of reasons. 65 One is that US exposure thresholds for workers are currently aligned with international standards. It would be difficult for the US industry to operate on a different basis than the rest of the world when supply chains are global and kit is designed to meet currently recognized standards. Another is that apparently the nuclear industry are not, so far as I can discern, asking for any changes to limits. They instead are looking for changes to how some of the details are being applied, such as for example the criteria for deciding when respirators are required in low risk environments. 66 Some point to recent changes in UK regulations as an example of what they are looking for. I will post a link to the new (November of 2025) UK regulations in the show notes. https://www.gov.uk/government/publications/nuclear-industry-principles-to-guide-the-application-of-as-low-as-reasonably-practicable-alarp-and-best-available-techniques-bat/ways-of-working-principles-to-guide-the-application-of-alarp-and-bat-in-the-nuclear-industry-accessible-webpage This is about as much detail as I think I can comment on when it comes to this question, as I think it is a subject that requires a fair bit more practical knowledge of than I have in order to give a thorough and balanced answer. -------------------- 67 Question from Antoine Were/are the designs patented? Hi, Whiskeyjack. Nice ep. You said AGR, based on Magnox, was a nuclear reactor type that did not sell well outside the UK. I then started thinking if it were (is) possible to another countries to develop by themselves based on that project, or if it had (has) a commercial restriction for exploration of the technology. I have yet to listen to the following episodes (doing little by little) and may learn better on the choices, but I felt free to present the question by now... Thanks! 68 Answer This is a very good question because it offers the opportunity to talk about a number of interesting things that haven't been touched on yet. Let's cover a bit of background first. 69 A patent is a time limited right to exploit a defined bit of valuable technical knowledge. Patents were involved from the very earliest days of commercial nuclear power, and I will give an example of this later. A key point to keep in mind though is that the nuclear power field moves very slowly and it takes a long time for new knowledge to make it from the lab to commercial application. Patents will often expire before they reach the point where they can be used. 70 Contracts on the other hand are legally enforceable agreements between two parties. A contract may have a time limited life, but that is an arrangement between the parties. A commercial nuclear power plant is a very large and complex bit of kit and not easily copied in detail. It can be far more effective to cover designs under contracts and licenses than to rely on patents. If a country wished to build their own nuclear power plants rather than buying them from someone else, there are a large number of companies who have commercial designs they are willing to license to third parties for them to build themselves. Indeed a number of these companies base their business around licensing of designs or have other reasons for wishing to do so. 71 From a licensee perspective, it could take decades of work and hundreds of millions or even billions of dollars to take a design from first principle to the ready to build state, wheras licensing a design give you a proven design right away. As mentioned in previous episodes, there many types of reactor in the world. The selection of what sort of reactor a country decides to buy often depends more on commercial considerations revolving around licensing terms and conditions than it does with respect to any technical considerations. Here's an example which shows how South Korea decided to license a design, build it for themselves, and then export it to other countries. 72 KunMo Chung - Professor at the Korea Advanced Institute of Science and Technology, stated in an interview in 2019 that South Korea wanted to standardize on a single reactor technology in the early 1980s. They had reactors from multiple different vendors, but wanted to license an existing successful design to produce for themselves and for the export market. One of the major factors in deciding to standardize was to allow them to improve operator training by focusing on one design. Professor Chung stated that one of the key factors in selecting a design from ABB-Combustion Engineering was that he personally knew and had a good relationship with the Chief Technical Officer of ABB-Combustion Engineering going back to a time when Professor Chung had been studying and working in the USA. 73 On their side, ABB-Combustion Engineering were having financial problems and they needed a partner to help further develop their new PWR design. Also they stood to gain revenue from this partnership as well. Based on this relationship, the two sides came to a business agreement and South Korea began producing reactors based on this design, while also continuing to develop and improve it further. 74 Here's an example of a case where the developers of a promising technology decided that they had more to gain by not patenting their technology. Instead they decided to freely share their information in order to get other researchers elsewhere to help to advance the technology so that all could benefit from it. 75 In an interview Wacław Gudowski - Prof. Emeritus, Royal Institute of Technology KTH Stockholm stated that the Soviets and later the Russian were the leaders in lead-bismuth cooled reactors. These reactors use lead-bismuth liquid metal alloy as a coolant. In the 1990s the Russian institute working on commercializing this technology were working with Western partners on nuclear technology in general. They considered patenting this technology, but in the end decided to simply publish it openly. 76 Professor Gudowski had even smuggled $60,000 in cash into Russia to finance the patent application in order to get the Russian institute to publish their technology, but the money was not needed. They based this decision on the judgment that it would take 20 years of R&D before the technology was ready for the commercial market, so they wouldn't see a penny on any patents anyway. They were right on this, as it was another 20 years of R&D in Europe, Russia, China, and Korea before lead-bismuth technology was ready for commercial use. 77 It had already seen use in submarine reactors, but the commercial market demanded a more thoroughly developed technology to satisfy commercial needs. By deciding to not patent the technology, the original developers gained from shared R&D rather than chasing the illusary gains from patent licenses on technology that was not ready for the commercial market anyway. 78 I said that patents were involved in nuclear technology from the very earliest days, and I will now turn to that story. When I say the earliest days, I mean probably earlier than you are imaging. I am talking about before WWII. 79 First though I need to give some background information. France and Britain were working on nuclear weapons from the very earliest days of WWII. In Britain's case this was called Tube Alloys. Canada also was conducting nuclear experiments, including building an "atomic pile", but it's not clear if this had any clear practical goals or was done to understand the physics better. 80 If you read the Wikipedia version of history, it states that Tube Alloys was merged into the Manhattan Project. However, participants have stated in interviews that this was not the case, and the Quebec Agreement which supposedly merged them makes no such mention of any merger of the projects, just the setting up of a board to coordinate efforts between the three countries, that is the US, UK, and Canada. In fact the two projects didn't get along that well, and as we shall see below, a big part of that was disputes over patents. ### 81 The following is based on a paper written by Bertrand Goldschmidt, a French nuclear scientist. Two of his colleagues, Hans Halban and Lew Kowarski played a critical role in early nuclear research. Halban in particular was one of the greatest scientific names in nuclear fission. In March of 1939 Halban conducted an experiment showing that neutrons were emitted by the fissioning of uranium. 82 In April Joliot, Halban, Kowarski and Perrin had a pretty good idea of how to use nuclear fission to produce energy and to make an explosive device and decided to file patents on their invention. Each of the four would receive a 5% share of any benefits and the other 80% would go to the research instittute they worked at in Paris. I will now quote from Goldschmidt's paper. 83 The first two patents concerned energy production and were entitled "Device for energy production" and "Method for stabilizing a device for energy production." They roughly defined the principles of the main components of our present power reactors: moderator in heterogeneous or homogeneous arrangements, cooling fluid, control rods, protection shield. The third patent called "Method for perfecting explosive charges" was less brilliant from a foresight point of view though it proposed valid solutions for the trigger, the tamper, and the rapid obtainment of the critical assembly of a possible explosive device. Finally, nearly a year later, after Alfred Nier's experimental confirmation in March 1940 of Niels Bohr's theoretical prediction that uranium 235, the rare isotope of the mixture in natural uranium, was responsible for fission by slow neutrons, the French took out an additional patent on the advantage of using enriched uranium for the chain reaction. End of quote. 84 In May of 1940, the CNRS, the French research institute in Paris, negotiated an agreement with Belgian mining company Union Miniere, who were the world's biggest producer of uranium, at the time a byproduct of radium mining, about a partnership for the world wide exploitation of these patents. However the agreement was not finalized due to the ongoing events in the war. At the beginning of the war, the French government had approved the development of an energy generator - or a nuclear reactor as we would say today, with the intention of creating an engine for submarines. 85 With the fall of France, Halban and Kowarski travelled to the UK with their supply of heavy water where they were received by their UK counterparts, James Chadwick and John Cockroft. The British were already working on an atomic bomb. In the UK the two conducted an experiment showing that it was possible to create nuclear energy using natural uranium and heavy water. In 1941 the British nuclear project was reorganized and given the name Tube Alloys. In 1942 it was decided to move the work on a plutonium bomb to Canada, and Canada would pay for the project. A lab was set up in Montreal and Halban was put in charge of the project. 86 Halban had negotiated this arrangement by offering to arrange to have the French patents for world wide rights outside of France and the French empire transferred to the UK. In return the French team were to be given a key role in the British nuclear project. The author of the paper I am referencing, Bertrand Goldschmidt, was a section leader in Montreal and a colleague of Halban from France. The Montreal group cooperated with the American Manhattan Project and the two shared information and exchanged visits. 87 However, relations between the two began to break down, with a major cause of this being the Americans being unhappy about the French patents and Halban's arrangement to give the British world wide rights to them. The postwar commercial potential for nuclear power was seen to be huge, and this was a major bone of contention. The extensive participation of ICI (Imperial Chemical Industries) engineers in the Tube Alloys project was also objectionable to the Americans. Presumably this had something to do with potential for ICI being involved in future commercialization of the technology. The American Dupont company, a commercial rival of ICI, was also heavily involved in the American atomic bomb project. The eventual result of this was that the US cut off cooperation with the UK-Canada nuclear project. 88 Finally Halban was forced out of the project at the insistence of the Americans, and he was replaced by John Cockroft who moved to Montreal to take charge of the project. The Americans now restore limited cooperation. Kowarski was put in charge of building a heavy water moderated natural uranium reactor at a new site north of Ottawa at Chalk River. This reactor was turned on on the 5th of September, 1945, three days after Japan's surrender. So in what was supposedly a titanic war for survival, key allies were falling out with respect to their ultimate weapon over issues of patents covering post war commercialization. 89 With the end of the war, the nuclear weapons project in Montreal and Chalk River was wound up. Halban, Kowarski, and Goldschmidt returned to France and Cockroft to the UK where they all played senior roles in the nuclear programs of their respective countries. John Cockroft played an important role in the development of the Magnox reactors which Antoine asked about. The Chalk River Site remains as Canada's main nuclear research centre to this day, and Canada was to continue development of heavy water moderated natural uranium reactors. 90 The first commercial nuclear power plant was commissioned in the UK in 1956, roughly 17 years after the original French nuclear patents. At that time, UK patents had a term of 16 years. While I am not a patent lawyer, it would appear that these patents would likely have expired before nuclear power was ever commercialized. So to answer the question about patents, the first patents on nuclear energy date to before WWII started, and the very first two were about nuclear power plants and it was only the third one which covered nuclear weapons. -------------------- 91 Thanks to other listeners. A number of other listeners made comments saying they were really enjoying the series. I would like to thank the following for their kind words of encouragement. They helped make the work required to do this worthwhile. They are brian-in-ohio mnw Clinton Antoine bjb Kevin O'Brien Trey L'andrew Archer72 Jim DeVore If you have commented but I have forgotten your name, or if the show was recorded before I got a chance to read your comment, I would still like to thank you. 92 Conclusion I would like to thank all the listeners for their kind comments and insightful questions. I hope that I have answered these questions to the satisfaction of everyone. I look forward to hearing from all of you in future podcast episodes including those on other topics. -------------------- Proceedings of the 29th annual conference of the Canadian Nuclear Association and 10th annual conference of the Canadian Nuclear Society. V. 1-3 https://inis.iaea.org/records/m2s41-40917 This has a paper by Bertrand Goldschmidt about the work of the French scientists in Canada. -------------------- Provide feedback on this episode.

    HPR4627: UNIX Curio #5 - Faster, Pussycat! Kill! Kill!

    Play Episode Listen Later Apr 28, 2026


    This show has been flagged as Clean by the host. This series is dedicated to exploring little-known—and occasionally useful—trinkets lurking in the dusty corners of UNIX-like operating systems. Let me start by admitting that I've never actually seen the film referenced in the episode title, but I couldn't resist using it anyway. If you've used the UNIX command line to any extent, chances are good that you are familiar with the kill command. A common use is to terminate a misbehaving program. But there is more behind how kill works, including a curio you might not know about. The kill utility works by sending a "signal" to the targeted process. This signal is selected from a pre-defined list, and triggers the process to interrupt its normal flow and handle the signal before potentially returning back to its work. This "signal handler" can do whatever activities are written in its code, but typically it will take actions connected to the purpose of the specific signal received. One option is for the process not to have a signal handler at all; in that case, there is a default action that the operating system will take on behalf of the process, depending on what the signal is. The possible default actions are to terminate the process, take some implementation-defined action (usually writing a core file to disk) and then terminate the process, stop (pause) execution of the process, continue execution of a stopped process, or ignore the signal. By default, kill sends the TERM signal to the process, an indicator that it should terminate. Each signal has a name and a number assigned to it; SIGTERM is the name of the "terminate" signal. You can use the -s option with the name to choose which signal to send. The 'kill' command is specified to take these names without the SIG prefix, though some implementations will accept them either way. Also, kill is supposed to be case-insensitive when it comes to these names, but the convention is to write them in all upper case. The assigned numbers for signals can vary depending on the operating system, and on Linux, depending on what processor architecture you're on. However, there is a short list of signals 1 that have a stable number assigned to them. Despite this, I recommend using the signal name in your scripts to make them clearer and to ensure maximum portability to different systems. Well-behaved programs will have a signal handler that responds to the TERM signal by stopping what they are doing, cleaning up any open resources like temporary files, and promptly exiting. However, not every program behaves well, so sometimes it becomes necessary to send them the KILL signal. This one is special and cannot be handled or ignored by the program 2 ; the operating system will immediately terminate the program, possibly leaving a mess behind. Two other signals that can come in handy sometimes are STOP and CONT. As you might expect, STOP forces a process to pause in the middle of whatever it was doing. Its counterpart, CONT (short for "continue"), causes it to resume execution. This can be useful if a program consumes CPU time when not actually doing anything worthwhile—sending it the STOP signal will end that, and when you're ready to use it again, CONT will cause it to pick up right where it left off. Like the KILL signal, STOP cannot be handled or ignored by the program. I have used this to pause the game FreeCiv when I wanted to break away to do something else, but didn't want to have to deal with exiting my current game and having to reload it later. Take note, though, that the program might get confused if it expects the system clock not to suddenly jump forward, as that is exactly how the situation will appear to it. Network connections or other resources the process is using that change while it is stopped are other potential trouble spots. Also be aware that a stopped graphical program will not update its window, so I find it best to minimize the window before stopping it and then continuing the process before trying to raise the window again. Programs are not necessarily required to interpret signals in the way they are described. For example, the HUP signal was originally intended to be sent when a modem or serial connection hang-up occurred. Today, some daemons use it for other purposes and take a specific action in response. For example, the Apache web server will restart 3 , and NetworkManager will reload its configuration 4 . These uses of signals are usually described in the daemon's manual page, often in a separate section dedicated to signals. While all this background might be interesting (or maybe not), it's pretty commonly known, so isn't really a curio. Our UNIX Curio for today is the "0" signal. This is actually not a signal at all; instead, it tells the kill utility to just check for the existence of a process. If the process exists, kill will exit with a status of 0. If it doesn't exist, the exit status will be greater than 0. This provides a handy way to check whether a particular process is still around. A shell command can use this exit status with its control structures like if to take a particular action depending on whether a particular process exists. Somewhat oddly, "0" is both the number and the name of this pseudo-signal. Why would you want to do this? I have used it for a script to analyze log files that runs daily on a web server. Depending on how much traffic the site is getting, the log files can grow to the point where it takes longer than a day for the script to get through them. If a second instance of the script is started while one is still running, it will slow down both and if more keep being added, eventually the machine will run out of memory. My solution was to create a .pid file containing the process ID number of the running script. You might see examples of these if you look in /run or /var/run on your system. The script creates a file named something like "myscript.pid" in this directory containing its own process ID, which can be accessed in the shell with the variable $$ . When my script starts, it checks to see whether this file exists. If so, it uses kill -s 0 $(cat /run/myscript.pid) to see if the previous process still exists. If the process is no longer around, that's a sign that it exited abnormally before it had the chance to delete the .pid file, so the script removes the abandoned .pid file, replaces it with a new one containing the current process ID, and continues with its work. If the previous process is still around, my script exits with a message to that effect. This way, I can be sure that only one instance of the script will ever be running at one time. Be aware that the kill utility might also return a non-zero exit status if the user running it does not have privileges to send a signal to the process with the specified ID. This is not a concern if you are running a script as the root user, but could be if you are not. This can occur even if you aren't actually sending a signal, just using the "0" pseudo-signal to check if a process exists. There is a weakness in this method. UNIX-like systems generally have a limit to the quantity of process ID numbers that can be issued, so they are reused over time. (However, there will never be two processes with the same ID number running at the same time.) Typically, the first process that is run on start-up will be given the ID number 1, and each subsequent process will get the next higher number. Once the maximum is reached, the system starts again at the beginning with the lowest number not in use. It is possible for the script to crash and leave behind the .pid file, then the same process ID could be recycled and actively used for another program, causing a new instance of the script to give up. The chances of this are small enough that for my purposes, it's not worth worrying about. But you should be aware that it could happen. I should also note that it's not strictly necessary to use kill for the purpose I described. The ps utility can also be given a process ID with the -p option; if the process exists, the exit status will be 0, otherwise it will be greater than 0. In this case, you could also use the output to check that the name of the command matches what you expect, helping avoid the problem of a recycled process ID. In addition, ps doesn't concern itself with permissions for sending signals, so it will report on the existence of a process no matter what user you are running it as. From an efficiency standpoint, kill generally requires fewer resources to run (in fact, it is built in to some shells), but functionally ps can also do the job. So keep in mind that kill is capable of doing more than just killing off programs—maybe you can put it to one of these uses for your needs. References: Kill specification https://pubs.opengroup.org/onlinepubs/009695399/utilities/kill.html signal.h specification https://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html Stopping and Restarting Apache HTTP Server https://httpd.apache.org/docs/2.4/stopping.html#hup NetworkManager: Signals https://networkmanager.dev/docs/api/latest/NetworkManager.html#id-1.2.2.9 Appendix 1 - example script: #!/bin/sh # Use your own unique name here - be sure you can write to this location pidfile="/var/run/myscript.pid" # Exit if previous run hasn't completed yet if [ -f "$pidfile" ] ; then oldpid=$(cat "$pidfile") if kill -s 0 $oldpid ; then echo "${0}: Not running script, older process $oldpid still active" exit 1 else echo "${0}: Removing old pidfile from nonexistent process $oldpid" rm -f "$pidfile" fi fi # Create pidfile echo $$ > "$pidfile" ## Insert commands to do the actual work of the script here # Remove pidfile rm -f "$pidfile" Appendix 2 - another version of the script using ps instead of kill , checking that an existing process ID is actually the same command, and with extra validation of the contents of the pidfile; perhaps better for use by a non-root user: #!/bin/sh # Use your own unique name here - be sure you can write to this location pidfile="$HOME/myscript.pid" # Exit if previous run hasn't completed yet if [ -f "$pidfile" ] ; then oldpid=$(( 1 * $(cat "$pidfile") )) if [ -n "$oldpid" ] && [ "$oldpid" -gt 1 ] ; then : else echo "${0}: Not running script, $pidfile contents invalid" exit 1 fi # Test if old process ID exists if oldcmd="$( ps -o comm= -p $oldpid )" && # Also test if command name of old process is same as current script [ "$oldcmd" = "${0##*/}" ] ; then echo "${0}: Not running script, older process $oldpid still active" exit 1 else echo "${0}: Removing old pidfile from nonexistent process $oldpid" rm -f "$pidfile" fi fi # Create pidfile echo $$ > "$pidfile" ## Insert commands to do the actual work of the script here # Remove pidfile rm -f "$pidfile" Provide feedback on this episode.

    HPR4626: Cable Management / PC Speakers

    Play Episode Listen Later Apr 27, 2026


    This show has been flagged as Explicit by the host. Cable Management / PC Speakers ... Boao 3 Pieces Cord Protector Wire Loom Black Tubing Cable Sleeve Split Sleeving for USB Charger Cord Cover Audio Video Cable, Each Size 10 ft 3/4 Inch, 1/2 https://www.amazon.com/dp/B08JPV4NRJ Split-Sleeve Wire Loom for High-Temperature Automotive Harness and Home Cable Management, 25ft - 1/2 inch Braided Cable Management Sleeve Cord Protector, Self-Wrapping Split Wire Loom https://www.amazon.com/dp/B0C4LD8FP3 PreSonus Eris 3.5 Studio Monitors, Pair — Powered, Active Monitor Speakers for Near Field Music Production, Desktop Computer, Hi-Fi Audio https://www.amazon.com/dp/B0C88ZB3D9 Wood Hangboard Rock Climbing Holds - Sturdy Hang Board for Climbers https://www.amazon.com/dp/B07X58S696 POWER GUIDANCE Hangboard Rock Climbing Holds Finger Strengthener for Pull-up Grip Arm Training Indoor and Outdoor Double-Sided Non-Slip Portable https://www.amazon.com/dp/B09VTG6RZN Cosmos 1 Pc Green Screen Backdrop 43 in / 110 cm Diameter Foldable Portable Photography Background Green Screen Chroma Key Backdrop for Photography Photo Video Studio, Live Streaming, Video Meeting https://www.amazon.com/dp/B0CQNRWL7K Key Points: New Monitor Setup: Ordered a new 49-inch curved monitor. Current setup involves a steering wheel that needs to be moved for gaming and work. Detailed process for switching between gaming and work modes. Cable Management: Discussed different brands of wire loom: Boao and teziicus Store . BOA is cheaper and see-through, while teziicus Store is more expensive but better quality. Explained the use of split sleeve wire loom for easier cable management. Tips on using heat shrink tubing and a heat gun for a better seal. Mentioned using Gorilla Glue for expanding and sealing large dongles. Recommended sizes for wire loom: three-fourths inch for larger cables, one-fourth inch for smaller cables. Labeling and Organization: Emphasized the importance of labeling cables using a label maker. Suggested using specific tape for patch cables and placing labels a few inches away from the plug for easy identification. Mentioned using twist ties for temporary cable management and Velcro for more permanent setups. Additional Tools and Tips: Used binder clips and paracord for temporary setups. Mentioned using power guide holds for rock climbing practice during calls. Discussed the potential for a dual monitor setup to avoid moving the monitor frequently. PC Speakers: Noted the shift from traditional PC speakers to studio speakers. Mentioned entry-level studio speakers costing around $99. Highlighted the need for a subwoofer for better bass. Discussed bass shakers for haptic feedback in racing games. Workspace Cleanliness: Emphasized the importance of keeping the workspace clean and organized. Mentioned using a green screen for video calls, hung from the ceiling for a flat surface. Conclusion: Encouraged listeners to keep their workspaces clean and organized for better productivity and aesthetics. Provided practical tips and tools for effective cable management and workspace setup. Closing Remarks: Wished listeners a good day and encouraged them to record their own episodes. Additional Notes: Mentioned the use of a standing desk and the challenges of dual-use with a steering wheel setup. Discussed the potential for a separate office table for gaming and work to avoid frequent adjustments. Host's Personal Note: Acknowledged the change in format for better show notes and clarity for listeners. Provide feedback on this episode.

    HPR4620: The Second Doctor, Part 1

    Play Episode Listen Later Apr 17, 2026


    This show has been flagged as Clean by the host. This starts our look at the stories of the Second Doctor, portrayed by Patrick Troughton, during the 1960s. The Second Doctor, Part 1 Patrick Troughton is the reason we are still talking about Doctor Who all these years later. He took over the lead role in a popular and successful show and continued the success. It might have been a disaster, but it wasn't. And Troughton did not attempt to be another Hartnell, he had his own distinct way of playing the part. He established the principle that the personality of the Doctor changes when he (or she) regenerates. This made it much easier on all the actors who followed him in the role, and each one has been very distinctive in how they embodied the Doctor. Sadly, many of his episodes, and some complete stories, are missing now due to the short-sighted policy of the BBC the discard older shows, in many cases wiping video tapes for reuse. Of course, you can't blame them too much since I doubt anyone in the 1960s would have believed that the show would still be going over 60 years later. But there is always hope that some more episodes will be recovered. There are people who collect old TV shows in various formats such as film and video tape, and it is virtually certain that some missing Doctor Who episodes still exist in private collectors' hands, though how many is not known. To take the place of the missing episodes we have reconstructions using telesnaps (photos taken of the monitor screen), animations, and for a few Troughton stories fans have re-staged the stories as stage plays. So there are ways to experience at least a little of these missing episodes. And even as I write this there are indications that more episodes may be found and returned to the BBC . Troughton took over in the third story of Season 4, which aired in late 1966. Power of the Daleks This is the first story for Patrick Troughton as the Doctor, and starting with the Daleks was a smart move. They were so popular that they guaranteed a good audience and would get Troughton off to a good start. The TARDIS lands on a planet called Vulcan, where a scientist has found a derelict ship containing a few Daleks. He thinks he can bring them back to life, and won't listen to the Doctor who tries to warn him. Meanwhile, rebels on Vulcan are trying to overthrow the government there. In the end, the scientist sacrifices himself to help stop the Daleks, the rebels succeed in overthrowing the fascist dictator, and all is well. For now. Ben and Polly are along as the companions continuing their stay on the TARDIS after starting with the First Doctor in the War Machines This is one of the completely missing stories, but there is an animated version which is available on DVD, or you can watch it on YouTube. The Highlanders And another historical story, taking us to the Battle of Culloden in 1746, where the last gasp of the Jacobite rebellion was snuffed out by the English army. The TARDIS crew are first captured by the Scots, who are not kindly disposed to people who are obviously English. Then they are captured by the English, who have decided they are traitors and want to hang them. After various adventures, they get away, and bring with them a young Scottish lad named Jamie, who becomes the third member of the TARDIS team when he promises to teach the Doctor to play the bagpipes. An average historical story made memorable by the introduction of the next truly beloved companion, Jamie. He would stay with the Doctor all the way through the end of Troughton's run, and is still in high demand as a guest at Doctor Who conventions around the world. He was not actually intended to be a companion at first. They had shot two endings, one where he joins the Doctor, and another where he is left in Scotland. They did decide to keep him, but in the next few stories, for which the scripts had already been written, he is less central to the plot and sometimes get lines originally written for another character. This is another story where all of the episodes are missing, though there are reconstructions available. The Underwater Menace The TARDIS team arrives on an island formed by an extinct volcano, where they are brought underground to a sunken city. They are told that their arrival was foretold by the goddess of the city, and that they would be sacrificed. They are rescued by a scientist known to the doctor, but it turns out he has gone quite mad. The city is Atlantis, and he says he will raise it, but his plan involves blowing up everything with nuclear bombs. The underwater scenes of swimming ladies are quite hilarious, but it is an inventive little story. The scene of the mad scientist raging as he disappears under the water is pretty good too, in a campy way. Early in Patrick Troughton's run as The Doctor the show dropped much of the history and focused more on monsters and SF to compete with shows like Lost in Space and Land of the Giants. This story is missing two of the 4 episodes, but reconstructions exist for the two missing episodes. The Moonbase The Cybermen are back, and this time they are attacking a base on the Moon. They have been infiltrating the base through a hole in a basement wall, which is where you scratch your head and wonder why the air doesn't all leak out through this hole. And since the Cybermen are still significantly organic, how are they breathing in vacuum? Still, the Doctor puts the emphasis on science as the way to defeat them. The return of the Cybermen was sufficiently popular for them to become the acknowledged second best enemy of the Doctor, after the Daleks, of course. And as such they would come back again in several of the Troughton's stories, and continued up to the present to be featured in Doctor Who. This story is also missing two of its episodes, but they have been animated so you can get a decent experience of the story now. And there is at least one decent jump scare here. The Macra Terror The Macra made an appearance in the David Tennant story Gridlock, but this is where they began. The TARDIS materializes on a planet where a colony seems very happy, except for one malcontent who claims he has seen huge crab-like beings at night. Then the Doctor sees them as well, but no one else seems to notice them. It turns out these creatures are good at conditioning people to not see them, and to believe what they are told to believe. Ben ends up brainwashed by them, though the others escape this. And the colony is busily engaged in producing some kind of gas, and this turns out to be essential to the Macra. Oxygen is poisonous to them, they need the gas. Finally Ben breaks his conditioning and rescues the others, and the Macra are defeated. Why they reappeared in Gridlock was never clear to me, it looked like an Easter Egg for long-time fans that was never explained or justified. This is another story that is missing all of its episodes in original form, but an animated version has been released, and is available on DVD and on YouTube. The Faceless Ones This is a very good, inventive story that purports to take place at Gatwick Airport, though it is of course not really shot there, but at a smaller place nearby. The TARDIS materializes there, and the first problem is that none of them have passports! This is the only thing matters to the immigration people at the airport. Meanwhile, something puzzling is going on with a company called Chameleon Tours. One young lady, played by Pauline Collins, is trying to find out what happened to her brother, who went on a tour with them, sent a postcard, and then vanished. It turns out that the folks running Chameleon Tours are an alien race of Shape-shifters, hence the “Faceless Ones”, who are kidnapping people to help repopulate their planet. The obvious plot hole is that this would involve repopulating with people, not Chamelelons, but never let that get in the way of what is otherwise a nice romp full of action and suspense. The production team was hoping to get Collins as a companion, but she turned them down. At the end, Ben and Polly take advantage of the fact they are on Earth at the proper time, and decide to leave the TARDIS and get on with their lives. So now only Jamie is left. I bet that won't be true for long. For this story 4 of the 6 episodes are missing, but again this is a story that got the complete animation treatment. You can purchase the DVD, or watch it on YouTube. Links: https://en.wikipedia.org/wiki/Patrick_Troughton https://en.wikipedia.org/wiki/The_Power_of_the_Daleks https://www.youtube.com/watch?v=gX1DN7yHneA https://en.wikipedia.org/wiki/The_Highlanders_(Doctor_Who) https://en.wikipedia.org/wiki/The_Underwater_Menace https://en.wikipedia.org/wiki/The_Moonbase https://en.wikipedia.org/wiki/The_Macra_Terror https://www.youtube.com/watch?v=unipaGm8Pbo https://en.wikipedia.org/wiki/The_Faceless_Ones https://www.youtube.com/watch?v=ovSHAcu7g4A https://www.palain.com/science-fiction/intro-to-doctor-who/the-second-doctor-part-1/ Provide feedback on this episode.

    HPR4619: HPR Beer Garden 12 - Baltic Porter

    Play Episode Listen Later Apr 16, 2026


    This show has been flagged as Clean by the host. Dave and Kevie continue the HPR Beer Garden series with a look at a less known (and maybe a hidden gem to many) style of beer that originates from the north-eastern area of Europe: the Baltic Porter. Kevie Samples Öö from the Pojala Brewery in Estonia, whilst Dave samples Wave Tactics from another Estonian Brewery: Pühaste . Connect with the guys on Untappd: Dave Kevie The intro sounds for the show are used from: https://freesound.org/people/mixtus/sounds/329806/ https://freesound.org/people/j1987/sounds/123003/ https://freesound.org/people/greatsoundstube/sounds/628437/ Provide feedback on this episode.

    HPR4618: Simple Podcasting - Episode 2 - Basic Filtering

    Play Episode Listen Later Apr 15, 2026


    This show has been flagged as Clean by the host. Basic-Filtering 01 Introduction This is the second episode in a four part series on a simple way to create your own HPR podcast episode. 02 This episode will cover the following topics: Basic filtering.. De-essing to improve voice quality. And normalizing to adjust audio levels for easier reviewing. 03 Filtering is removing unwanted noise from an audio signal. There are several ways of doing this. It is possible to do this with Audacity, but I don't know how so I won't try to describe that method. It is possible however to filter using command line tools such as FFMPEG and Sox. When assembled into shell scripts, these tools can become part of an automated process that you can use over and over again for each HPR episode that you record. 04 In a later episode I will discuss how to analyze audio signals to find the sources of noise that can be reduced or eliminated with filters. In this episode however I will discuss basic filtering that you can apply routinely without doing any analysis beforehand. 05 Sources of Noise A question that you may have is "why is there noise in the recording?" There are many sources of undesirable noise. 06 A very common one that you may not be aware of is electrical noise that works its way into the electronic recording circuits and is imperceptible to you until you play back the recorded audio. The most common noise signal is what is commonly called "line noise" and is a low frequency hum at 50 or 60 Hz from the electric power lines and reflects the 50 or 60 Hz frequency of the AC power lines feeding your recording hardware. 07 You may be familiar with this low frequency hum from when it emanates from large electrical hardware such as transformers as it makes the laminations vibrate. However, it can also work its way indirectly into electronic equipment as well. Good quality audio hardware may filter all or most of this out, but it is present in a lot of consumer grade hardware. 08 Other sources of electrical noise may reflect specific problems in your recording hardware. I will discuss one such problem with my microphone that I had to address. Still other sources of noise may reflect actual physical audio noise around you, such as fans. Placing the microphone close to your face will help in dealing with a lot of these problems, but you may find filtering to be of some help here as well. 09 Audio Frequency Range Let's start with some basics. A good quality stereo of the type you may have at home is typically rated to perform between 20 Hz and 20 kHz. This is the widest possible range that we need to consider. In reality, this is a far wider range than is needed for a voice oriented podcast. It is also well beyond the range of the hardware that many of your listeners will be using to listen to the podcast. 10 For example, the speakers that I have connected to my PC and a number of headphones and earphones that I have tested drop off drastically below 80 Hz or above 8 kHz, or even above 6 kHz in many cases. This is not audiophile quality hardware, but it is representative of the sort of hardware that a lot of your listeners will be using when listening to podcasts. And to be honest here, a lot of people will have difficulty hearing anything above 8 kHz even with the best quality audio hardware due to hearing loss from environmental noise exposure or age. 11 You can get a good idea of what different frequencies sound like by generating sine waves using either FFMPEG or Sox. Here's an example of generating a 1 kHz sine wave using FFMPEG. A copy of this will be in the show notes. ffmpeg -f lavfi -i "sine=frequency=1000:sample_rate=44100:duration=3" 01000hz.flac This creates a sine wave at 1 kHz and at a sample rate of 44.1 kHz for a duration of 3 seconds and saves it to a flac file named 01000hz.flac 12 Here's the same using Sox. sox -n -r 44100 -b 16 01000hz.flac synth 3 sine 1000 The -b 16 specifies using 16 bit audio to encode it, and the "sine 1000" element specifies the frequency in hertz. 13 You can test this out at different frequencies to get a feel for how your hardware responds. What the effective limits on typical hardware audio range means is that we can quite safely filter out a large part of what is considered to be the "audio range" without any noticeable loss of quality. For the purposes of our discussion here then I will limit the frequency range to between 80 Hz and 12 kHz, and that is being generous. You can probably narrow that, particularly at the top end, without any problems. 14 At the low end, the typical rule of thumb recommended by most people seems to be that for the average male voice you can set the lower threshold at 80 Hz, and for the average female you can set it at 160 Hz. Note that you don't *have* to set the threshold higher for a female. Rather, it is just that you typically *can* set it higher if you wish. Note also that these are averages, and may not reflect an actual individual. 15 Simple Filters We will now create some simple filters using the same command line software mentioned in a previous episode in this series. These are FFMPEG and Sox. 16 First let's define some terminology. A high pass filter passes through frequencies which fall above a certain threshold and blocks frequencies which are below that frequency. A low pass filter passes through frequencies which fall below a certain threshold and blocks frequencies which are above that frequency. 17 In reality there isn't an abrupt cut-off in the filters. Instead there is a gradual roll off or sloping off of amplitude below or above the specified filter frequency. This is for two reasons. One is that if there was an abrupt cut off then it would risk introducing audible distortion in the signal for frequencies on the margin. 18 The other reason is that this is how hardware filters traditionally inherently worked when they were made out of electronic components such as resistors, capacitors, and inductors. The sharpness of this cut off can be adjusted, but we won't be fiddling with it in that sort of detail. You will sometimes see filters specified in terms of "poles". This has to do with describing how filters were constructed using electronic components. Don't worry about it, it doesn't really matter. 19 Here is a typical high pass filter using ffmpeg which filters out frequencies below 80 hertz. # High pass filter. ffmpeg -i inputfile.flac -af "highpass=f=80" outputfile.flac Here is a typical low pass filter using ffmpeg which filters out frequencies above 12 kHz. # Low pass filter. ffmpeg -i inputfile.flac -af "lowpass=f=12000" outputfile.flac 20 Here is a filter which combines the two. # Combined filters. ffmpeg -i inputfile.flac -af "highpass=f=80, lowpass=f=12000" outputfile.flac And here is the same thing using Sox. sox inputfile.flac outputfile.flac highpass 80 lowpass 12000 21 Filtering Out Specific Frequencies Recall that I mentioned that a common source of noise is the 50 or 60 Hz AC power line frequency working its way through the electronics of your recording device. Because filters operate gradually and the 80 Hz lower filter threshold is close to 60 Hz, the high pass filter may not deal with this adequately. 22 Now it happens that your listeners may not be able to hear this 50 or 60 Hz noise anyway because their audio hardware won't reproduce it. That by the way includes you not being able to hear it either when you review your recording before uploading it. However, there may be some HPR listeners who are sitting back sipping a glass of wine and listening to your episode on their stereo and who can hear it. That suggests that we ought to do something about it just in case. 23 I will get into how to analyze audio signals in a later episode, but for now just accept that I looked at the frequency spectrum of a sample recording using my hardware and found a large 60 Hz noise spike which I wanted to address. 24 Experimenting with additional high pass frequencies up to 120 Hz did not improve things much with respect to the 60 Hz problem. There are other parameters which could be tweaked, but at this point it would seem most promising to attack the 60 Hz spike problem directly using a different filter method. To deal with the this 60 Hz spike we can use a "band reject" filter, which removes a specific band of frequencies. We will use this in combination with the filtering that we have already done above. 25 After a small amount of experimenting I came up with the following. I also added in a 50 Hz filter while I was at it, for the benefit of those living in areas with 50 Hz electrical supply. These filters will be included in the show notes, so don't worry if you can't quite understand all the details from a verbal description. 26 Here's the FFMPEG version. # Using ffmpeg ffmpeg -i input.flac -af "highpass=f=80, lowpass=f=12000, bandreject=f=60:width_type=h:w=20, bandreject=f=50:width_type=h:w=20" output.flac 27 This as the following elements A high pass filter at 80 Hz, A low pass filter at 12 kHz, A band reject filter centred at 60 Hz and with a width of 20 hertz. A similar band reject filter centred at 50 Hz. 28 Here's the Sox version. # Sox version. sox input.flac output.flac highpass 80 lowpass 12000 bandreject 60 20 bandreject 50 20 Note that with sox, don't quote the filter definition strings or else it will result in an error as sox doesn't see enough parameters. This is not a problem with ffmpeg. 29 The band reject filter knocks the stuffing out of the 60 Hz line noise, and the 50 Hz parameter should do the same for that frequency as well. This basic filter should be able to be applied to any podcast audio recording without causing any problems. You can probably reduce the low pass frequency from 12 kHz down to 8 kHz without any problems, but I would suggest that you test it with your voice before making that decision. 30 I will come back to filtering out specific frequencies again later when I discuss how I solved a specific problem with the hardware that I am using. However, we have to discuss how to analyze audio signals before we can do that sort of technical troubleshooting, and I will cover that in a later episode. -------------------- 31 De-Essing An additional type of filtering is "de-essing". When recording audio, the microphone or environment may result in "s", "sh", "ch" and possibly other sounds to be exaggerated. These are all higher frequency elements of voice recordings. "De-essing" attempts to soften these sounds by selectively reducing the volume on the frequency band which contains these sounds. 32 Software Filters De-essing is accomplished via software filters. FFMPEG and Sox both have de-essing filters. For FFMPEG, the de-essing filter is built in. For Sox however, we must install an optional plug-in. I will cover this is more detail when I discuss using Sox for de-essing. 33 Do You Need De-Essing? The first thing to make clear however, is that you may not need to worry about this. If you think the audio sounds just fine the way it is, you don't need to do any de-essing to it. De-essing is a very subtle change, and you would probably need to do some careful before and after comparisons of audio samples to tell the difference. I didn't know that a thing called de-essing even existed before I started doing the research to make this podcast episode. However, at this point we are doing things more for fun than out of necessity, so I'll describe it anyway. 34 De-Essing with FFMPEG De-essing with FFMPEG is relatively simple. The filter is built in, and there are just three values to adjust. On the other hand, it is not really obvious what these values mean in practical terms. 35 I will however warn you to not rely on the AI search results from Google to understand this feature. The AI, in my experience, just makes stuff up about it and tells you to use options that don't exist and values that are not valid. I found that the only useful information came from FFMPEG's own web site, and from examples written by actual humans. 36 I then experimented with different values to see what effects they had. Since the results are rather subtle, fine tuning isn't really that necessary and I found that I could arrive at some reasonable values fairly quickly. I will provide the parameters that I found useful for me, and I suspect they would probably work for you as well. 37 Here is a typical de-essing command. ffmpeg -i inputfile.flac -filter_complex "deesser=i=0.5:m=0.5:f=0.5:s=o" -b:a 336k -sample_fmt s16 outputfile.flac 38 The important arguments are i, m, and f. i is intensity for triggering de-essing. The allowed range is 0 to 1. The default is 0. By experimentation I found that "0" means no de-essing, and "1" is maximum de-essing. I found that setting it to "0.5" gave satisfactory results. 39 m is the amount of "ducking on the treble part of sound". The allowed range is 0 to 1. The default is 0.5. By experimentation I found that "1" means no de-essing, and "0" is maximum de-essing. I found that setting it to "0.5" gave satisfactory results. 40 f is how much of the original frequency content to keep when de-essing. The allowed range is 0 to 1. The default is 0.5. By experimentation I found that "1" means no de-essing, and "0" is maximum de-essing. I found that setting it to "0.5" gave satisfactory results. 41 Setting "m" or "f" too high can result in a distorted output as too much of the original sound is cut out. The defaults of 0.5 in both cases gave audible improvements without noticeable distortion. 42 There is an additional parameter called "s". This controls whether the de-essing filter does anything. Setting it to "o" is the normal and default mode. Setting it to "e" causes it to output just the components that it would normally have filtered out. This is useful for testing purposes so you can see what and how much is being filtered. You only use this when experimenting with different values. Setting it to "i" causes the input to be passed through without de-essing. This would be useful in scripts where you want to use a variable to control whether or not to use the de-esser while still creating the expected output file. 43 There are two other elements of the command which were included but are not strictly speaking part of the de-essing filter itself . These are " -b:a 336k" and "-sample_fmt s16". " -b:a 336k" sets the audio bit rate to 336k. "-sample_fmt s16" sets the audio sample format to 16 bit. I found it necessary to specify these in order to prevent the de-essing filter from changing formats. They are not part of de-essing however. 44 De-Essing with Sox You can also de-ess with Sox. However, this is more complex for several reasons. One reason is that Sox does not have its own de-essing filters. Instead it uses optional plug-ins, and you must find and install these. The actual plug in may vary depending on what operating system you are using. The other reason is that it deals with the issue in fairly low level parameters, and so is a bit more complex to describe. Because of this I will skip over describing this in detail and just give a very brief overview. If anyone would like me to describe in more detail how to de-ess with Sox, then send in a comment and I will do a short episode on it later. 45 Sox De-Essing Overview To de-ess with Sox, you first need to install the plug-ins. On Linux, these will be the TAP ladspa plug-ins. TAP stands for "Tom's Audio Processing" plugins. ladspa stands for "Linux Audio Developer's Simple Plugin API" To install the TAP plugins on Ubuntu, using the following command. sudo apt install tap-plugins The plug-in we need is called "tap_deesser.so". 46 In order to use the plug-ins, you need to set the path as a variable. On Ubuntu this is. export LADSPA_PATH="/usr/lib/ladspa:" I put the above in the shell script which calls the Sox de-esser. 47 To use the Sox de-esser, you do the following: sox inputfile.flac outputfile.flac ladspa tap_deesser tap_deesser -30 4500 48 tap_deesser tap_deesser tells it which plugin to use. We need to state tap_deesser twice because the first is the name of the ".so" file and the second is the name of the plugin. A single "so" file can contain multiple filters, although in this case there is only one. -30 is the threshold in dB at which to start to apply the filter. 4500 is the frequency in Hz that the filter centres around. 49 The TAP web page has a table of recommended frequencies. These are: Male 'ess' 4500 Hz Male 'ssh' 3400 Hz Female 'ess' 6800 Hz Female 'ssh' 5100 Hz You will need to do some trial and error to find what works best for you. 50 De-Essing Summary De-essing can be used to make minor improvements to voice quality by reducing certain harsh sounds which may be exaggerated by a microphone. If it sounds like a lot of work you can probably simply not bother with it and not really miss it. -------------------- 51 Normalizing Normalizing a signal means adjusting it to meet a specified level. For audio it means adjusting the volume or sound level. You may wish to normalize the audio of your recording to make it easier to listen to when reviewing it. The copy that you send to HPR however should be the original un-normalized version. 52 Sound level is measured in two ways, dB and LUFS. The latter is a more sophisticated way of measuring things which takes into account how the human ear perceives loudness. I won't go into a lot of detail in that regards, other than to say that just accept LUFS as a unit of perceived loudness that is the international standard. LUFS stands for "Loudness Units referenced to Full Scale", and is part of the EBU R128 standard, where EBU stands for European Broadcast Union. In both cases the measured value is a negative number, with numbers smaller in magnitude being louder. Smaller in magnitude means closer to zero. 53 HPR will adjust the sound level for publication, but if you wish to check the audio before uploading it can help to adjust it to something close to what HPR will do so that you can listen to it at a volume which most listeners will hear. In my case full volume on the audio system input produced a sound level which was much lower than a typical HPR episode. However, the volume level in the flac file itself can be adjusted using ffmpeg. 54 Measuring Volume Level First we need to see what the volume level is for a typical HPR podcast. To do this we use ffmpeg. In this example we are using an episode named "hprpodcast.mp3". Pick an episode which you think is suitable and copy the file to the working directory. 55 In the following script we use a volumedetect filter. The text we want normally outputs to standard error, so we have to do a bit of bashery to redirect this to standard output so it will go through a pipe. We then grep for the string "I:". This will have the average volume level in "loudness units" (LUFS). Then we extract the number, giving us a target LUFS level. 56 ffmpeg -i hprpodcast.mp3 -filter:a ebur128=framelog=quiet -f null /dev/null 2>&1 | grep "I:" | cut -d: -f2 57 Unfortunately I can't find a Sox feature which handles EBU loudness, so we need to work in dB instead. Here is the sox version. However, note that this may not work on mp3s if sox mp3 handing is not installed. 58 sox hprpodcast.mp3 -n stats 2>&1 | grep "RMS lev dB" | rev | cut -d" " -f1 | rev 59 You can use either of these for measuring the volume or sound level of an audio file. However, note that individual episodes from HPR may vary a bit in terms of loudness. In the samples that I looked at, this however was less than 1 LUFS or dB while my own recording was roughly 5 LUFS lower in volume than a typical HPR episode. -------------------- 60 If you Google for the EBU R128 standard the AI result will confidently tell you to use a target of -23 LUFS. However, this is wrong, which shouldn't be of any surprise if you are familiar with using AI. 61 The -23 LUFS figure is for broadcast television. There is in fact no standard level for podcasts. However, there is apparently a general industry convention of using somewhere around -17 LUFS. If I look at the first two HPR episodes that I did, HPR normalized them to -16.8 LUFS and -17.8 LUFS, while the original FLAC files that I submitted were -21.6 LUFS and -22.3 LUFS respectively. 62 So HRP appear to be targeting somewhere around -17 LUFS as well. We will therefore use -17 LUFS as our target for our own copy for review. -------------------- 63 The nice thing about using the EBU filter in FFMPEG is that this is very simple. Here is the FFMPEG version. 64 ffmpeg -i inputfile.flac -af loudnorm=I=-17:TP=-2.0:LRA=7.0 -ar 44.1k outputfile.flac 65 "I" is the LUFS target. LRA is the loudness range target. The default value is 7.0 so I used that. TP sets the maximum true peak. The default value is -2.0. so I used that. -------------------- 66 With Sox things are a bit more difficult. There is no direct method of setting the loudness that I am aware of, so we need to measure the current sound level in dB, do some calculations, and then apply that as a gain factor to the output. 67 First we need to subtract the measured db level from our flac file from the target db level from the HPR episode we decided to use as a sample. Bash by itself normally just does integer math. However, we would like to have at least one decimal point of resolution to work with. The simple solution is to do this calculation using bc, the shell arbitrary precision calculator. 68 Then take this new value and use it in a "volume" filter. The number which we give sox is the amount to increase or decrease the volume by. Sox will then output a new file with the new volume level. You can now listen to this file under conditions more closely approximating what it will be like after HPR have done their own audio adjustments and normalizaton on it This helps when listening to the file for any problems before you upload it. 69 Rather than reading 5 lines of complex shell script to you, I will put a copy of it in the show notes. level=$( sox $inputfile -n stats 2>&1 | grep "RMS lev dB" ) leveldb=$( echo "$level" | rev | cut -d" " -f1 | rev ) targetdb="-18.9" volumechange=$(echo "scale=2 ; $targetdb - $leveldb" | bc ) sox $inputfile $outputname gain "$volumechange" -------------------- 70 Normalization should be the last thing you do to the file. It should be done after any noise filtering, such as low pass, high pass, bandreject, etc. If you normalize first, you will be amplifying the noise as well as the desired signal. 71 The exact normalization level used for review purposes doesn't matter, as HPR will apply their own later. All we are doing at this point is adjusting the volume to something which approximates a normal episode so you can listen to it for final review. 72 When you send your file to HPR, send the original *unnormalized* version, not the normalized version. When you normalize an audio signal, if you are not careful you may introduce things which cause problems with later additional processing. HPR probably do more things to the audio than just normalizing and so they need the unnormalized file so that they can do their own normalizing last. -------------------- 73 If at this point you are happy with the recording as is, you are ready to send the *unnormalized* version to HPR. The scripts to implement the features discussed in this episode will be in the show notes. 74 Conclusion In this episode we covered basic filtering using ffmpeg and sox. We discussed what noise was and some of the origins of noise. We talked about the audio frequency range and the limitations of common hardware used to record and listen to podcasts. We covered basic high and low pass filters used to limit the audio frequency range in order to remove possible low and high frequency noise. 75 We discussed specific filters to eliminate 50 and 60 Hz electrical power noise. We talked about de-essing, what it was, why you may wish to use it, and some basic de-essing filter implementation details. We discussed normalizing, what it is, why you may wish to use it, and how it relates to podcasting conventions. 76 In the next episode we will discuss analyzing audio signals to help find the sources of noise problems. We will also discuss creating filters to eliminate any problems that we found. In my case I had a problem with the microphone that I use, and I describe how I used filters to deal with that problem. 77 This has been the second episode in a four part series on simple podcasting. -------------------- EBU R128 Loudness Measurement using FFMPEG #!/bin/bash echo "EBU r128 loudness measurement using FFMPEG" for inputfile in *.flac *.mp3 ; do level=$( ffmpeg -i $inputfile -filter:a ebur128=framelog=quiet -f null /dev/null 2>&1 | grep "I:" | cut -d: -f2 ) echo $inputfile $level done -------------------- DB Sound Level Measurement using Sox #!/bin/bash # Sox version. May not work for mp3 if an mp3 format handling is not installed. echo "dB sound level measurement using Sox." for inputfile in *.flac *.mp3 ; do level=$( sox $inputfile -n stats 2>&1 | grep "RMS lev dB" ) leveldb=$( echo "$level" | rev | cut -d" " -f1 | rev ) echo $inputfile $leveldb done -------------------- EBU R128 Loudness Normalization using FFMPEG #!/bin/bash # Adjust the volume to a desired level. for inputfile in *.flac ; do j=$( basename $inputfile ".flac" ) outputname="$j""-normff.flac" ffmpeg -i $inputfile -af loudnorm=I=-17:TP=-2.0:LRA=4.0 -ar 44.1k $outputname echo $outputname done -------------------- DB Sound Level Normalization using Sox #!/bin/bash # Adjust the volume to a desired level. for inputfile in *.flac ; do j=$( basename $inputfile ".flac" ) outputname="$j""-normff.flac" # Measure the volume level and extract the mean volume. level=$( sox $inputfile -n stats 2>&1 | grep "RMS lev dB" ) leveldb=$( echo "$level" | rev | cut -d" " -f1 | rev ) # Calculate the difference in dB desired. Scale specifies the number of decimal places. # Target db is the volume measured on hpr4506 (UCSD-P-System). targetdb="-18.9" volumechange=$(echo "scale=2 ; $targetdb - $leveldb" | bc ) echo "Using sox: File: $inputfile Original level: $leveldb Change by: $volumechange" # Adjust the volume. sox $inputfile $outputname gain "$volumechange" done -------------------- Full processing pipeline for making simple podcasts using FFMPEG #!/bin/bash #!/bin/bash # Full processing pipeline for making simple podcasts. # ====================================================================== # Concatenate multiple flac files into a single flac file. # This is used to combine podcast recorded segments into a single # flac file for uploading to HPR. concataudio () { outputname="$1" # First create the list file. printf "file '%s'n" [0-9][0-9].flac > podseglist.txt # Now concatenate them ffmpeg -f concat -safe 0 -i podseglist.txt "$outputname" rm podseglist.txt } # ====================================================================== # Basic filters. filter () { inputfile=$1 outputname=$2 # Using ffmpeg. # The high and low pass filters. hlpfil="highpass=f=80, lowpass=f=12000" # Band reject filters filter for 60Hz and another for 50Hz. linefil="bandreject=f=60:width_type=h:w=20, bandreject=f=50:width_type=h:w=20" # Using ffmpeg ffmpeg -i $inputfile -af "$hlpfil, $linefil" $outputname } # ====================================================================== # De-Essing. deessing () { inputfile=$1 outputname=$2 option=$3 # De-essing filter. ffmpeg -i $inputfile -filter_complex "deesser=i=0.5:m=0.5:f=0.5:s=$option" -b:a 336k -sample_fmt s16 $outputname } # ====================================================================== # Normalizing the audio to EBU R128 standard for review using ffmpeg. normffmpeg () { inputfile=$1 outputname=$2 # Normalize to EBU R128 standard. ffmpeg -i $inputfile -af loudnorm=I=-17:TP=-2.0:LRA=4.0 -ar 44.1k $outputname } # ====================================================================== # Output an MP3 version to help with reviewing. mp3convert () { inputfile=$1 # Get the name of the file and then create the output file name. j=$( basename $inputfile ".flac" ) outputname="$j"".mp3" # Convert to MP3. ffmpeg -i $inputfile $outputname } # ====================================================================== # Concatenate the separate audio files. concataudio fullpod-unfiltered.flac # Basic filtering. filter fullpod-unfiltered.flac filtered.flac # De-essing. This is the version to send for publishing. # The third argument should be "o" for de-essing, or "i" for pass through without de-essing. deessing filtered.flac fullpod.flac o # Normalized for review. normffmpeg fullpod.flac fullpod-norm.flac # Output an MP3 copy for review. mp3convert fullpod-norm.flac -------------------- -------------------- Provide feedback on this episode.

    HPR4617: UNIX Curio #4 - Archiving Files

    Play Episode Listen Later Apr 14, 2026


    This show has been flagged as Clean by the host. This series is dedicated to exploring little-known—and occasionally useful—trinkets lurking in the dusty corners of UNIX-like operating systems. When you think about creating and managing archives on a UNIX system, tar is probably the utility that comes to mind. But this was not the first archiving program; ar was in First Edition UNIX 1 and cpio also pre-dates it, sort of 2 . According to the NetBSD manual page, cpio was developed within AT&T before tar , but did not get widely released until System III UNIX after tar was already well known from the earlier release of Seventh Edition UNIX (a.k.a. Version 7). You might think that ar and cpio are old and irrelevant these days, but these formats do live on. Each Debian package file 3 is an ar archive which in turn contains two tar files. On Red Hat, Fedora, SUSE, and some other distributions, each .rpm package file 4 contains a cpio payload. So these may very well still be in use on your modern Linux system. But let's get back to the subject of what you might want to use to create archives today. The tar utility has persisted in its popularity over the decades, and you most probably have a version installed on your UNIX-like systems. One of the problems with tar , however, is that it has not kept a consistent file format. Also, different implementations have used differing syntax at times. There are excellent reasons for the file format changing 5 . The names people give files have gotten longer over time, and the original Seventh Edition tar format could only handle a total pathname length of 100 bytes for each archive member. In addition, filenames were in ASCII format, and modern filesystems now accommodate richer encodings with characters that aren't in ASCII. The size of each archive member was limited to 8 gigabytes—unthinkably large back then, but not so big these days. User and group ownership could only be specified by numeric ID, which can vary from one system to another. Many other types of files and information simply couldn't be stored: block and character device nodes, FIFOs, sockets, extended attributes, access control lists, and SELinux contexts. As a result, the tar format had to evolve over the years. One important version was the ustar format, created for the 1988 POSIX standard. The POSIX committee wanted to try standardizing both the file format and syntax for the tar command. While the ustar format addressed some shortcomings, progress marched on. Filesystems started allowing filenames in different character sets and more types of information to be attached to files, so for the 2001 revision of POSIX they gave up on standardizing the tar utility and came up with a new format and utility, which is our actual UNIX Curio for this episode: pax 6 . Since the pax program didn't have historical baggage, they could specify its options, behavior, and file format and be sure everyone's implementation would match. Developers of different tar implementations had been reluctant to change away from their historical option syntax to the standard. The pax utility was also an attempt to avoid taking sides between those who advocated for tar and fans of cpio . The pax file format was an extension of ustar with the ability to add arbitrary new attributes tied to each archive member as UTF-8 Unicode. Some of these attribute names were standardized, but implementers could also define their own, making the format more future-proof. Older versions of tar that could handle the ustar format should still be able to process pax archives, but might not know what to do with the extra attributes. GNU tar developed its current archive format 7 alongside the standardization of the ustar format. The GNU format was based on an early draft which later underwent incompatible changes, so the two unfortunately are not interchangable. Unlike ustar , the GNU format has no limits on the size of files or the length of their names. In addition to its own format, GNU tar is able to detect and correctly process both ustar and pax archives. In situations where its native format can't store necessary information about a file (such as POSIX access control lists or extended attributes), GNU tar will automatically output the pax format instead (called "posix" in documentation). However, it still uses the GNU format by default, though the documentation has been threatening to move to the POSIX format for at least 20 years 8 . The good news is that the ustar , pax , GNU tar , and Seventh Edition tar formats are well documented and utilities across many UNIX-like systems 2,7,9,10,11 are able to handle these, depending on which formats existed when the utility was developed. While your system may not have pax itself installed, there are other archiving utilities that can read the file format, including GNU tar . (Somewhat amusingly, Debian and some other Free Software operating systems package a pax utility developed by MirBSD 12 which largely follows the POSIX-specified interface, but doesn't support reading or writing archives in pax format!) Look at the manual page for the tar , cpio , or pax utilities on your system to see if they can handle pax archives. Perhaps one aspect that has worked in favor of tar and other UNIX archive formats is that they only concern themselves with storing files and make no attempt at compression. Instead, it is common for a complete archive file to be compressed after creation; many utilities can be told to do this step for you, but it is not typically the default behavior. Therefore, if a better compression method comes along, the archive format doesn't need to change. If you do use compression, be careful to choose a method that is available on the destination system. Compressing files is a big enough subject to deserve its own episode, so we won't talk more about it here. So which format should you use when creating an archive? Unfortunately, there is no single answer that applies in all circumstances. The pax format is supported among modern UNIX-like systems and can represent all types of files and metadata. While other systems, their filesystems, and archive utilities might not be able to properly make use of all the metadata, they should at least be able to extract the data contained in files and, if Unicode is supported, give them appropriate filenames. If you intend to unpack the archive on an older system, more research might be needed to figure out what formats it is able to handle. The Seventh Edition tar format (often called "v7") is widely supported, including by older systems, but has limitations in what it can contain as described earlier. Moving beyond the UNIX world, things get even more complicated. Apple's macOS, with its FreeBSD underpinnings, easily handles tar files. However, when it comes to MS-DOS and Windows, it's a bit different. There, a multitude of archiving programs and formats arose, usually combining archiving with compression. PKZIP was probably the most popular of these and its .zip format became common in many places, helped by the fact that PKWARE openly published the specification. While there is only a single .zip format, it has many options, some proprietary, and different implementations have diverged in the way some aspects are handled (or not handled). An ISO/IEC standard for .zip 13 was published in 2015 giving a baseline profile, and sticking to it produces files that can be widely extracted successfully. Other file formats like OpenDocument use the .zip format and typically hew to the standardized profile. Windows' File Explorer, starting with Windows XP, can natively extract .zip files 14 . The Info-ZIP program 15 is a Free Software implementation for a wide variety of systems (even rather obscure ones); while it might not be installed on yours, if you're copying the archive file over, you can probably copy over its unzip utility at the same time to unpack it. So .zip probably has the broadest support, although it might not already be present on every system. However, as Klaatu points out in Hacker Public Radio episode 4557 16 , .zip files and applications handling them aren't always great at maintaining metadata about files. The .zip format doesn't seem to have any way to represent UNIX file permissions, and user/group ownership can only be included as numeric IDs. Other types of metadata on UNIX-like systems are not saved at all. This is probably not a problem in some cases, such as with a collection of photos, but for others it might be a concern. While pax as a utility does not seem to have gained much popularity or support, except on commercial UNIX systems where including it was required to conform to the POSIX standard, its file format has persisted. Free Software systems have generally avoided the pax interface, preferring to stick with the tar utility on the command line, but usually have good support for archive files in the pax format. Outside of UNIX-like systems, .zip seems to have become the most common file format, and support for it is also good in the UNIX world, though it might not be built in. References: Archive (library) file format https://man.cat-v.org/unix-1st/5/archive NetBSD 10.0 cpio manual page https://man.netbsd.org/NetBSD-10.0/cpio.1 Debian binary package format https://manpages.debian.org/trixie/dpkg-dev/deb.5.en.html RPM V6 Package format https://rpm.org/docs/6.0.x/manual/format_v6.html NetBSD 10.0 libarchive-formats manual page https://man.netbsd.org/NetBSD-10.0/libarchive-formats.5 Pax specification https://pubs.opengroup.org/onlinepubs/009695399/utilities/pax.html GNU tar manual https://www.gnu.org/software/tar/manual/tar.html GNU tar manual for version 1.15.90 https://web.cvs.savannah.gnu.org/viewvc/*checkout*/tar/tar/manual/tar.html?revision=1.3 FreeBSD 15.0 libarchive-formats manual page https://man.freebsd.org/cgi/man.cgi?query=libarchive-formats&sektion=5&apropos=0&manpath=FreeBSD+15.0-RELEASE+and+Ports OpenBSD 7.8 tar manual page https://man.openbsd.org/OpenBSD-7.8/tar HP-UX Reference (11i v3 07/02) - 1 User Commands N-Z (vol 2) https://support.hpe.com/hpesc/public/docDisplay?docId=c01922474&docLocale=en_US MirBSD pax(1) manual page http://www.mirbsd.org/htman/i386/man1/pax.htm#Sh.STANDARDS ISO/IEC 21320-1:2015 Information technology - Document Container File Part 1: Core https://www.iso.org/standard/60101.html Mastering File Compression on Windows https://windowsforum.com/threads/mastering-file-compression-on-windows-how-to-zip-and-unzip-files-effortlessly.369235/ About Info-ZIP https://infozip.sourceforge.net/ HPR4557::Why I prefer tar to zip https://hackerpublicradio.org/eps/hpr4557/index.html Provide feedback on this episode.

    HPR4616: Thoughts about age control and further suggestions

    Play Episode Listen Later Apr 13, 2026


    This show has been flagged as Explicit by the host. HPR EXCLUSIVE: THE INTERVIEW THAT WILL SAVE CIVILIZATION (OR AT LEAST YOUR KITCHEN DRAWER) Hopper sits down with the legendary Trollercoaster for a completely serious policy discussion with absolutely zero sarcasm whatsoever Tired of living in a world where ANYONE can just... open a drawer? Where CHILDREN can casually access spatulas and spicy condiments without proving their age to a licensed algorithm? Where your VCR doesn't run a background check before spooling up a tape? WELL, WORRY NO MORE. In this landmark interview, visionary tech policy thinker Trollercoaster lays out the roadmap to a safer tomorrow — one age-verified gunshot wound at a time. Topics covered include: System 76's courageous capitulation — actually a 5D chess move to manufacture the next generation of hackers by making Linux mildly annoying again Two-factor authentication for firearms — SMS-based triggers considered, reluctantly rejected (reception is bad at most crime scenes) GPS injections at birth — like circumcision, but for helicopter parents. Kids won't remember. Probably. Kitchen-as-a-Service (KaaS™) — powered by Microsoft, mandated by your government, billed monthly, support tickets routed to Bangalore Biannual maturity exams — because some people's brains start "deteriorating" and they end up making sarcastic podcasts that lawmakers might accidentally take seriously The liability framework is elegant in its simplicity: if anything bad ever happens to anyone, sue the manufacturer . Philips. IKEA. Smith & Wesson. Your kitchen. It doesn't matter. Someone made a thing, someone got hurt, somebody owes somebody lunch money. If you agree with any of this: contact your lawmakers immediately. They are waiting by the phone. If you disagree : too late, buddy. The lobbyists are already having the soup course. The lawmakers need your insights. They are, as noted, extremely narrow-minded. The comment section is open. Provide feedback on this episode.

    HPR4615: Clicking through an audit

    Play Episode Listen Later Apr 10, 2026


    This show has been flagged as Explicit by the host. ISO 27001 from Wikipedia.org: ISO/IEC 27001 is an information security standard . It specifies the requirements for establishing, implementing, maintaining and continually improving an information security management system (ISMS). Organizations with an ISMS that meet the standard's requirements can choose to have it certified by an accredited certification body following successful completion of an audit . Information security audit from Wikipedia.org: An information security audit is an audit of the level of information security in an organization. It is an independent review and examination of system records, activities, and related documents. These audits are intended to improve the level of information security, avoid improper information security designs, and optimize the efficiency of the security safeguards and security processes. Factors contributing to cybersecurity fatigue Source: Adapted from Factors contributing to cybersecurity fatigue by L. J. J. S. (2024), Abertay University. Available at: https://rke.abertay.ac.uk/en/publications/factors-contributing-to-cybersecurity-fatigue/ In cloud-based environments, the push for high-security standards often leads to "cybersecurity fatigue," which creates unintended psychological strain on employees. Constant interruptions from repetitive access requests. Overload of security checks and decision fatigue. Lack of clear understanding regarding actual cybersecurity risks. Impact on Behavior Fatigue frequently leads to negative outcomes, including the bypassing of security protocols, abandonment of necessary tasks, and total disengagement from mandatory training. Key Concept The study highlights "attitudinal fatigue" (an employee's negative mindset toward security) as a major barrier to organizational resilience and compliance. Strategic Recommendations: Transition to "contextualized training" that uses relatable, real-world scenarios. Streamline security workflows to minimize disruption to daily productivity. Develop targeted interventions. National Institute of Standards and Technology 2011 Report: Information Security Continuous Monitoring (ISCM) for Federal Information Systems and Organizations (Tangentially ) related Episodes hpr3779 :: Just Because You Can Do a Thing... - Trey hpr0061 :: Punk Computing - Klattu hpr0002 :: Customization the Lost Reason - Deepgeek Provide feedback on this episode.

    HPR4614: Dauug|18: Faster Than a '286, but Inspectable Like a Soroban

    Play Episode Listen Later Apr 9, 2026


    This show has been flagged as Clean by the host. In this show, Marc Abel presents an introduction to Dauug|18, an 18-bit controller developed by The Dauug House. About the size of a postcard, Dauug|18 avoids the use of complex VLSI such as microprocessors, FPGAs, PLDs, ASICs, and DRAM. Instead, the architecture is built from trivial glue logic and synchronous static RAM, using components that can be hand-soldered and verified for connectivity after assembly. The motivation for Dauug|18 is to provide refuge in situations where transparency, auditability, and supply chain integrity are priorities. Rather than relying on high-integration silicon, Dauug|18 is auditable at the logic-gate level, allowing owners to verify the integrity of their hardware. This show covers key architectural details, the decision to use SRAM for both memory and logic, and system constraints that stem from Dauug|18's brutal simplicity, limited component selection, and succinctness. The practical effect of these constraints on programming Dauug|18 is also discussed in detail. Anticipated uses for Dauug|18 include privacy assertion, critical infrastructure, and curricula for fields relating to computer engineering. Files supplied with this show include a short PDF of Dauug|18 architectural details, as well as word-accurate, spell-checked subtitles and their matching transcript. More information, technical documentation, and updates on related projects like Dauug|36 can be found at https://dauug.org. Provide feedback on this episode.

    HPR4613: Adding functionality to an Odoo installation

    Play Episode Listen Later Apr 8, 2026


    This show has been flagged as Clean by the host. A show about downloading and installing extra Odoo addons. There are 18780 lines of Python code in the core of Odoo (18) The standard set of available apps are usually installed in /usr/lib/python3/dist-packages/odoo/addons/ Take note of the Linux File Hierarchy Standard So install your own stuff somewhere under /usr/local. For this show we standardize on /usr/local/lib/python3/odoo/addons But some use /opt/odoo. Edit /etc/odoo/odoo.conf and add: addons_path = /usr/lib/python3/dist-packages/odoo/addons, /usr/local/lib/python3/odoo/addons Find extra apps for example in: https://apps.odoo-community.org/shop First example: "Web Responsive", "https://github.com/OCA/web/", subdirectory "web_responsive" Next go to: Menu->Settings->Enable developermode->Goto Apps app->Update list of apps: to scan for all apps Install the app you just installed in /usr/local/lib/python3/odoo/addons Some more apps: "Web No Bubble" ,"https://github.com/OCA/web/", subdirectory "web_no_bubble" "Remove odoo.com Bindings", "https://github.com/OCA/server-brand/", subdirectory "disable_odoo_online" To unhide accountancy: https://github.com/OCA/account-financial-tools/tree/19.0/account_usability To add a helpdesk: https://apps.odoo-community.org/shop/helpdesk-management-4839 Want more support? : jeroen@jeroenbaten.nl Provide feedback on this episode.

    HPR4612: Hackerpublic Radio New Years Eve Show 2026 Episode 4

    Play Episode Listen Later Apr 7, 2026


    This show has been flagged as Explicit by the host. Aldi https://www.aldi.us/ https://en.wikipedia.org/wiki/Aldi Does Aldi's Summit Diet Cola Contain Aspartame? https://www.thedailymeal.com/1465489/does-aldi-cola-contain-aspartame/ Aspartame and Other Sweeteners in Food https://en.wikipedia.org/wiki/Aspartame https://www.fda.gov/food/food-additives-petitions/aspartame-and-other-sweeteners-food https://pmc.ncbi.nlm.nih.gov/articles/PMC8227014/ Sugar: THE BITTER TRUTH https://www.youtube.com/watch?v=dBnniua6-oM How to Make Up Comebacks when Somebody Calls You Fat https://www.wikihow.com/Make-Up-Comebacks-when-Somebody-Calls-You-Fat Swimming With Men - You Calling Me Fat? https://www.youtube.com/watch?v=JbD_sk0ih0g "Weird Al" Yankovic - Fat (Official Video) https://www.youtube.com/watch?v=t2mU6USTBRE Sam's Club https://www.samsclub.com/ 3rd Rock from the Sun https://en.wikipedia.org/wiki/3rd_Rock_from_the_Sun Interstate Highway System https://en.wikipedia.org/wiki/Interstate_Highway_System History of the Interstate Highway System https://highways.dot.gov/highway-history/interstate-system/50th-anniversary/history-interstate-highway-system https://www.gbcnet.com/ushighways/history.html https://www.history.com/articles/interstate-highway-system https://www.historicushighways.com/history-of-us-highways https://vividmaps.com/evolution-interstate-highway-system/ https://www.youtube.com/watch?v=SF16uDPGi14 99% Invisible https://99percentinvisible.org/ https://en.wikipedia.org/wiki/99%25_Invisible Devhack is a Queer-focused hackerspace https://wiki.hackerspaces.org/%E2%88%95dev/hack https://devhack.net/ Beyond The Exit https://www.youtube.com/@BTE4172/videos Amtrak https://www.amtrak.com/home Palmer Raids https://en.wikipedia.org/wiki/Palmer_Raids Mumble project https://www.mumble.info/ LinuxLugCast https://linuxlugcast.com/ n scale piedmont northern boxcar https://www.worthpoint.com/worthopedia/scale-kadee-piedmont-northern-40-1840448079 N scale https://en.wikipedia.org/wiki/N_scale HO scale https://en.wikipedia.org/wiki/HO_scale Rail transport modelling scales https://en.wikipedia.org/wiki/Rail_transport_modelling_scales Navy Pier https://en.wikipedia.org/wiki/Navy_Pier https://navypier.org/ The IT Crowd https://en.wikipedia.org/wiki/The_IT_Crowd https://www.imdb.com/title/tt0487831/ A Christmas Story https://en.wikipedia.org/wiki/A_Christmas_Story Die Hard https://www.imdb.com/title/tt0095016/ https://theconversation.com/nine-reasons-why-die-hard-really-is-a-christmas-film-173801 The Fifth Element https://en.wikipedia.org/wiki/The_Fifth_Element Footloose https://en.wikipedia.org/wiki/Footloose Tom Cruise's Couch Jump https://people.com/tom-cruise-couch-jump-on-oprah-is-20-years-old-11737728 Cruise control https://en.wikipedia.org/wiki/Cruise_control Blind spot monitor https://en.wikipedia.org/wiki/Blind_spot_monitor Kenworth T680 https://www.kenworth.com/trucks/T680/ https://www.youtube.com/watch?v=Ze05NW6UJOE Knight Rider https://en.wikipedia.org/wiki/Knight_Rider_(1982_TV_series) https://en.wikipedia.org/wiki/KITT Christine (King novel) https://en.wikipedia.org/wiki/Christine_(King_novel) SWAT https://en.wikipedia.org/wiki/SWAT The Blues Brothers (film) https://en.wikipedia.org/wiki/The_Blues_Brothers_(film) https://www.imdb.com/title/tt0080455 Speed limits in the United States https://en.wikipedia.org/wiki/Speed_limits_in_the_United_States Provide feedback on this episode.

    HPR4611: HPR Community News for March 2026

    Play Episode Listen Later Apr 6, 2026


    This show has been flagged as Explicit by the host. New hosts There were no new hosts this month. Last Month's Shows Id Day Date Title Host 4586 Mon 2026-03-02 HPR Community News for February 2026 HPR Volunteers 4587 Tue 2026-03-03 UNIX Curio #1 - Shell Archives Vance 4588 Wed 2026-03-04 HPR Beer Garden 11 - Belgian Scotch Ale Kevie 4589 Thu 2026-03-05 YouTube Subscriptions 2025 #15 Ahuka 4590 Fri 2026-03-06 Playing Civilization V, Part 9 Ahuka 4591 Mon 2026-03-09 A Bit of Git Lee 4592 Tue 2026-03-10 Happy by shower # 2 Antoine 4593 Wed 2026-03-11 Nuclear Reactor Technology - Ep 8 Generation Four Reactors Whiskeyjack 4594 Thu 2026-03-12 Hackerpublic Radio New Years Eve Show 2026 Episode 2 Honkeymagoo 4595 Fri 2026-03-13 WATER WATER EVERYWHERE! operat0r 4596 Mon 2026-03-16 Adding voice-over audio track created using text to speech on the movie subtitles Ken Fallon 4597 Tue 2026-03-17 UNIX Curio #2 - fgrep Vance 4598 Wed 2026-03-18 Recording good audio using open source tools Shane - StrandedOutput 4599 Thu 2026-03-19 Women in digital and games event Dave Hingley 4600 Fri 2026-03-20 The First Doctor, Part 5 Ahuka 4601 Mon 2026-03-23 How to be a better writer enistello 4602 Tue 2026-03-24 Hackerpublic Radio New Years Eve Show 2026 Episode 3 Honkeymagoo 4603 Wed 2026-03-25 On the Erosion of Freedom in Open Source Software HopperMCS 4604 Thu 2026-03-26 Quick Tips for January 20 26 operat0r 4605 Fri 2026-03-27 Lee locks down his wifey poo Elsbeth 4606 Mon 2026-03-30 My Nerdy Childhood: From Floppy Disks to Dial-Up Dreams Trollercoaster 4607 Tue 2026-03-31 UNIX Curio #3 - basename and dirname Vance Comments this month Past shows hpr3711 (2022-10-24) "Cars" by Zen_Floater2. m0dese7en said: "Additional details on cars" (2026-03-13 16:44:12) hpr4333 (2025-03-12) "A Radically Transparent Computer Without Complex VLSI" by Marc W. Abel. Marc said: "New online home for Dauug|36 and Dauug|18" (2026-03-25 15:18:15) hpr4424 (2025-07-17) "How I use Newsboat for Podcasts and Reddit" by Archer72. أحمد المحمودي said: "Not fixed" (2026-03-31 00:54:19) hpr4509 (2025-11-13) "HPR Beer Garden 5 - Heferweisen" by Kevie. Gan Ainm said: "Hefeweizen" (2026-03-04 06:47:39) Kevie said: "Thanks Gan" (2026-03-13 15:28:45) hpr4553 (2026-01-14) "Nuclear Reactor Technology - Ep 4 Less Common Reactor Types" by Whiskeyjack. Antoine said: "Were/are the designs patented?" (2026-03-18 12:41:35) Whiskeyjack said: "Reply to Antoine" (2026-03-19 03:31:50) Antoine said: "I will" (2026-03-21 02:30:29) hpr4565 (2026-01-30) "HPR Beer Garden 9 - Barley Wine" by Kevie. Aleman said: "Beer Garden" (2026-03-06 19:25:26) hpr4571 (2026-02-09) "Data processing retrospective" by Lee. Archer72 said: "previous generation" (2026-03-03 15:44:12) hpr4573 (2026-02-11) "Nuclear Reactor Technology - Ep 6 Thorium Reactors" by Whiskeyjack. Archer72 said: "Interesting series" (2026-02-28 16:59:15) Whiskeyjack said: "Reply to Archer72" (2026-02-28 23:06:46) Clinton said: "Modern situation." (2026-03-07 11:30:14) Whiskeyjack said: "Reply to Clinton" (2026-03-07 18:42:23) hpr4574 (2026-02-12) "UNIX Curio #0 - Introduction" by Vance. murph said: "Great show, looking forward to more." (2026-03-01 19:21:46) hpr4575 (2026-02-13) "Making First Contact" by Ken Fallon. Archer72 said: "Good to hear 73's" (2026-02-28 15:51:52) hpr4576 (2026-02-16) "Responce to Lee/Elsbeth eps" by operat0r. candycanearter07 said: "relatable episode" (2026-03-10 01:39:18) hpr4577 (2026-02-17) "HPR Beer Garden 10 - Scotch Ale/Wee Heavy" by Kevie. Kevie said: "Upcoming beers" (2026-02-26 18:14:16) hpr4583 (2026-02-25) "Nuclear Reactor Technology - Ep 7 Small Modular Reactors" by Whiskeyjack. brian-in-ohio said: "good shows" (2026-03-02 21:10:12) Whiskeyjack said: "Response to brian-in-ohio for HPR4583 Small Modular Reactors" (2026-03-03 23:38:55) hpr4584 (2026-02-26) "Recording a show, and crappy audio" by Archer72. Dave Lee (thelovebug) said: "Audio quality" (2026-02-27 08:33:24) Kevin O'Brien said: "The Zoom was perfect" (2026-02-27 17:29:43) Archer72 said: "Bad mic" (2026-03-03 15:08:13) jezra said: "false advertising! " (2026-04-03 17:28:05) hpr4585 (2026-02-27) "mpv util scripts" by candycanearter. Windigo said: "mpv fanclub" (2026-02-28 01:55:28) Windigo said: "Re: mpv fanclub" (2026-03-01 05:07:24) Archer72 said: "Second in mpv fanclub" (2026-03-01 08:52:41) candycanearter07 said: "updated script" (2026-03-01 22:35:38) This month's shows hpr4586 (2026-03-02) "HPR Community News for February 2026" by HPR Volunteers. candycanearter07 said: "41:40" (2026-03-01 23:39:18) Whiskeyjack said: "HPR Commnity News discussion on audio" (2026-03-03 23:11:25) hpr4587 (2026-03-03) "UNIX Curio #1 - Shell Archives" by Vance. Archer72 said: "Continuing series" (2026-03-03 15:15:19) xmanmonk said: "uuencode/uudecode on Solaris" (2026-03-05 01:47:53) Vance said: "Thanks, and Solaris" (2026-03-07 20:10:08) Jim DeVore said: "Thanks for the trip down memory lane!" (2026-03-17 01:19:46) hpr4591 (2026-03-09) "A Bit of Git" by Lee. candycanearter07 said: "anecdotal teaching is the best kind" (2026-03-09 04:58:24) hpr4592 (2026-03-10) "Happy by shower # 2" by Antoine. candycanearter07 said: "interesting!" (2026-03-10 04:20:16) Antoine said: "Sharing (response to candycanearter07)" (2026-03-21 02:27:17) hpr4593 (2026-03-11) "Nuclear Reactor Technology - Ep 8 Generation Four Reactors" by Whiskeyjack. Jim DeVore said: "Great series!" (2026-03-17 01:13:51) Whiskeyjack said: "Response to Jim DeVore" (2026-03-17 13:46:31) hpr4596 (2026-03-16) "Adding voice-over audio track created using text to speech on the movie subtitles" by Ken Fallon. folky said: "Interesting solution, but annoying " (2026-02-05 11:54:36) Carsten said: "Amazing project" (2026-02-25 00:29:08) candycanearter07 said: "interesting!!" (2026-03-16 13:38:03) hpr4597 (2026-03-17) "UNIX Curio #2 - fgrep" by Vance. Ken Fallon said: "Time to active use" (2026-03-05 05:58:31) L'andrew said: "Nice job explaining *grep features." (2026-03-18 03:34:11) candycanearter07 said: "informative" (2026-03-18 03:52:52) Vance said: "Expressions" (2026-03-20 18:16:09) hpr4598 (2026-03-18) "Recording good audio using open source tools" by Shane - StrandedOutput. Archer72 said: "Great tips!" (2026-03-19 10:39:24) Ole Aamot said: "GarageJam 6.0.1" (2026-03-24 01:50:51) hpr4600 (2026-03-20) "The First Doctor, Part 5" by Ahuka. Kevie said: "Great series" (2026-03-21 15:22:59) Kevin O'Brien said: "I think I will" (2026-03-21 21:23:38) Archer72 said: "Great series and 2nd continuation " (2026-03-21 22:35:05) hpr4605 (2026-03-27) "Lee locks down his wifey poo" by Elsbeth. Ken Fallon said: "Congratulations" (2026-03-18 11:09:45) Elsbeth said: "Thank you!" (2026-03-27 11:10:10) Trollercoaster said: "Congrats - and now we want all the fun puns!" (2026-03-27 12:58:38) Antoine said: "=)" (2026-03-29 22:39:06) ClaudioM said: "Congratulations to You Both!" (2026-03-30 13:22:43) Paulj said: "Congratulations" (2026-04-04 19:52:01) hpr4606 (2026-03-30) "My Nerdy Childhood: From Floppy Disks to Dial-Up Dreams" by Trollercoaster. Trey said: "Trip down memory lane..." (2026-03-30 14:24:54) xmanmonk said: "Great Episode!" (2026-03-30 16:23:43) Trollercoaster said: "Back to you..." (2026-03-31 08:24:58) Trollercoaster said: "Not to janitors" (2026-03-31 08:26:06) ClaudioM said: "Nerdy Nostalgia!" (2026-03-31 17:20:34) hpr4607 (2026-03-31) "UNIX Curio #3 - basename and dirname" by Vance. xmanmonk said: "Great episode!" (2026-03-31 14:19:12) Mailing List discussions Policy decisions surrounding HPR are taken by the community as a whole. This discussion takes place on the Mailing List which is open to all HPR listeners and contributors. The discussions are open and available on the HPR server under Mailman. The threaded discussions this month can be found here: https://lists.hackerpublicradio.com/pipermail/hpr/2026-March/thread.html Events Calendar With the kind permission of LWN.net we are linking to The LWN.net Community Calendar. Quoting the site: This is the LWN.net community event calendar, where we track events of interest to people using and developing Linux and free software. Clicking on individual events will take you to the appropriate web page. Provide feedback on this episode.

    HPR4610: Playing Civilization V, Part 10

    Play Episode Listen Later Apr 3, 2026


    This show has been flagged as Clean by the host. In our next look at the game mechanics for Civilization V we three key ideas: Great People, Trade, and Empires/Civilizations. Playing Civilization V, Part 10 - Great People Gaining Great People You earn Great People by accumulating Great Person Points (GPP). Each type of Great Person has its own type of GPP, and they are earned independently, so you can easily accumulate points for several different types of Great People at the same time. You can earn these points through specialists, through Wonders, and through Social Policies. While you can accumulate points towards any and all Great People, you should focus on ones that fit your game strategy. If you are going for a Domination victory, you should focus on Great Generals and Great Admirals in preference to Great Artists and Great Musicians. But if you are going for a Culture victory you might want to reverse that. That is not to say you won't gain a few random other Great People along the way, just that you should know what you are trying to achieve. And Great Generals and Great Admirals are a little different in that you earn them by winning battles. Types of Great People Great Artist – Can start Golden Age, or create Great works Great Musician – Can do Concert Tour (+Tourism), or create Great Works Great Writer- Can write a Political Treatise (+Culture), or create Great Works Great Engineer – Can hurry production (including Wonders). Can create Manufactory Great General – combat bonus to units within 2 tiles, or steal land when creating a Citadel Khan – Unique to Mongolia, replaces Great General, moves faster and heals adjacent units, and can create Citadel Great Merchant – Trade Mission (+Gold and +Influence with a city state). Create Customs House Merchant of Venice – Unique to Venice, replaces Great Merchant. +100% Gold and +100% Influence from Trade Mission, or can puppet a City-State. Can create Customs House Great Scientist – Can Hurry Research, or create Academy Great Admiral – Combat bonus to naval units within 2 tiles. Can repair adjacent naval and embarked units Great Prophet – Can Found or enhance Religion, can spread Religion, or can create Holy Site Every type except Great Admiral can create something, but that uses up the Great Person. And the main action for each also uses up the Great Person (e.g. do a Concert Tour, Hurry Production, etc.). So you need to consider which one works best for you. As a general rule, compare which option pays off the best. For example, if it is early in the game and you get a Great Scientist, creating an Academy will give you science points per turn that will pay off over the whole game. But once you hit the mid-to-late stages the one time hit of science points from Hurry Research makes more sense because you don't have the time left for the per-turn bonus from an Academy to add up. And if there is a key Wonder you need to make your strategy works, keeping a Great Engineer on hand to hurry it up can pay off very nicely. This is the only way to Hurry Production on a Wonder. Trade In Civilization V, the amount of Gold you earn from terrain is much lower, so the path to a full treasury requires that you set up Trade Routes. You have limited number of Trade Slots available, but that limit grows over time. You can earn slots two ways. The first is through discovering techs: Ancient Era: Animal Husbandry, Sailing Classical Era: Engineering Medieval Era: Compass Renaissance Era: Banking Industrial Era: Biology Modern Era: Railroad Atomic Era: Penicillin So just from keeping up your research you can get up to 8 Trade Routes. In addition, the Wonders Colossus and Petra each provide an additional Trade Route. You can establish trade route with your own cities, with City-States, and with other Empires. Trade routes are always city-to-city, and are limited by distance, so it can make sense sometimes to move your trade unit to a different city. The city that produced the unit will always be where it shows up first, but you can make a move on its first turn to transfer the unit to another city, though note that Cargo Ships can only be placed in coastal cities. This can bring a desired destination city within range. Note that for land units (Caravans) you can increase the range by building roads. Effects of Trade Trade is generally pursued for the gold, but there can also be Science, Culture, and Religious effects, so it is worth paying attention here. Even if Gold is the main object, you may have several options that provide equivalent amounts of Gold, and a potential gain of Science or Culture might be the tie-breaker, depending on your strategy for victory. If you establish a trade route with a City-State, you can receive Gold, provide religious pressure to convert them to your religion, and gain influence with them, This can be very helpful if you are going for a Diplomatic Victory, But I would not accept a large difference in Gold just for that minor Influence gain. You can gain far more influence with Gold in long run. Setting up trade between your own cities can be helpful in giving a boost to a city because you can send Food and Production. In the earlier phases of the game that might be a good idea to get a city up to full development. The city where the route originates does not lose Food or Production, but some added amount shows up in the destination city. However, for Food trade to happen you need to have a Granary in each city, and for Production you need to have a Workshop in each city. Plundering Trade routes can be plundered by Empires you are at war with, or more often, by Barbarians. When that happens, the route disappears, and you need to build another trade unit and set up another route. Empires/Civs There are 43 possible Civilizations in Civ 5, so I don't propose to discuss all of them in depth here, but if you want to dive into this more you can go to the Civ Wiki for a chart that shows them all. Instead, I want to discuss why they are different and how you should make choices depending on the Victory type you are choosing. Of course, if you let the game make the choice for you randomly, knowing what each Civ is good for can help you to determine what type of strategy to pursue for your best chance of a victory. The first thing to know about each Civ is that they have a starting bias for where they will spawn at the beginning of the game. This can be either positive or negative, i.e. you are either more likely to spawn in certain terrain, or less likely to spawn in certain terrain. England, which is a naval power, will be biases to spawn on the Coast. Whereas Egypt, a famously desert country, will have a negative bias to avoid Jungle or Forest locations. Second, all Civs have one or more Unique Abilities. For example, the Carthaginians have two abilities that come from history. The first is Phoenician Heritage, which means that all Coastal cities get a free Harbor. And once they have earned a Great General, their military units can cross Mountain tiles, and they are the only ones that can do this. And the French have the City of Light ability, which grants doubled theming bonuses for Museums and wonders that are in the Capital. Third, each Civ has a Unique Unit. These units replace one of the regular units in the game, but are enhanced in some way. Spain has two of these. The first, the Tercio, replaces the Musketman, but it has a +50% bonus against mounted units and an increased Melee strength, making it a combination of Musketman and Pikeman. The other unit, the Conquistador replaces the Knight, but it has some interesting abilities. It can move after attacking if it still has movement points, embarked units have double defense, it can see two tiles further, and has no penalty when attacking cities. Finally, the Conquistador unit can be use to establish a city, though that uses up the unit. Finally, most (but not all) Civs have Unique Building or Improvement. As with units, these tend to replace ordinary buildings/improvements but offer something better. Arabia, for instance, has the Bazaar, which replaces the Marketplace. But it provides an additional 2 Gold per turn more than the Marketplace, it adds one additional copy of each improved luxury resource near the city, and provides +2 Gold for each Oasis and each source of Oil. What you need to consider is how each of these unique attributes of a Civ will fit in to your strategy. And timing matters. The American Unique Unit of the B-17 Bomber is nice, to be sure, but comes very late in the game. It probably won't help you conquer the world. But the Roman units of the Ballista and the Legion are excellent for an early campaign of conquest. For a Trade-oriented strategy, Portugal is excellent, as all of its Unique attributes help with generating Trade and Gold. And Gold is the key to many possible paths to victory. So keep these points in mind as you plan your strategy. And to illustrate all of the things we have been discussing in the Civilization V series, I will play a game where I aim for a Diplomatic Victory. Links: https://civilization.fandom.com/wiki/Great_People_(Civ5) https://civilization.fandom.com/wiki/International_trade_route_(Civ5) https://civilization.fandom.com/wiki/Civilizations_(Civ5) https://www.palain.com/gaming/civilization-v/playing-civilization-v-part-10/ Provide feedback on this episode.

    HPR4609: Proper Date Format

    Play Episode Listen Later Apr 2, 2026


    This show has been flagged as Clean by the host. This is about how dates are formatted, and I demonstrate that the ISO 8601 Format is the only logical one to use, and will make your life easier if you learn to use it. Something you quickly run into if you correspond with people in both the U.S. and Europe, which I have done over my career as well as in my personal life, is that we don't write dates the same way. If you think March 14th is Pi day because in the U.S. it is written as 3/14, people in most of Europe will wonder why you think there is a 14th month to the year. And if you want to make a joke about May 4th, as in “May the fourth be with you”, it is 5/4 in the U.S., and 4/5 in most of Europe. And it can be even more complicated once you drag in the rest of the world. There is simply no uniformity. You can see this with this page at Wikipedia . And we are not even consistent in how we talk about dates. In the U.S. we might well say “May 4th”, and that does indeed match how we write dates. But then we will insist that our independence day is the “Fourth of July”, almost like we are not a British colony any longer, but let's use their date format for one of our most important dates. In my experience, each side thinks the other is a bit odd, but regards it as a harmless eccentricity. But which side is correct in this? The answer, of course, is neither. The one absolutely correct date format has been defined, and you can find it in the ISO 8601 standard. The correct date format is YYYY/MM/DD, because that puts the elements of the date in a logical order. Why is this the logical order? Well, suppose you were filing documents by date. Would you start by putting all of the documents from the 4th day (without regard to month or year) into a group? Or would you first collect all documents for a given year? Now, you might argue that filing documents is something people don't do as much of these days. We have computers and digital documents, we don't need any filing cabinets. But that only strengthens my argument, as you can easily verify. For example I am writing this on February 13, 2025. If I use a date code for my digital file, and I make it 02132025, what happens if I later on create file on January 6, 2026? That would then be 01062026. Try this, and you will see that in your file manager 01062026 will appear before 02132025, because all computers treat the significance of digits from left to right. But if you follow the ISO 8601 standard, the most significant part of the date is on the left, and all of your files will be in order. And once you get used to it, your life is easier. An example of this is photos. My wife and I like to travel, and we take a lot of photos using our smart phones. And every photo we take uses date/time stamp as part of the file name, and the dates all follow the ISO 8601 standard. So I can easily sort my photos in the order in which they were taken. And since I have over 13,000 photos in my Flickr Pro account, a little help with sorting them is really nice. I now use this format not just for digital file names, but for most of my dating purposes. It just makes sense. Links https://en.wikipedia.org/wiki/List_of_date_formats_by_country https://en.wikipedia.org/wiki/ISO_8601 https://www.zwilnik.com/proper-date-formats/ Provide feedback on this episode.

    HPR4606: My Nerdy Childhood: From Floppy Disks to Dial-Up Dreams

    Play Episode Listen Later Mar 30, 2026


    This show has been flagged as Explicit by the host. It all started at Flanders Technology International in 1987... a tech expo where an eleven-year-old watched a wooden block move across a desk and an arrow follow it on screen. That was it. That was the moment. He had to have a computer with a mouse. What followed was a story of after-school showroom squatting, summer jobs, game piracy, a modem bill that nearly gave his parents a heart attack, and an education in computing that no school could have provided. From the Amstrad PC1512 and the GEM windowing system, to the Schneider Euro PC with its infamous Turbo button that turned Ms. Pac-Man into a half-second blur — this episode is a love letter to the glorious chaos of home computing in the late 1980s. Along the way: the satisfying clatter of a matrix printer , the dark arts of config.sys and autoexec.bat , Digger , the allure of the Commodore 64 , forbidden floppy disks at computer club, a 2400-baud modem, and the very first taste of online community — long before anyone called it the internet. The computers Amstrad PC1512 — the showroom machine that started it all Schneider Euro PC — the computer-in-a-keyboard with the infamous Turbo button Commodore 64 — legendary sounds, legendary forbidden floppy disks Play the games Digger — play in your browser Ms. Pac-Man — play in your browser Samantha Fox Strip Poker (C64) Leisure Suit Larry — Looking for Love in All the Wrong Places — play in your browser Provide feedback on this episode.

    HPR4605: Lee locks down his wifey poo

    Play Episode Listen Later Mar 27, 2026


    This show has been flagged as Clean by the host. Two geeky people, both HPR hosts, decide to sign on the dotted line and do the darn thing and get married. Provide feedback on this episode.

    HPR4604: Quick Tips for January 20 26

    Play Episode Listen Later Mar 26, 2026


    This show has been flagged as Clean by the host. It's going to be pretty short, I'm going to go through my quick tips. Looks like I've got enough to kind of do a little short episode for you guys. Quick tips are basically just, you know, kind of things that I think about, that add value, kind of like those stupid viral videos on social media where they show, like how to make a pancake with a square, like it, you know. Prevent messiness when making Matcha Baking soda and super glue to get an epoxy type of seal. "Tile batter pad on top of speaker in middle" - even operat0r has no clue ! How to blowing out a candle Request for more shows on rsync inspired by hpr4341 :: Transferring Large Data Sets sent in by hairylarry How to make a foam machine Fixing garden chairs by replacing the Vinyl straps How to use a Fabric belt YTDLnis Full Featured Downloader using yt-dlp, available on F-Droid Use a wet paper towel over Microwave food. Use binder clips instead of chip clips Things To Get Me since Amazon got rid of their add arbitrary item to wish list feature. Provide feedback on this episode.

    HPR4603: On the Erosion of Freedom in Open Source Software

    Play Episode Listen Later Mar 25, 2026


    This show has been flagged as Explicit by the host. DISCLAIMER: "Hill willing to kill on" is an idiom. I do not condone or tolerate open calls for violence and want to make this very clear here. Due to the incredibly unfortunate nature of the topic at hand, I have also taken the liberty to mark this episode as explicit. This episode was recorded while I had some short downtime. There are filler phrases and pauses throughout. I apologize in advance. Provide feedback on this episode.

    HPR4602: Hackerpublic Radio New Years Eve Show 2026 Episode 3

    Play Episode Listen Later Mar 24, 2026


    This show has been flagged as Explicit by the host. Bluetooth https://www.bluetooth.com/ Sound Core Headsets https://www.soundcore.com/ BaoFeng Mini https://www.baofengradio.com/products/5r-mini NOAA Weather Channel https://www.weather.gov/mob/nwr Chirp APP https://chirpmyradio.com/projects/chirp/wiki/Home HAM Radio https://www.arrl.org/what-is-ham-radio Echolink APP https://www.echolink.org/ YAGI Antenna https://www.everythingrf.com/community/what-is-a-yagi-antenna ISS https://www.nasa.gov/international-space-station/ Dry January https://alcoholchange.org.uk/help-and-support/managing-your-drinking/dry-january APRS https://www.aprs.org/ Quebec https://www.quebec-cite.com/en Chicago https://www.choosechicago.com/ Lexington, Kentucky https://www.lexingtonky.gov/ IT (Movie series) https://stephen-kings-it-series.fandom.com/wiki/It_(film_series) https://www.rottentomatoes.com/m/it_2017 https://www.rottentomatoes.com/m/it_chapter_two Burn Notice https://www.rottentomatoes.com/tv/burn-notice Bill Skarsgard https://www.rottentomatoes.com/celebrity/771821133 Villians https://www.rottentomatoes.com/m/villains Becky (movie series) https://www.rottentomatoes.com/m/becky_2020 https://www.rottentomatoes.com/m/the_wrath_of_becky Kevin James https://www.rottentomatoes.com/celebrity/1148922-kevin_james Krampus https://www.rottentomatoes.com/m/krampus Bruce Campbell https://www.rottentomatoes.com/celebrity/bruce_campbell The Perfect Host https://www.rottentomatoes.com/m/the-perfect-host David Hyde Pierce https://www.rottentomatoes.com/celebrity/david_hyde_pierce John Dies At The End https://www.rottentomatoes.com/m/john_dies_at_the_end This Book Is Full of Spiders https://www.goodreads.com/book/show/12924261-this-book-is-full-of-spiders The Owners https://www.rottentomatoes.com/m/the_owners_2020 Games of Thrones https://www.rottentomatoes.com/tv/game_of_thrones Maisy Williams https://www.rottentomatoes.com/celebrity/maisie_williams Sylvester McCoy https://www.rottentomatoes.com/celebrity/sylvester_mccoy Don't Breath https://www.rottentomatoes.com/m/dont_breathe_2016 Terrifier Movie Series https://www.rottentomatoes.com/m/terrifier https://www.rottentomatoes.com/m/terrifier_2 https://www.rottentomatoes.com/m/terrifier_3 V/H/S Movie Series https://www.rottentomatoes.com/m/v_h_s_halloween https://www.rottentomatoes.com/m/v_h_s_beyond https://www.rottentomatoes.com/m/vhs https://www.rottentomatoes.com/m/vhs94 https://www.rottentomatoes.com/m/vhs99 https://www.rottentomatoes.com/m/v_h_s_85 https://www.rottentomatoes.com/m/vhs2 https://www.rottentomatoes.com/m/vhs_viral Last Christmas https://www.rottentomatoes.com/m/last_christmas_2019 Santa's Slay https://www.rottentomatoes.com/m/santas_slay Violent Night https://www.rottentomatoes.com/m/violent_night 8 Bit Christmas https://www.rottentomatoes.com/m/8_bit_christmas Rare Exports https://www.rottentomatoes.com/m/rare_exports Silent Night, Deadly Night https://www.rottentomatoes.com/m/silent_night_deadly_night_2025 Carnage for Christmas https://www.rottentomatoes.com/m/carnage_for_christmas All The Creatures Were Stirring https://www.rottentomatoes.com/m/all_the_creatures_were_stirring Full Circle Weekly News https://fullcirclemagazine.org/ Treevenge https://www.rottentomatoes.com/m/treevenge_2009 The Killing Tree (aka Demonic Christmas Tree) https://www.rottentomatoes.com/m/the_killing_tree Bambi The Reckoning https://www.rottentomatoes.com/m/bambi_the_reckoning Winnie The Pooh Blood and Honey https://www.rottentomatoes.com/m/winnie_the_pooh_blood_and_honey Five Nights At Freddys https://www.rottentomatoes.com/m/five_nights_at_freddys Five Nights At Freddys 2 https://www.rottentomatoes.com/m/five_nights_at_freddys_2 Stranger Things https://www.rottentomatoes.com/tv/stranger_things Alien Vs Predator https://www.rottentomatoes.com/m/alien_vs_predator Snakes On A Train https://www.rottentomatoes.com/m/snakes_on_a_train LOST https://www.rottentomatoes.com/tv/lost From https://www.rottentomatoes.com/tv/from Kingfast SSD Drives https://kingfast-ssd.com/ Floorp https://floorp.app/ Jellyfin https://jellyfin.org/ Primeval https://www.rottentomatoes.com/tv/primeval Shetland https://www.rottentomatoes.com/tv/shetland Fallout https://www.rottentomatoes.com/tv/fallout Fallout 4 (viideo game) https://fallout.bethesda.net/en/games/fallout-4 Twisted Metal https://www.rottentomatoes.com/tv/twisted_metal Playstation https://en.wikipedia.org/wiki/PlayStation Farscape https://www.rottentomatoes.com/tv/farscape Peace Keeper Wars https://www.rottentomatoes.com/tv/farscape_the_peacekeeper_wars Altered https://www.rottentomatoes.com/m/altered_2025 Firefly https://www.rottentomatoes.com/tv/firefly Running Man https://www.rottentomatoes.com/m/the_running_man_2025 Suits https://www.rottentomatoes.com/tv/suits Peacemaker https://www.rottentomatoes.com/tv/peacemaker_2022 Tulsa King https://www.rottentomatoes.com/tv/tulsa_king Deadpool and Wolverine https://www.rottentomatoes.com/m/deadpool_and_wolverine Guardians Of The Galaxy 3 https://www.rottentomatoes.com/m/guardians_of_the_galaxy_vol_3 Guardians Of The Galaxy Holiday Special https://www.rottentomatoes.com/m/the_guardians_of_the_galaxy_holiday_special All Dogs Go To Kevin (Knoxville) https://www.dogstokevin.com/ Atlanta https://discoveratlanta.com/ Bohdi Linux https://www.bodhilinux.com/ Linux Mint https://linuxmint.com/ Feren OS https://ferenos.weebly.com/ Mokka https://dev.to/jliter/garuda-mokka-the-new-distro-for-developers-who-want-power-and-polish-3eif Mate https://mate-desktop.org/ Cinnamon https://thenewstack.io/what-makes-the-cinnamon-desktop-so-appealing/ Little Ceasars https://littlecaesars.com/en-us/ Jets Pizza https://www.jetspizza.com/stores/kentucky/ South Coast Pizza https://southcoastpizza.com/ Pluribus https://www.rottentomatoes.com/tv/pluribus/s01 Rick and Morty https://www.rottentomatoes.com/tv/rick_and_morty Stadia Controller https://www.pcgamingwiki.com/wiki/Controller:Stadia_Controller System 76 https://system76.com/ Pop OS https://system76.com/pop/ Elementry OS https://elementary.io/ FMAN https://fman.io/ Thunarr https://docs.xfce.org/xfce/thunar/start PCMAN FM https://wiki.archlinux.org/title/PCManFM ESP 32 https://randomnerdtutorials.com/getting-started-with-esp32/ ESP 32 Cheap Yellow Screen https://randomnerdtutorials.com/cheap-yellow-display-esp32-2432s028r/ Ganesh https://www.hinduamerican.org/blog/5-things-to-know-about-ganesha Black Shirt Bleach (Tie Dye) https://www.clorox.com/learn/how-to-bleach-tie-dye-patterns/ Discharge Paste for Fabric https://store.jacquardproducts.com/products/decolourant Plastisol https://latem.com/blog/what-exactly-is-plastisol Potato / Tapioca Starch https://www.unnatisilks.com/blogs/fiber-talk/21850-2 Corn Starch (garment printing) https://www.biopacktech.com/Corn-Starch-PLA-Sustainable-Digital-Printing-Design-Clothes-Packaging-pd44247194.html Xanthum Gum https://thedreamstress.com/2024/04/making-18th-century-buckram-gum-arabica-vs-tragacanth-vs-xantham/ Gnu Wolrd Order https://gnuworldorder.info/ Drawing Fluid (screen printing) https://www.melissadettloff.com/blog/2023/5/10/drawing-with-drawing-fluid-for-screen-printing-paint-pen-squeeze-bottle-four-tools-tested Screen Filler https://thediningtablestudio.uk/blog/screen-printing-with-screen-filler-and-drawing-fluid/ Photo Emullsion https://www.instructables.com/Photo-emulsion-Screen-Printing/ PHP https://www.php.net/ Proton Drive https://proton.me/drive GRUB https://www.gnu.org/software/grub/ Arch Linux https://archlinux.org/ Proxmox https://www.proxmox.com/en/ Allen Americans Hockey Team https://allenamericans.com/ Dallas Stars Hockey https://www.nhl.com/stars/ Arlington, Texas https://www.arlingtontx.gov/Home Dallas, Texas https://dallascityhall.com/Pages/default.aspx Knoxville Ice Bears https://knoxvilleicebears.com/ Skrewball Whiskey https://www.skrewballwhiskey.com/en/ Fireball https://www.fireballwhisky.com/ Dr. McGillicuddys https://drmcgillicuddy.com/ Guacamole https://www.allrecipes.com/recipe/14064/easy-guacamole/ Inkscape https://inkscape.org/ Cricut Cutting Machine https://inkscape.org/ South East Linux Fest https://southeastlinuxfest.org/ Seinfeld https://www.rottentomatoes.com/tv/seinfeld Simpsons https://www.rottentomatoes.com/tv/the_simpsons 24 (TV Show) https://www.rottentomatoes.com/tv/24 Eveangelion https://www.rottentomatoes.com/m/evangelion_111_you_are_not_alone Robotech https://www.rottentomatoes.com/tv/robotech StarGate https://www.rottentomatoes.com/m/stargate MakeMKV https://www.makemkv.com/ Handbrake https://handbrake.fr/ The IT Crowd https://www.rottentomatoes.com/tv/the_it_crowd_2006 Jimmy Carr https://www.jimmycarr.com/ IT Crowd (American version) https://www.asteroidg.com/index.php?section=articles&page=20240327_it_crowd_2007_pilot IT Crowd (German version) https://www.imdb.com/title/tt1101236/ Red Bull https://www.redbull.com/us-en Liquid Death (Mountain Water https://liquiddeath.com/ Deathwish Coffee https://www.deathwishcoffee.com/ Fanta https://www.coca-cola.com/us/en/brands/fanta Orange Crush https://www.crushsoda.com/ Mezzo Mix https://germanfoods.org/shop-german-foods/mezzo-mix-cola-orange-soda-in-can-11-2-oz/ Liquid Death (energy drinks) https://liquiddeath.com/products/scary-strawberry Liquid Death (iced teas) https://liquiddeath.com/products/variety-tea Tang https://www.mondelezinternational.com/our-brands/tang/ Kool Aid https://www.kraftheinz.com/kool-aid True Citrus https://www.truecitrus.com/ Provide feedback on this episode.

    Claim Hacker Public Radio

    In order to claim this podcast we'll send an email to with a verification link. Simply click the link and you will be able to edit tags, request a refresh, and other features to take control of your podcast page!

    Claim Cancel