<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Chish</title>
      <link>https://chish.is-a.dev</link>
      <description>Chish&#39;s blog, guides, and devlogs</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://chish.is-a.dev/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Mon, 28 Sep 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>A Game of Thrones</title>
          <pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://chish.is-a.dev/random/a-game-of-thrones/</link>
          <guid>https://chish.is-a.dev/random/a-game-of-thrones/</guid>
          <description xml:base="https://chish.is-a.dev/random/a-game-of-thrones/">&lt;!--
This is a stub, so the reading side of the setup is visible. Fill it in or
delete it - the `author`, `status` and `link` fields are all optional and
just disappear from the index if you leave them out.

Worth writing down, in rough order:

- What is it about, in a sentence, for someone who has not read it?
- What made me pick it up rather than something else?
- What am I expecting from it?
- The part that actually stuck with me, and why
- Who I would recommend it to, and who would not bother
- Where I am now: partway through, finished it, or dropped it

The `link` field is for wherever the thing actually lives, if you want to
point at a specific edition or a writeup somewhere.
--&gt;
</description>
      </item>
      <item>
          <title>Two Pointers</title>
          <pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://chish.is-a.dev/random/two-pointers/</link>
          <guid>https://chish.is-a.dev/random/two-pointers/</guid>
          <description xml:base="https://chish.is-a.dev/random/two-pointers/">&lt;h2 id=&quot;approach&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#approach&quot; aria-label=&quot;Anchor link for: approach&quot;&gt;##&lt;/a&gt;Approach&lt;/h2&gt;
&lt;!--
Fill this in as you go. These are the questions worth answering, in order:

- Restate the problem in your own words. What is actually being asked for?
- What was your first instinct, before you wrote anything?
- What did I try first, and why did I expect it to work?
- What was the first thing that broke? Input size, or a wrong assumption?
- What told me the naive approach was the wrong shape?

Write it down even if it looks dumb. This is the part that&#39;s worth reading
back in a month.
--&gt;
&lt;h2 id=&quot;solution&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#solution&quot; aria-label=&quot;Anchor link for: solution&quot;&gt;##&lt;/a&gt;Solution&lt;/h2&gt;
&lt;!--
The thing that actually worked, plus:

- Language used
- Time complexity
- Space complexity
- A short walkthrough of one non-obvious step
--&gt;
&lt;h2 id=&quot;learning&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#learning&quot; aria-label=&quot;Anchor link for: learning&quot;&gt;##&lt;/a&gt;Learning&lt;/h2&gt;
&lt;!--
- What is the pattern actually called, so I recognise it next time?
- What was the tell that pointed at this approach?
- What would I do differently, now that it works?
- Two or three similar problems to hit next, so the pattern sticks
--&gt;
</description>
      </item>
      <item>
          <title>Escaping AI Tutorial Hell and Learning to Actually Think in Code</title>
          <pubDate>Wed, 09 Sep 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://chish.is-a.dev/blogs/ai-hell-and-confusion/</link>
          <guid>https://chish.is-a.dev/blogs/ai-hell-and-confusion/</guid>
          <description xml:base="https://chish.is-a.dev/blogs/ai-hell-and-confusion/">&lt;p&gt;Me and two friends are building a regex parser and interactive TUI in Go for Hack Club -- basically regex101, but running directly inside the terminal using Bubble Tea.&lt;/p&gt;
&lt;p&gt;One friend took the engine (lexer, parser, NFA matcher), the third guy was building the bridge between the two, and I took the TUI.&lt;/p&gt;
&lt;p&gt;Early in the project, I caught myself falling into a dangerous habit that almost every junior dev is struggling with right now. I stopped it before it ruined my learning, broke the crutch, and forced myself to build the core architecture from first principles.&lt;/p&gt;
&lt;p&gt;Here is what that trap actually looked like, how I broke out of it, and the mental models that finally made things click.&lt;/p&gt;
&lt;h2 id=&quot;the-new-tutorial-hell&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-new-tutorial-hell&quot; aria-label=&quot;Anchor link for: the-new-tutorial-hell&quot;&gt;##&lt;/a&gt;The New &quot;Tutorial Hell&quot;&lt;/h2&gt;
&lt;p&gt;We all know traditional tutorial hell: watching someone build an app on YouTube, coding along, and learning nothing.&lt;/p&gt;
&lt;p&gt;The new version is subtler: &lt;strong&gt;personalized, infinitely flexible AI tutorial hell&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When I started sketching out the TUI, I wasn&#39;t blindly copy-pasting code blocks. I was asking questions, reading the suggestions, and manually typing the code out line by line. On paper, it looked like productive engineering—my commits were atomic, the editor was moving, and my WakaTime hours were ticking up.&lt;/p&gt;
&lt;p&gt;But a couple of hours in, I paused and tested myself on a blank buffer. My brain went completely blank. I couldn&#39;t design a struct on my own, I couldn&#39;t figure out where a test file should live, and I couldn&#39;t sketch a layout from scratch.&lt;/p&gt;
&lt;p&gt;I realized I was just copying someone else&#39;s homework. When you retype generated code, you&#39;re only exercising &lt;strong&gt;recognition memory&lt;/strong&gt; (&lt;em&gt;&quot;I understand this line as I type it&quot;&lt;/em&gt;), not &lt;strong&gt;generative recall&lt;/strong&gt; (&lt;em&gt;&quot;I can architect this from nothing&quot;&lt;/em&gt;). The moment you hit an edge case, you&#39;re helpless without the prompt box.&lt;/p&gt;
&lt;p&gt;I immediately killed that approach. If I was going to build this TUI, every struct, layout calculation, and test needed to originate in my own head.&lt;/p&gt;
&lt;p&gt;Here are the concepts that actually unfroze my brain.&lt;/p&gt;
&lt;h2 id=&quot;1-what-actually-goes-in-a-struct&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-what-actually-goes-in-a-struct&quot; aria-label=&quot;Anchor link for: 1-what-actually-goes-in-a-struct&quot;&gt;##&lt;/a&gt;1. What Actually Goes in a Struct?&lt;/h2&gt;
&lt;p&gt;Whenever I tried to create a component, I&#39;d freeze wondering what fields belong in a struct. Turns out I was overthinking it like some abstract OOP hierarchy.&lt;/p&gt;
&lt;p&gt;A struct is literally just a block of memory holding variables that change together. The easiest way to think about it is three buckets:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Config stuff that never changes&lt;/strong&gt; (max widths, fixed borders, keybindings).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State that changes on keystrokes&lt;/strong&gt; (cursor index, is this pane focused, raw input text).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cached outputs&lt;/strong&gt; so you don&#39;t recompute heavy stuff every frame (match offsets, syntax error messages).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And if you don&#39;t know what to put in a struct yet? Just don&#39;t make one. Write raw variables inside a dirty test function first. The moment you find yourself passing three loose variables into multiple functions together, that&#39;s your struct telling you it exists.&lt;/p&gt;
&lt;h2 id=&quot;2-terminal-uis-are-just-bounding-box-math&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-terminal-uis-are-just-bounding-box-math&quot; aria-label=&quot;Anchor link for: 2-terminal-uis-are-just-bounding-box-math&quot;&gt;##&lt;/a&gt;2. Terminal UIs are Just Bounding Box Math&lt;/h2&gt;
&lt;p&gt;Designing the TUI layout was another thing that paralyzed me. 2D space feels endless until you realize terminal windows are just a finite grid of cells (Width $W$ by Height $H$).&lt;/p&gt;
&lt;p&gt;Every layout is just two splits: vertical (stacking) and horizontal (side-by-side). You classify every box as either &lt;strong&gt;Fixed&lt;/strong&gt; or &lt;strong&gt;Stretchy&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fixed:&lt;/strong&gt; The header is 1 row. The regex input box is 3 rows. The status bar at the bottom is 1 row.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stretchy:&lt;/strong&gt; The test string editor and match results take whatever height is left.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Remaining Height = Total Height - (Header + Pattern Box + Footer)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Left Column Width = Total Width / 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Right Column Width = Total Width - Left Column Width&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once I wrote that arithmetic out, the blank canvas vanished. It&#39;s just boxes inside boxes.&lt;/p&gt;
&lt;h2 id=&quot;3-the-git-conflict-panic&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-the-git-conflict-panic&quot; aria-label=&quot;Anchor link for: 3-the-git-conflict-panic&quot;&gt;##&lt;/a&gt;3. The Git Conflict Panic&lt;/h2&gt;
&lt;p&gt;Then came our first real team workflow collision.&lt;/p&gt;
&lt;p&gt;I finished the base TUI, merged it to &lt;code&gt;main&lt;/code&gt;, and started working on macro navigation on a new branch. At the exact same time, my friend branched off to build widgets. Both of our features legitimately needed new fields inside our root &lt;code&gt;AppState&lt;/code&gt; struct in &lt;code&gt;app.go&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;He finished first and merged his PR into &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When I went to open my PR, GitHub slapped me with the red conflict warning. My initial reaction was &quot;wait, did we mess up the repo? How do I even update this without blowing away my branch?&quot;&lt;/p&gt;
&lt;p&gt;Turns out the workflow is way simpler than I thought:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stash dirty work:&lt;/strong&gt; If you&#39;re halfway through writing something and it doesn&#39;t compile yet, don&#39;t make a messy &quot;wip&quot; commit. Just &lt;code&gt;git stash&lt;/code&gt;. It cleans your working directory immediately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pull main directly into your branch:&lt;/strong&gt; You don&#39;t need a crazy rebase dance. Just run:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B392F0;&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color: #9ECBFF;&quot;&gt; pull origin main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fix the conflict markers:&lt;/strong&gt; Open the file, find the &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD&lt;/code&gt; markers, and just keep &lt;em&gt;both&lt;/em&gt; additions:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #B392F0;&quot;&gt; AppState&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; struct&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;    // my fields&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    NavIndex&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;    int&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    KeyMap&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;      map&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;string&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;string&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;    // my friend&amp;#39;s field from main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ActiveWidget&lt;/span&gt;&lt;span style=&quot;color: #B392F0;&quot;&gt; WidgetType&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compile and test locally:&lt;/strong&gt; Run &lt;code&gt;go build ./...&lt;/code&gt; and &lt;code&gt;go test ./...&lt;/code&gt; before touching Git. If it compiles clean, &lt;code&gt;git add&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, and push. The GitHub warning disappears.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pop your unfinished work back if you stashed: &lt;code&gt;git stash pop&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-new-rule-the-closed-tab-method&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-new-rule-the-closed-tab-method&quot; aria-label=&quot;Anchor link for: the-new-rule-the-closed-tab-method&quot;&gt;##&lt;/a&gt;The New Rule: The Closed-Tab Method&lt;/h2&gt;
&lt;p&gt;To actually get better (especially since I eventually want to write low-level systems code in Rust, Zig, and C++), I made a rule for myself on this project:&lt;/p&gt;
&lt;p&gt;If I get stuck on how an API works or why an algorithm is failing, I can look it up or ask an LLM to explain the concept. &lt;strong&gt;Then I have to close the tab.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No copy-typing with the answer sitting on the second monitor. I close it, turn back to the editor, write the test case, break it, fix the off-by-one errors myself, and let my brain do the actual heavy lifting.&lt;/p&gt;
&lt;p&gt;Currently writing the match span highlighter and unit tests by hand. It&#39;s slower, but the code is actually mine now.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>VIA Not Detecting Your Keyboard on Linux? It Might Be a Stale udev Rule</title>
          <pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://chish.is-a.dev/guides/via-not-detecting-keyboard-linux/</link>
          <guid>https://chish.is-a.dev/guides/via-not-detecting-keyboard-linux/</guid>
          <description xml:base="https://chish.is-a.dev/guides/via-not-detecting-keyboard-linux/">&lt;p&gt;So I got a Rainy75 Pro keyboard. Great board, VIA support, the works. Plugged it
into my Fedora 44 machine, opened VIA in Brave, and... nothing. VIA showed the
device but immediately threw errors:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;NotAllowedError: Failed to write the report.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Received invalid protocol version from device&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Keyboard worked perfectly fine for typing. VIA worked perfectly fine on Windows.
Just... not on Linux.&lt;/p&gt;
&lt;h3 id=&quot;the-red-herring-selinux&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-red-herring-selinux&quot; aria-label=&quot;Anchor link for: the-red-herring-selinux&quot;&gt;###&lt;/a&gt;The Red Herring: SELinux&lt;/h3&gt;
&lt;p&gt;First instinct on Fedora is always SELinux. The &lt;code&gt;chrome://device-log&lt;/code&gt; output
was showing &lt;code&gt;Access denied opening device read-write, trying read-only&lt;/code&gt;, which
screams permission issue. So I went down the SELinux rabbit hole:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B392F0;&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color: #9ECBFF;&quot;&gt; setsebool&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; -P&lt;/span&gt;&lt;span style=&quot;color: #9ECBFF;&quot;&gt; usbhid_access&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6A737D;&quot;&gt;# Boolean usbhid_access is not defined&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cool. Created a new udev rule with &lt;code&gt;MODE=&quot;0666&quot;&lt;/code&gt; and &lt;code&gt;TAG+=&quot;uaccess&quot;&lt;/code&gt;.
Reloaded rules, replugged keyboard... still broken. Set SELinux to permissive
with &lt;code&gt;setenforce 0&lt;/code&gt;... still broken. At this point I was convinced it was
something weird with the VIA web protocol on Linux.&lt;/p&gt;
&lt;h3 id=&quot;the-actual-problem&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-actual-problem&quot; aria-label=&quot;Anchor link for: the-actual-problem&quot;&gt;###&lt;/a&gt;The Actual Problem&lt;/h3&gt;
&lt;p&gt;Turns out I had a &lt;code&gt;92-via.rules&lt;/code&gt; file sitting in &lt;code&gt;/etc/udev/rules.d/&lt;/code&gt; from
when I first tried to get VIA working (via some online guide). Here&#39;s what
it had:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;KERNEL==&amp;quot;hidraw*&amp;quot;, SUBSYSTEM==&amp;quot;hidraw&amp;quot;, MODE=&amp;quot;0664&amp;quot;, TAG+=&amp;quot;uaccess&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Looks fine right? Except... &lt;code&gt;0664&lt;/code&gt;. That&#39;s &lt;strong&gt;not&lt;/strong&gt; writable by the user.
And because it matches &lt;code&gt;KERNEL==&quot;hidraw*&quot;&lt;/code&gt; as a catch-all, it was hitting
ALL hidraw devices — including the ones my new &lt;code&gt;99-rainy75.rules&lt;/code&gt; was trying
to fix with &lt;code&gt;MODE=&quot;0666&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The catch-all with the wrong permissions was silently overriding my fix.&lt;/p&gt;
&lt;h3 id=&quot;the-fix&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-fix&quot; aria-label=&quot;Anchor link for: the-fix&quot;&gt;###&lt;/a&gt;The Fix&lt;/h3&gt;
&lt;p&gt;Literally one line:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color: #9ECBFF;&quot;&gt; &amp;#39;KERNEL==&amp;quot;hidraw*&amp;quot;, SUBSYSTEM==&amp;quot;hidraw&amp;quot;, MODE=&amp;quot;0666&amp;quot;, TAG+=&amp;quot;uaccess&amp;quot;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: #B392F0;&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color: #9ECBFF;&quot;&gt; tee /etc/udev/rules.d/92-via.rules&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Changed &lt;code&gt;0664&lt;/code&gt; to &lt;code&gt;0666&lt;/code&gt;, removed the redundant &lt;code&gt;99-rainy75.rules&lt;/code&gt;, reloaded
udev, replugged the keyboard, and VIA connected immediately. No SELinux
tweaks needed. No browser flags. No desktop app install.&lt;/p&gt;
&lt;h3 id=&quot;how-i-figured-it-out&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-i-figured-it-out&quot; aria-label=&quot;Anchor link for: how-i-figured-it-out&quot;&gt;###&lt;/a&gt;How I Figured It Out&lt;/h3&gt;
&lt;p&gt;The real breakthrough was checking &lt;code&gt;chrome://device-log&lt;/code&gt; in Brave (which is
Chromium-based, so same internals as Chrome). It showed the full chain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Chrome detects the HID device (vendor &lt;code&gt;0x320F&lt;/code&gt;, product &lt;code&gt;0x5055&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Tries to open &lt;code&gt;/dev/hidraw3&lt;/code&gt; read-write&lt;/li&gt;
&lt;li&gt;Gets &lt;code&gt;FILE_ERROR_ACCESS_DENIED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Falls back to read-only&lt;/li&gt;
&lt;li&gt;Tries to write the VIA config report&lt;/li&gt;
&lt;li&gt;Gets &lt;code&gt;Bad file descriptor (9)&lt;/code&gt; because it opened read-only&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then I ran &lt;code&gt;ls -la /dev/hidraw*&lt;/code&gt; and noticed the Rainy75 devices had
&lt;code&gt;crw-rw-r--.&lt;/code&gt; (664, no ACLs) while other devices had &lt;code&gt;crw-rw-r--+&lt;/code&gt; (666
with ACLs). The &lt;code&gt;+&lt;/code&gt; means ACLs from &lt;code&gt;TAG+=&quot;uaccess&quot;&lt;/code&gt; were applied, but the
underlying mode was still &lt;code&gt;664&lt;/code&gt; from that old rule.&lt;/p&gt;
&lt;h3 id=&quot;takeaway&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#takeaway&quot; aria-label=&quot;Anchor link for: takeaway&quot;&gt;###&lt;/a&gt;Takeaway&lt;/h3&gt;
&lt;p&gt;If you&#39;re fighting VIA (or any WebHID/WebUSB tool) on Linux:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check ALL udev rules&lt;/strong&gt;, not just the one you created. A stale rule from
a previous attempt might be overriding your fix. Look at every &lt;code&gt;.rules&lt;/code&gt;
file in &lt;code&gt;/etc/udev/rules.d/&lt;/code&gt; and &lt;code&gt;lib/udev/rules.d/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;chrome://device-log&lt;/code&gt;&lt;/strong&gt; is your best friend for debugging WebHID issues.
It shows exactly which device, which operation, and which error.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&#39;t trust SELinux as the first suspect.&lt;/strong&gt; In my case it was a
perfectly innocent bystander. Always verify file permissions first with
&lt;code&gt;ls -la&lt;/code&gt; and &lt;code&gt;getfacl&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
</description>
      </item>
      <item>
          <title>Fixing Sphinx&#39;s Hyphen-Eating Search</title>
          <pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://chish.is-a.dev/blogs/hyphen-search-regex/</link>
          <guid>https://chish.is-a.dev/blogs/hyphen-search-regex/</guid>
          <description xml:base="https://chish.is-a.dev/blogs/hyphen-search-regex/">&lt;p&gt;So Sphinx&#39;s search was doing this annoying thing where searching for &lt;code&gt;-v&lt;/code&gt;
or &lt;code&gt;--force&lt;/code&gt; just... returned nothing. Even in docs that literally have
those exact flags written out.&lt;/p&gt;
&lt;h3 id=&quot;the-mystery-python-indexer-vs-javascript-search&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-mystery-python-indexer-vs-javascript-search&quot; aria-label=&quot;Anchor link for: the-mystery-python-indexer-vs-javascript-search&quot;&gt;###&lt;/a&gt;The Mystery: Python Indexer vs JavaScript Search&lt;/h3&gt;
&lt;p&gt;My first instinct was to go poke the JS search code since, well, that&#39;s
what actually runs the query right. But that&#39;s only treating the symptom
lol, by the time a query even reaches the JS side, the index has ALREADY
lost the hyphens. Turns out the Python indexer was stripping leading
hyphens before terms even got stored. So &lt;code&gt;-v&lt;/code&gt; was being indexed as just
&lt;code&gt;v&lt;/code&gt;, and no amount of JS fixing was ever gonna find that.&lt;/p&gt;
&lt;h3 id=&quot;flags-vs-compound-words&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#flags-vs-compound-words&quot; aria-label=&quot;Anchor link for: flags-vs-compound-words&quot;&gt;###&lt;/a&gt;Flags vs Compound Words&lt;/h3&gt;
&lt;p&gt;Real fix had to happen on the Python side, regex change. The annoying part
was telling apart something like &lt;code&gt;-v&lt;/code&gt; (a flag, keep the hyphen) from the
hyphen inside &lt;code&gt;extra-curricular&lt;/code&gt; (a compound word, don&#39;t treat it special).
Those two cases look kinda similar but need totally different handling...&lt;/p&gt;
&lt;p&gt;This is what led me to &lt;strong&gt;negative lookbehind&lt;/strong&gt;, which I&#39;d genuinely never used
before. &lt;code&gt;(?&amp;lt;!pattern)&lt;/code&gt; basically checks &quot;hey is this pattern NOT sitting
right before me&quot; without actually consuming any characters. Zero width
check, so it doesn&#39;t eat part of what you&#39;re trying to match.&lt;/p&gt;
&lt;h3 id=&quot;the-regex-fix&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-regex-fix&quot; aria-label=&quot;Anchor link for: the-regex-fix&quot;&gt;###&lt;/a&gt;The Regex Fix&lt;/h3&gt;
&lt;p&gt;Ended up with this:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;regexp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;(?&amp;lt;!&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt;\w&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #DBEDFF;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;{1,2}&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt;\w[\w-]&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;*|&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt;\w&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reading it out... match one or two hyphens followed by a word character
(and then whatever word/hyphen stuff after), BUT only if there&#39;s not
already a word character sitting right before those hyphens. That&#39;s what
kicks out the &lt;code&gt;extra-curricular&lt;/code&gt; case while still letting &lt;code&gt;-v&lt;/code&gt; and
&lt;code&gt;--force&lt;/code&gt; through clean. The &lt;code&gt;|\w+&lt;/code&gt; at the end is just... normal word
matching for everything that isn&#39;t hyphen-flag-shaped.&lt;/p&gt;
&lt;p&gt;PR&#39;s up against Sphinx now. Fingers crossed for review lol.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Devlog 01: Shared Types First</title>
          <pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://chish.is-a.dev/projects/hackatime-tui/devlog-01/</link>
          <guid>https://chish.is-a.dev/projects/hackatime-tui/devlog-01/</guid>
          <description xml:base="https://chish.is-a.dev/projects/hackatime-tui/devlog-01/">&lt;p&gt;Okay so, first real day on the Hackatime TUI. 3 person team, Bubbletea for the
TUI part, one guy on backend wiring, one guy on widgets, and me doing
dashboard/nav stuff.&lt;/p&gt;
&lt;h3 id=&quot;unblocking-the-team-first&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#unblocking-the-team-first&quot; aria-label=&quot;Anchor link for: unblocking-the-team-first&quot;&gt;###&lt;/a&gt;Unblocking the Team First&lt;/h3&gt;
&lt;p&gt;First thing I did was just... define the shared types. Dashboard, Filters,
the whole shape of the panel data. Didn&#39;t touch any actual logic before this,
cuz both backend guy and widget guy are kinda stuck until they know what the
data even looks like. Felt like the responsible thing to do lmao, be the guy
who unblocks everyone instead of just diving into my own corner.&lt;/p&gt;
&lt;h3 id=&quot;the-fixed-header-wireframe-slots&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-fixed-header-wireframe-slots&quot; aria-label=&quot;Anchor link for: the-fixed-header-wireframe-slots&quot;&gt;###&lt;/a&gt;The Fixed Header &amp;amp; Wireframe Slots&lt;/h3&gt;
&lt;p&gt;After that I built out the fixed header, renders username, streak, the whole
filter row (Date Range / Project / Language / OS / Editor / Category)... I
basically just referenced the real Hackatime dashboard for this. It looks
right now, which is nice, but it doesn&#39;t DO anything yet lol. Next up is
making it actually usable, dropdowns opening/closing, moving the cursor
around, filters actually triggering a refetch.&lt;/p&gt;
&lt;p&gt;Also threw together the card and panel grid, just wireframes with empty
slots for now (Project Durations, Languages, Timeline, etc) so widget guy
has something concrete to build into whenever he starts.&lt;/p&gt;
&lt;p&gt;Getting started is always the hardest part for me, every single time. But
once the first commit was up everything just kinda... flowed after that.&lt;/p&gt;
&lt;h3 id=&quot;the-planned-layout&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-planned-layout&quot; aria-label=&quot;Anchor link for: the-planned-layout&quot;&gt;###&lt;/a&gt;The Planned Layout&lt;/h3&gt;
&lt;p&gt;This is our planned layout for the dashboard:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;┌──────────────────┬──────────────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ [●] Chish 🇮🇳     │ Keep Track of Your Coding Time                                                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ [🔥 3 day streak]│ Today: 43m 27s logged (Python, JS, Rust, etc.) using Neovim &amp;amp; VSCode             │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│                  ├──────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ &amp;gt; [Home]         │ [Date: All Time ▾] [Project: All ▾] [Lang: All ▾] [OS: All ▾] [Editor: All ▾]    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   Projects       ├──────────────┬──────────────┬──────────────┬──────────────┬──────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   Settings       │ TOTAL TIME   │ TOP PROJECT  │ TOP LANGUAGE │ TOP OS       │ TOP EDITOR           │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│                  │ 520h 34m     │ kasumi       │ Rust         │ Linux        │ VSCode               │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│                  └──────────────┴──────────────┴──────────────┴──────────────┴──────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│                                                                                                     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ ┌─ Project Durations ────────────────────────────┐ ┌─ Languages ──────────────────────────────────┐ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ kasumi            ██████████████████ 31h 28m   │ │ Rust       ████████████░░░░░░░░░  38%        │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ skora-backend     ██████████████████ 31h 27m   │ │ Python     ████████░░░░░░░░░░░░░  22%        │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ stacksense        █████████████░░░░░ 22h 25m   │ │ Svelte     ████░░░░░░░░░░░░░░░░░  12%        │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ the-verse-...     ██████████░░░░░░░░ 19h 54m   │ │ C / Go     ███░░░░░░░░░░░░░░░░░░   8%        │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ desktop-editor    ████████░░░░░░░░░░ 16h 44m   │ │ Other      ██████░░░░░░░░░░░░░░░  20%        │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ └────────────────────────────────────────────────┘ └──────────────────────────────────────────────┘ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│                                                                                                     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ ┌─ Editors ──────────────────────────────────────┐ ┌─ Operating Systems ──────────────────────────┐ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ VSCode            ██████████████████  48%      │ │ Linux      ████████████████████  100%        │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Neovim            ██████████░░░░░░░░  28%      │ │                                              │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Zed / CLion       ████░░░░░░░░░░░░░░  14%      │ │                                              │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Godot / Other     ███░░░░░░░░░░░░░░░  10%      │ │                                              │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ └────────────────────────────────────────────────┘ └──────────────────────────────────────────────┘ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│                                                                                                     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ ┌─ Project Timeline (Stacked Weekly Activity) ────────────────────────────────────────────────────┐ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ 22h ┤  █                                                                                        │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ 16h ┤  █                                                                                        │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ 11h ┤  █    █         █                                                                         │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │  5h ┤  █    █    █    █    █    █    █                                      █                   │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │  0h ┴──┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴───────────  │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │       Jun15 Jun22 Jun29 Jul6 Jul13 Jul20 Jul27 Aug3 Aug10 Aug17 Aug24 Aug31                     │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ └─────────────────────────────────────────────────────────────────────────────────────────────────┘ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│                                                                                                     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ ┌─ Coding Rhythm (Activity Heatmap) ──────────────────────────────────────────────────────────────┐ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │      12AM    3AM    6AM    9AM   12PM    3PM    6PM    9PM                                      │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Mon  [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][■][■][■][■]                               │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Tue  [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][■][■][■]                               │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Wed  [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][■][■][■][■][■][■][■][■]                               │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Thu  [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][■][■][■]                               │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Fri  [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][■][■][■][■][■][■][■][■]                               │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Sat  [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][■][■][■][■][■][■][■][■][■][■]                               │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ Sun  [■][■][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][■][■][■][■][■][■]                               │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ └─────────────────────────────────────────────────────────────────────────────────────────────────┘ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│                                                                                                     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ ┌─ Today&amp;#39;s Goal ─────────────────────────────────┐ ┌─ AI vs Human Coding ─────────────────────────┐ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │               ╭─────────╮                      │ │ [AI 7%]                [Human Coding 93%]    │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │               │   73%   │                      │ │ ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░    │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │               ╰─────────╯                      │ │                                              │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ │ 27% below usual  |  Today: 43m / Usual: 59m    │ │ AI: 32h 15m (7%)   |   Human: 450h 58m (93%) │ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│ └────────────────────────────────────────────────┘ └──────────────────────────────────────────────┘ │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└─────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;current-progress&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#current-progress&quot; aria-label=&quot;Anchor link for: current-progress&quot;&gt;###&lt;/a&gt;Current Progress&lt;/h3&gt;
&lt;p&gt;Here is how the wireframe looks right now in the terminal:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/screenshots/hackatime-tui-1.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Diving into C++ as a Rust Developer</title>
          <pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://chish.is-a.dev/blogs/systems-vs-web/</link>
          <guid>https://chish.is-a.dev/blogs/systems-vs-web/</guid>
          <description xml:base="https://chish.is-a.dev/blogs/systems-vs-web/">&lt;p&gt;I recently decided to learn C++ alongside my Rust knowledge. My initial impression is that modern C++ (C++20/C++23) is much cleaner than the old legacy tutorials make it out to be.&lt;/p&gt;
&lt;h3 id=&quot;what-is-interesting-so-far&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-is-interesting-so-far&quot; aria-label=&quot;Anchor link for: what-is-interesting-so-far&quot;&gt;###&lt;/a&gt;What is interesting so far:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;References and Pointers:&lt;/strong&gt; In Rust, the compiler forces me to think about lifetimes constantly. In C++, I have to enforce those exact same rules in my head.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAII:&lt;/strong&gt; Resource Acquisition Is Initialization is basically how C++ handles cleaning up memory when variables go out of scope, which maps directly to Rust&#39;s &lt;code&gt;Drop&lt;/code&gt; trait.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I will be posting my progress here as I read Bjarne Stroustrup&#39;s &lt;em&gt;A Tour of C++&lt;/em&gt; and work on my custom heap allocator.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #E1E4E8; background-color: #24292E;&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;let&lt;/span&gt;&lt;span&gt; code&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #B392F0;&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; 64&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      </item>
    </channel>
</rss>
