Wrapping Up the Lewis & Clark Trail

More from the trip: A Lewis & Clark POTA Journey | On The Trail | West Over Lemhi Pass | Arrived at the Pacific Ocean Joyce/K0JJW and I have wrapped up our trip along the Lewis and Clark National Historic Trail. We started at the Gateway Arch in St. Louis on September 5th and ended ... Read more

The post Wrapping Up the Lewis & Clark Trail appeared first on Above Average Terrain.


Bob Witte, KØNR, is a regular contributor to AmateurRadio.com and writes from Colorado, USA. Contact him at [email protected].

The Google gadget is back and running

 


It seems Google has finally gotten around to fixing its Blogs I Follow gadget! The original issue was that it had completely stopped updating. You can read my previous post to see the workaround I used while waiting for the folks at Google to address the problem.

Below is the code I used to bring back the official Blogs I Follow gadget while hiding the temporary HTML/JavaScript fix.

To keep things organized, I saved both code snippets in OpenOffice. That way, if Google's gadget ever breaks again, it’s a quick copy and paste to deploy the temporary fix, and another simple copy and paste to switch back once it's resolved.

Note: The only change you will need to make is replacing my followed blog URLs with your own. I detailed step-by-step instructions on how to do this in the post linked above. Also you do this at your own risk. 


 HTML

<div style="display: none;">

  <div id="blogger-bloglist-feed">
    <p style="font-size: 0.9em; color: #ffffff; margin: 0;">Loading blog updates...</p>
  </div>

  <style>
    .bloglist-item {
      margin-bottom: 14px !important;
      padding-bottom: 10px !important;
      border-bottom: 1px dashed rgba(255, 255, 255, 0.3) !important;
      font-family: inherit !important;
    }
    /* Blog Name */
    .bloglist-name {
      display: block !important;
      font-size: 1.05em !important;
      font-weight: bold !important;
      color: #ffffff !important;
      margin-bottom: 4px !important;
      line-height: 1.3 !important;
    }
    /* Article Post Title Link */
    a.bloglist-link,
    a.bloglist-link:visited {
      display: block !important;
      font-size: 1.0em !important;
      font-weight: normal !important;
      color: #ffffff !important;
      text-decoration: none !important;
      line-height: 1.3 !important;
    }
    a.bloglist-link:hover {
      text-decoration: underline !important;
    }
    /* Updated Date */
    .bloglist-date {
      font-size: 0.85em !important;
      color: #ffffff !important;
      margin-top: 3px !important;
      display: block !important;
      opacity: 0.9 !important;
    }
  </style>

  <script>
    (function() {
      var followedFeeds = [
        "http://ae5x.blogspot.com/feeds/posts/default",
        "https://www.kb6nu.com/feed/",
        "http://w2lj.blogspot.com/feeds/posts/default",
        "http://pa1b-qrp.blogspot.com/feeds/posts/default",
        "https://ve7sar.blogspot.com/feeds/posts/default",
        "https://swling.com/blog/feed/",
        "https://www.arrl.org/arrl.rss",
        "http://ve3clq.blogspot.com/feeds/posts/default",
        "https://wb3gck.com/feed/",
        "https://tommcquiggan.blogspot.com/feeds/posts/default",
        "http://ve3vn.blogspot.com/feeds/posts/default",
        "https://ke9v.net/feed.xml",
        "https://kg3v.com/feed/",
        "http://offgridham.com/feed/",
        "http://pe4bas.blogspot.com/feeds/posts/default",
        "https://qrper.com/feed/",
        "https://www.amateurradio.com/feed/",
        "https://k9zw.wordpress.com/feed/"
      ];

      var container = document.getElementById("blogger-bloglist-feed");
      var loadedCount = 0;
      var items = [];

      // Helper function to fetch feeds that rss2json fails to parse
      async function fetchXmlFallback(feedUrl) {
        try {
          var proxyUrl = "https://api.allorigins.win/get?url=" + encodeURIComponent(feedUrl);
          var res = await fetch(proxyUrl);
          var data = await res.json();
          if (!data.contents) return null;
          
          var parser = new DOMParser();
          var xmlDoc = parser.parseFromString(data.contents, "text/xml");
          var item = xmlDoc.querySelector("item") || xmlDoc.querySelector("entry");
          if (!item) return null;
          
          var title = item.querySelector("title") ? item.querySelector("title").textContent : "Untitled";
          var link = item.querySelector("link") ? item.querySelector("link").textContent : "#";
          
          if (!link || link.trim() === "") {
            link = item.querySelector("link") ? item.querySelector("link").getAttribute("href") : "#";
          }
          
          var dateStr = item.querySelector("pubDate") ? item.querySelector("pubDate").textContent :
                        (item.querySelector("published") ? item.querySelector("published").textContent :
                        (item.querySelector("updated") ? item.querySelector("updated").textContent : ""));
                        
          var blogTitle = (xmlDoc.querySelector("channel > title") ? xmlDoc.querySelector("channel > title").textContent :
                          (xmlDoc.querySelector("feed > title") ? xmlDoc.querySelector("feed > title").textContent : "Blog"));
                          
          var pubDateObj = new Date(dateStr);
          return {
            blogTitle: blogTitle,
            title: title,
            link: link,
            date: pubDateObj,
            dateStr: isNaN(pubDateObj) ? "" : pubDateObj.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })
          };
        } catch (e) {
          return null;
        }
      }

      followedFeeds.forEach(function(feedUrl) {
        var apiUrl = "https://api.rss2json.com/v1/api.json?rss_url=" + encodeURIComponent(feedUrl);
        fetch(apiUrl)
          .then(function(res) { return res.json(); })
          .then(async function(data) {
            if (data.status === "ok" && data.items && data.items.length > 0) {
              var blogTitle = data.feed.title || "Blog";
              var latestPost = data.items[0];
              var pubDateObj = new Date(latestPost.pubDate);
              items.push({
                blogTitle: blogTitle,
                title: latestPost.title,
                link: latestPost.link,
                date: pubDateObj,
                dateStr: isNaN(pubDateObj) ? "" : pubDateObj.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })
              });
            } else {
              var fallbackItem = await fetchXmlFallback(feedUrl);
              if (fallbackItem) items.push(fallbackItem);
            }
          })
          .catch(async function(err) {
            var fallbackItem = await fetchXmlFallback(feedUrl);
            if (fallbackItem) items.push(fallbackItem);
          })
          .finally(function() {
            loadedCount++;
            if (loadedCount === followedFeeds.length) {
              if (items.length > 0) {
                items.sort(function(a, b) { return b.date - a.date; });
                var htmlBuffer = "";
                items.forEach(function(item) {
                  htmlBuffer += '<div class="bloglist-item">';
                  htmlBuffer += '<span class="bloglist-name">' + item.blogTitle + '</span>';
                  htmlBuffer += '<a class="bloglist-link" href="' + item.link + '" target="_blank" rel="noopener">' + item.title + '</a>';
                  if (item.dateStr) {
                    htmlBuffer += '<span class="bloglist-date">Updated: ' + item.dateStr + '</span>';
                  }
                  htmlBuffer += '</div>';
                });
                container.innerHTML = htmlBuffer;
              } else {
                container.innerHTML = "<p style='font-size:0.85em; color: #ffffff;'>No recent updates available.</p>";
              }
            }
          });
      });
    })();
  </script>

</div>


Mike Weir, VE9KK, is a regular contributor to AmateurRadio.com and writes from New Brunswick, Canada. Contact him at [email protected].

The Google gadget is back and running

 


It seems Google has finally gotten around to fixing its Blogs I Follow gadget! The original issue was that it had completely stopped updating. You can read my previous post to see the workaround I used while waiting for the folks at Google to address the problem.

Below is the code I used to bring back the official Blogs I Follow gadget while hiding the temporary HTML/JavaScript fix.

To keep things organized, I saved both code snippets in OpenOffice. That way, if Google's gadget ever breaks again, it’s a quick copy and paste to deploy the temporary fix, and another simple copy and paste to switch back once it's resolved.

Note: The only change you will need to make is replacing my followed blog URLs with your own. I detailed step-by-step instructions on how to do this in the post linked above. Also you do this at your own risk. 


 HTML

<div style="display: none;">

  <div id="blogger-bloglist-feed">
    <p style="font-size: 0.9em; color: #ffffff; margin: 0;">Loading blog updates...</p>
  </div>

  <style>
    .bloglist-item {
      margin-bottom: 14px !important;
      padding-bottom: 10px !important;
      border-bottom: 1px dashed rgba(255, 255, 255, 0.3) !important;
      font-family: inherit !important;
    }
    /* Blog Name */
    .bloglist-name {
      display: block !important;
      font-size: 1.05em !important;
      font-weight: bold !important;
      color: #ffffff !important;
      margin-bottom: 4px !important;
      line-height: 1.3 !important;
    }
    /* Article Post Title Link */
    a.bloglist-link,
    a.bloglist-link:visited {
      display: block !important;
      font-size: 1.0em !important;
      font-weight: normal !important;
      color: #ffffff !important;
      text-decoration: none !important;
      line-height: 1.3 !important;
    }
    a.bloglist-link:hover {
      text-decoration: underline !important;
    }
    /* Updated Date */
    .bloglist-date {
      font-size: 0.85em !important;
      color: #ffffff !important;
      margin-top: 3px !important;
      display: block !important;
      opacity: 0.9 !important;
    }
  </style>

  <script>
    (function() {
      var followedFeeds = [
        "http://ae5x.blogspot.com/feeds/posts/default",
        "https://www.kb6nu.com/feed/",
        "http://w2lj.blogspot.com/feeds/posts/default",
        "http://pa1b-qrp.blogspot.com/feeds/posts/default",
        "https://ve7sar.blogspot.com/feeds/posts/default",
        "https://swling.com/blog/feed/",
        "https://www.arrl.org/arrl.rss",
        "http://ve3clq.blogspot.com/feeds/posts/default",
        "https://wb3gck.com/feed/",
        "https://tommcquiggan.blogspot.com/feeds/posts/default",
        "http://ve3vn.blogspot.com/feeds/posts/default",
        "https://ke9v.net/feed.xml",
        "https://kg3v.com/feed/",
        "http://offgridham.com/feed/",
        "http://pe4bas.blogspot.com/feeds/posts/default",
        "https://qrper.com/feed/",
        "https://www.amateurradio.com/feed/",
        "https://k9zw.wordpress.com/feed/"
      ];

      var container = document.getElementById("blogger-bloglist-feed");
      var loadedCount = 0;
      var items = [];

      // Helper function to fetch feeds that rss2json fails to parse
      async function fetchXmlFallback(feedUrl) {
        try {
          var proxyUrl = "https://api.allorigins.win/get?url=" + encodeURIComponent(feedUrl);
          var res = await fetch(proxyUrl);
          var data = await res.json();
          if (!data.contents) return null;
          
          var parser = new DOMParser();
          var xmlDoc = parser.parseFromString(data.contents, "text/xml");
          var item = xmlDoc.querySelector("item") || xmlDoc.querySelector("entry");
          if (!item) return null;
          
          var title = item.querySelector("title") ? item.querySelector("title").textContent : "Untitled";
          var link = item.querySelector("link") ? item.querySelector("link").textContent : "#";
          
          if (!link || link.trim() === "") {
            link = item.querySelector("link") ? item.querySelector("link").getAttribute("href") : "#";
          }
          
          var dateStr = item.querySelector("pubDate") ? item.querySelector("pubDate").textContent :
                        (item.querySelector("published") ? item.querySelector("published").textContent :
                        (item.querySelector("updated") ? item.querySelector("updated").textContent : ""));
                        
          var blogTitle = (xmlDoc.querySelector("channel > title") ? xmlDoc.querySelector("channel > title").textContent :
                          (xmlDoc.querySelector("feed > title") ? xmlDoc.querySelector("feed > title").textContent : "Blog"));
                          
          var pubDateObj = new Date(dateStr);
          return {
            blogTitle: blogTitle,
            title: title,
            link: link,
            date: pubDateObj,
            dateStr: isNaN(pubDateObj) ? "" : pubDateObj.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })
          };
        } catch (e) {
          return null;
        }
      }

      followedFeeds.forEach(function(feedUrl) {
        var apiUrl = "https://api.rss2json.com/v1/api.json?rss_url=" + encodeURIComponent(feedUrl);
        fetch(apiUrl)
          .then(function(res) { return res.json(); })
          .then(async function(data) {
            if (data.status === "ok" && data.items && data.items.length > 0) {
              var blogTitle = data.feed.title || "Blog";
              var latestPost = data.items[0];
              var pubDateObj = new Date(latestPost.pubDate);
              items.push({
                blogTitle: blogTitle,
                title: latestPost.title,
                link: latestPost.link,
                date: pubDateObj,
                dateStr: isNaN(pubDateObj) ? "" : pubDateObj.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })
              });
            } else {
              var fallbackItem = await fetchXmlFallback(feedUrl);
              if (fallbackItem) items.push(fallbackItem);
            }
          })
          .catch(async function(err) {
            var fallbackItem = await fetchXmlFallback(feedUrl);
            if (fallbackItem) items.push(fallbackItem);
          })
          .finally(function() {
            loadedCount++;
            if (loadedCount === followedFeeds.length) {
              if (items.length > 0) {
                items.sort(function(a, b) { return b.date - a.date; });
                var htmlBuffer = "";
                items.forEach(function(item) {
                  htmlBuffer += '<div class="bloglist-item">';
                  htmlBuffer += '<span class="bloglist-name">' + item.blogTitle + '</span>';
                  htmlBuffer += '<a class="bloglist-link" href="' + item.link + '" target="_blank" rel="noopener">' + item.title + '</a>';
                  if (item.dateStr) {
                    htmlBuffer += '<span class="bloglist-date">Updated: ' + item.dateStr + '</span>';
                  }
                  htmlBuffer += '</div>';
                });
                container.innerHTML = htmlBuffer;
              } else {
                container.innerHTML = "<p style='font-size:0.85em; color: #ffffff;'>No recent updates available.</p>";
              }
            }
          });
      });
    })();
  </script>

</div>


Mike Weir, VE9KK, is a regular contributor to AmateurRadio.com and writes from New Brunswick, Canada. Contact him at [email protected].

Arrived at the Pacific Ocean

We continued on our trip following the Lewis and Clark National Historical Trail, crossing Idaho into Washington and Oregon. And, yes, we arrived at the Pacific Ocean, near Astoria, OR, completing our adventure, in 24 days, driving 3725 miles. More on that in a future post. This section of the trip started out by going ... Read more

The post Arrived at the Pacific Ocean appeared first on Above Average Terrain.


Bob Witte, KØNR, is a regular contributor to AmateurRadio.com and writes from Colorado, USA. Contact him at [email protected].

Enter to win an Icom ID-5200 in our 21st Anniversary Contest.

Get all the details here.
Contest


George Thomas, W5JDX, is co-host of AmateurLogic.TV, an original amateur radio video program hosted by George Thomas (W5JDX), Tommy Martin (N5ZNO), Peter Berrett (VK3PB), and Emile Diodene (KE5QKR). Contact him at [email protected].

The ARDC wants you




 Applications are open Sept. 15 – Oct. 30, 2026.

ARDC is now accepting applications for our 2027 volunteer cohort. We’re looking for qualified individuals to contribute their time and expertise across several committees and teams:

How To Apply

Interested in applying? Please complete our application form by October 30, 2026: https://forms.gle/sWBt8TZdKc3VgNgA9. Please also be prepared with a PDF file of your resume or CV.

Alternatively, you can send a message to [email protected] with the requested application information.

We plan to make our final decisions by December 2026, with meetings beginning mid-January 2027.

Eligibility

An amateur radio license OR a technical degree OR experience in digital communications is required to serve in any volunteer role.

Some roles may benefit from the following skills and experience:

  • GAC, GET, and GCT – experience in K-12 education, university academics, research and development, and/or with nonprofits.
  • GCT – writing experience is preferred, especially in scientific communications. Experience with web archiving is also of interest.
  • TAC – experience using 44Net, as well as networking, development, internet regulatory matters, and/or related technologies.

We are always interested in volunteers who are located outside of the United States! A good command of the English language is important, and don’t let time zones deter you from applying. Our team works across multiple time zones, and we encourage interested volunteers from across the globe to apply.

Current and prospective grantees are also encouraged to apply. If you are involved in or could have a conflict of interest with a grant under discussion, you can simply recuse yourself from that particular vote or conversation. This allows you to contribute your time and expertise while helping ensure that our processes remain fair and transparent.

Terms, Time Commitment & Meetings

All five groups serve one-year terms that run from January through December, with a maximum of four consecutive terms.

Time commitments vary by committee and include both meetings and independent work:

  • GAC – meets once a week for an hour, plus 3-6 hours a week for independent proposal review.
  • TAC – meets once a month for an hour.
  • GET – at the beginning of the year, this team meets once every two weeks for an hour, plus about 2-3 hours biweekly of independent work. After a few months, this is reduced to meeting once a month for an hour, with 2-4 hours of independent work ahead of each meeting.
  • GCT – meets once every two weeks for an hour, plus 1-2 hours biweekly of independent work.

The time commitment for the CRC, which supports enforcement of our Code of Conduct, is anticipated to be very low. Because of this, CRC members must also participate in another ARDC volunteer activity. Applicants can indicate their interest in serving on the CRC when applying. We may also ask a small number of volunteers selected for another 2027 role to serve jointly on the CRC.

Additional Information

Questions about volunteering or the application process? Please reach out to [email protected]. Thank you for considering volunteering your time and expertise to support ARDC’s mission and vision. We look forward to receiving your application!

~




LHS Episode #632: 44Net Connect with John Burwell KI5QKX

Show Notes

Featured Topic:

Announcements & Feedback:

  • Announcements:
    • Support the show!  
      • Support us via Patreon, Paypal, Merch, Sharing the Podcast via Social Media, and Rating Us in your Podcast Application! Your support allows us to continue to pay to host and produce the 18 years of the podcast and participate in person at Hamvention!  We have $2/$5/$10 monthly subscriptions via Patreon (https://www.patreon.com/cw/lhspodcast) or you can set up to send us a recurring payment ($2/$5/$10 monthly or $20 yearly) via PayPal ([email protected])
    • It’s (almost) our birthday!
      • The very first episode of LHS dropped on October 7, 2008.  Cheryl has been here from the beginning, silent until the episodes in the early 100’s (I was too busy chicken herding with Russ and Richard - then I got unceremoniously and unexpectedly popped into my current spot starting with episode #606) and Bill joined us on episode #168!  464 episodes as of tonight… he’s been a trooper!  I think we’re going to turn our early October 5th episode (NOTE:  We are not recording on Sunday, October 4th!) into a Birthday Party Episode!  Mark your calendar and make plans to join us!
    • Come hang out with us on Minecraft!
      • It’s been ages since we reminded folks about this, but… in case you missed it, we have 2 Minecraft Servers, and we’d love to have you join us.  And, to whoever left me the sign letting me know about the Creeper that blew up our train station… thanks!!  I think I’ve gotten the damage MOSTLY fixed! Connect with us to get you whitelisted
        • minecraft.lhspodcast.info
        • minecraft.bluecows.com
    • We need your feedback!
      • Comments, Questions, Show Topic Ideas! Go ahead and send us hate mail, too… we get bored and need something to read and comment on!  Email us at [email protected]
    • Memorial Service for Russ, K5TUX
      • There will be a memorial service held for Russ at our home in Mt. Vernon, Missouri on November 1, 2026.  Everyone is welcome!  If you’d like to join us, please send an email to [email protected] and we’ll send you more info!
      • Facebook event page: https://lhs.fyi/mem

Subscribers & Supporters:

  • Paid Patreon
    • Rodney Norris
  • Facebook
    • Siegrist Peter
  • Discord
    • Bob (VK1ED)
    • cornergrove
    • jmbwell73
  • Live Show Participants
    • Dan - KB6NU

Russ Woodman, K5TUX, co-hosts the Linux in the Ham Shack podcast which is available for download in both MP3 and OGG audio format. Contact him at [email protected].

Subscribe FREE to AmateurRadio.com's
Amateur Radio Newsletter

 
We never share your e-mail address.


Do you like to write?
Interesting project to share?
Helpful tips and ideas for other hams?

Submit an article and we will review it for publication on AmateurRadio.com!

Have a ham radio product or service?
Consider advertising on our site.

Are you a reporter covering ham radio?
Find ham radio experts for your story.

How to Set Up a Ham Radio Blog
Get started in less than 15 minutes!


  • Matt W1MST, Managing Editor