<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
   <channel>
      <title>Hacker Public Radio - Syndicated</title>
      <description>HPR Podcasts</description>
      <link>http://HPR-MIRROR/rss.xml</link>
      <!-- <image>
         <url>http://hackerpublicradio.org/images/hpr_logo.png</url>
         <title>Hacker Public Radio - Syndicated</title>
      </image> -->
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4703/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4703/index.html</link>
         <title>HPR4703: Ebooks and Audiobooks</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Clean by the host.</p>

<p>
I tend to prefer Ebook and Audiobooks to physical books, and these are some of the apps I use, and some of the sources I go to to find Ebooks or Audiobooks. These can be inexpensive, or in the case of Public Domain, free.</p>

<h1>
Ebooks and Audiobooks</h1>

<p>
I no longer wish to devote space to accumulating and storing physical books. As a former college professor I had more of them than most people, and tended to fill the house with bookcases and shelves. That made a certain sense in the pre-Internet years since I would often want to go back to them to look up things. But now I have more information at my fingertips than I ever had in those days, and I find it more convenient to just look up anything I need to know. And with Ebooks I can take my library with me anywhere I go. This means if I am sitting in a waiting room for a Doctor’s appointment (and at my age that happens often enough) I can just pull out my phone and open up a book. I always have at least one. Right now on my phone I have apps for <a href="https://www.amazon.com/kindle/" rel="noopener noreferrer" target="_blank">
Kindle</a>
, <a href="https://play.google.com/store/books?hl=en_US&amp;pli=1" rel="noopener noreferrer" target="_blank">
Google Play</a>
, <a href="https://www.barnesandnoble.com/b/ebooks-nook/_/N-8qa" rel="noopener noreferrer" target="_blank">
Barnes &amp; Noble Nook</a>
, <a href="https://www.kobo.com/us/en?srsltid=AfmBOoquJmiNH_aVTUx22AIRlBH8CF4iir4H8qpTKjQ4dZ-fSMCDAaD7" rel="noopener noreferrer" target="_blank">
Kobo</a>
 <a href="https://market.cantook.com/" rel="noopener noreferrer" target="_blank">
Cantook</a>
 (successor to Aldiko), <a href="https://bookshop.org/ebooks" rel="noopener noreferrer" target="_blank">
Bookshop.org</a>
, and <a href="https://calibre-ebook.com/" rel="noopener noreferrer" target="_blank">
Calibre</a>
. As for devices other than my phone, I own a kindle, I once owned a Nook, and I will buy a Kobo reader when Trump is gone. Kobo is Canadian, and last time I looked Trump had put on a tariff that was twice what the device costs. And finally I have the Bookshop.org app and Calibre.</p>

<p>
I started collecting Ebooks some years back, and at first the only option seemed to be buying them from large corporations. That has changed now, but I still have collections On Kindle, Google Play, Nook, and Kobo. I have all four because it seemed prudent to not put all my eggs in one basket. But now there are other options. One I like to use when possible is Bookshop.org. It is group of independent bookstores and I would rather support them than some giant corporation. And they seem to have all of the popular titles. Another similar site is <a href="https://www.booksamillion.com/" rel="noopener noreferrer" target="_blank">
Books-a-Million</a>
, which lets you order online and pick up at a local store if you need a physical book. Cantook and Calibre are both good for holding any miscellaneous Ebooks you have, and you can give them your Ebooks from the other sellers, though I have found that the native apps tend to work better. These days I rarely purchase books on Kindle, etc. But sometimes they have a special deals.</p>

<p>
If you want to build your library, there are some good places to try. One is <a href="https://www.bookbub.com/" rel="noopener noreferrer" target="_blank">
BookBub</a>
 which will send you emails with deals on books. On any one e-mail you may not see anything you want, but I found that once or twice a month I did see books I wanted and at good prices. And Books-a-Million has 99 cent deals to check out. But if you want to get free books, you have several options. If you want a chance to read a popular Ebook but don’t need to own it, see what your local Library offers. Mine offers <a href="https://www.hoopladigital.com/" rel="noopener noreferrer" target="_blank">
Hoopla</a>
 which is good for Ebooks, Audiobooks, and streaming music. What you can find depends on what your library has in its collection, but my wife uses it almost daily for audiobooks. Then there are the works that have become part of the Public Domain. This varies somewhat by your country, but you might be surprised to learn how much is available. For Ebooks one of the biggest sites is <a href="https://www.gutenberg.org/" rel="noopener noreferrer" target="_blank">
Project Gutenberg</a>
. They follow US Copyright law for their collection, and they are a non-profit that can always use some support, so if you use them, give them a few Dollars or Euros. They tend to be the source for many or most other sites for Public Domain Ebooks They have over 75,000 free Ebooks. A newer site is <a href="https://www.fadedpage.com/" rel="noopener noreferrer" target="_blank">
Faded Page</a>
 which is much smaller but focused on Canadian works. <a href="https://standardebooks.org/" rel="noopener noreferrer" target="_blank">
Standard Ebooks</a>
 is a site that pulls from Project Gutenberg but does some additional formatting and is very easy to read online in your browser. For Audiobooks a good source is <a href="https://www.openculture.com/freeaudiobooks" rel="noopener noreferrer" target="_blank">
Open Culture</a>
, which advertises it has 1,000 free Audiobooks. We should also mention <a href="https://librivox.org/" rel="noopener noreferrer" target="_blank">
LibriVox</a>
, which also pulls from Project Gutenberg for its texts, but then turns them into Public Domain Audiobooks. They are always looking for volunteers who have a microphone and a computer to record Public Domain audiobooks. And last but not least the <a href="https://archive.org/" rel="noopener noreferrer" target="_blank">
Internet Archive</a>
 has tons of Ebooks and Audiobooks that are free.</p>

<h3>
Links</h3>

<ul>

<li>

<a href="https://www.amazon.com/kindle/" rel="noopener noreferrer" target="_blank">
https://www.amazon.com/kindle/</a>

</li>

<li>

<a href="https://play.google.com/store/books?hl=en_US&amp;pli=1" rel="noopener noreferrer" target="_blank">
https://play.google.com/store/books?hl=en_US&amp;pli=1</a>

</li>

<li>

<a href="https://www.barnesandnoble.com/b/ebooks-nook/_/N-8qa" rel="noopener noreferrer" target="_blank">
https://www.barnesandnoble.com/b/ebooks-nook/_/N-8qa</a>

</li>

<li>

<a href="https://www.kobo.com/us/en?srsltid=AfmBOoquJmiNH_aVTUx22AIRlBH8CF4iir4H8qpTKjQ4dZ-fSMCDAaD7" rel="noopener noreferrer" target="_blank">
https://www.kobo.com/us/en?srsltid=AfmBOoquJmiNH_aVTUx22AIRlBH8CF4iir4H8qpTKjQ4dZ-fSMCDAaD7</a>

</li>

<li>

<a href="https://market.cantook.com/" rel="noopener noreferrer" target="_blank">
https://market.cantook.com/</a>

</li>

<li>

<a href="https://bookshop.org/ebooks" rel="noopener noreferrer" target="_blank">
https://bookshop.org/ebooks</a>

</li>

<li>

<a href="https://calibre-ebook.com/" rel="noopener noreferrer" target="_blank">
https://calibre-ebook.com/</a>

</li>

<li>

<a href="https://www.booksamillion.com/" rel="noopener noreferrer" target="_blank">
https://www.booksamillion.com/</a>

</li>

<li>

<a href="https://www.bookbub.com/" rel="noopener noreferrer" target="_blank">
https://www.bookbub.com/</a>

</li>

<li>

<a href="https://www.hoopladigital.com/" rel="noopener noreferrer" target="_blank">
https://www.hoopladigital.com/</a>

</li>

<li>

<a href="https://www.gutenberg.org/" rel="noopener noreferrer" target="_blank">
https://www.gutenberg.org/</a>

</li>

<li>

<a href="https://www.fadedpage.com/" rel="noopener noreferrer" target="_blank">
https://www.fadedpage.com/</a>

</li>

<li>

<a href="https://standardebooks.org/" rel="noopener noreferrer" target="_blank">
https://standardebooks.org/</a>

</li>

<li>

<a href="https://www.openculture.com/freeaudiobooks" rel="noopener noreferrer" target="_blank">
https://www.openculture.com/freeaudiobooks</a>

</li>

<li>

<a href="https://librivox.org/" rel="noopener noreferrer" target="_blank">
https://librivox.org/</a>

</li>

<li>

<a href="https://archive.org/" rel="noopener noreferrer" target="_blank">
https://archive.org/</a>

</li>

<li>

<a href="https://www.palain.com/ebooks-and-audiobooks/" rel="noopener noreferrer" target="_blank">
https://www.palain.com/ebooks-and-audiobooks/</a>

</li>

</ul>

<p>

</p>


<p><a href="https://hackerpublicradio.org/eps/hpr4703/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Wed, 12 Aug 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4703/hpr4703.ogg"
         length="6080323"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4702/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4702/index.html</link>
         <title>HPR4702: MakeACopy is an open-source document scanner app for Android</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Clean by the host.</p>

<h1>
MakeACopy</h1>

<p>
MakeACopy is an open-source document scanner app for Android that allows you to digitize paper documents with OCR functionality. The app is designed to be privacy-friendly, working completely offline without any cloud connection or tracking.</p>

<p>

</p>

<h2>
Features</h2>

<ul>

<li>

<strong>
Camera Scanning</strong>
: Capture documents using the device camera</li>

<li>

<strong>
Edge Detection</strong>
: Automatic document edge detection using OpenCV, enhanced with an ONNX model (DocAligner)</li>

<li>

<strong>
Perspective Correction</strong>
: Adjust and crop documents with manual or automatic perspective correction</li>

<li>

<strong>
Image Enhancement</strong>
: Apply filters (grayscale, contrast, sharpening)</li>

<li>

<strong>
OCR</strong>
: Offline text recognition with Tesseract</li>

<li>

<strong>
OCR Review</strong>
: Interactive review and correction of OCR results with word-level editing, dictionary-based suggestions, confidence highlighting, and re-OCR for individual words</li>

<li>

<strong>
PDF Export</strong>
: Save as searchable PDF with recognized text</li>

<li>

<strong>
JPEG Export</strong>
: Export scans as high-quality JPEG images (configurable quality, color/BW)</li>

<li>

<strong>
Multi-page Scanning</strong>
: Combine multiple pages into one document; reorder and manage pages before export</li>

<li>

<strong>
Last Scans</strong>
: Quickly access and reuse your most recent scans</li>

<li>

<strong>
Share &amp; Save</strong>
: Export locally or share with other apps</li>

<li>

<strong>
Dark Mode</strong>
: Material 3 theme with day/night support</li>

<li>

<strong>
Privacy-Focused</strong>
: 100% offline functionality, no internet connection required</li>

</ul>

<p>

</p>

<p>

<a href="http://hackerpublicradio.org/hpr4702_image_1.png">
<img src="http://hackerpublicradio.org/hpr4702_image_1_tn.png" />
</a>

</p>

<p>

</p>


<p><a href="https://hackerpublicradio.org/eps/hpr4702/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Tue, 11 Aug 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4702/hpr4702.ogg"
         length="5336781"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4701/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4701/index.html</link>
         <title>HPR4701: Elsbeth muses with Lee on her experiences and opinions on AI</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Explicit by the host.</p>

<p>

<strong>
Overview:</strong>
 Elroy sits down with Elsbeth to unpack her perspective on AI ethics — where the technology helps, where it risks harm, and what responsible use actually looks like in practice.</p>

<p>

<strong>
Topics covered (In no particular order, as the rabid squirrels of Elsbeth's AuDHD brain don't do "order"):</strong>

</p>

<ul>

<li>
Elsbeth's path into AI evaluation and content moderation, and how that shaped her thinking on ethics in practice</li>

<li>
What "ethical use" of AI means day-to-day, not just in the abstract</li>

<li>
Respecting intellectual property — the case for protecting artists and creators as AI tools become more capable and widespread</li>

<li>
Finding the balance: supporting AI's genuine benefits without letting them come at creators' expense</li>

<li>
AI as an accessibility tool — its particular promise for neurodivergent people, and where it can lower barriers others don't face</li>

<li>
Where the conversation is heading next, and what listeners should watch for</li>

</ul>

<p>

<strong>
Closing thoughts:</strong>
 Elsbeth's take is one of cautious optimism — a call to hold both truths at once: AI can do real good, and that good has to be built on respect for the people whose work made it possible.</p>

<p>

</p>

<h3>
Further Reading &amp; Resources</h3>

<p>

<strong>
On AI, Ethics, and Intellectual Property</strong>

</p>

<ul>

<li>

<em>
AI and Intellectual Property in 2026: why transparency and court rulings will define the next phase of governance</em>
 — The AI Journal</li>

<li>
 <a href="https://aijourn.com/ai-and-intellectual-property-in-2026-why-transparency-and-court-rulings-will-define-the-next-phase-of-governance/" rel="noopener noreferrer" target="_blank">
https://aijourn.com/ai-and-intellectual-property-in-2026-why-transparency-and-court-rulings-will-define-the-next-phase-of-governance/</a>

</li>

<li>

<em>
Global laws governing intellectual property rights for AI-generated works</em>
 — Discover Artificial Intelligence, Springer Nature Link</li>

<li>
 <a href="https://link.springer.com/article/10.1007/s44163-026-01165-8" rel="noopener noreferrer" target="_blank">
https://link.springer.com/article/10.1007/s44163-026-01165-8</a>

</li>

<li>

<em>
AI and IP laws 2026: Understanding Authorship and Ownership legalities</em>
 — AnalystIP</li>

<li>
 <a href="https://analystip.com/ai-and-ip-laws-2026-authorship-ownership-explained/" rel="noopener noreferrer" target="_blank">
https://analystip.com/ai-and-ip-laws-2026-authorship-ownership-explained/</a>

</li>

<li>

<em>
AI Art in 2026: The Ethics, Law, and What Artists Should Know</em>
 — UrduPure</li>

<li>
 <a href="https://www.urdupure.com/blog/ai-art-in-2026-the-ethics-law-and-what-artists-should-know" rel="noopener noreferrer" target="_blank">
https://www.urdupure.com/blog/ai-art-in-2026-the-ethics-law-and-what-artists-should-know</a>

</li>

</ul>

<p>

<strong>
On AI and Neurodivergent Accessibility</strong>

</p>

<ul>

<li>

<em>
Navigating Neurodivergence with AI Chatbots: Benefits, Tensions, and Implications for HCI</em>
 — CHI 2026 Conference Proceedings</li>

<li>
 <a href="https://dl.acm.org/doi/10.1145/3772318.3791334" rel="noopener noreferrer" target="_blank">
https://dl.acm.org/doi/10.1145/3772318.3791334</a>

</li>

<li>

<em>
Is AI making work more accessible for neurodiverse people?</em>
 — Everway</li>

<li>
 <a href="https://www.everway.com/en-gb/blog/is-ai-making-work-more-accessible-for-neurodiverse-people/" rel="noopener noreferrer" target="_blank">
https://www.everway.com/en-gb/blog/is-ai-making-work-more-accessible-for-neurodiverse-people/</a>

</li>

<li>

<em>
Autoethnographic Insights from Neurodivergent GAI "Power Users"</em>
 — NCBI/PMC</li>

<li>
 <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC12645485/" rel="noopener noreferrer" target="_blank">
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC12645485/</a>

</li>

<li>

<em>
A scoping review of inclusive and adaptive human–AI interaction design for neurodivergent users</em>
 — Disability and Rehabilitation: Assistive Technology</li>

<li>
 <a href="https://www.tandfonline.com/doi/full/10.1080/17483107.2025.2579822" rel="noopener noreferrer" target="_blank">
https://www.tandfonline.com/doi/full/10.1080/17483107.2025.2579822</a>

</li>

</ul>

<p>

</p>

<p>
Show rated *explicit* for possible course language and strong opinions.</p>

<p>

</p>


<p><a href="https://hackerpublicradio.org/eps/hpr4701/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Mon, 10 Aug 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4701/hpr4701.ogg"
         length="36932086"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4700/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4700/index.html</link>
         <title>HPR4700: Robert A. Heinlein: The Juveniles</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Clean by the host.</p>
<p>Heinlein wrote a series of books under contract to Scribners that were aumed at younger readers, pre-teen and teen. Today we would call them Young Adult, but back then they were called Juveniles. But even an adult reader can enjoy many of these books. Because they were aimed at younger readers, he could not always be as explicit as he might have liked, but if you pay attention you just might noticed he slipped in something subversive.</p>

<h1>Heinlein: The Juveniles</h1>
						
<p>As a boy I read voraciously. I remember my mother organizing weekly trips to the town library, where I would load up on books, and I quickly became focused on Science Fiction, along with the usual stuff kids read, like the Hardy Boys, Tom Swift, and the Walter Farley horse books. But the idea of going into space grabbed me very early. And one of the first authors I read was Heinlein. He had taken a leave from publishing during World War II, when he was doing research at the Philadelphia Navy Yard. But when the war was over, he set out to move beyond the “pulps” and expand the market for his stories. And one big market for him was what were called “juveniles” at the time, and would today be called “Young Adult”. I was reading adult fiction by the time I was 11 or 12, but before that (and even after that, in fact) I read these Heinlein novels with great relish.</p>

<p>Heinlein’s target audience for these novels was teenage boys. He did a few stories aimed at girls, but mostly he wrote for boys. And these were mostly “coming of age” stories where the teenage protagonist has adventures, and as a result grows and develops. They are very loosely related via some internal references, but should really be thought of as stand-alone stories. They also in some cases have references to his other stories, including the Future history stories. He wrote 13 of these novels, one per year, from 1947 to 1959. The series was published by Scribners until the last one was rejected by them. Heinlein then published it with a different publisher, and stopped writing these novels altogether in favor of more adult fiction. The novels roughly form a progression telling the story of space exploration. It starts with a trip to the Moon, then Venus, Mars, Jupiter’s moon, and so on until we reach the Lesser Magellanic Cloud.</p>

<ul>
<li><em><a href="https://en.wikipedia.org/wiki/Rocket_Ship_Galileo" rel="noreferrer noopener" target="_blank">Rocket Ship Galileo (1947)</a></em> – While readable, this initial effort was not up to Heinlein’s later standards. The plot concerns three teenagers who assist an uncle to build a rocket ship and go to the Moon. When they get there they discover Nazis have already arrived. The Nazis try to kill the group, but they succeed in turning the tables, stealing the Nazi ship, and returning to Earth as heroes. This novel became the basis (loosely) for the movie <em><a href="https://en.wikipedia.org/wiki/Destination_Moon_(film)" rel="noreferrer noopener" target="_blank">Destination Moon (1950)</a></em>, and I personally would consider the movie to be superior to the novel. It is also worth noting that the theory brought up in <em>Blowups Happen</em> reappears in this novel. They find evidence of an ancient Lunar civilization that was destroyed, and theorize that the craters on the moon were caused by the explosion of nuclear reactors that caused the extinction of the civilization.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Space_Cadet" rel="noreferrer noopener" target="_blank">Space Cadet (1948)</a></em> – This was in part the inspiration for the <em><a href="https://en.wikipedia.org/wiki/Tom_Corbett,_Space_Cadet_(TV_series)" rel="noreferrer noopener" target="_blank">Tom Corbett</a></em> franchise, which licensed the name Space Cadet from Heinlein. It is about a young man who is accepted to the Academy for the Space Patrol. It follows him through his education in the Academy, and then into his first mission after graduating. This holds up better than the previous novel. And it is tied back to the story <em>The Long Watch</em> from the Future History. Part of the story takes place on an inhabited Venus that is cloudy and swampy.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Red_Planet_(novel)" rel="noreferrer noopener" target="_blank">Red Planet (1949)</a></em> – This is set on Mars, as it is also portrayed in <em><a href="https://en.wikipedia.org/wiki/Stranger_in_a_Strange_Land" rel="noreferrer noopener" target="_blank">Stranger In A Strange Land (1961)</a></em>. Mars is inhabited by native Martians, but also by human colonists. It has the canals, and with seasonal changes the colonists migrate from north to south and back. A pair of teenage boys get caught up in a revolution when the evil corporation that controls the colony pushes the colonists too far. In the end you wish there really were canals and Martians.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Farmer_in_the_Sky" rel="noreferrer noopener" target="_blank">Farmer In The Sky (1950)</a></em> – This is one of the best, as seen by the Retro Hugo this novel won in 2000. Jupiter’s moon Ganymede is being terraformed because Earth is overcrowded and food is rationed. A teenage boy and his family emigrate to Ganymede and try to make a life there, which they eventually succeed in doing. <em>The Green Hills of Earth</em> is mentioned here, tying this into the future History. There are frequent references to the Boy Scouts, due to the fact that the story ran as a serial in <em><a href="https://en.wikipedia.org/wiki/Scout_Life" rel="noreferrer noopener" target="_blank">Boy’s Life</a></em> magazine.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Between_Planets" rel="noreferrer noopener" target="_blank">Between Planets (1951)</a></em> – A teenage boy is caught up in interplanetary intrigue. Venus and Mars have colonies, but Earth is trying to control them too much. So revolution is on the menu. This is clearly patterned in the colonial wars of the 18th and 19th centuries, such as the American Revolution against England. By this point the so-called “Juveniles” are really having more adult content, and reviewers re starting to rate them in comparison with adult science fiction. This novel was also first serialized in <em>Boy’s Life</em> magazine.</li>

<li>T<em><a href="https://en.wikipedia.org/wiki/The_Rolling_Stones_(novel)" rel="noreferrer noopener" target="_blank">he Rolling Stones (1952)</a></em> – Here we have teenage twin boys, Castor and Pollux, as the protagonists. They and their family live on the Moon, but decide to travel, so this novel is a kind of travelogue as they go to Mars, then to the Asteroid belt. The grandmother, Hazel Stone, appears in Heinlein’s later works as well. One interesting episode in this story involves “martian flat cats”, which are furry, lovable, and reproduce like mad with the right conditions. If this sound like Star Trek’s Tribbles, that is also what the Star Trek producers thought, so they got permission from Heinlein to use the idea.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Starman_Jones" rel="noreferrer noopener" target="_blank">Starman Jones (1953)</a></em> – We are now further into the future, and the human race is exploring the stars. Unfortunately, very restrictive guilds closely control who can participate in this. A teenage boy named Max, who happens to have an eidetic memory, has memorized the Astrogation tables from his uncle’s books, and wants to join the Guild, but is turned down. He lies his way onboard a ship, and through a series of events becomes the only one who can guide the ship home.</li>

<li><em><a href="https://en.wikipedia.org/wiki/The_Star_Beast_(novel)" rel="noreferrer noopener" target="_blank">The Star Beast (1954)</a></em> – A teenage boy has an alien “pet” his great-grandfather had brought back that has grown very large, and is considered a nuisance. A court decides the beast must be killed, but that proves easier to say than to do. It appears that the beast isn’t even aware that people are trying to kill it. Meanwhile, a powerful and hitherto unknown alien species demand the return of one of  their own, or they will destroy the Earth. Of course, it is this beast, who is actually royalty to the alien species. One interesting point is that government officials in this story are portrayed sympathetically as intelligent and dedicated.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Tunnel_in_the_Sky" rel="noreferrer noopener" target="_blank">Tunnel In The Sky (1955)</a></em> – In the future humanity is colonizing other planets, and a group of teenagers are taking their final survival test. They are sent to a planet and told that they have to survive for 10 days, But more than 10 days go by with no pickup, and they know something went wrong. So they have to establish their own little society to keep surviving. An interesting note is that the protagonist, Rod Walker, is black. It was never explicitly stated in the text, but Heinlein was firm in stating this. The clue is when the others expect Rod to end up with Caroline, who is explicitly stated to be black. This was Heinlein being subtly subversive. To have a black protagonist for a boy’s story in 1955 in America would be impossible. but Heinlein was completely anti-racist, among other things.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Time_for_the_Stars" rel="noreferrer noopener" target="_blank">Time For The Stars (1956)</a></em> – This is a novel that takes Relativity seriously, which was not common in the 1950s. Researchers have discovered that some twins and triplets can communicate telepathically (and instantaneously), and so when a group of ships is sent out to explore other star systems, one twin is on the ship and the other remains on Earth to provide communication. The twin on Earth ages must faster than the one in space, of course, and eventually the Earth twin dies, But they discover that the connection sometimes passes down through the family, so the protagonist, Tom Bartlett, becomes connected first to his niece, then his grandniece, and finally his great-grandniece.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Citizen_of_the_Galaxy" rel="noreferrer noopener" target="_blank">Citizen of the Galaxy (1957)</a></em> – This book is about a future slave trade, which Heinlein strongly hated. The protagonist is a boy who is bought at a slave auction by an old beggar, but the beggar is more than he seems. He is actually spying and gathering data regarding the slave trade. When discovered, he commits suicide, but he had prepared the young boy, Thorby, who then contacts the Free Traders who spirit him away. He has to adapt to this new society, but then is delivered to the Hegemonic Guard. It turns out his “father” (i.e. the man who bought him) was an officer in this organization. And when they run the background checks, they discover that he is the heir to a large conglomerate, and that conglomerate may be implicated in the slave trade.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Have_Space_Suit%E2%80%94Will_Travel" rel="noreferrer noopener" target="_blank">Have Space Suit—Will Travel (1958)</a></em> – Clifford “Kip” Russell dreams of going to the Moon, and enters a contest with that as the top prize. Unfortunately, he wins the somewhat lesser prize of a used spacesuit. The first few chapters focus on him doing repairs and maintenance to make it functional again, and this displays Heinlein’s engineering background. It is more engaging than you might think. Then while wearing the spacesuit he receives a radio message, and he is kidnapped along with an alien called “The Mother Thing” and a young girl who is a genius. The kidnappers are a group of aliens who consider anyone not of their race to be animals. The trio first try to escape on the Moon, but are recaptured, then taken to Pluto, where they succeed in killing the alien kidnappers. Then they are taken to the Lesser Magellanic Cloud to be put on trial to determine if the human race should be allowed to live.</li>

<li><em><a href="https://en.wikipedia.org/wiki/Starship_Troopers" rel="noreferrer noopener" target="_blank">Starship Troopers (1959)</a></em> – This is the novel that Scribners rejected, and which brought the Juvenile series to an end. And it bears absolutely no resemblance at all to the movie, to the point that for Heinlein fans the word Verhoeven is considered an obscenity. A young man, Juan “Johnny” Rico joins the military, where he has to grow up and then take part in a war against an insectoid race, but that is all background really. The book is primarily a glorification of military service, which is not surprising given Heinlein’s background. And it focuses on a series of discussions under the heading of “History and Moral Philosophy”, which lets Heinlein expound on his values and beliefs. The novel won a Hugo, but it is an add one given that the plot is secondary to the philosophizing. One of the most controversial ideas is that in this society the right to vote is limited to people who have been in Federal Service. Heinlein said this didn’t have to be military, but the only ones we see are in fact military veterans.</li>
</ul>

<p>So, these are the Heinlein Juveniles. In my opinion, many of them are quite good reading for adults. The thing that separates them from adult novels in Heinlein’s body of work is the lack of any sex element. That would become prominent in Heinlein’s later adult novels, but it was not something you could put in a book aimed at teenagers, certainly not in the 1950s, and arguably the case today as well.</p>

<h3 id="links">Links</h3>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Rocket_Ship_Galileo">https://en.wikipedia.org/wiki/Rocket_Ship_Galileo</a></li>
<li><a href="https://en.wikipedia.org/wiki/Destination_Moon_(film)">https://en.wikipedia.org/wiki/Destination_Moon_(film)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Space_Cadet">https://en.wikipedia.org/wiki/Space_Cadet</a></li>
<li><a href="https://en.wikipedia.org/wiki/Tom_Corbett,_Space_Cadet_(TV_series)">https://en.wikipedia.org/wiki/Tom_Corbett,_Space_Cadet_(TV_series)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Red_Planet_(novel)">https://en.wikipedia.org/wiki/Red_Planet_(novel)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Stranger_in_a_Strange_Land">https://en.wikipedia.org/wiki/Stranger_in_a_Strange_Land</a></li>
<li><a href="https://en.wikipedia.org/wiki/Farmer_in_the_Sky">https://en.wikipedia.org/wiki/Farmer_in_the_Sky</a></li>
<li><a href="https://en.wikipedia.org/wiki/Scout_Life">https://en.wikipedia.org/wiki/Scout_Life</a></li>
<li><a href="https://en.wikipedia.org/wiki/Between_Planets">https://en.wikipedia.org/wiki/Between_Planets</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Rolling_Stones_(novel)">https://en.wikipedia.org/wiki/The_Rolling_Stones_(novel)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Starman_Jones">https://en.wikipedia.org/wiki/Starman_Jones</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Star_Beast_(novel)">https://en.wikipedia.org/wiki/The_Star_Beast_(novel)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Tunnel_in_the_Sky">https://en.wikipedia.org/wiki/Tunnel_in_the_Sky</a></li>
<li><a href="https://en.wikipedia.org/wiki/Time_for_the_Stars">https://en.wikipedia.org/wiki/Time_for_the_Stars</a></li>
<li><a href="https://en.wikipedia.org/wiki/Citizen_of_the_Galaxy">https://en.wikipedia.org/wiki/Citizen_of_the_Galaxy</a></li>
<li><a href="https://en.wikipedia.org/wiki/Have_Space_Suit%E2%80%94Will_Travel">https://en.wikipedia.org/wiki/Have_Space_Suit%E2%80%94Will_Travel</a></li>
<li><a href="https://en.wikipedia.org/wiki/Starship_Troopers">https://en.wikipedia.org/wiki/Starship_Troopers</a></li>
<li><a href="https://www.palain.com/science-fiction/the-golden-age/robert-a-heinlein/heinlein-the-juveniles/">https://www.palain.com/science-fiction/the-golden-age/robert-a-heinlein/heinlein-the-juveniles/</a></li>
</ul>

<p><a href="https://hackerpublicradio.org/eps/hpr4700/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Fri, 07 Aug 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4700/hpr4700.ogg"
         length="11067012"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4699/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4699/index.html</link>
         <title>HPR4699: Sunshine, Moonlight, Playnite !?</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Clean by the host.</p>

<p>
sunshine / xbox contlers / plex / steam / UWPHook / Bluetoothctl restart / HDMI dongle</p>

<p>

<a href="https://www.youtube.com/watch?v=FM4FbA4-W_c" rel="noopener noreferrer" target="_blank">
https://www.youtube.com/watch?v=FM4FbA4-W_c</a>

</p>

<p>

</p>

<p>
UGREEN USB C Hub 5 in 1 Multiport Adapter Revodok 105 4K HDMI, 100W Power Delivery, 3 USB-A Data Ports, USB C Dongle for MacBook Pro/Air, iPad Pro, iMac, iPhone 16 Pro/Pro Max, XPS, Thinkpad</p>

<p>

<a href="https://www.amazon.com/dp/B0BR3M8XHK" rel="noopener noreferrer" target="_blank">
https://www.amazon.com/dp/B0BR3M8XHK</a>

</p>

<p>
Detached Command:</p>

<pre>
@ECHO OFF
cd "C:\backup\gamestream_launchpad"
c:\windows\System32\HdrSwitcher.exe disable
start /MIN gamestream_launchpad.exe 1920 1080 gamestream_playnite.ini
</pre>

<p>

</p>

<pre>
.bindkeys rc 
cat .xbindkeysrc
/bin/bash /home/plex/.local/bin/Plex.sh
/bin/bash /home/plex/.local/bin/Steam.sh
/home/plex/.local/bin/kasa --host 192.168.1.239 --port 9999 --type dimmer on; /home/plex/.local/bin/kasa --host 192.168.1.239 --port 9999 --type dimmer brightness 100;xgamma -gamma 1.3
/home/plex/.local/bin/kasa --host 192.168.1.239 --port 9999 --type dimmer on; /home/plex/.local/bin/kasa --host 192.168.1.239 --port 9999 --type dimmer brightness 40;xgamma -gamma 1.3
/home/plex/.local/bin/kasa --host 192.168.1.239 --port 9999 --type dimmer on; /home/plex/.local/bin/kasa --host 192.168.1.239 --port 9999 --type dimmer brightness 12;xgamma -gamma 1.3
/home/plex/.local/bin/kasa --host 192.168.1.239 --port 9999 --type dimmer off;xgamma -gamma 1.3"
</pre>

<p>

</p>

<pre>
cat /home/plex/.local/bin/Steam.sh
# requires wmctrl -l and xbindkeys
#
# xdotool windowactivate ```xdotool search --name 'window  name'```
# 0
StartSteamLink(){
 echo "restarting bluetooth"
 sudo systemctl restart bluetooth
 echo "Waking Game PC"
 sudo /usr/sbin/etherwake -i enp1s0 -D "d8:bb:c1:a2:2c:0b"
 echo "Starting steamlink"
 killall -9 steamlink
 killall moonlight
 sleep 20
# /snap/bin/moonlight
 /home/plex/.local/bin/Moonlight-6.1.0-x86_64.AppImage    
}
StartSteamLink


</pre>

<p>
SUMMARY:</p>

<ol>

<li>
 Speaker discusses technical challenges with Sun Shine, Moonlight, and Play Night setups.</li>

</ol>

<p>
IDEAS:</p>

<ol>

<li>
 Sun Shine and Moonlight enable remote game streaming.</li>

<li>
 Play Night acts as a multimodal launcher for Steam.</li>

<li>
 Resolution changes cause display issues during gameplay.</li>

<li>
 Proper exit sequence is critical to revert settings.</li>

<li>
 Ultra-wide resolutions are unusable in some configurations.</li>

<li>
 Multiple launchers require separate logins for different games.</li>

<li>
 Environment variables can adjust client dimensions.</li>

<li>
 Background commands improve system stability.</li>

<li>
 Cat named Mojo is mentioned during the discussion.</li>

<li>
 5G networks support slower-paced gaming.</li>

<li>
 Technical glitches include frame drops and latency.</li>

<li>
 Steam accounts are tied to specific game libraries.</li>

<li>
 Detached commands run in the background without user interaction.</li>

<li>
 GameStream Launchpad manages resolution and launcher paths.</li>

<li>
 Magical system behavior simplifies remote gaming.</li>

<li>
 Star Wars and Baldurâ€™s Gate are cited as example games.</li>

<li>
 22nd Millie thing refers to network latency.</li>

<li>
 Multiple Steam accounts complicate game access.</li>

<li>
 Task killing reverts system settings automatically.</li>

<li>
 Cross-platform streaming solutions are highlighted.</li>

</ol>

<p>

</p>

<p>
RECOMMENDATIONS:</p>

<ol>

<li>
 Use environment variables for client resolution adjustments.</li>

<li>
 Exit applications properly to revert settings.</li>

<li>
 Set up detached background commands for stability.</li>

<li>
 Monitor ultra-wide resolution compatibility.</li>

<li>
 Utilize Play Night for Steam account management.</li>

<li>
 Avoid multiple logins for different game libraries.</li>

<li>
 Opt for cross-platform streaming solutions.</li>

<li>
 Check network latency for smooth gameplay.</li>

<li>
 Use bat files for automated task execution.</li>

<li>
 Configure GameStream Launchpad for resolution changes.</li>

<li>
 Prioritize proper task termination to prevent glitches.</li>

<li>
 Test 5G networks for slower-paced gaming.</li>

<li>
 Leverage environment variables for client settings.</li>

<li>
 Ensure all applications exit before shutting down.</li>

<li>
 Use detached commands for background processes.</li>

<li>
 Verify resolution compatibility with ultra-wide displays.</li>

<li>
 Combine Sun Shine and Moonlight for reliable streaming.</li>

<li>
 Log in once for multiple Steam accounts.</li>

<li>
 Address frame drops in low-latency networks.</li>

<li>
 Stream games universally across platforms.</li>

</ol>

<p>

</p>


<p><a href="https://hackerpublicradio.org/eps/hpr4699/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Thu, 06 Aug 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4699/hpr4699.ogg"
         length="14508574"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4698/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4698/index.html</link>
         <title>HPR4698: ID3 Tags and Vorbis Comments</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Clean by the host.</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
01 Introduction</p>

<p>

</p>

<p>
In a response to a post on a previous episode, I said that I would take a look at ID3 tags. </p>

<p>
ID3 tags are text information that is added to an MP3 audio file, such as the author, date, name, and other information.</p>

<p>

</p>

<p>
02</p>

<p>
While I am at it I will also look at Vorbis comments, which perform a similar function for vorbis, the container format for "ogg" audio files.</p>

<p>
As example audio files, I will use a recent HPR episode, hpr4678 in both mp3 and vorbis formats plus also one from another podcast as well. </p>

<p>

</p>

<p>
03</p>

<p>
There is Free Software which you can use to view, edit, or remove both types of tags or comments, and I will describe how to use it in this episode.</p>

<p>

</p>

<p>
04</p>

<p>
I will cover how to view tags and extract the text information, as well as how to strip the tags from a file and why you may wish to do so under certain very specific circumstances.</p>

<p>

</p>

<p>
I won't cover how to add to or edit tags in an MP3 or OGG file, as that is a more involved subject that I don't have much experience with. </p>

<p>

</p>

<p>
05</p>

<p>
I will mainly talk about ID3 MP3 tags rather than vorbis comments for the simple reason that the situation with MP3 files is an utter mess while vorbis comments are very straightforward and so there isn't as much to say about them.</p>

<p>

</p>

<p>
06</p>

<p>
As often happens when researching a subject to write a podcast script, I have learned quite a bit that I didn't know previously, and discovered that things that I thought I did know were wrong.</p>

<p>
I hope that you may learn a few things from this episode that you didn't know previously either. </p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
07 Background</p>

<p>

</p>

<p>
I won't go over the detailed history of ID3 tags, as I don't have a reliable source for this.</p>

<p>
Briefly however, so far as I can determine, there is no official independent standard for ID3 tags or vorbis comments.</p>

<p>
Both seem to be more in the nature of a convention that was created by an unofficial group of contributors rather than something issued by a standards body.</p>

<p>

</p>

<p>
08</p>

<p>
However, I don't see the lack of a conventional standards body as necessarily a problem with respect to the use of ID3 tags or vorbis comments.</p>

<p>
I just am not familiar enough with the industry to know who to regard as being an authoritative source when it comes to the history and development of them</p>

<p>
Since I am unsure as who to credit with what developments, I will avoid that sort of detail.</p>

<p>

</p>

<p>
09 ID3 Tags</p>

<p>
There is a web site with the URL of ID3.org that seems to have the best reference material on the topic of ID3 tags.</p>

<p>
According to this site, the term "ID3" means "IDentify an MP3".</p>

<p>

</p>

<p>
10 Vorbis Comments</p>

<p>
For vorbis, the reference site seems to be xiph.org.</p>

<p>
Although the implementation details may differ from ID3, from our perspective as podcast listeners, they can be seen as more or less equivalent in terms of what I am going to address here.</p>

<p>

</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
11 ID3 Details</p>

<p>

</p>

<p>

</p>

<p>
Versions</p>

<p>
One of the problems with ID3 is that there are multiple incompatible versions, particularly from the very early days.</p>

<p>
ID3v1 tags are located at the end of the audio file in the last 128 bytes.</p>

<p>
This was done for compatibility reasons to allow early MP3 players to simply ignore the tags if they didn't know how to deal with them. </p>

<p>
The tags would simply appear as a short burst of static from the perspective of these early players.</p>

<p>

</p>

<p>
12</p>

<p>
ID3v2 moved the tags to the start of the MP3 file to allow players to scan the tags for information such as titles without having to read to the end of the file to find them.</p>

<p>
There are far fewer limits on the amount of information that can be placed in ID3v2 tags.</p>

<p>

</p>

<p>
13</p>

<p>
ID3v1 is obsolete and only very old players will require it.</p>

<p>
However, it is still used by some publishers for backward compatibility reasons.</p>

<p>
ID3v1 included numerical musical "genre" category codes which apparently turned out to be a very bad idea in practice. </p>

<p>

</p>

<p>
14</p>

<p>
Furthermore, all genre categories above 70 were defined by an audio software company called Nullsoft who created software such as Winamp.</p>

<p>
These codes were never actually part of the ID3 standard, although there was never really a standard to begin with.</p>

<p>

</p>

<p>
15</p>

<p>
The current ID3 version is 2.3. There is a version 2.4, but apparently it is not actually generally accepted and may be a developmental dead end.</p>

<p>

</p>

<p>
16</p>

<p>
The id3.org web site contains a copy of the ID3v2.3 standard, but I am not going to address the technical details here.</p>

<p>
This would only be of interest to someone who was creating software to read and write ID3 tags.</p>

<p>

</p>

<p>
17 ID3v2 Frames</p>

<p>
The ID3v2 information is encoded into what are called "frames".</p>

<p>
The text information is contained in text information frames.</p>

<p>

</p>

<p>
18</p>

<p>
Text information frames start with a set of four character identifiers, all starting with the capital letter 'T'.</p>

<p>
Examples</p>

<p>
"TALB" is the "Album/Movie/Show title" frame.</p>

<p>
"TIT2" is the "Title/Songname/Content description" frame.</p>

<p>
"TYER" is the "Year" frame.</p>

<p>

</p>

<p>
There are many more, but I won't go into more detail here.</p>

<p>

</p>

<p>
19 HPR ID3 Tags</p>

<p>
HPR makes an interesting case study because they use both ID3v1 and ID3v2 in the same file.</p>

<p>
This can cause some interesting problems with software that tries to read those tags.</p>

<p>
This is because most software appears to expect one or the other, but not both.</p>

<p>
However, so long as this does not cause problems with anything that actually plays the files, this is not a problem so far as people who just want to listen to podcasts are concerned.</p>

<p>

</p>

<p>
It does mean though that we have more to talk about than we would otherwise would have had.</p>

<p>

</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
20 Vorbis Comment Fields</p>

<p>

</p>

<p>
The situation with Vorbis comments is much simpler, as there seems to be just one standard that was adhered to from the start rather than a succession of hacks.</p>

<p>
Information is stored in "fields", which xiph describes as being like Unix environment variables.</p>

<p>
These consist of a field name followed by an equal sign and then the information intended for that field.</p>

<p>
Field names are case insensitive.</p>

<p>

</p>

<p>
21</p>

<p>
The field names are not firmly defined at this stage, but there is a list of recommended names.</p>

<p>
Examples are</p>

<p>
"TITLE" is the Track or Work name.</p>

<p>
"ARTIST" is the person responsible for the work.</p>

<p>
"LICENSE" is the license information.</p>

<p>

</p>

<p>
22</p>

<p>
You can see the complete list for yourself on the comment field and header specification page at xiph.org</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
23 Software for Listing, Adding, and Modifying Tags and Fields</p>

<p>

</p>

<p>
There are three software packages that I will now describe which allow you to list, add, modify, and remove tags and fields.</p>

<p>
There are other packages which can do the same, including some which offer a GUI interface.</p>

<p>
However, I will limit myself to describing these three.</p>

<p>
The principles should be the same for others.</p>

<p>

</p>

<p>
24 ffprobe</p>

<p>
ffprobe is part of the ffmpeg package.</p>

<p>
If you have listened to my previous episodes on audio, you will have heard me talk about ffmpeg.</p>

<p>
ffprobe is used to display information about media files rather than for modifying them.</p>

<p>
ffprobe is licensed under the GPLv2 or later.</p>

<p>

</p>

<p>
ffprobe can be used to display information about both MP3 and OGG Vorbis files.</p>

<p>

</p>

<p>
25 ID3v2</p>

<p>
The next is the rather aptly named id3v2 and works with MP3 files.</p>

<p>
On Linux systems, this should be provided by the id3v2 package.</p>

<p>
On Debian derivatives this can be installed as follows</p>

<p>

</p>

<p>
sudo apt install id3v2</p>

<p>

</p>

<p>
26</p>

<p>
This also installs a man page which provides a brief list of the options.</p>

<p>
According to the README file in the source tarball, this is published under the LGPL</p>

<p>
ID3v2 is particularly useful for displaying ID3v1 tags.</p>

<p>

</p>

<p>
27 vorbiscomment</p>

<p>
The third is "vorbiscomment" and works with OGG files.</p>

<p>
On Linux systems this should be provided by the "vorbis-tools" package.</p>

<p>
On Debian derivatives this can be installed as follows</p>

<p>

</p>

<p>
sudo apt install vorbis-tools</p>

<p>

</p>

<p>
28</p>

<p>
The vorbiscomment program is used to list or edit comments in Ogg Vorbis files.</p>

<p>
This also installs a man page which provides a brief list of the options.</p>

<p>
According to the license.lgpl file in the source tarball, this is published under the LGPL version2.</p>

<p>

</p>

<p>
29</p>

<p>
The display format for vorbiscomment follows the data definition format in the vorbis standard, whereas ffprobe re-formats it to match its own preferred appearance. </p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
30 Examples from HPR</p>

<p>

</p>

<p>
With the background out of the way, I will now give several examples of how to list the tags or fields.</p>

<p>

</p>

<p>
31 Listing ID3v1 Tags</p>

<p>

</p>

<p>
As previously mentioned HPR uses both ID3v1 and ID3v2 tags in the same file.</p>

<p>
However, so far as I can tell, most software seems to look for ID3v2 tags first, and don't display the ID3v1 tags if both are present.</p>

<p>

</p>

<p>
32</p>

<p>
The ID3v2 program however seems to do the opposite, at least with HPR podcasts. </p>

<p>
However, the number of samples that I have which have both are rather limited, so I can't be sure if this is always the case or if this is a side effect of something else.</p>

<p>
I did mention that ID3 tags were a mess, didn't I?</p>

<p>

</p>

<p>
33</p>

<p>
Let's go on to our example however.</p>

<p>
If we want to see the ID3v1 tags, then using hpr4678 as an example, if we type</p>

<p>

</p>

<p>
id3v2 -l hpr4678.mp3</p>

<p>
=</p>

<p>
we get the following result.</p>

<p>

</p>

<p>
34</p>

<p>

</p>

<p>
id3v1 tag info for hpr4678.mp3:</p>

<p>
Title  : High Resolution Elapsed Time i  Artist: Whiskeyjack                   </p>

<p>
Album  : Hacker Public Radio             Year: 2026, Genre: Unknown (186)</p>

<p>
Comment: https://hackerpublicradio.or    Track: 0</p>

<p>
hpr4678.mp3: No ID3v2 tag</p>

<p>

</p>

<p>
35</p>

<p>
The first line tells us that this information is ID3v1 tags.</p>

<p>
The last line tells us that there are no ID3v2 tags. </p>

<p>
This last line is incorrect, but we will come back to that later.</p>

<p>

</p>

<p>
36</p>

<p>
In between are three lines of text.</p>

<p>
The first line contains the title and the artist.</p>

<p>
The title is the name of the HPR episode, or at least part of it.</p>

<p>
The artist is the HPR contributor who made that episode.</p>

<p>

</p>

<p>
37</p>

<p>
The second line contains the album name, the year, and the genre.</p>

<p>
The album name is this case is simply Hacker Public Radio, as the concept of an album doesn't really fit a podcast.</p>

<p>
The year is the year that the episode was recorded, or at least the year in which the MP3 file was assembled with the HPR intro and the tags added.</p>

<p>

</p>

<p>
38</p>

<p>
The genre is listed as "unknown 186".</p>

<p>
Recall that with ID3v1 tags there is a one byte numeric genre code, but that no genres above 70 were ever officially assigned.</p>

<p>
It seems to be a general convention though to use a code 186 for podcasts.</p>

<p>

</p>

<p>
39</p>

<p>
The third line contain a comment and track number.</p>

<p>
The comment in this case is the HPR web site URL.</p>

<p>
The track is zero.</p>

<p>
"Track" would appear to serve no useful purpose in this instance.</p>

<p>
However, it may be there for reasons of compatibility that I am unaware of, so I would be very reluctant to remove that without very good reason.</p>

<p>

</p>

<p>
40</p>

<p>
If we look at the above information in detail we can see that two of the tags appear to have cut their text information off short.</p>

<p>
The title is cut off in mid word after the 30th character.</p>

<p>
The final "g" in "hackerpublicradio.org" is cut off in the comment.</p>

<p>

</p>

<p>
41 Alternative Method for ID3v1</p>

<p>
We can confirm whether the text being cut short is due to a problem with the id3v2 program, or whether it really represents the data in the file by using a rather simple check.</p>

<p>

</p>

<p>
42</p>

<p>
Recall that ID3v1 tags are simply the last 128 bytes of the MP3 file.</p>

<p>
All we need to do is to extract the last 128 bytes of the file.</p>

<p>
We can do this using the standard tail command.</p>

<p>

</p>

<p>
tail -c128 hpr4678.mp3 | tr '\0' ' ' | tr -c '[:print:]' 'x'</p>

<p>

</p>

<p>
43</p>

<p>
The -c128 option used with tail tells it to extract the last 128 bytes of the file.</p>

<p>
We then pass the result through the "tr" command and tell it to replace null bytes with new line characters.</p>

<p>
Then we replace any remaining non-printable characters  with an 'x'.</p>

<p>

</p>

<p>
When we do that we get the following</p>

<p>

</p>

<p>
44</p>

<p>

</p>

<p>
TAGHigh Resolution Elapsed Time iWhiskeyjack                   Hacker Public Radio           2026https://hackerpublicradio.or  x</p>

<p>

</p>

<p>
45</p>

<p>
The first three characters are capital TAG.</p>

<p>
This is a flag which indicates that what follows  are ID3 tags.</p>

<p>

</p>

<p>
46</p>

<p>
Next, we have 30 characters which specify the title.</p>

<p>
The next 30 characters specify the artist.</p>

<p>
The next 30 characters are the album, or in this case just "Hacker Public Radio".</p>

<p>
The next 4 characters are the year.</p>

<p>
The next 30 characters are a comment, or in this case the HPR URL, except for the final "g".</p>

<p>
The last character is the genre code, which we have replaced with an "x" because it is otherwise non-printable.</p>

<p>

</p>

<p>
47</p>

<p>
Taken together, these add up to 128 bytes.</p>

<p>
We can see that the field lengths are of fixed length with pre-defined meanings based on position.</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
48 ID3v2 Using ffprobe</p>

<p>
Now lets move on to ID3v2 tags, which is probably more useful for most people.</p>

<p>

</p>

<p>
For this, we will switch to using ffprobe.</p>

<p>
The command for this is</p>

<p>

</p>

<p>
ffprobe -hide_banner hpr4678.mp3</p>

<p>

</p>

<p>
The -hide_banner option suppresses extra data about the codecs which doesn't interest us much and leaves mainly the tag information plus a few other things.</p>

<p>

</p>

<p>
49</p>

<p>
The output gives us the full data that is associated with the podcast episode from the HPR web site.</p>

<p>
This includes the episode number, year, full title, author, license, and full summary text.</p>

<p>
You can see a full copy of this in the show notes.</p>

<p>

</p>

<p>
Input #0, mp3, from 'hpr4678.mp3':</p>

<p>
  Metadata:</p>

<p>
	track           : 4678</p>

<p>
	year            : 2026</p>

<p>
	title           : High Resolution Elapsed Time in Shell Scripts</p>

<p>
	author          : Whiskeyjack</p>

<p>
	copyright       : CC-BY-SA</p>

<p>
	artist          : Whiskeyjack</p>

<p>
	album           : Hacker Public Radio</p>

<p>
	comment         : https://hackerpublicradio.org Clean; Surprises encountered when measuring elapsed time in shell scripts The license is CC-BY-SA</p>

<p>
	genre           : Podcast</p>

<p>
	encoder         : Lavf61.7.103</p>

<p>
	date            : 2026</p>

<p>
  Duration: 00:30:10.18, start: 0.023021, bitrate: 64 kb/s</p>

<p>
  Stream #0:0: Audio: mp3, 48000 Hz, mono, fltp, 64 kb/s</p>

<p>

</p>

<p>
50</p>

<p>
The ID3v2 tag version contains all of the information which was provided by the author, including the full title and description without the 30 character limit of ID3V1.</p>

<p>

</p>

<p>
If you want any of this information for some reason you should be able to extract it from the MP3 file using a combination of ffprobe, grep, and cut rather than trying to scrape the HPR web site and matching it to the MP3 later. </p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
51 ID3v1 Using ffprobe</p>

<p>

</p>

<p>
I previously mentioned that HPR MP3 files have both ID3v1 and ID3v2 tags in the same file, and that ffprobe will default to using ID3v2 tags if present.</p>

<p>

</p>

<p>
However, what happens if we remove the ID3v2 tags and leave the ID3v1 tags?</p>

<p>
I will describe how to strip tags later on in this episode, but let's just assume for now that I have done this.</p>

<p>

</p>

<p>
If we then use ffprobe to read the ID3 tags using the same command as before, we get the following output.</p>

<p>

</p>

<p>
52</p>

<p>
We get a series of lines in the same format as with ID3v2, but with each data element limited to at most 30 bytes.</p>

<p>
These include title, artist, album, date, comment, and genre. </p>

<p>
You can see the full output in the show notes.</p>

<p>

</p>

<p>
Input #0, mp3, from 'test.mp3':</p>

<p>
  Metadata:</p>

<p>
	title           : High Resolution Elapsed Time i</p>

<p>
	artist          : Whiskeyjack</p>

<p>
	album           : Hacker Public Radio</p>

<p>
	date            : 2026</p>

<p>
	comment         : https://hackerpublicradio.or</p>

<p>
	genre           : Podcast</p>

<p>
  Duration: 00:30:10.18, start: 0.023021, bitrate: 64 kb/s</p>

<p>
  Stream #0:0: Audio: mp3, 48000 Hz, mono, fltp, 64 kb/s</p>

<p>

</p>

<p>
53</p>

<p>
The information is the same as when read by the id3v2 program, but formatted for display in the manner that ffprobe uses. </p>

<p>

</p>

<p>
This shows that ffprobe can indeed read ID3v1 tags if they are the only ones present. </p>

<p>

</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
54 Reading Vorbis Comments</p>

<p>
Now let us turn our attention to vorbis comments, which are the equivalent to tags for ogg files.</p>

<p>
We will look at this using two methods.</p>

<p>

</p>

<p>
55 Using vorbiscomment</p>

<p>
The first method we will look at is using the vorbiscomment package.</p>

<p>
The command is </p>

<p>

</p>

<p>
vorbiscomment -l hpr4678.ogg</p>

<p>

</p>

<p>
56</p>

<p>
The output of this is a series of lines with key value pairs separated by equal signs.</p>

<p>
The output is also exactly the same as the MP3 file, except that there is an additional "language" field, "track" becomes "TRACKNUMBER", and there is no "date" field.</p>

<p>
You can see the full output in the show notes.</p>

<p>

</p>

<p>
encoder=Lavc61.19.101 libvorbis</p>

<p>
TRACKNUMBER=4678</p>

<p>
year=2026</p>

<p>
language=English</p>

<p>
title=High Resolution Elapsed Time in Shell Scripts</p>

<p>
author=Whiskeyjack</p>

<p>
copyright=CC-BY-SA</p>

<p>
artist=Whiskeyjack</p>

<p>
album=Hacker Public Radio</p>

<p>
DESCRIPTION=https://hackerpublicradio.org Clean; Surprises encountered when measuring elapsed time in shell scripts The license is CC-BY-SA</p>

<p>
genre=Podcast</p>

<p>

</p>

<p>

</p>

<p>
57 Using ffprobe</p>

<p>
Now lets do the same again using ffprobe.</p>

<p>
The command for this is</p>

<p>

</p>

<p>
ffprobe -hide_banner hpr4678.ogg</p>

<p>

</p>

<p>
58</p>

<p>
The output content is the same of course, but the field names have all been forced to lower case, and instead of an equal sign as a separator between the key and value, this has been replaced by a colon and white space has been added to make the output look a bit nicer.</p>

<p>
You can see the full output in the show notes.</p>

<p>

</p>

<p>
Input #0, ogg, from 'hpr4678.ogg':</p>

<p>
  Duration: 00:30:10.14, start: 0.000000, bitrate: 86 kb/s</p>

<p>
  Stream #0:0(English): Audio: vorbis, 192000 Hz, mono, fltp, 4294967 kb/s</p>

<p>
	Metadata:</p>

<p>
	  encoder         : Lavc61.19.101 libvorbis</p>

<p>
	  track           : 4678</p>

<p>
	  year            : 2026</p>

<p>
	  title           : High Resolution Elapsed Time in Shell Scripts</p>

<p>
	  author          : Whiskeyjack</p>

<p>
	  copyright       : CC-BY-SA</p>

<p>
	  artist          : Whiskeyjack</p>

<p>
	  album           : Hacker Public Radio</p>

<p>
	  comment         : https://hackerpublicradio.org Clean; Surprises encountered when measuring elapsed time in shell scripts The license is CC-BY-SA</p>

<p>
	  genre           : Podcast</p>

<p>

</p>

<p>

</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
59 Another Example from Another Podcast</p>

<p>

</p>

<p>
The above is interesting, but it's a sample of one podcast. Let's look at another different one altogether.</p>

<p>
For this test I used two episodes of the Linux Matters podcast, episodes 68 and 82. As to why I am using two different episodes I will explain in a moment.</p>

<p>

</p>

<p>
60 Episode 68</p>

<p>
We will start with examining episode 68</p>

<p>

</p>

<p>
Using id3v2</p>

<p>
The command using id3v2 is</p>

<p>

</p>

<p>
id3v2 -l LMP68.mp3</p>

<p>

</p>

<p>
61</p>

<p>
This provides output as a series of lines containing the official 4 character identifiers from the standard, a description of the identifiers, and the text provided by the authors.</p>

<p>
The identifiers include TIT2 indicating title, TALB indicating show title, TRCK indicating track number, and a number of others.</p>

<p>
You can see the full output in the show notes.</p>

<p>

</p>

<p>

</p>

<p>
id3v2 tag info for LMP68.mp3:</p>

<p>
TIT2 (Title/songname/content description): 68: Frameworks, Filesystems and Fixes</p>

<p>
TPE1 (Lead performer(s)/Soloist(s)): Linux Matters</p>

<p>
TALB (Album/Movie/Show title): Linux Matters</p>

<p>
TYER (Year): 2025</p>

<p>
TRCK (Track number/Position in set): 68</p>

<p>
COMM (Comments): ()[]: https://linuxmatters.sh/</p>

<p>
APIC (Attached picture): (LMP-3000-moon.jpg)[, 3]: image/jpeg, 554576 bytes</p>

<p>
LMP68.mp3: No ID3v1 tag</p>

<p>

</p>

<p>
62</p>

<p>
From this we can see what the id3v2 program would normally do with ID3v2 tags. </p>

<p>
Note that it outputs the actual 4 character identifiers, plus a description of what they mean, and then the actual data.</p>

<p>
This helps when trying to understand the actual encoding of the data.</p>

<p>

</p>

<p>

</p>

<p>
63 Using ffprobe</p>

<p>
Now let's try that with ffprobe.</p>

<p>

</p>

<p>
The command is</p>

<p>

</p>

<p>
ffprobe -hide_banner LMP68.mp3</p>

<p>

</p>

<p>
64</p>

<p>
This provides the same publisher provided data as before.</p>

<p>
However it does not display the 4 character identifiers but instead uses its own format for display.</p>

<p>

</p>

<p>
Also note in both cases that there is a picture embedded in the MP3 file which is used to generate an icon for display in your file manager.</p>

<p>

</p>

<p>
With ffprobe this results in there being two keys called "title" and two keys called "comment". </p>

<p>
This makes grepping for the metadata more complicated, but it should still be possible.</p>

<p>
You can see the full output in the show notes.</p>

<p>

</p>

<p>

</p>

<p>
Input #0, mp3, from 'LMP68.mp3':</p>

<p>
  Metadata:</p>

<p>
	title           : 68: Frameworks, Filesystems and Fixes</p>

<p>
	artist          : Linux Matters</p>

<p>
	album           : Linux Matters</p>

<p>
	comment         : https://linuxmatters.sh/</p>

<p>
	track           : 68</p>

<p>
	date            : 2025</p>

<p>
  Duration: 00:28:12.45, start: 0.025056, bitrate: 114 kb/s</p>

<p>
  Stream #0:0: Audio: mp3, 44100 Hz, mono, fltp, 112 kb/s</p>

<p>
	Metadata:</p>

<p>
	  encoder         : LAME3.100</p>

<p>
  Stream #0:1: Video: mjpeg (Progressive), yuvj444p(pc, bt470bg/unknown/unknown), 4166x4166 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn (attached pic)</p>

<p>
	Metadata:</p>

<p>
	  title           : LMP-3000-moon.jpg</p>

<p>
	  comment         : Cover (front)</p>

<p>

</p>

<p>

</p>

<p>

</p>

<p>
65 Episode 82</p>

<p>
Now lets try that again with a different episode, 82.</p>

<p>

</p>

<p>
Using id3v2</p>

<p>

</p>

<p>
The command for id3v2 is</p>

<p>

</p>

<p>
id3v2 -l LMP82.mp3</p>

<p>

</p>

<p>
This results in id3v2 saying</p>

<p>

</p>

<p>
LMP82.mp3: No ID3 tag</p>

<p>

</p>

<p>
What happened here?</p>

<p>

</p>

<p>
66 Using ffprobe</p>

<p>

</p>

<p>
Let's try that again with ffprobe.</p>

<p>
The command</p>

<p>

</p>

<p>
ffprobe -hide_banner LMP82.mp3</p>

<p>

</p>

<p>
provides the expected output.</p>

<p>

</p>

<p>
Input #0, mp3, from 'LMP82.mp3':</p>

<p>
  Metadata:</p>

<p>
	date            : 2026-05</p>

<p>
	title           : 82: Ditching Grammarly for Open Sauce</p>

<p>
	album           : Linux Matters</p>

<p>
	track           : 82</p>

<p>
	artist          : Linux Matters</p>

<p>
	comment         : https://linuxmatters.sh</p>

<p>
  Duration: 00:33:37.83, start: 0.025056, bitrate: 113 kb/s</p>

<p>
  Stream #0:0: Audio: mp3, 44100 Hz, mono, fltp, 112 kb/s</p>

<p>
  Stream #0:1: Video: png, rgb24(pc, gbr/unknown/unknown), 3000x3000, 90k tbr, 90k tbn (attached pic)</p>

<p>
	Metadata:</p>

<p>
	  title           : Linux Matters Logo</p>

<p>
	  comment         : Cover (front)</p>

<p>

</p>

<p>
67</p>

<p>
This results in a few minor changes from episode 68, but otherwise it looks the same.</p>

<p>
So there are ID3 tags, but for some reason id3v2 couldn't recognize them.</p>

<p>

</p>

<p>
A bit more research and experimentation shows that this change appears to have happened right after episode 68, when they changed hosting and processing arrangements.</p>

<p>

</p>

<p>
I suspect that something changed with respect to the ID3v2 tag formatting somewhere along the way in the change over, and this in turn has affected the ability of the id3v2 program to recognize the tags.</p>

<p>

</p>

<p>
I will come back to the implications of this later in my conclusions.</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
68 Stripping ID3 Tags</p>

<p>

</p>

<p>
Now let's turn to a differen topic. </p>

<p>

</p>

<p>
Stripping ID3 tags refers to removing the ID3 tags from the audio file.</p>

<p>

</p>

<p>
I will start off by emphasizing that normally, you don't want to do this.</p>

<p>
You should only be doing it if you suspect the ID3 tags are causing a problem with the playback or ordering of the files.</p>

<p>

</p>

<p>
69</p>

<p>
In my case I do it when I have problems with my MP3 player when playing certain podcasts.</p>

<p>
This MP3 player orders files according to ID3 tags rather than by file name.</p>

<p>
This can result in the podcasts being played in an unpredictable order which I find undesirable.</p>

<p>
This is particularly a problem with podcasts from certain publishers where the title data does not follow any consistent pattern, but is whatever someone felt like doing that day.</p>

<p>

</p>

<p>
70</p>

<p>
I also often have to normalize the files from the same publishers to get a consistent audio loudness.</p>

<p>
See my series on Simple Podcasting for information on how to use ffmpeg to normalize the audio loudness.</p>

<p>

</p>

<p>
The solution to the inconsistent tag formats in these cases is to simply strip the ID3 tags altogether.</p>

<p>
The player then falls back on using the file names, and I can readily rename the files to a consistent format.</p>

<p>

</p>

<p>
I have never had these sorts of problems with HPR podcasts.</p>

<p>
If you are not having any problems of this nature, then as I said, don't bother stripping the tags.</p>

<p>

</p>

<p>
71</p>

<p>
To strip the ID3 tags from an MP3 file use the following.</p>

<p>

</p>

<p>
id3v2 -D hpr4678.mp3</p>

<p>

</p>

<p>
id3v2 will strip the tags and overwrite the existing file.</p>

<p>
If you wish to keep a copy with the tags, be sure to keep a backup before you try things.</p>

<p>

</p>

<p>
72</p>

<p>
When it comes to stripping tags, the options are</p>

<p>

</p>

<p>
"-s" deletes ID3v1 tags.</p>

<p>
"-d" deletes ID3v2 tags.</p>

<p>
"-D" deletes both v1 and v2 tags.</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
73 Conclusions</p>

<p>

</p>

<p>
In this episode we took a very brief look at ID3 tags and vorbis comments and ways of reading them.</p>

<p>

</p>

<p>
74</p>

<p>
ID3 tags and Vorbis comments provide a means of allowing information about an MP3 or OGG Vorbis file to be embedded in the file itself.</p>

<p>
Podcast publishers very often use this to label the file with information such as title, publisher, and author.</p>

<p>
We can read this information using Fee Software tools such as ffprobe, ID3v2, and vorbiscomment.</p>

<p>

</p>

<p>
75</p>

<p>
ID3 tags seem to be a mess with more than one incompatible versions, and difficulties in reading them even within the same version.</p>

<p>
They are difficult to test for because there is so much hardware out there of varying ages, much of which you will never have heard of let alone had access to.</p>

<p>
If you are recording episodes for HPR you do not have to worry about this, as HPR will do this behind the scenes for you.</p>

<p>
However, if you are responsible for producing a podcast or other similar audio and you have a setup that works, it is probably best not to change anything without good reason. </p>

<p>

</p>

<p>
76</p>

<p>
Vorbis comments seem to be much less of a problem.</p>

<p>
However, there are far fewer devices which can play OGG files compared to MP3, so simply switching to OGG may not be a realistic solution to the ID3 tag problem.</p>

<p>

</p>

<p>
77</p>

<p>
If you wish to have one tool that can read ID3 tags of all sorts and vorbis comments, then ffprobe is your obvious choice.</p>

<p>

</p>

<p>
78</p>

<p>
The ID3v2 program will provide more information about the ID3 tags, including the actual identifiers used. However, it does not work in all cases.</p>

<p>

</p>

<p>
79</p>

<p>
The vorbiscomment program will read Vorbis comments from OGG files in a manner which is closer to the actual vorbis format than ffprobe does, which uses its own display format.</p>

<p>

</p>

<p>
80</p>

<p>
HPR includes both ID3v1 and ID3v2 tags in its MP3 files. </p>

<p>
ffprobe can be used to read the ID3v2 tags, and the id3v2 program can be used to read the ID3v1 tags.</p>

<p>
You can also read the ID3v1 tags using the tail command.</p>

<p>

</p>

<p>
81</p>

<p>
I have barely scratched the surface of this subject and have not talked at all about creating tags or comments.</p>

<p>
If anyone else would like to take up the challenge of providing more detail, or of correcting any mistakes that  have made, please send in a podcast episode on the subject.</p>

<p>
If you have any comments you would like to make, leave them in the comment section below this episode on the HPR web site.</p>

<p>

</p>

<p>
82</p>

<p>
I hope to see you all again in future in another episode of HPR.</p>

<p>

</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>
References</p>

<p>

</p>

<p>
https://id3.org/Introduction</p>

<p>
https://www.xiph.org/</p>

<p>
https://wiki.xiph.org/VorbisComment</p>

<p>

</p>

<p>
--------------------</p>

<p>

</p>

<p>

</p>


<p><a href="https://hackerpublicradio.org/eps/hpr4698/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Wed, 05 Aug 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4698/hpr4698.ogg"
         length="22086989"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4697/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4697/index.html</link>
         <title>HPR4697: Correcting the Dates of Files</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Clean by the host.</p>

<p>
I recently had an experience where UNIX tools proved very useful. A relative had an old mobile phone running Android that stopped connecting to the carrier's network and bought a new one to replace it. I took on the job of trying to copy their files (consisting of just photos and videos) off of the old phone.</p>

<p>
Google's software was desperate to convince me to upload everything to the cloud, but I wasn't interested. It offered the option of copying the files over to an SD card, but failed on repeated attempts to do that. The option I tried next was to transfer them to another device via Bluetooth—that one did actually work, although it was slow and would only handle sending about 100 files at a time.</p>

<p>
They came over to my laptop OK, but the problem with that method was that all of the file times were set to the time when they were transferred. I'm not super familiar with how mobile apps manage metadata, but would presume that they look to file times for organizing photos by date. Fortunately, the <em>
names</em>
 of each of the files included the date and time they were created. I recognized that I could write a bit of shell script to parse the filenames and set the file times accordingly.</p>

<p>
While there were over 800 files, the good news is that there were only three different categories of filenames, so the logic to extract the information needed was relatively simple. Each file had eight numerical digits representing the date and six digits representing the time. It would definitely be an option to come up with a more sophisticated parser that could handle a wide variety of filenames, but I went the lazy way and just handled those three cases. Another nice aspect was that none of the filenames contained spaces, which allowed me to be a bit less careful when using them in command lines. I didn't need to worry about time zones because my laptop was set to the same time zone as the phone—also, if a time was off a by a few hours it wouldn't make a practical difference.</p>

<p>

<em>
Examples of the three different types of filenames I had to deal with, labeled with the relevant values: YYYY=year, MM=month, DD=day, hh=hour, mm=minute, and SS=second.</em>

</p>

<pre>
00001IMG_00001_BURST20250525140124.jpg
                    YYYYMMDDhhmmSS

IMG_20220223_124023.jpg
VID_20221017_095024.mp4
    YYYYMMDD hhmmSS

20191224_195939.jpg
20161021_122620-1.jpg
20191130_134317_Burst01.jpg
20200129_223612_010.jpg
YYYYMMDD hhmmSS
</pre>

<p>
I considered <code>
awk</code>
 as an option (see <a href="http://hackerpublicradio.org/eps/hpr4657/index.html#comment_4766" rel="noopener noreferrer" target="_blank">
Whiskeyjack's comment on HPR episode 4657</a>
), but realized it has no built-in way to change file times, so I set it aside. Don't worry, I <em>
will</em>
 come back to that later.</p>

<p>
My approach was to use an <code>
if-then</code>
 shell construct to choose how to treat the three categories of filenames. For the <code>
if</code>
 condition, I fed the filename into the <code>
grep -q</code>
 command with an appropriate regular expression to test whether it matches. The <code>
-q</code>
 option to <code>
grep</code>
 causes it not to output anything—it returns a zero exit status if there's a match and a status greater than zero if there isn't. Then, there is an <code>
elif</code>
 statement with another <code>
grep -q</code>
 test for the second category of filenames. Finally, an <code>
else</code>
 statement is followed by the command to run for all other filenames. The whole thing is wrapped in a <code>
for</code>
 loop that runs over all the files in the current directory.</p>

<p>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/touch.html" rel="noopener noreferrer" target="_blank">
The </a>

<code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/touch.html" rel="noopener noreferrer" target="_blank">
touch</a>

</code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/touch.html" rel="noopener noreferrer" target="_blank">
 command</a>
, when used with the <code>
-t</code>
 option, can be given a string consisting of the year, month, day, hour, minute, and second. These are all numerals that are run together, <em>
except</em>
 that a period sits between the minute and second. So we need a way to extract these numbers and to insert the period.</p>

<p>
That's where <a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html" rel="noopener noreferrer" target="_blank">
the </a>

<code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html" rel="noopener noreferrer" target="_blank">
cut</a>

</code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html" rel="noopener noreferrer" target="_blank">
 utility</a>
 comes in. It can be given a set of characters to select, and I specified a different set representing the appropriate ones depending on which category a filename fit into. To insert the period, I used <code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html" rel="noopener noreferrer" target="_blank">
sed</a>

</code>
 to replace the last two characters with a period followed by those characters.</p>

<p>

<em>
The first script was to test out that I was getting the correct results.</em>

</p>

<pre>
for fn in *
do
  if echo "$fn" | grep -q BURST
  then
    printf "$fn "
    echo $fn | cut -c '21-34' | sed 's/..$/.&amp;/'
  elif echo "$fn" | grep -q -E '^(IMG_|VID_)'
  then
    printf "$fn "
    echo $fn | cut -c '5-12,14-19' | sed 's/..$/.&amp;/'
  else
    printf "$fn "
    echo $fn | cut -c '1-8,10-15' | sed 's/..$/.&amp;/'
  fi
done
</pre>

<p>

<em>
This one actually sets the file times. The </em>

<code>

<em>
-c</em>

</code>

<em>
 option to </em>

<code>

<em>
touch</em>

</code>

<em>
 prevents it from creating a file if one with that name doesn't already exist.</em>

</p>

<pre>
for fn in *
do
  if echo "$fn" | grep -q BURST
  then
    touch -c -t "$(echo $fn | cut -c '21-34' | sed 's/..$/.&amp;/')" "$fn"
  elif echo "$fn" | grep -q -E '^(IMG_|VID_)'
  then
    touch -c -t "$(echo $fn | cut -c '5-12,14-19' | sed 's/..$/.&amp;/')" "$fn"
  else
    touch -c -t "$(echo $fn | cut -c '1-8,10-15' | sed 's/..$/.&amp;/')" "$fn"
  fi
done
</pre>

<p>
The script ran over all the files in less than 15 seconds and correctly set the file time on each. Job done, right? Well, after I did this, it struck me that there was room for improvement. The script would probably run more quickly if I used <a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_05" rel="noopener noreferrer" target="_blank">
a </a>

<code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_05" rel="noopener noreferrer" target="_blank">
case</a>

</code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_05" rel="noopener noreferrer" target="_blank">
 construct</a>
 instead of an <code>
if</code>
 construct that called <code>
grep</code>
 multiple times. While the pattern-matching notation used with <code>
case</code>
 is not as flexible and can handle fewer situations than the regular expression syntax available with <code>
grep</code>
, in this case (see what I did there?) it is sufficient. Testing it out, using <code>
case</code>
 reduced the running time by 45%.</p>

<p>

<em>
Replacing </em>

<code>

<em>
if</em>

</code>

<em>
 with </em>

<code>

<em>
case</em>

</code>

<em>
—the commands to be executed for each category of filename can remain exactly the same.</em>

</p>

<pre>
for fn in *
do
  case "$fn" in
  *BURST*)
    printf "$fn "
    echo $fn | cut -c '21-34' | sed 's/..$/.&amp;/'
  ;;
  IMG_*|VID_*)
    printf "$fn "
    echo $fn | cut -c '5-12,14-19' | sed 's/..$/.&amp;/'
  ;;
  *)
    printf "$fn "
    echo $fn | cut -c '1-8,10-15' | sed 's/..$/.&amp;/'
  esac
done

for fn in *
do
  case "$fn" in
  *BURST*)
    touch -c -t "$(echo $fn | cut -c '21-34' | sed 's/..$/.&amp;/')" "$fn"
  ;;
  IMG_*|VID_*)
    touch -c -t "$(echo $fn | cut -c '5-12,14-19' | sed 's/..$/.&amp;/')" "$fn"
  ;;
  *)
    touch -c -t "$(echo $fn | cut -c '1-8,10-15' | sed 's/..$/.&amp;/')" "$fn"
  esac
done
</pre>

<p>
I couldn't completely put <code>
awk</code>
 out of my mind, though, and I eventually came up with an <code>
awk</code>
 script for the same purpose. This is <em>
far</em>
 faster, probably because everything can be done within <code>
awk</code>
 except actually modifying the file times, which is possible using <a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_14" rel="noopener noreferrer" target="_blank">
the </a>

<code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_14" rel="noopener noreferrer" target="_blank">
system()</a>

</code>

<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_14" rel="noopener noreferrer" target="_blank">
 function</a>
 to call <code>
touch</code>
. I was able to knock 90% off the running time, which for 800 files isn't a big deal but might make a difference if you have hundreds of thousands of files.</p>

<p>

<em>
The </em>

<code>

<em>
awk</em>

</code>

<em>
 counterparts to both scripts above. Unlike those, </em>

<code>

<em>
ls</em>

</code>

<em>
 is used to feed it with the list of filenames. We have the full power of extended regular expressions available to use for matching against the filenames. The </em>

<code>

<em>
next</em>

</code>

<em>
 statement causes </em>

<code>

<em>
awk</em>

</code>

<em>
 to skip any remaining pattern-action pairs and go to the next line of input.</em>

</p>

<pre>
ls | awk '/BURST/ { print $0, substr($0, 21, 12) "." substr($0, 33, 2)
  next }
/^(IMG_|VID_)/ {
  print $0, substr($0, 5, 8) substr($0, 14, 4) "." substr($0, 18, 2)
  next }
{ print $0, substr($0, 1, 8) substr($0, 10, 4) "." substr($0, 14, 2) }'

ls | awk '/BURST/ {
  system("touch -c -t " substr($0, 21, 12) "." substr($0, 33, 2) " " $0)
  next }
/^(IMG_|VID_)/ {
  system("touch -c -t " substr($0, 5, 8) substr($0, 14, 4) "." \
    substr($0, 18, 2) " " $0)
  next }
{ system("touch -c -t " substr($0, 1, 8) substr($0, 10, 4) "." \
    substr($0, 14, 2) " " $0) }'
</pre>

<p>
A further optimization that came to me later was to not call <code>
system()</code>
 from within <code>
awk</code>
, but to instead just have <code>
awk</code>
 print out a set of command lines. These can then be piped to <code>
sh</code>
 to actually be executed. This cut the running time down by 95% compared to my original script.</p>

<p>

<em>
The fastest version I was able to come up with. If you run it without the </em>

<code>

<em>
| sh</em>

</code>

<em>
 on the end, you can check that it's outputting the right information before actually modifying anything. The backslash on the end of a couple lines causes the subsequent line to be treated as a continuation of the existing line. Normally I would just keep everything on one line even if it runs longer than 80 columns, but for display purposes this looks nicer.</em>

</p>

<pre>
ls | awk '/BURST/ {
  print "touch -c -t " substr($0, 21, 12) "." substr($0, 33, 2) " " $0
  next }
/^(IMG_|VID_)/ {
  print "touch -c -t " substr($0, 5, 8) substr($0, 14, 4) "." \
    substr($0, 18, 2) " " $0
  next }
{ print "touch -c -t " substr($0, 1, 8) substr($0, 10, 4) "." \
    substr($0, 14, 2) " " $0 }' | sh
</pre>

<p>
It is probably true that this could have been carried out just as easily on Windows using Microsoft's PowerShell. I'm not very familiar with it, but would imagine (or hope) that it includes commands for managing these basic things like text manipulation and modifying file times. If you are stuck in an environment where you don't have a UNIX-like system available, investigate how to accomplish a task with the tools you do have.</p>

<p>
While I had the necessary information in the filenames to use, that might not be the case in all situations. You could look for other sources of dates—most digital cameras will add EXIF tags to a JPEG file giving the date and time it was created. (Hopefully, the clock in the camera will be set accurately.) While there is no standard UNIX utility to read those tags, free and open source software tools are widely available for that purpose. I found one called <code>
exiftags</code>
 that included the utility <code>
exiftime</code>
, which specifically outputs EXIF data relating to time. The output format was a little trickier to handle, but <code>
awk</code>
 was able to manage it with a little coaxing.</p>

<p>

<em>
Example of output produced by </em>

<code>

<em>
exiftime</em>

</code>

<em>
. Note that the first line with the filename is </em>
only<em>
 printed if more than one filename is given as an argument. Also, for </em>

<code>

<em>
amusing-sign.jpg</em>

</code>

<em>
, apparently I edited that photo after taking it and the editing software updated the "created" tag but left the others intact. Not all images will necessarily have created, generated, and digitized tags; we will just take whichever ones exist. I redirected standard error to </em>

<code>

<em>
/dev/null</em>

</code>

<em>
 to get rid of error messages for files that don't have EXIF tags; we'll handle those below.</em>

</p>

<pre>
$ exiftime *.jpg 2&gt;/dev/null
20260508_154743.jpg:
Image Created: 2026:05:08 15:47:43
Image Generated: 2026:05:08 15:47:43
Image Digitized: 2026:05:08 15:47:43

20260508_155044.jpg:
Image Created: 2026:05:08 15:50:44
Image Generated: 2026:05:08 15:50:44
Image Digitized: 2026:05:08 15:50:44

3704a78e771c2a25a894ef2f0b5a2a629f1eba80.jpg:

amusing-sign.jpg:
Image Created: 2017:01:24 23:14:04
Image Generated: 2017:01:24 21:18:07
Image Digitized: 2017:01:24 21:18:07

dscf3011.jpg:
Image Created: 2015:01:01 00:02:19
Image Generated: 2015:01:01 00:02:19
Image Digitized: 2015:01:01 00:02:19

window-view.jpg:
$ 
</pre>

<p>

<em>
We can take advantage of the fact that different records are separated by a blank line. In </em>

<code>

<em>
awk</em>

</code>

<em>
, when </em>

<code>

<em>
RS</em>

</code>

<em>
 is set to a null string and </em>

<code>

<em>
FS</em>

</code>

<em>
 is set to a newline character, each set of non-blank lines is treated as a record and each line within those sets is treated as a field. One or more blank lines separate each record. For the output of </em>

<code>

<em>
exiftime</em>

</code>

<em>
, this means that </em>

<code>

<em>
$1</em>

</code>

<em>
 will contain the filename and </em>

<code>

<em>
$2</em>

</code>

<em>
 will contain the first line after the filename. For those files without an EXIF date tag, </em>

<code>

<em>
$2</em>

</code>

<em>
 will be a null string, which is treated by </em>

<code>

<em>
awk</em>

</code>

<em>
 as FALSE, so the pattern will not match, the action will not be taken, and nothing will be printed. If a file has multiple tags, I will just use the first one reported by </em>

<code>

<em>
exiftime</em>

</code>

<em>
 (contained in </em>

<code>

<em>
$2</em>

</code>

<em>
). The </em>

<code>

<em>
sub()</em>

</code>

<em>
 function call removes the colon that </em>

<code>

<em>
exiftime</em>

</code>

<em>
 prints after the filename, and the </em>

<code>

<em>
gsub()</em>

</code>

<em>
 function call removes all non-numeric characters from the date and time in the tag. (After a comma within a </em>

<code>

<em>
print</em>

</code>

<em>
 statement, a backslash is not necessary to continue a line.) Also, this time I bothered to print quotation marks around the filename in case it contains spaces.</em>

</p>

<pre>
$ exiftime *.jpg 2&gt;/dev/null | awk 'BEGIN { FS = "\n" ; RS = "" }
$2 { sub(":$", "", $1)
  gsub("[^0-9]", "", $2)
  print "touch -c -t", substr($2, 1, 12) "." substr($2, 13, 2),
    "\"" $1 "\"" }'
touch -c -t 202605081547.43 "20260508_154743.jpg"
touch -c -t 202605081550.44 "20260508_155044.jpg"
touch -c -t 201701242314.04 "amusing-sign.jpg"
touch -c -t 201501010002.19 "dscf3011.jpg"
$ 
</pre>

<p>
I would imagine that there's some photo management program out there that I could have used to accomplish this. But then I would have had to locate it, verify that it wasn't some malware-loaded garbage, download, and install it. And chances are it would want to take over all the photos on my laptop. Instead, with standard UNIX tools and shell capabilities like <code>
if</code>
, <code>
case</code>
, process substitution, and pipelines, I was able to complete the task without having to install anything.</p>

<p>
The techniques I described can be used in different circumstances and with the output of different utilities. My intention was not just to explain how to solve this specific problem, but to hopefully teach you some things that you can apply in many situations. Perhaps if you use them to tackle a challenge of your own, you'll record an episode for HPR to share what you know.</p>


<p><a href="https://hackerpublicradio.org/eps/hpr4697/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Tue, 04 Aug 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4697/hpr4697.ogg"
         length="8924298"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4696/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4696/index.html</link>
         <title>HPR4696: HPR Community News for July 2026</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Explicit by the host.</p>
<h2>New hosts</h2> <p> There were no new hosts this month. </p>  <h2>Last Month's Shows</h2>  <table id="t01"> <tr> <th>Id</th> <th>Day</th> <th>Date</th> <th>Title</th> <th>Host</th> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4673/index.html" target="_blank">4673</a></strong></td> <td>Wed</td> <td class="shrink">2026-07-01</td> <td><a href="https://hackerpublicradio.org/eps/hpr4673/index.html" target="_blank">First contact conversation</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0318.html" target="_blank">Archer72</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4674/index.html" target="_blank">4674</a></strong></td> <td>Thu</td> <td class="shrink">2026-07-02</td> <td><a href="https://hackerpublicradio.org/eps/hpr4674/index.html" target="_blank">Audiobooks</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0198.html" target="_blank">Ahuka</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4675/index.html" target="_blank">4675</a></strong></td> <td>Fri</td> <td class="shrink">2026-07-03</td> <td><a href="https://hackerpublicradio.org/eps/hpr4675/index.html" target="_blank">Yard Inflatables</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0036.html" target="_blank">operat0r</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4676/index.html" target="_blank">4676</a></strong></td> <td>Mon</td> <td class="shrink">2026-07-06</td> <td><a href="https://hackerpublicradio.org/eps/hpr4676/index.html" target="_blank">HPR Community News for June 2026</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0159.html" target="_blank">HPR Volunteers</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4677/index.html" target="_blank">4677</a></strong></td> <td>Tue</td> <td class="shrink">2026-07-07</td> <td><a href="https://hackerpublicradio.org/eps/hpr4677/index.html" target="_blank">UNIX Curio #10 - Checksums and Hashes</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0459.html" target="_blank">Vance</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4678/index.html" target="_blank">4678</a></strong></td> <td>Wed</td> <td class="shrink">2026-07-08</td> <td><a href="https://hackerpublicradio.org/eps/hpr4678/index.html" target="_blank">High Resolution Elapsed Time in Shell Scripts</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0455.html" target="_blank">Whiskeyjack</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4679/index.html" target="_blank">4679</a></strong></td> <td>Thu</td> <td class="shrink">2026-07-09</td> <td><a href="https://hackerpublicradio.org/eps/hpr4679/index.html" target="_blank">HPR Beer Garden 15 - Double IPA</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0296.html" target="_blank">Kevie</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4680/index.html" target="_blank">4680</a></strong></td> <td>Fri</td> <td class="shrink">2026-07-10</td> <td><a href="https://hackerpublicradio.org/eps/hpr4680/index.html" target="_blank">Robert A. Heinlein: The Future History, Part 2</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0198.html" target="_blank">Ahuka</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4681/index.html" target="_blank">4681</a></strong></td> <td>Mon</td> <td class="shrink">2026-07-13</td> <td><a href="https://hackerpublicradio.org/eps/hpr4681/index.html" target="_blank">My Disabilities</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0441.html" target="_blank">Antoine</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4682/index.html" target="_blank">4682</a></strong></td> <td>Tue</td> <td class="shrink">2026-07-14</td> <td><a href="https://hackerpublicradio.org/eps/hpr4682/index.html" target="_blank">Behind the Keyboard: A Cybersecurity Operator’s Real-World Workflow</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0036.html" target="_blank">operat0r</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4683/index.html" target="_blank">4683</a></strong></td> <td>Wed</td> <td class="shrink">2026-07-15</td> <td><a href="https://hackerpublicradio.org/eps/hpr4683/index.html" target="_blank">Recording the hallway track</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0030.html" target="_blank">Ken Fallon</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4684/index.html" target="_blank">4684</a></strong></td> <td>Thu</td> <td class="shrink">2026-07-16</td> <td><a href="https://hackerpublicradio.org/eps/hpr4684/index.html" target="_blank">Sim Racing on the cheap!</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0036.html" target="_blank">operat0r</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4685/index.html" target="_blank">4685</a></strong></td> <td>Fri</td> <td class="shrink">2026-07-17</td> <td><a href="https://hackerpublicradio.org/eps/hpr4685/index.html" target="_blank">Listening to SSB stations in the early 1980s</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0461.html" target="_blank">Lennart Benschop</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4686/index.html" target="_blank">4686</a></strong></td> <td>Mon</td> <td class="shrink">2026-07-20</td> <td><a href="https://hackerpublicradio.org/eps/hpr4686/index.html" target="_blank">Debugging Security Cameras: Firmware Updates, Python Scripts and Windows Workarounds</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0036.html" target="_blank">operat0r</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4687/index.html" target="_blank">4687</a></strong></td> <td>Tue</td> <td class="shrink">2026-07-21</td> <td><a href="https://hackerpublicradio.org/eps/hpr4687/index.html" target="_blank">UNIX Curio #11 - Merging Files</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0459.html" target="_blank">Vance</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4688/index.html" target="_blank">4688</a></strong></td> <td>Wed</td> <td class="shrink">2026-07-22</td> <td><a href="https://hackerpublicradio.org/eps/hpr4688/index.html" target="_blank">Downloading Podcasts with a Shell Script</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0455.html" target="_blank">Whiskeyjack</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4689/index.html" target="_blank">4689</a></strong></td> <td>Thu</td> <td class="shrink">2026-07-23</td> <td><a href="https://hackerpublicradio.org/eps/hpr4689/index.html" target="_blank">Cheap Yellow Display Project Part 8: Writing the code </a></td> <td><a href="https://hackerpublicradio.org/correspondents/0394.html" target="_blank">Trey</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4690/index.html" target="_blank">4690</a></strong></td> <td>Fri</td> <td class="shrink">2026-07-24</td> <td><a href="https://hackerpublicradio.org/eps/hpr4690/index.html" target="_blank">Playing Civilization V, Part 14</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0198.html" target="_blank">Ahuka</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4691/index.html" target="_blank">4691</a></strong></td> <td>Mon</td> <td class="shrink">2026-07-27</td> <td><a href="https://hackerpublicradio.org/eps/hpr4691/index.html" target="_blank">Viva la Coda</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0403.html" target="_blank">Lee</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4692/index.html" target="_blank">4692</a></strong></td> <td>Tue</td> <td class="shrink">2026-07-28</td> <td><a href="https://hackerpublicradio.org/eps/hpr4692/index.html" target="_blank">Noise Music Tutorial 2: Using Audacity to Make Noise</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0354.html" target="_blank">TheDUDE</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4693/index.html" target="_blank">4693</a></strong></td> <td>Wed</td> <td class="shrink">2026-07-29</td> <td><a href="https://hackerpublicradio.org/eps/hpr4693/index.html" target="_blank">Amateur Radio Field Days</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0318.html" target="_blank">Archer72</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4694/index.html" target="_blank">4694</a></strong></td> <td>Thu</td> <td class="shrink">2026-07-30</td> <td><a href="https://hackerpublicradio.org/eps/hpr4694/index.html" target="_blank">HPR Beer Garden 16 - Belgian Blonde</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0296.html" target="_blank">Kevie</a></td> </tr> <tr> <td><strong><a href="https://hackerpublicradio.org/eps/hpr4695/index.html" target="_blank">4695</a></strong></td> <td>Fri</td> <td class="shrink">2026-07-31</td> <td><a href="https://hackerpublicradio.org/eps/hpr4695/index.html" target="_blank">Try not to buy a phone</a></td> <td><a href="https://hackerpublicradio.org/correspondents/0036.html" target="_blank">operat0r</a></td> </tr> </table>  <h2>Comments this month</h2>  <h3>Past shows</h3> <ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4644/index.html#comments" target="_blank">hpr4644</a></strong> (2026-05-21) "<em>Response to comments on HPR4424: Newsboat...</em>" by <a href="https://hackerpublicradio.org/correspondents/0318.html" target="_blank">Archer72</a>.<br /></li> <ul> <li style="display: inline;"><strong>Archer72</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4644/index.html#comment_4779" target="_blank">Ken on Community Show HPR4676</a></em>" (2026-07-06 13:48:39)<br /></li> <li style="display: inline;"><strong>Ken Fallon</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4644/index.html#comment_4780" target="_blank">hpr3962 :: It's your data</a></em>" (2026-07-06 15:07:47)<br /></li> </ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4669/index.html#comments" target="_blank">hpr4669</a></strong> (2026-06-25) "<em>HPR Beer Garden 14 - Super Strong Lager</em>" by <a href="https://hackerpublicradio.org/correspondents/0296.html" target="_blank">Kevie</a>.<br /></li> <ul> <li style="display: inline;"><strong>The_Dud3</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4669/index.html#comment_4789" target="_blank">Favorite Malt Liquores/Super Strong Lagers</a></em>" (2026-07-22 02:07:59)<br /></li> </ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4672/index.html#comments" target="_blank">hpr4672</a></strong> (2026-06-30) "<em>Hey Mum, I'm on Spotify ! </em>" by <a href="https://hackerpublicradio.org/correspondents/0030.html" target="_blank">Ken Fallon</a>.<br /></li> <ul> <li style="display: inline;"><strong>Archer72</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4672/index.html#comment_4782" target="_blank">Another great show!</a></em>" (2026-07-08 09:46:44)<br /></li> </ul> </ul> <h3>This month's shows</h3> <ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4674/index.html#comments" target="_blank">hpr4674</a></strong> (2026-07-02) "<em>Audiobooks</em>" by <a href="https://hackerpublicradio.org/correspondents/0198.html" target="_blank">Ahuka</a>.<br /></li> <ul> <li style="display: inline;"><strong>The Librarian</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4674/index.html#comment_4778" target="_blank">Ook ?</a></em>" (2026-07-02 10:50:38)<br /></li> </ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4677/index.html#comments" target="_blank">hpr4677</a></strong> (2026-07-07) "<em>UNIX Curio #10 - Checksums and Hashes</em>" by <a href="https://hackerpublicradio.org/correspondents/0459.html" target="_blank">Vance</a>.<br /></li> <ul> <li style="display: inline;"><strong>xmanmonk</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4677/index.html#comment_4781" target="_blank">Another great show</a></em>" (2026-07-07 21:17:41)<br /></li> <li style="display: inline;"><strong>candycanearter07</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4677/index.html#comment_4783" target="_blank">cool show :D</a></em>" (2026-07-08 11:32:04)<br /></li> <li style="display: inline;"><strong>Vance</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4677/index.html#comment_4784" target="_blank">Thanks, and systemd as a future topic</a></em>" (2026-07-09 01:50:23)<br /></li> <li style="display: inline;"><strong>Vance</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4677/index.html#comment_4787" target="_blank">Sorry, xmanmonk</a></em>" (2026-07-12 03:20:02)<br /></li> </ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4678/index.html#comments" target="_blank">hpr4678</a></strong> (2026-07-08) "<em>High Resolution Elapsed Time in Shell Scripts</em>" by <a href="https://hackerpublicradio.org/correspondents/0455.html" target="_blank">Whiskeyjack</a>.<br /></li> <ul> <li style="display: inline;"><strong>candycanearter07</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4678/index.html#comment_4785" target="_blank">cool ep</a></em>" (2026-07-09 14:38:32)<br /></li> <li style="display: inline;"><strong>Whiskeyjack</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4678/index.html#comment_4786" target="_blank">Reply to candycanearter07 on HPR4678</a></em>" (2026-07-09 22:48:47)<br /></li> </ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4681/index.html#comments" target="_blank">hpr4681</a></strong> (2026-07-13) "<em>My Disabilities</em>" by <a href="https://hackerpublicradio.org/correspondents/0441.html" target="_blank">Antoine</a>.<br /></li> <ul> <li style="display: inline;"><strong>Archer72</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4681/index.html#comment_4790" target="_blank">Reading</a></em>" (2026-07-22 13:43:46)<br /></li> </ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4684/index.html#comments" target="_blank">hpr4684</a></strong> (2026-07-16) "<em>Sim Racing on the cheap!</em>" by <a href="https://hackerpublicradio.org/correspondents/0036.html" target="_blank">operat0r</a>.<br /></li> <ul> <li style="display: inline;"><strong>Jim DeVore </strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4684/index.html#comment_4793" target="_blank">Great episode!</a></em>" (2026-07-28 03:43:23)<br /></li> </ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4685/index.html#comments" target="_blank">hpr4685</a></strong> (2026-07-17) "<em>Listening to SSB stations in the early 1980s</em>" by <a href="https://hackerpublicradio.org/correspondents/0461.html" target="_blank">Lennart Benschop</a>.<br /></li> <ul> <li style="display: inline;"><strong>Lucinda</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4685/index.html#comment_4788" target="_blank">Thank you</a></em>" (2026-07-21 10:53:42)<br /></li> </ul> <li><strong><a href="https://hackerpublicradio.org/eps/hpr4688/index.html#comments" target="_blank">hpr4688</a></strong> (2026-07-22) "<em>Downloading Podcasts with a Shell Script</em>" by <a href="https://hackerpublicradio.org/correspondents/0455.html" target="_blank">Whiskeyjack</a>.<br /></li> <ul> <li style="display: inline;"><strong>candycanearter07</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4688/index.html#comment_4791" target="_blank">cool solution</a></em>" (2026-07-22 23:14:22)<br /></li> <li style="display: inline;"><strong>Whiskeyjack</strong> said: "<em><a href="https://hackerpublicradio.org/eps/hpr4688/index.html#comment_4792" target="_blank">Response to candycanearter07 in HPR4688</a></em>" (2026-07-23 19:14:55)<br /></li> </ul> </ul> <h2>Mailing List discussions</h2> <p>Policy decisions surrounding HPR are taken by the community as a whole. This discussion takes place on the <a href="https://lists.hackerpublicradio.com/mailman/listinfo/hpr" target="_blank">Mailing List</a> which is open to all HPR listeners and contributors. The discussions are open and available on the HPR server under <a href="https://lists.hackerpublicradio.com/pipermail/hpr">Mailman</a>. </p> <p>The threaded discussions this month can be found here:</p> <a href="https://lists.hackerpublicradio.com/pipermail/hpr/2026-July/thread.html" target="_blank">https://lists.hackerpublicradio.com/pipermail/hpr/2026-July/thread.html</a>  <h2>Events Calendar</h2> <p>With the kind permission of <strong>LWN.net</strong> we are linking to <a href="https://lwn.net/Calendar/" target="_blank">The LWN.net Community Calendar</a>.</p> <p>Quoting the site:</p> <blockquote>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.</blockquote> <!-- HPRCN:month=2026-07,latest_comment=4793,latest_host=461,latest_episode=4695 --><p><a href="https://hackerpublicradio.org/eps/hpr4696/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Mon, 03 Aug 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4696/hpr4696.ogg"
         length="34464526"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4695/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4695/index.html</link>
         <title>HPR4695: Try not to buy a phone</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Clean by the host.</p>

<p>
IDEAS:</p>

<ol>

<li>
 Using a cheap phone plan with SMS for authentication.</li>

<li>
 Mighty Text as a free SMS solution.</li>

<li>
 Google VoIP number for shared accounts.</li>

<li>
 Issues with SMS verification blocking VoIP numbers.</li>

<li>
 Avoiding carrier-specific number blocks.</li>

<li>
 Multiple SIM cards for cost-effective SMS.</li>

<li>
 Rooting a phone to manage apps.</li>

<li>
 Security concerns with third-party apps.</li>

<li>
 Limited data usage for minimal phone plans.</li>

<li>
 Challenges with app compatibility on rooted devices.</li>

<li>
 Short-term phone solutions for SMS needs.</li>

<li>
 Shared Google accounts for streamlined access.</li>

<li>
 Avoiding premium SMS services like $15/month plans.</li>

<li>
 Using Wi-Fi for data instead of cellular plans.</li>

<li>
 Importance of SMS for MFA (multi-factor authentication).</li>

<li>
 Transitioning from old phones to new setups.</li>

<li>
 Balancing convenience and cost in phone plans.</li>

<li>
 Reliance on SMS for banking and insurance access.</li>

<li>
 Difficulty finding non-blocked SMS verification options.</li>

<li>
 Preference for minimal, low-cost phone solutions.</li>

</ol>

<p>

</p>

<p>
RECOMMENDATIONS:</p>

<ol>

<li>
 Use a shared Google account for SMS access.</li>

<li>
 Opt for a cheap phone plan with unlimited texting.</li>

<li>
 Try Mighty Text as a free SMS alternative.</li>

<li>
 Avoid premium SMS services with high fees.</li>

<li>
 Use Wi-Fi instead of cellular data for minimal plans.</li>

<li>
 Choose carrier numbers over VoIP for critical services.</li>

<li>
 Root a device to manage app settings.</li>

<li>
 Test SMS compatibility with banks and providers.</li>

<li>
 Consider multiple SIM cards for redundancy.</li>

<li>
 Prioritize SMS for MFA over other verification methods.</li>

<li>
 Monitor app updates for compatibility with rooted devices.</li>

<li>
 Select phones with flexible data plans.</li>

<li>
 Use downloaded content instead of streaming.</li>

<li>
 Check for SMS blockages with new services.</li>

<li>
 Explore low-cost phone options for minimal use.</li>

<li>
 Maintain backup SMS methods for emergencies.</li>

<li>
 Simplify phone setups to reduce costs.</li>

<li>
 Verify SMS support before switching providers.</li>

<li>
 Combine Wi-Fi and SMS for reliable connectivity.</li>

<li>
 Share accounts to streamline digital access.</li>

</ol>

<p>

</p>


<p><a href="https://hackerpublicradio.org/eps/hpr4695/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Fri, 31 Jul 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4695/hpr4695.ogg"
         length="7585940"
         type="audio/ogg"
         />
      </item>
      
      <item>
         <guid>https://hackerpublicradio.org/eps/hpr4694/index.html</guid>
         <link>https://hackerpublicradio.org/eps/hpr4694/index.html</link>
         <title>HPR4694: HPR Beer Garden 16 - Belgian Blonde</title>
         <description>
            <![CDATA[
            <p>This show has been flagged as Clean by the host.</p>

<p>
Dave and Kevie are back with another HPR Beer Garden and this time they turn their attention to Belgian Blonde Ales. Kevie samples <a href="https://www.leffe.com/beer?name=leffe-blonde" rel="noopener noreferrer" target="_blank">
Leffe Blonde</a>
, whilst Dave opts for <a href="https://chouffe.com/en-gb/our-beer/la-chouffe" rel="noopener noreferrer" target="_blank">
La Chouffe</a>
.</p>

<p>

</p>

<p>

<a href="http://hackerpublicradio.org/hpr4694_image_1.png">
<img src="http://hackerpublicradio.org/hpr4694_image_1_tn.png" />
</a>

</p>

<p>

</p>

<p>
Connect with the guys on Untappd:</p>

<p>

</p>

<ul>

<li>

<a href="https://untappd.com/user/thelovebug" rel="noopener noreferrer" target="_blank">
Dave</a>

</li>

<li>

<a href="https://untappd.com/user/kevie49" rel="noopener noreferrer" target="_blank">
Kevie</a>

</li>

</ul>

<p>

</p>

<p>
The intro sounds for the show are used from:</p>

<p>

</p>

<ul>

<li>

<a href="https://freesound.org/people/mixtus/sounds/329806/" rel="noopener noreferrer" target="_blank">
https://freesound.org/people/mixtus/sounds/329806/</a>

</li>

<li>

<a href="https://freesound.org/people/j1987/sounds/123003/" rel="noopener noreferrer" target="_blank">
https://freesound.org/people/j1987/sounds/123003/</a>

</li>

<li>

<a href="https://freesound.org/people/greatsoundstube/sounds/628437/" rel="noopener noreferrer" target="_blank">
https://freesound.org/people/greatsoundstube/sounds/628437/</a>

</li>

</ul>

<p>

</p>

<p>
The next 3 beer styles to be reviewed:</p>

<p>

</p>

<ul>

<li>
DDH IPA</li>

<li>
Amber Ale</li>

<li>
Lager</li>

</ul>

<p>

</p>

<p>

</p>


<p><a href="https://hackerpublicradio.org/eps/hpr4694/index.html#comments">Provide <strong>feedback</strong> on this episode</a>.</p>
            ]]>
            </description>
         <pubDate>Thu, 30 Jul 2026 01:00:00 -0500</pubDate>
         <enclosure 
         url="https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4694/hpr4694.ogg"
         length="22429708"
         type="audio/ogg"
         />
      </item>
      
  </channel>
</rss>