<rss version="2.0">
<channel>
  <title>Chuck Carroll's RSS Feed</title>
  <description>Chuck Carroll's RSS Feed: A place where I complain about technology or dive into quasi-philsophical subjects.</description>
  <link>https://chuck.is</link>
  <lastBuildDate>
    Mon, 10 Aug 2026 21:00 -0800
  </lastBuildDate>
  <ttl>1440</ttl>

   <item>
          <title>Converting FLACs to Opus</title>
          <description>
                  <![CDATA[
<p>I have music collection of over 12,000 tracks. I prefer to actually own my music (ie digital files) and being able to play it on any device I choose rather than using a service like Spotify. That said, I also prefer using <a href="https://www.fsf.org/campaigns/playogg/en/" target="_blank">OGG over MP3</a>, and the majority of my music collection is (currently) in OGG Vorbis format. Over the years, I've been accumulating lossless albums from places like Bandcamp and transcoding them.

<p>Managing my music library comes with it's own set of challenges and mysteries. I've had a recurring issue where audio playback occasionally stutters on my Android phone (and any Android device for that matter, regardless of hardware) when doing OGG Vorbis playback. It's been a multi-year learning process which involved falling down a technical rabbit hole, but I finally figured out what was causing it and what the tedious solution is. 

<p>I learned that OGG Vorbis is an older standard and Android Media Framework does not place nice with it. Opus, on the other hand, is a newer, more modern, and much more efficient at encoding audio quality per bit, so despite being a smaller file, it sounds better. Some of the largest websites utilize Opus, including YouTube. OGG Vorbis uses the file extension ".ogg" whereas Opus uses ".opus" (but still technically uses the OGG container).   

<p><a href="find . -name "*flac" -exec oggenc -q 9 {} \;">A few years ago</a> I published a post, and until recently, I used a command that converts FLAC to Vorbis because I hadn't quite understood audio codecs, believing that bigger files must be better quality.    

<p>Converting FLACs to Opus is similar, but the prereq is that <code>opus-tools</code> must be installed. I have the following command in a script will recursively convert any FLACs in the directory and sub-directores to Opus.  
<pre><code>
find . -iname '*.flac' -print0 | while IFS= read -r -d '' f; do
  opusenc --bitrate 160 "$f" "${f%.*}.opus"
done

</code></pre>

<p>Spending the last few months with my favorite albums using the Opus codec, playback is smooth and functions flawlessly. Now comes the tedious task of going back through my lossless FLAC collection and transcoding them to lossy Opus, making sure the metadata is accurate, and the album artwork is there.

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>

                 ]]>
        </description>
        <link>https://chuck.is/</link>
        <pubDate>Mon, 10 Aug 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title>Why We Believe in the Preposterous</title>
          <description>
                  <![CDATA[

<p>We all have that friend or family member that believes in the most ludicrous things, convinced of a conspiracy that doesn't fit into the reality shared by the rest of us. I don't think an empirical mindset is the default for humans, but is something that's built over time, usually through education (though I wonder how much of our bullshit-detector calibration arrives with us at birth). 

<p>I also don't believe that an empirical mindset is with us at all times. In fact, I'd estimate that we are incredibly fallible beings with no good reasons for thinking and behaving the way we do the majority of the time.  

<p>I don't want to sound like I'm knocking on "gullible people" because every human is capable of all sorts of cognitive errors. Emotions is what makes us human. However, as emotional beings, even the most rational among us are capable of misguided beliefs. We are prone to believing in things without any rational reason. We see agency where none exists, because natural selection favors the paranoid. Evolution selects for those who think "I see a lion in the bush", whether or not the lion is there. The human standing there raising doubts and pondering the philosophical will sometimes be eaten be eaten by that lion thus preventing their genes from proliferating.  

<p>As pattern recognition creatures, connecting random events is something we do naturally, and it gives us the feeling of understanding the world we're in. Pattern recognition is one of our best traits, though it can often be wrong (believing the lion is in the bush, or seeing the face on the surface of Mars).  

<p>We tend to anthropomorphize objects, attributing agency to random events. Conspiracy theories help us make sense of an otherwise incomprehensible world. We feel better believing there's someone behind the curtain, even if that someone is a shadowy government or the Illuminati. It's reassuring knowing someone is in charge because chaos is a scary thought for many of us. 

<p>Conspiracy thinking also makes our our small lives more interesting. Earth is boring, so let's suspend our disbelief and entertain the idea that aliens constructed the pyramids. This reality is far more interesting and fun!

<p>These beliefs are also cheap to hold, because most of them don't impact the believer's actual life. Believing that Zuckerberg is a lizard person is absurd, but it costs you nothing day to day. 

<p>There's also the lack of falsifiability. The absence of evidence becomes evidence of a cover-up. Our pattern matching runs one direction.

<p>You're also more likely to believe in strange things because that's the shared belief of the group you identify with. People process evidence in whatever way protects their standing in a social group they value. Beliefs are membership badges, so abandoning one costs you socially even it doesn't align with the facts. We also commit "Argumentum ad populum", the fallacy that asserts something is true because many people believe it. "Many people believe X, therefore X is true". Surrounding oneself in online communities that share content from a few sources, solidifying the belief, all the while believing it's a common perspective believed by more people than really do. 

<p>These are just a few thoughts after interacting with a couple different people over the past year. 

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
                 ]]>
        </description>
        <link>https://chuck.is/preposterous</link>
        <pubDate>Fri, 7 Aug 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title>How to Pass the CCNA</title>
          <description>
                  <![CDATA[
<p>One of the most challenging things about the CCNA (Cisco Certified Network Associate) exam isn't subnetting, spanning-tree, routing protocols, ACLs, or calculating longest prefix match. The most challenging thing is figuring out what study resources to use. There's a ridiculous amount of CCNA study material available out there and all of them claim to be the best. I spent <a href="https://en.wikipedia.org/wiki/Analysis_paralysis" target="_blank">far too much time</a> trying to find the best and least complicated material. I'd spend time working through a resource and either discover quickly or far too late that the material isn't great. In retrospect I had far better options right under my nose. Some resources are better than others, but it's important to really narrow down and simplify the resources to use and create a study strategy for yourself. I've wasted more time than I care to admit on terrible resources or looking for a shortcut.

<p>I recently took the CCNA exam and passed, but this was my second attempt. I first took it last September (2025). I was trying to get it before I started a new role which required that I have the certification or get it eventually. I already had the CompTIA Network+, CCST (Cisco Certified Support Technician): Networking, and the LFCA (Linux Foundation Certified IT Associate), so I was a bit overconfident going into it. The day before the exam I realized this would likely be more challenging than any cert I've taken, but I had already passed the 24 hour mark and therefore could not reschedule. It was also the day after a major news story and my stupid face was buried in news articles instead of studying.  

<p>After my fail, my CCNA studies were put on the back burner, though I'd do a little studying here and there over the months. I recently ran through my notes and I realized I had been spinning my wheels on the same concepts over and over again because I'd find a new source material and start over. About a month or two after I failed, I got an email from Cisco offering a discount if I wanted to retake the exam, but had to take it before the end of July 2026. I waited until the very end, but I will say that having that hard deadline motivated me pretty hard, especially in the last month leading up to my exam.  

<p>Going through my files post-exam, I had so much junk saved in my CCNA directory like hundreds of Packet Tracer labs, practice tests from many different sources, and video files that I never even touched. All this said, I want to break down what my study resources were. 

<h3>The Exam Topics</h3>
<p>Reviewing the exam topics early on, I felt overwhelmed at the enormous number of topics the CCNA touches on. This sounds obvious, but it never really clicked for me that the Exam Topics literally tell you what's going to be covered on the exam, and it's important to see exactly how Cisco words it. I'd spend too much time researching and labbing on how to do a specific thing in IOS, when really all I needed was to know the fundamentals. <b>Configure and verify</b> are important keywords to know because this indicates it will likely be a lab question.

<p>What I then did was convert the exam topics PDF into an editable text document and from there I began adding sub-bullets with topic explanations and went deeper into the things I'd likely need to know. I also highlighted "Configure and verify" because that meant I needed to lab it. 

<p>For reference, <a href="https://chuck.is/ccna/ccna_Exam_topics.docx">here's the CCNA exam topics with all of my notes</a>. This isn't the final version because I printed it out and added even more details and highlights. However, I highly recommend taking the exam topics and adding your own notes to each topic and sub-topic (I linked my notes as just an example). 


<h3>The CCNA Official Certification Guide + an LLM</h3>
<p>No, I did not read both 3-inch-thick volumes cover to cover, but I did read through certain sections I had trouble grasping. I forked out the cash for this from Cisco Press, and while it did come with a companion website and Wendell Odom's CertSkills website, I ultimately nixed them from my study resources. The content is fine, but there's better quality practice materials out there.  

<p>I also had both volumes in epub format and I uploaded them + the exam topics to a new project with Claude. My instructions were "<i>I have uploaded both volumes of the CCNA OCG. I am going to ask questions pertaining to the CCNA and I want the answers to specifically come from the textbook with chapter and section numbers cited. Do not use any sources other than the files that have been uploaded to this project. I want condensed but accurate responses.</i>" 

<p>This was surprisingly useful. For a period, I did have access to Anthropic's Fable 5 model and I noticed that it was far better at generating practice questions than Opus 4.8. Nonetheless, even with Opus at medium effort was as though I was talking to the actual textbook. Sometimes I'd ask it something and it would straight up tell me it's not in the book and not provide any sort of answer, or it would bounce my question off of the exam topics and let me know that I just need to know the concepts and that I shouldn't expect to do a lab.  

<h3>Boson ExSim</h3>
<p>This was one of my main study materials. It's $100 for a year for access, but if you do some digging you might find a small discount code. They provide 5 exams (370 questions) and it's worth every penny. A few months before my second CCNA attempt, I reviewed my scores from my first attempt and noted what areas I was weakest in (Network Access and IP Connectivity). I was able to create a custom Boson exam that just asked questions from those two subjects. As with any Boson exam I did, I'd take it in simulation mode, then again in study mode so I can see the breakdown of why my answer was wrong.   

<p>As a side note, I'm fairly certain that Boson recycles some of their CCNP questions into their CCNA practice exams. I can say that the real CCNA labs weren't nearly as difficult or have as many tasks as a lot of the Boson ones. When I got my first lab question on the exam, I immediately felt a pang of relief - though challenging, the actual CCNA labs were not nearly as challenging as Boson. 


<h3>A Physical Lab</h3>
<p>If you take your education seriously, invest in a couple old Cisco routers and switches. Not everyone can do this, but you can usually pick up some older FastEthernet hardware on eBay for $20-$30 each, but just make sure it's running (or capable of running) at least IOS 15.X. I managed to get my hands on 4 small form-factor Cisco routers and 4 Cisco small form-factor Switches from a colleague to borrow. All of the gear I had wasn't running the latest IOS XE and each NIC was limited to 100Mbps, but the fundamentals are the same.  

<figure>
	<a href="https://chuck.is/ccna/lab.jpg"><img src="lab.jpg" width=100%></a>
</figure>

<p>With this gear, I would lab out a dozen or so core IOS features in a single build: SSH, DHCP, user accounts, OSPF, VLANs, SVIs, link aggregation, port security, NAT, NTP, and IPv4 (in retrospect, I wish I'd also played around with IPv6). My naming convention for the four networks followed airport codes (e.g. PDX-RTR, SFO-LAN, etc), implementing all of the core features, then I'd tear them down and start over. I did this from beginning to end in it's entirety at least four times. I even connected a couple Android phones via USB-C ethernet NICs into the different networks I built to test that DHCP was working properly and that they were able to ping each other across networks. 

<p>Hands down, labbing was where I learned the most. 

<h3>Practice IP Subnetting Math</h3>
<p>This one isn't very fun, at least until it starts to click. Analyzing existing subnets, determining the first and last host given a IP and subnet, and determining which route a packet will take (longest prefix match) are all things that need to be drilled, especially in the days leading up to the exam. These are tough concepts to grasp - I'd master them one day and immediately forget it the next, but I'm really happy I practiced the day before. 


<h3>Anki Flashcards</h3>
<p>I found some CCNA 200-301 flashcards on the Anki forum and, using Claude, I pulled all the DIKTA (Do I Know This Already?) chapter questions from the books and included a brief description. Admittedly, I didn't come close to running through all of these decks, but I did run through key subjects I knew I was weak in. When I came across a card I thought was too easy (like "What does NAT stand for?"), I'd immediately delete it because there's no point in wasting time on something I'm never going to forget. I didn't have a routine of running through flash cards, but would quiz myself on my phone when I was sitting on the couch or had other moments of free time. It was also helpful to run through them when I was burned out on other study methods. Completing an Anki deck makes you feel like you've at least accomplished <i>something</i> after spending hours banging your head against the wall. 

<p>All of the Anki flashcards I used can be downloaded here:<br>
<a href="https://chuck.is/ccna/CCNA 200-301.apkg">CCNA 200-301 from Anki</a>, <a href="https://chuck.is/ccna/CCNA_Vol1_DIKTA_All_Chapters.apkg">CCNA Vol 1 DIKTA Questions</a>, <a href="https://chuck.is/ccna/CCNA_Vol2_DIKTA_All_Chapters.apkg">CCNA Vol 2 DIKTA Question</a>. 


<h3>Other Resources</h3>
<p>Jeremy's IT Lab videos are a popular resource, and while I did watch several of his videos, I did not watch more than a handful. I originally started with Day 1, but quickly realized there was a lot of stuff I already knew, so I only occasionally watched them to address my weaker areas. I also believe that his videos go way too deep for CCNA material. For example, he has CCNA lab videos that go into how to configure HSRPs, and while this may good to know, you are not asked to configure this per the exam topics. This goes back to just how important the exam topics are for simplifying what and how to study.  

<p>Packet Tracer Final Skills Assessment labs from Cisco Networking Academy. These are officially available if you are in a Cisco Networking Academy program, otherwise they can easily be found online. I went through an official Cisco Networking Academy program that I finished a year and a half ago, but I only redid the SRWE Final lab recently to become more familiar with wireless configuration. There are three: <a href="https://chuck.is/ccna/ITNv7 Final PT Skills Assessment.pka">ITN - Introduction to Networks (CCNA 1)</a>, <a href="https://chuck.is/ccna/SRWE Final PT Skills Assessment.pka">SRWE - Switching, Routing, Wireless Essentials (CCNA 2)</a>, and <a href="https://chuck.is/ccna/ENSA Final PT Skills Assessment-PTSA-Activity.pka">ENSA - Enterprise Networking, Security, and Automation (CCNA 3)</a>. 


<h3>Summary</h3>
<p>This is a lot of text, but that's because I have a lot to say - especially because I spent way too much time spinning my wheels. So to summarize, the resources I used and highly recommend are as follows (1 through 5 are the most important): 
<ol>
	<li>CCNA Exam Topics - What's going to be on the exam is here in plain English. Lab anything that says "Configure and verify".</li>
	<li>CCNA Official Certification Guide coupled with an LLM. Give precise instructions to the LLM and read through sections you need clarity on.</li>
	<li>Boson ExSim - Take a practice test in simulation mode, then again in study mode. Find your weaknesses.</li>
	<li>A physical lab where you can build multiple things from the ground up.</li>
	<li>Subnetting Math - know longest prefix match and first/last host.</li>
	<li>Anki Flashcards for weak areas.</li>
	<li>JITL for weak areas.</li>
	<li>Cisco's Final Skills Assessment Packet Tracer labs.</li> 
</ol>
<p>As with everything in life, keep it simple.
                 ]]>
        </description>
        <link>https://chuck.is/ccna</link>
        <pubDate>Sat, 25 Jul 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title></title>
          <description>
                  <![CDATA[
<p>Reddit is now requiring you to have an account and be logged in to use old.reddit.com, the less cluttered and bloated desktop website. Ars Technica <a href="https://arstechnica.com/gadgets/2026/06/reddit-will-require-you-to-log-in-to-use-old-reddit-com/" target="_blank">has a great article</a> with a breakdown of Reddit's reasoning behind this, but essentially they claim they're worried about scrapers accessing content without paying for it - content, of course, that Reddit didn't even create and yet are monetizing it as much as possible. The scraping can likely be exclusively due to training LLMs and Reddit wants a piece of that. Oddly, you can still access their bloated "www" website without being logged in, at least for now, but man is that a painful experience. 

<p>I deleted my Reddit account around 2021 in an effort to simplify my digital life, to spend less time online, and more specifically spending less time consuming toxic material. My experience with Reddit had become increasingly sour. Seldom did I find useful or interesting content, much less thoughtful comments, and more low-effort rage bait content trying to deliberately get a reaction out of people. Some, if not most, of the dumbest comments I've ever read on the internet have been on reddit. 

<p>The karma upvote/downvote systems reward groupthink over what's accurate or nuance. Especially in the last 10 years, even the most niche subreddit has terminally-online users and moderators trying to advance a political agenda rather than fostering a community around a specific subject. 

<p>Whenever I had to visit the site I exclusively use old.reddit.com (automatically redirected with a Firefox extension). Admittedly, I did occasionally visit subreddits that are filled with toxic content like r/idiotsincars and r/fightporn that I should certainly not visit, so if I completely lose access, it will be a positive benefit for my life.

                 ]]>
        </description>
        <link>https://chuck.is/not-on-reddit</link>
        <pubDate>Thu, 23 Jul 2026 21:00 PST</pubDate>
  </item>

 <item>
          <title>OPNsense on a Palo Alto Firewall Appliance</title>
          <description>
                  <![CDATA[
<figure>
	<a href="https://chuck.is/opnsense/ion2000.jpg"><img src="https://chuck.is/opnsense/ion2000.jpg" width="100%"></a>
</figure>

<p>I picked up a Palo Alto Cloudgenix ION 2000 off of eBay and decided to try and stick OPNsense on it. It has a ethernet ports, 4GB of RAM, 128GB SSD, and an Intel Atom CPU. What I hadn't considered was a lack of any video out on this thing, making it difficult to load a different OS. After some searching, I came across <a href="https://github.com/PhoenixSheppy/Palo-Alto-ION-2000-OPNsense-Conversion-Guide" target="_blank">this helpful article</a>. 

<p>Installing OPNsense (or another OS like pfSense, for example) involves dismantling the box. It's as easy as removing eight screws from the chassis, opening up the box to access the SSD, and removing an additional three screws from the SSD mounting plate to remove the SSD. I didn't bother removing the plate. 

<figure>
	<a href="https://chuck.is/opnsense/dismantle1"><img src="https://chuck.is/opnsense/dismantle1.jpg" width="100%"></a>
</figure>

<figure>
	<a href="https://chuck.is/opnsense/dismantle2"><img src="https://chuck.is/opnsense/dismantle2.jpg" width="100%"></a>
</figure>

<p>Once removed, I attached the SSD to a SATA to USB adapter - this one in particular was a piece I salvaged after schucking a 3.5" 14TB hard drive from an external drive enclosure. Is it janky? Yes. Is it functional? Absolutely.

<figure>
	<a href="https://chuck.is/opnsense/ssd.jpg"><img src="https://chuck.is/opnsense/ssd.jpg" width="100%"></a>
</figure>

<p>The next step was finding the right OPNsense image to use from the four different options provided on the website. The correct option is the "nano" image which is a preinstalled serial image for USB flash drives, SD, or CF cards as MBR boot. The image is 3.2GB in size and automatically adapts to the installed media size after first boot. The file downloaded was OPNsense-26.1.6-nano-amd64.img.bz2. I had to extract the .img from the .img.bz2 archive. I know this from trial and error as I wrote the .img.bz2 image to the SSD and it didn't work. 

<figure>
	<a href="https://chuck.is/opnsense/nano.png"><img src="https://chuck.is/opnsense/nano.png" width="100%"></a>
</figure>

<p>I reattached the SSD and partially reassembled the box. A few seconds after applying power, the system beeps. After a few minutes, the system should be up and running. By default, the first port (Port 0) is assigned to the LAN with the IP address 192.168.1.1 and includes a pre-configured DHCP server with a range of 192.168.1.100 to 192.168.1.199. By default, the username and password is admin/opnsense. 

<figure>
	<a href="https://chuck.is/opnsense/login.png"><img src="https://chuck.is/opnsense/login.png" width="100%"></a>
</figure>

<p>So there we have it, an open source FreeBSD-based firewall and router on this appliance. I had made a small attempt to get a RHEL-based distro to run, but getting everything configured properly is surprisingly difficult to do without a display. This is something I'm still tinkering with. 

<p>I've also read that using a different SSD other than the original will trigger a "no boot drive" error. 

<p>I should note that I'm not currently running this in my environment. This box gets pretty hot and I live on the top floor of an apartment where, in the summertime, already gets especially hot.
                 ]]>
        </description>
	<link>https://chuck.is/opnsense</link>
        <pubDate>Sun, 28 Jun 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title>Reviving an Obsolete NAS with Alt-F</title>
          <description>
                  <![CDATA[
	<p>I was recently handed down a <a href="https://www.dlink.com/uk/en/products/dns-323-sharecenter-2-bay-network-storage-enclosure" target="_blank">D-Link DNS-323 NAS</a> which I thought would be great for my brother to use. Although the stock D-Link firmware functions okay, it's officially EOL and there hasn't been an official update for it since 2013, and therefore using outdated protocols. I did some research and found the project <a href="https://sites.google.com/site/altfirmware" target="_blank">Alt-F</a>, an alternative custom firmware for the DNS-323, as well as several other D-Link NAS variants. Although the Alt-F project itself hasn't received an update since 2018, there's still community activity, and it still provides more modern features and standards compared to D-Link's stock firmware.  

	<p>Loading the Alt-F firmware is simple. Through D-Link's web UI, go to the firmware interface, and simply upload Alt-F's firmware binary. Once applied, it'll do it's thing for about 5 minutes, then it'll reboot automatically. After reboot, I was greeted with a first run wizard that allowed me to set up an admin password, user accounts, time zone, NTP, DNS, DHCP, and a static IP address (among other things).

	<p>After the initial setup, I noticed that the data on the drives were still intact. However, I had initially set up an ext3 partition with the D-Link software, so I decided to reformat to ext4 using the Alt-F firmware. It also supports Btrfs, NTFS, VFAT, and ISO9660. I am also able to SSH into this box and access the full Linux system underneath. So if I'd rather edit /etc/samba/smb.conf directly as opposed the using the web UI, I can do that.

	<p>Here's a comparison between the stock firmware and Alt-F's custom firmware:
	<pre><code>
| Feature           | Stock FW   | Alt-F               |
| ----------------- | ---------- | ------------------- |
| SMB               | SMB1 only  | SMB1/2 (+ SMB3 pkg) |
| FTP               | Yes        | Yes                 |
| FTPS              | No         | Yes                 |
| SFTP              | No         | Yes                 |
| SSH               | No         | Yes                 |
| NFS               | Optional   | Built in            |
| rsync             | No         | Yes                 |
| SCP               | No         | Yes                 |
| Web UI            | Basic      | Advanced            |
| Packages          | Limited    | Entware + custom    |
| Users/Groups      | Basic      | Advanced            |
| Startup Scripts   | No         | Yes                 |
| DNS Server        | No         | Yes                 |
| DHCP Server       | No         | Yes                 |
| Dynamic DNS       | Limited    | Yes                 |
| Print Server      | Yes        | Yes                 |
| Fan Control       | Limited    | Advanced            |
| LED Control       | No         | Yes                 |
| RAID 0/1          | Yes        | Yes                 |
| JBOD              | Yes        | Yes                 |
| RAID 5            | No         | Some support        |
| ext2              | Yes        | Yes                 |
| ext3              | Yes        | Yes                 |
| ext4              | No         | Yes                 |
| Btrfs             | No         | Yes                 |
| NTFS              | Limited    | Yes                 |
| FAT32/VFAT        | Yes        | Yes                 |
| ISO9660           | No         | Yes                 |
| Large Drives      | Limited    | Up to 8 TB          |
| Guest SMB         | Basic      | Configurable        |
| cron Jobs         | No         | Yes                 |
| Telnet            | Limited    | Yes                 |
| WoL Tools         | No         | Yes                 |
| Updates           | Ended 2014 | Community           |
| Linux Shell       | No         | Full shell          |
| Samba Config      | Limited    | Full access         |
| Remote Admin      | No         | SSH/SFTP            |
| Modern OS Support | Limited    | Good                |

	</code></pre>

	<p>The web UI is far more minimalist than the D-Link firmware. From here, I can also install additional packages, enable/disable services, run through various disk utilities, and more. In my screenshot, I'm in the process of transferring ~300GB of data hence the high CPU utilization. 
<img src="alt-f.jpg" width="100%">

	<p>Although the DNS-323 is nearly two decades old, it's nice to know that one can breath new life into it with a project like Alt-F. It's a good reminder that old hardware often has more life left in it than the manufacturer intended thanks to open source projects. 

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
                 ]]>
        </description>
        <link>https://chuck.is/alt-f</link>
        <pubDate>Sun, 24 May 2026 21:00 PST</pubDate>
  </item>

  <item>
	  <title>Self Hosting Passwords</title>
	  <description>
		  <![CDATA[
<p>A few months back, Ars Technica published <a href="https://arstechnica.com/security/2026/02/password-managers-promise-that-they-cant-see-your-vaults-isnt-always-true/">Password managers' promise that they can't see your vaults isn't always true</a>. I haven't used an online password manager in 5 years. Previously I had been using Bitwarden, which is fine, I just prefer to take ownership of as much of my digital life as I can. 

<p>My setup is <a href="https://keepassxc.org/" target="_blank">KeepassXC</a> to manage all my passwords in a database and <a href="https://syncthing.net/" target="_blank">Syncthing</a> to sync all my passwords across my smartphone, laptop, and server. I read a comment on HN recently about how a couple people who had a similar setup and struggled with syncing conflicts, eventually switching back to an online password manager. In the 5 years I've been using KeepassXC + Syncthing, I have yet to have a single conflict with my password. Granted, I don't have a lot of credentials and am very diligent about going through the motions of deleting an online account I no longer have a use for. Once I get confirmation the account is deleted, I then delete the credential from my password manager. I have about 150 credentials in total and I'd guesstimate I could delete around 20 of those. 

<p>Now that said, it is possible to self host an instance of Vaultwarden (a fork of Bitwarden), but after some trial and error, it seemed like a more complex alternative to my current solution. For a period, I also briefly used "<a href="https://www.passwordstore.org/" target="_blank">pass</a>" which is a terminal based offline password manager which I did a <a href="https://chuck.is/pass/">brief write up on</a>. I eventually ditched it and went back to KeepassXC because, again, it was making things more complicated than it needed to be (and the browser plugin I was using always seemed to fight me).   

<p>I'm not arguing that everyone should ditch their online password manager. This method has less conveniences and requires more responsibility. If my phone, laptop, server, and backup hard drive get destroyed tomorrow in a fire, I'll have challenging times ahead. Most people in the world should probably stick with an online password manager so long as they have a strong vault password and randomly generate all their internet account passwords. However, I still prefer a local password manager because it reduces my attack surface, increases my control, and I enjoy the simplicity of not having a third party involved in my password management. KeepassXC works offline, doesn't potentially leak metadata like the sites I visit, it's flexible, and there's no vendor lock-in. I also don't have to deal with a company shutting down, raising prices, or getting acquired by a less reputable company.

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
		 ]]>
	</description>
	<link>https://chuck.is/passwords</link>
	<pubDate>Wed, 20 May 2026 21:00 PST</pubDate>
	</item>

  <item>
	  <title>A Rant on Owning a Modern EV</title>
	  <description>
		  <![CDATA[
<p>This post is not about electric vehicle hesitations like range anxiety and more complicated trip planning. No, this post is just me complaining about the digital experiences that come with owning a modern vehicle, but especially with an EV. Yes, this is yet another edition of "Bad Technology that Chuck Doesn't Like".  
<p>Let's take charging. At the apartment that I'm officially moved out of as of today, there was a convenient Blink Charging station within the complex which charges a reasonable 21 cents per kWh. There's four charging stations and very rarely are all in use. In order to use this charging station (and basically every station I've come across thus far) it requires that I download and install an app to my phone with no option to pay by card. For whatever reason, this app is entirely dependent on Google Play Services to operate, and because I'm a weird person that likes to actually <a href="https://chuck.is/root">own my devices</a>, I run LineageOS on my smartphone. When I first got the car, I initially I had no Google Play Services, but didn't want to go through the trouble of having to start the charge on another smartphone, so I caved and sideloaded the Gapps addon. All was good for several months until the app stopped working. I jumped through a several of loopholes, like rooting my device and installing several Magisk modules to spoof Play Integrity Check, and while that worked for a while, eventually it stopped working. From what I understand, it is now impossible to pass the Play Integrity check with a 3rd party mobile OS, and therefore it is not possible to use Blink Charging.    
<p>Then there's Nissan's E&V Services app, which is designed to be a companion app to the Nissan Leaf. It can be used to remotely lock and unlock doors, turn on climate control, plan a route that includes charging stations, initiate charging, and check what the current charge is at. Holy shit, what an awful app for a multi-billion dollar global company. The "route planner" is broken and has been broken since I bought the car in 2024. To have the privilege of remotely turning on climate control or unlocking your car, it costs a whopping $25 per month. The only reason I ever used this app is because it is handy to see what remaining charge without having to physically visit my vehicle, but I've since uninstalled it due to how buggy it is.  
<p>Nissan's default infotainment leaves a lot to be desired. Not only is it an incredibly clunky and slow interface despite being a few years old, but there's an entire home panel dedicated to advertising XM Radio services with no ability to disable it. It is there forever! The infotainment system does support Android Auto and Apple Play, but again I'm a weird guy that elects not to use Google Play Services. That said, I'm not really a fan of how Google is now inserting ads into Android Auto's navigation.     
<p>Ultimately, my frustrations with EV ownership has little to do with the vehicle itself and entirely to do with the software ecosystem wrapped around it. Of course, most of these issues can be found in all modern cars. Auto companies are forcing consumers to use invasive and overall obnoxious software, locked down devices, subscriptions fees, and shoving advertisements down their throats. The Nissan Leaf itself is a fantastic car and I'm very much happy with it, but the surrounding digital infrastructure is a reminder that modern technology and automotive companies are more interested in controlling and monetizing the end user, rather than serving them. I will now end this rant.
<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="/cdn-cgi/l/email-protection#b0d8d5c9f0d3d8c5d3db9ed9c3"><span class="__cf_email__" data-cfemail="c0a8a5b980a3a8b5a3abeea9b3">[email&#160;protected]</span></a>.</i>
		 ]]>
	</description>
	<link>https://chuck.is/ev</link>
	<pubDate>Sun, 17 May 2026 21:00 -0800</pubDate>
	</item>

  <item>
	  <title>Minimizing and Finding Satisfaction with Less</title>
	  <description>
		  <![CDATA[
			 
	<figure>
		<a href="https://chuck.is/minimizing/laptop.jpg"><img src="https://chuck.is/minimizing/laptop.jpg" width="100%"></a>
	</figure>

<p>We're in the process of moving and it's eye-opening just how much stuff we've accumulated over the span of just two and a half years. During that time, my in-laws from Viet Nam stayed with us for several months, and we welcomed our son into the world. As a result, we made a lot of purchases and learned a few things. I can now speak firsthand just how much advertising is targeted toward new parents about how some product is essential, and how you're a terrible parent if you don't purchase the product (in fact, your child will die without it!). 

<p>I've also realized how difficult it is to responsibly get rid of something once I've taken ownership of it. One cannot just toss everything into the recycling bin and expect that it gets recycled (in fact <a href="https://chuck.is/recycling/">the majority of the stuff we put in the recycling bin ends up in a landfill</a>). Goodwill (or similar) is an option, but there's still a good chance it will never get reused or even properly recycled. I've had some success with Craigslist, but then there's the time cost and I have to deal with random strangers, that may or may not be shady or flaky. I simply don't like the thought of throwing something out that could still be useful to someone. 

<p>When I brought a new object in my home, I thought it was something I needed. In most instances it was just another thing taking up space and making me feel bad whenever I looked at it. We add things to our life with the idea that it will improve us and make our lives better somehow. Before adding something new to our life, we should instead look at what's currently in our lives to remove that could be beneficial first.  

<p>What I'm describing is minimalism and there is practical aspects. Having less stuff means less to lose, clean, maintain, organize, move, or eventually dispose of. It also means less stuff that can be stolen or break. This also translates to more time, energy, focus, and money. I'm someone who strives to be comfortable with as few possessions as possible, though that's obviously easier said then done. 

<p>My homelab, for instance, is an area that has gone unchecked at times and the nerds will know firsthand about holding onto those "just in case" cables. I bought a 10" mini-rack which I thought would make my equipment look more organized and cleaner. Instead I purchased <i>more</i> equipment so the rack looked more loaded up. The imaginary friend I would have over would inspect my rack and think "damn, Chuck is serious about his homelab environment. What a cool guy!" Granted some of this junk is actually needed so I can continue learn and become a better network engineer, but after packing up all but my most essential gear, the only things I really need is a wireless router running OpenWRT, my storage drives, and a small form factor server. 

<p>Minimalism is a philosophy I've adopted in my life and has helped me stay adaptable. Perhaps it also gives me a sense of control in life; an outlet that helps me focus on what I find actually important. When I'm feeling overwhelmed or distracted, decluttering my work space has proved beneficial.  

<p>I'm reminded of something Thoreau wrote "I have in my mind that seemingly wealthy, but most terribly impoverished class of all, who have accumulated dross, but know not how to use it, or get rid of it, and thus have forged their own golden or silver fetters."</p>

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="/cdn-cgi/l/email-protection#83ebe6fac3e0ebf6e0e8adeaf0"><span class="__cf_email__" data-cfemail="bdd5d8c4fdded5c8ded693d4ce">[email&#160;protected]</span></a>.</i>
 
		 ]]>
	</description>
	<link>https://chuck.is/minimizing</link>
	<pubDate>Thu, 7 May 2026 21:00 -0800</pubDate>
	</item>



  <item>
	  <title>How to Build a Time Machine: A GPS-Disciplined Stratum 1 NTP Server</title>
	  <description>
		  <![CDATA[
<figure>
	<a href="https://chuck.is/ntp/rpi5_ntp.jpg"><img src="https://chuck.is/ntp/rpi5_ntp_thumb.jpg"></a>
	</figure>

	<p>During my holiday break, I built a Stratum 1 NTP server in my home lab. Ordinarily, we get our time from internet-based NTP servers which usually Stratum 2 or 3. With Stratum 1, I can get significantly more accurate time directly from the Stratum 0 GPS satellites orbiting above me. On these satellites are atomic clocks which are the most accurate timekeeping devices humanity has ever created. 
	<p>First off, time tracking that's this precise and reliable is overkill for my needs, but it's a fun project and a great learning experience. For this project I used a Raspberry Pi 5 (which I already had), a GPS module, GPIO wires, and a better antenna. I followed some guidance from a colleague, but much of this has been based off of a post on <a href="https://blog.networkprofile.org/gps-backed-local-ntp-server/" target="_blank">NetworkProfile.org</a>. However, what I've put together below has some differences that I felt was worth documenting. For example, I'm using a newer Raspberry Pi 5 and <a href="https://wiki.almalinux.org/documentation/raspberry-pi.html" target="_blank">AlmaLinux 10.1</a> as opposed to a Raspberry Pi 3 and RaspberryPiOS (Debian). As such, some of the instructions, commands, and insights are different, but the original is well worth the read. 
	<h3>The GPS Module</h3>
	<p>In terms of hardware, I bought this <a href="https://www.amazon.com/dp/B084MK8BS2" target="_blank">GPS module receiver</a>, <a href="https://www.amazon.com/dp/B01EV70C78" target="_blank">this set of ribbon cables</a>, and <a href="https://www.amazon.com/Bingfu-Waterproof-Navigation-Connector-Tracking/dp/B07R7RC96G" target="_blank">GPS antenna</a>. However, there are a ton of different modules and antennas available that should work. For everything, I spend about $25. 
	<p>During this project, I learned that although USB is an option on the GPS module, it will not be anywhere near as accurate as going through the GPIO pins on a Raspberry Pi because there is a pin on the module for PPS. PPS stands for Pulse-Per-Second and is a hardware timing signal output used by many GPS receivers that provide an extremely accurate “tick” every second - accurate to the millisecond (and even nanoseconds). Even though the GPS module can be connected over USB and can deliver NMEA sentences and GPS time, USB cannot carry PPS timing as it requires a dedicated electrical pin. So if we want a true Stratum-1 NTP server, we must use something like a Raspberry Pi that has GPIO pins.
	<div style="text-align: center;">
		<a href="https://chuck.is/ntp/gps.jpg"><img src="https://chuck.is/ntp/gps_thumb.jpg"></a>
		<a href="https://chuck.is/ntp/gps_antenna.jpg"><img src="https://chuck.is/ntp/gps_antenna_thumb.jpg"></a><br>
		<small><i>Here's the GPS module and the antenna which I stuck on my windowsill.</i></small>
	</div>

	<p>The first step is to solder the header to the GPS module. I hadn't soldered anything in quite a while, so I picked up a soldering gun for about $10. I'll be up front, I shorted the PPS and TX pins on the GPS module with a little too much solder which caused me about 2 hours of troubleshooting before I realized that was the reason why I wasn't picking up any satellites.
	<p>In regards to connections, the RPI5 GPIO pins 4, 6, 8, 10, and 12, need to be connected to VCC, GND, RXD, TXD, and PPS on the module respectively. Below is a diagram of the RPI5 GPIO pin diagram and a screenshot from the module product page.
	<div class="table-wrapper"><table>
  <thead>
    <tr>
      <th>RPI5 Pin</th>
      <th>GPS Pin</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align:center;">4 - SV</td>
      <td style="text-align:center;">VCC</td>
    </tr>
    <tr>
      <td style="text-align:center;">6 - GND</td>
      <td style="text-align:center;">GND</td>
    </tr>
    <tr>
      <td style="text-align:center;">8 - GPIO 14 TXD</td>
      <td style="text-align:center;">RXD</td>
    </tr>
    <tr>
      <td style="text-align:center;">10 - GPIO 15 RXD</td>
      <td style="text-align:center;">TXD</td>
    </tr>
    <tr>
      <td style="text-align:center;">12 - GPIO 18 - CLK/PCM</td>
      <td style="text-align:center;">PPS</td>
    </tr>
  </tbody>
</table></div>
	<figure>
		<a href="https://chuck.is/ntp/diagram.jpg"><img src="https://chuck.is/ntp/diagram.jpg" width="100%"></a>
		<figcaption>RPI5 GPIO Pin Diagram <a href="https://vilros.com/pages/raspberry-pi-5-pinout" target="_blank">Source</a>.</figcaption>
	</figure>
	<figure>
		<a href="https://chuck.is/ntp/gps_bottom.jpg"><img src="https://chuck.is/ntp/gps_bottom.jpg" width="40%"></a>
		<figcaption>Bottom of GPS module showing PPS, TXD, RXD, GND, and VCC.</figcaption>
	</figure>
	<figure>
		<img src="https://chuck.is/ntp/solder.jpg" width="100%">
		<figcaption>Pin head soldered to the GPS module <a href="https://www.amazon.com/Navigation-Positioning-Microcontroller-Compatible-Sensitivity/dp/B084MK8BS2" target="_blank">Source</a></figcaption>
	</figure>
	<p>Below is what my RPI5 looks like with the GPS module attached. You'll notice that I mounted the GPS module to a Deskpi KL-P24 board. I attached this to my RPI5 because 1) I already had two of them that were included when I bought my minirack, 2) it's cleaner in that all cables run in the same direction behind the RPI5, and 3) I was able to easily mount the GPS module to it. In terms of the excessive wire length, I'll shorten them another day. 
	<div style="text-align: center;">
		<a href="https://chuck.is/ntp/rpi5_gps3.jpg"><img src="https://chuck.is/ntp/rpi5_gps3_thumb.jpg" width="45%"></a>
		<a href="https://chuck.is/ntp/rpi5_gps4.jpg"><img src="https://chuck.is/ntp/rpi5_gps4_thumb.jpg" width="45%"></a>
		<a href="https://chuck.is/ntp/rpi5_gps5.jpg"><img src="https://chuck.is/ntp/rpi5_gps5_thumb.jpg" width="45%"></a>
		<a href="https://chuck.is/ntp/rpi5_gps2.jpg"><img src="https://chuck.is/ntp/rpi5_gps2_thumb.jpg" width="45%"></a>
	</div>
	
	<h3>Software Configuration</h3>
	<p>On AlmaLinux 10.1, install the following packages: <code>sudo dnf install gpsd gpsd-clients tcpdump</code>. The original guide also suggested installing <code>chrony</code> and <code>jq</code> but they were already installed, and <code>pps-tools</code> are not currently in the AlmaLinux 10.1 repos or EPEL at this time (however, pps-tools is not needed).
	<p>To enable the serial port on AlmaLinux, run <code>sudo vim /boot/cmdline.txt</code> and remove the line <code>console=serial0,115200</code> so it will not interfere with GPS data and PPS timing. Below is what mine looks like. Note that I have <code>pcie_aspm=off</code> which I only added to correct some <a href="https://chuck.is/rpi5nvme">NVMe issues</a> and it's not needed for this project. 
	<pre>
<code>console=tty1 root=PARTUUID=f773372a-b398-4536-abc4-b86776f6e1c9 rootfstype=ext4 rootwait pcie_aspm=off</code>
	</pre>

	<p>Now we configure the GPIO pins for PPS with <code>sudo vim /boot/config.txt</code> and add the following lines:
	<pre>
<code># The following 3 lines are for GPS PPS signals
dtoverlay=pps-gpio,gpiopin=18
enable_uart=1
init_uart_baud=57600</code>
	</pre>
	I already had <code>enable_uart=1</code> present in mine, just ensure it exists in the config.
	<p>Now we can add the PPS module: <code>sudo bash -c "echo 'pps-gpio' >> /etc/modules"</code>. 

	<p>Create the file <code>/etc/default/gpsd</code> and added these lines:
	<pre>
<code>START_DAEMON="true"
USBAUTO="true"
DEVICES="/dev/ttyAMA0 /dev/pps0"
GPSD_OPTIONS="-n"</code>
	</pre>
	
	<p>In order to make gpsd start at boot, run this command: <code>sudo ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/</code>. Now reboot the machine.
	<p>If everything went smoothly, we should start seeing the LED on the GPS module blinking every one second.
	<p>From here we can see if things are working correctly by running <code>cgps -s</code> and <code>gpsmon</code>. If satellites are being picked up, they will be displayed in this output. If we don't see any after around 15 minutes, the configuration is wrong or there's an issue with the hardware (such as the antenna not being a good spot or you shorted the connections as was my case). You can also run <code>gpspipe -w | jq ".uSat| select( . != null )"</code> which will provide the value of how many satellites are being picked up, updating every second. It's important to note that at least 4 satellites are needed to get accurate time.
	<p>For reference, below is my output from <code>cgps -s</code>. Note that my GPS coordinates, Grid Square, and ECEF coordinates are obfuscated with #'s. 
	<pre>
<code>
┌───────────────────────────────────────────┐┌────────────────Seen 19/Used 11──┐
│ Time         2026-01-01T03:00:48.000Z (18)││GNSS  S PRN  Elev  Azim   SNR Use│
│ Latitude          45.6####### N           ││GP  5     5  47.0 136.0  43.0  Y │
│ Longitude        122.4####### W           ││GP 11    11  43.0  54.0  39.0  Y │
│ Alt (HAE, MSL)      60.985,     83.138  m ││GP 12    12  40.0 161.0  29.0  Y │
│ Speed              0.09              km/h ││GP 18    18  14.0 235.0  38.0  Y │
│ Track (true, var)	84.9,  15. 0    deg ││GP 20    20  51.0  80.0  41.0  Y │
│ Climb             -4.32             m/min ││GP 21    21  45.0  88.0  36.0  Y │
│ Status          3D FIX (12 secs)          ││GP 25    25  66.0 217.0  36.0  Y │
│ Long Err  (XDOP, EPX)   0.66, +/-  9.9 m  ││GP 28    28  20.0 284.0  28.0  Y │
│ Lat Err   (YDOP, EPY)   0.72, +/- 10.8 m  ││GP 29    29  60.0 302.0  36.0  Y │
│ Alt Err   (VDOP, EPV)   1.60, +/- 36.8 m  ││GP 31    31  14.0 314.0  31.0  Y │
│ 2D Err    (HDOP, CEP)   0.98, +/- 18.6 m  ││QZ  2   194   7.0 295.0  26.0  Y │
│ 3D Err    (PDOP, SEP)   1.87, +/- 35.5 m  ││GP  6     6   2.0  54.0   0.0  N │
│ Time Err  (TDOP)        1.01              ││GP  9     9   1.0  28.0   0.0  N │
│ Geo Err   (GDOP)        2.13              ││GP 26    26   4.0 321.0   0.0  N │
│ Speed Err (EPS)            +/- 77.8 km/h  ││SB133    46  37.0 189.0   0.0  N │
│ Track Err (EPD)         n/a               ││SB135    48  37.0 183.0   0.0  N │
│ Time offset             0.145824081     s ││SB138    51  35.0 159.0   0.0 uN │
│ Grid Square             ##########        ││QZ  1   193   n/a   0.0   0.0 uN │
│ ECEF X, VX   -#######.###  m    0.050  m/s││QZ  5   197   n/a   0.0   0.0 uN │
│ ECEF Y, VY   -#######.###  m    0.030  m/s││                                 │
│ ECEF Z, VZ    #######.###  m   -0.050  m/s││                                 │
│                                           ││                                 │
│                                           ││                                 </code>
	</pre>

	<h3>Configuring Chrony and Truing Up the Clock</h3>
	<p>Now that we've confirmed that the GPS module is working correctly, we need to configure Chrony. Run <code>sudo vim /etc/chrony.conf</code> and add these two lines:
	<pre>
<code>refclock SHM 0 refid NMEA offset 0.000 precision 1e-3 poll 3 noselect
refclock PPS /dev/pps0 refid PPS lock NMEA poll 3</code>
	</pre>

	Then uncomment <code>log measurements statistics tracking</code> to enable logging. Restart chrony with <code>sudo systemctyl restart chronyd.service</code>.

	<p>In order to true up the clock, we need to see the "Est offset" number so we can revise our chrony configuration so that our clock is more accurate. Run <code>sudo cat /var/log/chrony/statistics.log | sudo head -2; sudo cat /var/log/chrony/statistics.log | sudo grep NMEA</code> and you'll see some data. After around 15 minutes, run it again. Copy and paste this data into a text file, save it, then import it into a spreadsheet and set the delimiter to spaces. The only column we're interested in is Column R (Est). I had to change the values to in this column from "Scientific" to "Number" and increase the decimal to the ten-thousandths place so that 4 values would show after the decimal. Take the average of this column - in my case, it's 0.1412. For more detailed instructions on working with the spreadsheet, I suggest the <a href="https://blog.networkprofile.org/gps-backed-local-ntp-server/" target="_blank">NetworkProfile.org blog post</a>.  
	<p>Open the chrony config with <code>sudo vim /etc/chrony.conf</code> and update the line <code>refclock SHM 0 refid NMEA offset 0.000 precision 1e-3 poll 3 noselect</code> with the offset value we just obtained. In my case, the line is now <code>refclock SHM 0 refid NMEA offset 0.1412 precision 1e-3 poll 3 noselect</code>. Also, comment out the line we uncommented earlier <code>log measurements statistics tracking</code>, then save and close. We can also remove the old log files with <code>sudo rm /var/log/chrony/statistics.log</code>. Finally, restart chrony: <code>sudo systemctl restart chrony</code>. 
	<p>If the tuning we did earlier worked, then PPS will be deemed as the most accurate and will take over. We can take a look at chrony's source with the command <code>watch -n 1 chronyc sources</code> (you can also add the "-v" option for verbose to this command if you want more details on what each column means. The output looks something like this: 

	<pre>
<code>Every 1.0s: chronyc sources          mercury: Wed Dec 31 19:31:58 2025

MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#? NMEA                          0   3   377     7  +6670us[+6670us] +/- 1000us
#* PPS                           0   3   377     6   +704ns[ +834ns] +/-  161ns
^- dns-e.ns4v.icu                2   6   177    25   +468us[ +468us] +/-   48ms
^- 159.203.82.102                3   6   177    24   -858us[ -857us] +/-   37ms
^- 45.12.52.138                  3   6   177    24  -3299us[-3299us] +/-   42ms
^- 173.208.172.164               3   6   177    26  -2429us[-2429us] +/-  151ms</code>
	</pre>

	<p>As you can see, in the far right column, PPS is showing 142ns, whereas the best networked-based NTP is 37ms (or 37,000,000ns!). This value is chrony's estimate of the uncertainty (error bound) of that time source. Obviously, the difference in accuracy is substantial. 
	<p>The symbols in the front are chrony's selection and status markers that tell you which time sources are usable, trusted, and actually discipling the clock. #'s are local reference clocks, whereas ^'s are time sources over the network (most likely the internet). Of the second characters, * means the source is currently controlling the system clock, "?" means unusable/not selected, and "-" indicates the source is a candidate, but it's not selected. Here's a summary:
	<pre>
<code>
| Symbol | Meaning                                     |
| ------ | ------------------------------------------- |
| `#`    | Local reference clock (GPS/PPS)             |
| `^`    | Network time source                         |
| `*`    | Selected (currently disciplining the clock) |
| `?`    | Seen but unusable / not selectable          |
| `-`    | Valid candidate, but not chosen             |</code>
	</pre>

	<p>If satisfied with the accuracy, run <code>sudo vim /etc/chrony.conf</code> again and add "prefer" to the end of PPS line (<code>refclock PPS /dev/pps0 refid PPS lock NMEA poll 3 prefer</code>). 
	<p>To allow clients to connect to chrony, add the line: <code>allow 0.0.0.0/0</code>, or whatever your home network is (ie the common 192.168.1.0/24). We also we must add a line which changes who is allowed to set the system clock and when. All we need to do is add the line <code>manual</code> to <code>chrony.conf</code>. It enables runtime support for the settime command, and at the same time disables chrony’s automatic stepping behavior. Chrony will not step automatically. A clock step can occur only if you explicitly request it.
	<p>We also will add the line <code>local stratum 1</code> which tells connected clients that even if there is no internet connection, this is a Stratum 1 time server.
	<p>While editing the chrony config, it's also not a bad idea to review and even add NTP servers to your chrony file to verify your clock is accurate, or as a fallback option. By default, the only one in AlmaLinux's chrony file is <code>pool 2.almalinux.pool.ntp.org iburst</code>. I also added <code>server time.nist.gov</code> and <code>server tick.usno.navy.mil</code>. Once you're satisfied, save and close, then restart chrony <code>sudo systemctl restart chrony</code>.
	<p>One final step on AlmaLinux is to open the firewall. Running <code>sudo firewall-cmd --add-service=ntp --permanent</code> and <code>sudo firewall-cmd --reload</code> will allow NTP connections to be made.
	
	<h3>Adding the NTP Server as a Source</h3>
	<p>It's fairly simple to add the new NTP server as a source. On Linux machines, we first need to determine what service we're running, which can be done by running <code>systemctl status systemd-timesyncd</code> and <code>systemctl status chronyd</code>. In my case, I see chronyd is active so I'll run <code>sudo vim /etc/chrony.conf</code> and add the line <code>server 10.0.0.40 iburst</code> which is the IP address of the NTP server I just built. Run <code>sudo systemctl restart chronyd</code> and verify it's using the server with <code>chronyc sources</code>. As you can see below, 10.0.0.40 has been selected and identified as a Stratum 1 server.
	<pre>
<code>MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 10.0.0.40                     1   6   377    42    +25us[  +33us] +/-  138us
^- 172-232-15-202.ip.linode>     3  10   377   374  +3078us[+3085us] +/-   79ms
^- fairy0.mattnordhoffdns.n>     3  10   377   378    +72us[  +79us] +/-   72ms
^- 198-12-95-197-host.coloc>     3  10   377    17  -1027us[-1027us] +/-   56ms
^- 23.186.168.132                2  10   367   193  +3436us[+3451us] +/-   25ms</code>
	</pre>	
	<h3>Further Reading</h3>
	<ul>
		<li><a href="https://blog.networkprofile.org/gps-backed-local-ntp-server/">GPS Raspberry Pi NTP Server - NetworkProfile.org</li>
		<li><a href="https://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_strata" target="_blank">Network Time Protocol #Clock Strata</a></li>
	</ul>	
 
<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
	]]>
	</description>
	<link>https://chuck.is/ntp</link>
	<pubDate>Thu, 1 Jan 2026 21:00 -0800</pubDate>
	</item>


  
  <item>
	  <title>Ignorance is Bliss</title>
	  <description>
		  <![CDATA[
<p>"Ignorance is bliss" usually has a negative connotation, a way to refer to someone who is ignorant on some topic that someone else has deemed very important (sometimes meant as an insult). In my view, ignorance can be a positive thing when it comes to most topics. It's not so much about a lack of information on a topic, but more so about selective non-investment in what others consider as very important. We are products of what we pay attention to, and given the sheer amount of information in the form of news, media, entertainments, and legitimately interesting things that are available for us to consume in the modern age, it's more important than ever to be selective in what we pay attention to.

<p>For example I really could not care less about football, celebrity news, daily political controversies, social media influencers, and so on. I have zero interest in these things and I certainly don't have my identity anchored to them. What may seem as obviously important to you could just be background noise to me. Yes, ignorance in the things I don't care about is bliss. My attention is finite, life is finite, so I choose to spend me time focusing on what I see as important or interesting - and it's fair that others may see what interests me as background noise.  

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
	]]>
	</description>
	<link>https://chuck.is/ignorant</link>
	<pubDate>Mon, 29 Dec 2025 21:00 -0800</pubDate>
	</item>


  <item>
	  <title>Owning a Domain Increases Digital Self-Reliance</title>
	  <description>
		  <![CDATA[
		Updated: 2026-01-09<br>

<p>Other than looking cool to your friends, owning your own domain increases your digital self-reliance. It's kind of like having your own phone number. Just like switching cell phone carriers if you don't like your provider, you can easily switch registrars, hosting companies, or email provider and the world would be none the wiser.

<p>There are many reasons to have your own domain that don't involve email or a website, but for me, those are the two primary ones. I have two websites: one for professional purposes and one for personal uses (this one). When buying beginning to use a domain, there's a few considerations I wish I thought about first. 

<p>For example, <a href="https://chuck.is/xyz">will the TLD (such as .xyz) be blocked by ISPs or automatically flagged as spam by email providers</a> because security teams are lazy? Or whether non-technical people will arbitrarily add an "m" at the end of an email address that ends in ".co" because they don't know any better? My suggestion is to stick with well established TLDs like .com, .net, or .org unless you understand what the drawbacks and limitations are (or don't plan on using it with email). 

<p>Cost is another factor. I use Iceland's TLD ".is" which is around ~$50/yr and <s>can only be renewed <i>annually</i> rather than up to 10 years as with other domains</s> (Kirill pointed out to me via email that ISNIC <i>does</i> allow <a href="https://www.namecheap.com/support/knowledgebase/article.aspx/10105/36/is-domain-registration-requirements/" target="_blank">one year renewals, up to 5 years</a>). The benefit is that it's easy and fun to use in that I can configure sweet-looking URLs like <a href="https://chuck.is/dumb/">chuck.is/dumb</a>. That being said, established TLD's like .com, .net, and .org are usually the most cost effective and run for about ~$15/yr and can be paid for up to 10 years in advance. They've also been around a lot longer so you're unlikely to find a short domains like <a href="http://www.chuck.net/gallery/index.php?/category/20" target="_blank">chuck.net</a> because some guy cooler than you already snagged it. 

<p>Let's talk about email. Once upon a time I wrote a post about <a href="https://chuck.is/email/">why you should use your own domain for all your email</a>. To summarize, having your own email domain is like owning the doorstep to your digital life. 

<p>For example, I own chuckcarroll.net and my email address is chuck@chuckcarroll.net. This decouples me from providers like Gmail, Yahoo, Microsoft, and even Protonmail. While many of these providers allow you to use a custom domain (for a fee), if they do something you don't like or they suspend your account for any reason, you're basically screwed unless you have your own domain. 

<p>With a custom domain, you can typically move to a different provider with ease. This is why I considering switching as not unlike porting your cellphone number to a different carrier.

<p>Another benefit of custom domains are email aliases. I can create any alias I want such as "school@chuckcarroll.net" or "[business]@chuckcarroll.net" on the fly. Each service I register with online gets a unique email address. When my credentials were leaked last year, I was quickly able to determine who was responsible because the exposed email address was "meineke@chuckcarroll.net" - a company I mistakenly gave my email address to for an oil change (and nobody should ever do business with them). 

<p>That being said, I should note that I've been slowly moving away from using [business]@chuckcarroll.net aliases. When real people see the custom email address, they often assume either I work for that company or that I gave false information. Either way, it makes for awkward social interactions.  

<p>Owning your own domain also means you can have your own personal or professional website that you fully control. Years ago, I wrote about <a href="https://chuck.is/web-independent/">why I think it's important for everyone to have a personal website</a>. The same arguments apply here, but I'll add that if you're trying to get noticed (especially if you're looking for work) having a website helps you stand out. 

<p>I also strongly believe that if you're going to write or publish anything, you should own your publishing tools and your platform. Own your words. Own your distribution. Avoid falling into the trap of publishing on someone else's platform like Medium or Substack. 

<p>A domain also enables you to run and share online services. I use custom domains with services like Wallabag, Jellyfin, and Audiobookshelf. If a service is running on my server, I can easily and securely share that service with friends or family since it's publicly accessible. For this I use <a href="https://chuck.is/tunneling/">Cloudflare's Zero Trust tunnels</a>. 

<p>Beyond being a ton of fun to experiment and play around with, owning a domain grants you freedoms you otherwise wouldn't have. It gives you control, flexibility, and long term independence of your digital life.

<h3>Update 2026-01-09</h3>
<p>Apparently, this post has been <a href="https://lobste.rs/s/df8vju/owning_domain_increases_digital_self" target="_blank">floating</a> <a href="https://news.ycombinator.com/item?id=46520240" target="_blank"> around</a> the internet</a>, and I’m humbled by the fact that people took the time to share and read it. One interesting comment caught my attention and it made consider what ownership means. Obviously, you don't really "own" a domain, which raises the question - do you really own anything on the internet? I don't necessarily disagree with this sentiment, but by this logic, you don't own your phone number, the title to a house, your passport, etc. Most things we own are actually governed allocations inside of shared systems. What matters to me is long-term control, portability, and independence, not physical impermanence.  

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>	  
		  ]]>
	</description>
	<link>https://chuck.is/self-reliant</link>
	<pubDate>Wed, 24 Dec 2025 21:00 -0800</pubDate>
	</item>

  <item>
	  <title>Resolving I/O Errors on RPI5 with NVMe</title>
	  <description>
		  <![CDATA[
<p>I have an NVMe base for my Raspberry Pi 5 and it's been running for a little over a year without any issues. A couple of months ago I switched to Almalinux and noticed that I could SSH into it right after it booted, but around 30-40 minutes after boot, I could ping from another host on my network but could no longer SSH. When I restarted and directly consoled in, everything was fine until that ~40 minute mark and I started getting a ton of I/O errors. I couldn't even run basic commands like "ls" or "cd". It took me a couple months of off-and-on fiddling to track down the problem. 

<figure>
	<img src="https://chuck.is/rpi5nvme/rpi5.jpg" alt="RPI5 w/ NVMe base" style="width:80%; height:auto;">
	<figcaption>RPI5 w/ NVMe base.</figcaption>
</figure>

<p>Initially I thought it was the NVMe base, ribbon, or the drive, but I swapped each and still had the issue. Then I made the connection that I started receiving I/O errors usually around the same time after bootup. Consoling in, among all the messages, I noticed that the NVMe went into power saving mode not long before the I/O errors started to occur.

<p>I <i>think</i> I solved the issues by adding PCIe power limit to the firmware, preventing the NVMe from going into power saving mode. This can be done by adding a single line to the Raspberry Pi's configuration and haven't experienced any I/O errors since. 

<p>On AlmaLinux edit /boot/efi/cmdline.txt and add the line <code>pcie_aspm=off</code>, then restart. On RaspberryPiOS, it's the same line, but file is located at /boot/firmware/cmdline.txt.

<p>I think the power saving kicks on at different times depending on the OS. On RockyLinux I started having I/O errors almost immediately on startup and didn't get the opportunity to edit the file. 

<p>What's odd is that when I was running EndeavourOS I wasn't experiencing this issue until I upgraded the system, so it sounds like a software issue. It's taken me a while to track down this issue, so hopefully I'll never see this pop up again.  

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a></i>.</p>
	]]>
	</description>
	<link>https://chuck.is/rpi5nvme</link>
	<pubDate>Sat, 13 Dec 2025 21:00 -0800</pubDate>
	</item>

<item>
	  <title>A Reminder on the Realities of Digital Purchases</title>
	  <description>
		  <![CDATA[
<p>This is a follow up from something I wrote in 2020 titled <a href="https://chuck.is/owning">The End of Ownership in a Digital Age</a> where I discuss (ie complain) about what it means to "own" something in the modern digital age. I've recently experienced a kind of digital revocation of a purchase through Bandcamp - a company I've only had positive things to say about until now.   

<p>Some background: I prefer to buy DRM-free music so that I can play it on any device I choose and with any music program I wish to, which is why I absolutely adore Bandcamp. They provide not only legitimate DRM free music, but also make your purchases available in a variety of formats including FLAC, MP3, OGG, etc. From the artist side, Bandcamp only takes a 15% cut of the sale price while the rest goes directly to the artists. From my side, I get high quality DRM-free music without having to feel guilty about pirating. Everyone is a winner. Unfortunately, Bandcamp (and the artist) can renege on the deal whenever they wish. 

<p>On October 31st, 2025, my favorite metal band <i>Despised Icon</i> released their latest album <i>Shadow Work</i>. I did a typical search via a search engine and saw that it had been distributed through Bandcamp. I immediately ordered it, downloaded the lossless FLAC version, then converted it to 350Kbps OGG (the equivalent to a high quality MP3). A couple of days later I noticed that my conversion had some stuttering so I went to download a fresh copy only to discover that the album not only disappeared from my Bandcamp collection, but it was also removed from my order history despite having a record of the purchase via email and the funds removed from my bank account. 
 
<p>Now, one of a few things occurred. The record company (Nuclear Blast Records) changed it's mind about distributing on Bandcamp, in which case I believe I should still be able to download my purchase. This is something I believe Steam does with video games. 

<p>Another thing I've considered is that someone opened up a fraudulent account and uploaded Despised Icon's music library along with their latest album to make money off of a people (like me) trying to legally purchase music. If this is the case, I should receive a full refund on my purchase since there is no guarantee this is actually a legitimate copy, much less a legitimate LOSSLESS copy.

<figure>
	<img src="email.png" alt="Email confirmation of my purchase">
	<figcaption>Email confirmation of my purchase.</figcaption>
</figure>
<figure>
	<img src="url.png" alt="Page shown when I click 'Download your purchase'">
	<figcaption>The page I'm greeting with when I click 'Download your purchase'.</figcaption>
</figure>

<p>Unfortunately, this has soured some of the appeal of buying music via Bandcamp. What I find especially sketchy about this situation is that my purchase has been removed from my order history as well, and there's no trace that I had ever ordered this album in my Bandcamp account. The only proof I have is an email confirmation and a transaction in my bank account. The is reminiscent of a couple situations I've experienced in the past. A decade ago when I had bought a game via the Google Play Store, around a year later the developer pulled it and reuploaded it as a separate item. I don't know what their reasoning was, but I was no longer able to download and install it on my device without paying another $6.99. I reached out to the developer and all they did was email me the APK (thanks, I guess?). Also, back in the days of Google Daydream, I purchased the VR game <i>Blade Runner Revelations</i> and within a year I was no longer able to download/install the game, and the transaction disappeared from my purchase history. All links on the internet pointing to the Google Play Store page returned the error "We're sorry, the requested URL was not found on this server." 
 
<p>Regardless as to why this situation occurred with Bandcamp, this is yet another reason why I (and you!) should not only buy DRM-free content, but also store that content on a data storage device that you physically own. And in my case, keep the LOSSLESS version permanently backed up after it's converted to a different audio format. I am not an advocate of piracy, but it's situations like this as to why people do indeed pirate content.

<p>In the last week, I have reached out to Bandcamp support directly via email twice and their support contact form twice, but have yet to receive a response. I'll update this post once I hear back.

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a></i>.</p> 
		  ]]>
	</description>
	<link>https://chuck.is/purchasing</link>
	<pubDate>Sun, 23 Nov 2025 21:00 -0800</pubDate>
 </item>


  <item>
	  <title>The Anatomy of an SSH Config</title>
	  <description>
		  <![CDATA[
		<p>A few years ago I published a post about <a href="https://chuck.is/alias">aliases</a>, one of which I set up to allow me to SSH into a shared web server. Someone shared that post to Hacker News, so naturally the gaping flaws in my understanding of both aliases and SSH came to light. One piece of feedback I got was that my alias "sshchuck" was "suboptimal". At the time I barely had a grasp of SSH, but since then I've become far more familiar with it.  

<p>This post isn't going to be the holy grail of SSH, just some of the fundamentals that I find interesting and have incorporated in my home network environment. 

<h3>What is Secure Shell</h3>
<p>SSH was designed as a replacement for Telnet which initiated remote sessions in plain text. SSH allows remote sessions over an encrypted connection. Within the OSI model, SSH is generally considered to be at Layer 7, the application layer. By default it uses port 22, but from a security standpoint, it's considered best practice to change it to a different non-standard port number to deter automated brute-force attacks. 

<h3>SSH Config file</h3>
<p>Your OpenSSH client config file is stored in your home directly in ~/.ssh/config. A basic configuration includes the host, hostname IP address, the user, and a port number. We could also include options like <code>ServerAliveInterval 60</code> which sends a keep-alive every 60 seconds to prevent timeouts, or <code>ServerAliveCountMax 3</code> which will drop the connection if 3 keep-alives go unanswered. 

<p>An example SSH config looks something like this:
<pre>
	<code>
	Host jupiter
		Hostname 192.168.1.10
		User chuck
		Port 21098

	Host mercury
		Hostname 192.168.1.30
		User chuck
		Port 22212
	
	Host web-server
		Hostname server166.webhosting.net
		User chuck12345
		Port 22 
	</code>
</pre>

<p>With this configuration, instead of running <code>ssh chuck@192.168.1.10 -p 21098</code> to initiate a remote session to my server, I can simply run <code>ssh jupiter</code>. I went from typing 31 characters, to just 11 (or 5 with bash auto-completion) which expends less energy from my fingers, and billions of hours of time saved. 

<p>Note that SFTP also uses this config file, <s>since it's FTP running over SSH</s>. As Lars helpfully pointed out to me, SFTP and FTP are entirely different protocols. SFTP, despite the name, stands for SSH File Transfer Protocol and is built from the ground up as part of the OpenSSH suite, as opposed to FTP (File Transfer Protocol) which transfers files via plain text and has no meaningful security. SFTP runs inside an encrypted SSH connection via port 22 (by default), providing not just file transfer, but also file system operations like ls, mv, etc. There's also a distinction to be made about FTPS which is literally FTP with SSL/TLS encryption added to it. 


<h3>Passwordless Authentication</h3>
<p>Running <code>ssh [host]</code> is great, but you still need to authenticate your session. We can, however, configure a passwordless SSH login.  

<p>Assuming you don't have an existing ssh key pair, generate a new key pair with <code>ssh-keygen -t rsa -b 4096 -C "name@example.com"</code>. This will generate an RSA key with a key length of 4096 bits. The <code>-C</code> option creates a comment, and conventionally that's the user's email address which is simply an identifier. Hit enter to accept the default file location, then enter again if you want an empty passphrase (less secure, but helps with automation). This generates your private and public keys to ~/.ssh/id_rsa and ~/.ssh/id_rsa.pub respectively. 

<p>Now to login to our server without a password, copy the public key to the server we're managing. Run <code>ssh-copy-id [username]@[IP address of server]</code> and you'll be prompted to enter the password. If all went well, you should receive a message <code>Number of key(s) added: 1</code>. 

<p>Now, all I need to do is run <code>ssh jupiter</code> and I'm immediately connected to my server.  

<h3>Further Reading</h3>
<ul>
	<li><a href="https://en.wikibooks.org/wiki/OpenSSH" target="_blank">OpenSSH | Wikibooks</a></li>
	<li><a href="https://www.openssh.com/" target="_blank">OpenSSH project page</a></li>
</ul>

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
	  
		  ]]>
	</description>
	<link>https://chuck.is/ssh</link>
	<pubDate>Wed, 17 Sep 2025 21:00 -0800</pubDate>
 </item>

</channel>
</rss>
