<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2802075472139289461</id><updated>2026-07-12T15:00:57.004-07:00</updated><category term="Main"/><category term="Software"/><category term="Programming"/><category term="Linux"/><category term="Gadgets"/><category term="Web"/><category term="OSX"/><category term="Woodworking"/><category term="House"/><category term="Yahoo"/><category term="Video Games"/><category term="Google"/><category term="Recommendations"/><category term="Windows"/><category term="Firefox"/><category term="Go"/><category term="Golang"/><category term="Photography"/><category term="AI"/><category term="Anime"/><category term="Cooking"/><category term="Management"/><category term="DIY"/><category term="LLM"/><category term="Reading List"/><category term="Wing Chun"/><title type='text'>Lazy Hacker Babble</title><subtitle type='html'>Just some random babbling of a lazy hacker...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>LazyHacker</name><uri>http://www.blogger.com/profile/03264441996728050942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>563</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-1408111363485933644</id><published>2026-07-12T15:00:57.003-07:00</published><updated>2026-07-12T15:00:57.004-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>Fedora 44</title><content type='html'>&lt;p&gt;&amp;nbsp;A couple of weeks I installed Fedora 44 but not as an upgrade.&amp;nbsp; I had to do a clean new install because btrfs indicated there was a problem with the file system.&amp;nbsp; It became noticeable when a system backup was happening and it kept running into errors.&amp;nbsp; At one point, the system went into read-only mode (which was what btrfs will do when it runs into an issue).&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;On reboot, everything &quot;seemed&quot; okay and the hardware checks didn&#39;t reveal any issue with the drive.&amp;nbsp; However, the logs and btrfs&#39; health check indicated an error.&amp;nbsp; The suggestion was that it was safest to reformat the partition and reinstall everything and that&#39;s what I eventually did.&lt;/p&gt;&lt;p&gt;Fedora 44 worked without any problems and it was a quick install to get everything up-and-running again.&amp;nbsp; It gave me a chance to rework my install scripts and update them.&amp;nbsp; One package that was available in Fedora 43 for enabling Nvidia GPU access to containers were not available.&amp;nbsp; It seems like there&#39;s been issues trying to get it approved for Fedora 44 so because of that I didn&#39;t try do upgrade the other machines.&amp;nbsp; I&#39;ll see if the package will eventually get into the Fedora core package so I don&#39;t have to add the Copr repo just for that.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/1408111363485933644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/07/fedora-44.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1408111363485933644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1408111363485933644'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/07/fedora-44.html' title='Fedora 44'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-2868057991304900287</id><published>2026-07-05T23:36:09.045-07:00</published><updated>2026-07-06T00:15:52.258-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>ComfyUI in a Container</title><content type='html'>&lt;p&gt;Setting up &lt;a href=&quot;https://github.com/Comfy-Org/ComfyUI&quot;&gt;ComfyUI&lt;/a&gt; in a Podman container on Fedora Linux with a Nvidia GPU.&lt;/p&gt;&lt;h2&gt;Prepare Persistent Directories&lt;/h2&gt;&lt;p&gt;Create directories on your host machine to store your models, custom nodes, outputs, and user data. This ensures your configurations and large model files survive container restarts and updates.&lt;/p&gt;&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; overflow-x: auto; padding: 15px;&quot;&gt;&lt;code&gt;mkdir -p ~/comfyui/{models,custom_nodes,output,user}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Create the Container Image&lt;/h2&gt;&lt;p&gt;We will build a custom image based on Debian (&lt;code&gt;python:3.11-slim&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; We explicitly include the GNU C-compilers (&lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;g++&lt;/code&gt;) via &lt;code&gt;apt&lt;/code&gt;. This is required because the Triton library (used by PyTorch) needs to dynamically compile GPU kernels when ComfyUI starts. &lt;em&gt;Without them, Triton will throw a &lt;code&gt;0 active drivers&lt;/code&gt; error.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Create a file named &lt;code&gt;Containerfile&lt;/code&gt; in your current directory with the following contents:&lt;/p&gt;&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; overflow-x: auto; padding: 15px;&quot;&gt;# Use a slim Python 3.11 image as the base (Debian-based)
FROM python:3.11-slim

WORKDIR /app

# Install system dependencies (including C compilers for Triton and OpenGL for OpenCV)
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \
    git \
    libgl1 \
    libglib2.0-0 \
    gcc \
    g++ \
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*

# Clone the latest ComfyUI repository
RUN git clone https://github.com/comfyanonymous/ComfyUI.git .

# Install PyTorch with CUDA 13.0 support (Required for RTX 50-series)
RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130

# Install standard ComfyUI dependencies
RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8188

# Bind to 0.0.0.0 so the host network can access the web interface
CMD [&quot;python&quot;, &quot;main.py&quot;, &quot;--listen&quot;, &quot;0.0.0.0&quot;]&lt;/pre&gt;&lt;p&gt;Build the image using Podman:&lt;/p&gt;&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; overflow-x: auto; padding: 15px;&quot;&gt;&lt;code&gt;podman build -t comfyui-nvidia .&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Deploy the Container&lt;/h2&gt;&lt;p&gt;Run the container using the configuration below.&lt;/p&gt;&lt;p&gt;Critical Fedora-Specific Flags to &lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;--security-opt label=disable&lt;/code&gt;: This disables SELinux separation specifically for this container, preventing SELinux from blocking the execution of the injected Nvidia driver binaries (&lt;code&gt;libcuda.so&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;&lt;code&gt;:Z&lt;/code&gt; (on volume mounts): Instructs Podman to label the mounted host directories with a private unconfined SELinux context, allowing the container read/write access.&lt;/li&gt;&lt;/ul&gt;&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; overflow-x: auto; padding: 15px;&quot;&gt;&lt;code&gt;podman run -d \
  --name comfyui \
  --security-opt label=disable \
  --device nvidia.com/gpu=all \
  -p 8188:8188 \
  -v ~/comfyui/models:/app/models:Z \
  -v ~/comfyui/custom_nodes:/app/custom_nodes:Z \
  -v ~/comfyui/output:/app/output:Z \
  -v ~/comfyui/user:/app/user:Z \
  localhost/comfyui-nvidia&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Automate Firewall for Remote Access (Optional)&lt;/h2&gt;&lt;h2&gt;&lt;p style=&quot;font-size: medium; font-weight: 400;&quot;&gt;If you want to access ComfyUI from another device on your network, you must open port 8188 in Fedora&#39;s firewall. Instead of leaving the port open permanently, you can use a wrapper script that temporarily opens it when ComfyUI starts, and securely closes it when the container stops.&lt;/p&gt;&lt;p style=&quot;font-size: medium; font-weight: 400;&quot;&gt;Create a file named &lt;code&gt;start_comfyui.sh&lt;/code&gt;:&lt;/p&gt;&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; font-weight: 400; overflow-x: auto; padding: 15px;&quot;&gt;&lt;code&gt;&lt;span style=&quot;font-family: inherit; font-size: small;&quot;&gt;#!/bin/bash

echo &quot;Opening firewall port 8188...&quot;
sudo firewall-cmd --add-port=8188/tcp

echo &quot;Starting ComfyUI container...&quot;
# The --attach flag keeps the script running until the container is stopped
podman start --attach comfyui

echo &quot;Container stopped. Closing firewall port...&quot;
sudo firewall-cmd --remove-port=8188/tcp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;font-size: medium; font-weight: 400;&quot;&gt;Make the script executable and run it whenever you want to start your server for remote access:&lt;/p&gt;&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; font-weight: 400; overflow-x: auto; padding: 15px;&quot;&gt;&lt;code&gt;&lt;span style=&quot;font-family: inherit; font-size: small;&quot;&gt;chmod +x start_comfyui.sh
./start_comfyui.sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/h2&gt;&lt;h2&gt;Access and Day-to-Day Management&lt;/h2&gt;&lt;p&gt;Once deployed, you can access the ComfyUI web interface by opening your browser and navigating to:&lt;br /&gt;&lt;strong&gt;&lt;code&gt;http://localhost:8188&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(or your machine&#39;s local IP address if accessing from another device on the network).&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Useful Podman Commands&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Check Startup Logs:&lt;/strong&gt; Monitor the initialization process or kernel compilations:&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; margin-top: 5px; overflow-x: auto; padding: 10px;&quot;&gt;&lt;code&gt;podman logs -f comfyui&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Stop the Server:&lt;/strong&gt;&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; margin-top: 5px; overflow-x: auto; padding: 10px;&quot;&gt;&lt;code&gt;podman stop comfyui&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Start the Server:&lt;/strong&gt;&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; margin-top: 5px; overflow-x: auto; padding: 10px;&quot;&gt;&lt;code&gt;podman start comfyui&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clean up Disk Space:&lt;/strong&gt; After rebuilding images (e.g., updating ComfyUI in the future), run this to delete dangling, unnamed images and recover gigabytes of storage space:&lt;pre style=&quot;background: rgb(244, 244, 244); border-radius: 5px; margin-top: 5px; overflow-x: auto; padding: 10px;&quot;&gt;&lt;code&gt;podman image prune&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/2868057991304900287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/07/setup-comfyui-in-container-fedora.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/2868057991304900287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/2868057991304900287'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/07/setup-comfyui-in-container-fedora.html' title='ComfyUI in a Container'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-3467508817807813443</id><published>2026-07-03T11:50:14.364-07:00</published><updated>2026-07-03T11:50:14.365-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>How to Create a Windows 11 Bootable USB on Fedora Linux (Without Third-Party Apps)</title><content type='html'>&lt;p&gt;&amp;nbsp;Microsoft&#39;s Media Creation Tool is only for Windows so what happens if you&#39;re on Linux?&amp;nbsp; I didn&#39;t want to download another third party tool when I don&#39;t need to.&amp;nbsp; Fedora (and most Linux) had all the tools needed in the distribution to do this.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This &lt;a href=&quot;https://nixaid.com/archive/article/bootable-usb-windows-linux?era=ghost&quot;&gt;article&lt;/a&gt; tells you how to do it manually but I&#39;m lazy and wanted a script to do it and it is now available on &lt;a href=&quot;https://github.com/lazyhacker/create-windows-usb&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/3467508817807813443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/07/how-to-create-windows-11-bootable-usb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/3467508817807813443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/3467508817807813443'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/07/how-to-create-windows-11-bootable-usb.html' title='How to Create a Windows 11 Bootable USB on Fedora Linux (Without Third-Party Apps)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-6133441471703851291</id><published>2026-05-10T22:40:40.343-07:00</published><updated>2026-05-10T22:57:19.764-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OSX"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Alacritty with Terminus On MacOS</title><content type='html'>Getting Alacritty to render Terminus font nicely along with having those nice nerd font symbols on MacOS&amp;nbsp; turned out to be much more of a hassle then I ever expected it to be.&amp;nbsp; With iTerm2, it was simply a matter of installing the Terminess Nerd Font and disable anti-aliasing, but with Alacritty there&#39;s a lot more steps involved.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Installing Terminus&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Installing Terminus on MacOS can be done through Brew for both Terminus TTF and Terminess (the Nerd Font equivalent).&amp;nbsp; Make sure to do the following:&lt;/div&gt;&lt;div&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Go to Font Book and check that the fonts are all &lt;b&gt;activated&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Make sure you have the right family name and style as Alacritty is &lt;b&gt;case sensitive&lt;/b&gt; and both needs to be entered into the config exactly or Alacritty will give you a misleading error message.&lt;/li&gt;&lt;/ol&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Disabling Anti-Aliasing&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Terminus is a font that might look worse with anti-aliasing.&amp;nbsp; Both the Terminus TTF and Terminess did not look as clear and as sharp compared to what I&#39;m used to.&amp;nbsp; iTerm has a checkbox to turn it off but Alacritty requires you to do this from the OS:&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;defaults write org.alacritty AppleFontSmoothing -int 0&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;To turn it back on:&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;defaults delete org.alacritty AppleFontSmoothing&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Installing a Better Terminus&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alacritty couldn&#39;t render either of the above fonts very clearly.&amp;nbsp; On &lt;a href=&quot;https://www.programmingfonts.org/#terminus-consoleet&quot;&gt;programmingfonts.org&lt;/a&gt;, I found another Terminus font that looked nice on the browser called &lt;a href=&quot;https://inai.de/projects/consoleet/terminus&quot;&gt;Consoleet Terminus&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg5SWs1FApL11aYajp-eXmfJ5nqvZiPAL32FTGWUqvm23CFkyGS0vMEC3OajbzkP6z9kV87Y-TzwE_82Daz1dDcWdswDOwVOldA4jtmJmqncfda69UGdVuWJvUhjx7y6w7ldy7xnka-RmS-QfirAm-_owkUYP0xd7jzO3-80oCV-55uauHrTpRMUAkPlfY&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;640&quot; data-original-width=&quot;474&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg5SWs1FApL11aYajp-eXmfJ5nqvZiPAL32FTGWUqvm23CFkyGS0vMEC3OajbzkP6z9kV87Y-TzwE_82Daz1dDcWdswDOwVOldA4jtmJmqncfda69UGdVuWJvUhjx7y6w7ldy7xnka-RmS-QfirAm-_owkUYP0xd7jzO3-80oCV-55uauHrTpRMUAkPlfY=w297-h400&quot; width=&quot;297&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I installed it on to MacOS but getting Alacritty to recognize it had me pulling out my hair.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;[font]
size = 18.0
normal = { family = &quot;Consoleet Terminus-18&quot;, style = &quot;medium&quot; }
bold = { family = &quot;Consoleet Terminus-18&quot;, style = &quot;bold&quot; }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Notice what&#39;s unusual about the configuration that finally worked in Alacritty?&amp;nbsp; Some Terminus fonts don&#39;t have &quot;Regular&quot; styles and only define it as &quot;Medium&quot;.&amp;nbsp; In the case of Consoleet Terminus, the styles are all lowercase.&amp;nbsp; If it is capitalized (e.g. &quot;Medium&quot; instead of &quot;medium&quot;) then there will be an error.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I finally got the same nice looking terminal except it doesn&#39;t have those Nerd Font symbols.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;Installing Nerd Font Symbols&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On Linux, it is easy to tell it that if a font doesn&#39;t have a symbol to go to a fallback font that does have it and use that one.&amp;nbsp; MacOS doesn&#39;t allow that so I had to merge a font that has it into Consoleet Terminus.&amp;nbsp; The problem is that most fonts with the symbols are scalable while classic version of Terminus fonts (like Consoleet) are not.&amp;nbsp; &amp;nbsp;That&#39;s why you&#39;ll see individual font files for specific sizes.&amp;nbsp; In my case, the Consoleet em size is 36 units (ascent 30, descent 6) while Terminess will be 2048 — so the symbols are coming in roughly 56× too large.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following script got me the right numbers to use to figure out what size I need to extract:&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;#!/usr/local/bin/bash
SYMBOL_REGULAR=&quot;$HOME/Library/Fonts/TerminessNerdFont-Regular.ttf&quot;
SYMBOL_BOLD=&quot;$HOME/Library/Fonts/TerminessNerdFont-Bold.ttf&quot;
mkdir -p ~/merged-fonts

declare -A SYMBOL_MAP=(
  [/Library/Fonts/consoleet_ter18nr.otf]=&quot;$SYMBOL_REGULAR|medium&quot;
  [/Library/Fonts/consoleet_ter18br.otf]=&quot;$SYMBOL_BOLD|bold&quot;
)

for f in &quot;${!SYMBOL_MAP[@]}&quot;; do
  IFS=&#39;|&#39; read -r symbol style &amp;lt;&amp;lt;&amp;lt; &quot;${SYMBOL_MAP[$f]}&quot;
  name=$(basename &quot;$f&quot; .otf)
  family=&quot;Consoleet Terminus-18 Nerd&quot;
  psname=&quot;ConsoleetTerminus18Nerd-${style}&quot;
  fullname=&quot;${family} ${style}&quot;

  cat &amp;gt; /tmp/merge.pe &amp;lt;&amp;lt;EOF
Open(&quot;$f&quot;)
Print(&quot;Destination em: &quot; + \$em)
Print(&quot;Destination ascent: &quot; + \$ascent + &quot; descent: &quot; + \$descent)
\$dst_em = \$em
\$dst_ascent = \$ascent
\$dst_descent = \$descent

Open(&quot;$symbol&quot;)
Print(&quot;Source em (before): &quot; + \$em)
ScaleToEm(\$dst_ascent, \$dst_descent)
Print(&quot;Source em (after): &quot; + \$em)
Generate(&quot;/tmp/scaled_symbol.ttf&quot;)
Close()

MergeFonts(&quot;/tmp/scaled_symbol.ttf&quot;)
SetFontNames(&quot;$psname&quot;, &quot;$family&quot;, &quot;$fullname&quot;, &quot;$style&quot;)
Generate(&quot;$HOME/merged-fonts/${name}-merged.otf&quot;)
EOF
  fontforge -script /tmp/merge.pe&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Then with the results, update the script to create the merged fonts:&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;#!/usr/local/bin/bash
SYMBOL_REGULAR=&quot;$HOME/Library/Fonts/TerminessNerdFont-Regular.ttf&quot;
SYMBOL_BOLD=&quot;$HOME/Library/Fonts/TerminessNerdFont-Bold.ttf&quot;
mkdir -p ~/merged-fonts

declare -A SYMBOL_MAP=(
  [/Library/Fonts/consoleet_ter18nr.otf]=&quot;$SYMBOL_REGULAR|medium&quot;
  [/Library/Fonts/consoleet_ter18br.otf]=&quot;$SYMBOL_BOLD|bold&quot;
)

for f in &quot;${!SYMBOL_MAP[@]}&quot;; do
  IFS=&#39;|&#39; read -r symbol style &amp;lt;&amp;lt;&amp;lt; &quot;${SYMBOL_MAP[$f]}&quot;
  name=$(basename &quot;$f&quot; .otf)
  family=&quot;Consoleet Terminus-18 Nerd&quot;
  psname=&quot;ConsoleetTerminus18Nerd-${style}&quot;
  fullname=&quot;${family} ${style}&quot;

  cat &amp;gt; /tmp/merge.pe &amp;lt;&amp;lt;EOF
Open(&quot;$f&quot;)
dst_ascent = \$ascent
dst_descent = \$descent
Print(&quot;Destination em: &quot; + \$em + &quot; ascent: &quot; + dst_ascent + &quot; descent: &quot; + dst_descent)

Open(&quot;$symbol&quot;)
Print(&quot;Source em (before): &quot; + \$em)
ScaleToEm(dst_ascent, dst_descent)
Print(&quot;Source em (after): &quot; + \$em)
Generate(&quot;/tmp/scaled_symbol.ttf&quot;)
Close()

Open(&quot;$f&quot;)
MergeFonts(&quot;/tmp/scaled_symbol.ttf&quot;)
SetFontNames(&quot;$psname&quot;, &quot;$family&quot;, &quot;$fullname&quot;, &quot;$style&quot;)
Generate(&quot;$HOME/merged-fonts/${name}-merged.otf&quot;)
EOF
  fontforge -script /tmp/merge.pe
Done&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Once the script is run, validate it first:&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;fc-scan --format &quot;%{family}\n%{fullname}\n%{postscriptname}\n%{style}\n&quot; ~/merged-fonts/consoleet_ter18nr-merged.otf
fc-scan --format &quot;%{family}\n%{fullname}\n%{postscriptname}\n%{style}\n&quot; ~/merged-fonts/consoleet_ter18br-merged.otf&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;If there are no errors then install and validate:&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;cp ~/merged-fonts/consoleet_ter18*-merged.otf ~/Library/Fonts/
fc-match &quot;Consoleet Terminus\-18 Nerd&quot;
fc-match &quot;Consoleet Terminus\-18 Nerd:style=bold&quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Your final alacritty.conf file will be:&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;[font]
size = 18.0
normal = { family = &quot;Consoleet Terminus-18 Nerd&quot;, style = &quot;medium&quot; }
bold = { family = &quot;Consoleet Terminus-18 Nerd&quot;, style = &quot;bold&quot; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Restart Alacritty.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/6133441471703851291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/05/alacritty-with-terminus-on-macos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/6133441471703851291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/6133441471703851291'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/05/alacritty-with-terminus-on-macos.html' title='Alacritty with Terminus On MacOS'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEg5SWs1FApL11aYajp-eXmfJ5nqvZiPAL32FTGWUqvm23CFkyGS0vMEC3OajbzkP6z9kV87Y-TzwE_82Daz1dDcWdswDOwVOldA4jtmJmqncfda69UGdVuWJvUhjx7y6w7ldy7xnka-RmS-QfirAm-_owkUYP0xd7jzO3-80oCV-55uauHrTpRMUAkPlfY=s72-w297-h400-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-561330139266635470</id><published>2026-05-04T22:17:54.558-07:00</published><updated>2026-05-04T22:17:54.558-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gadgets"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><title type='text'>Chrome and Fedora Crashes With Multi-Monitor Setup</title><content type='html'>&lt;p&gt;&amp;nbsp;I&#39;ve noticed with more frequency that after waking from sleep, Chrome or some of its tabs will crash.&amp;nbsp; It can happen immediately or shortly after.&amp;nbsp; A kernel crash or system freeze&amp;nbsp; happens less frequently but is more disruptive when they happen.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgg8t2T5VZLWFZC6dhuPXgwE_UnN8IFyXJCQ6Zg4mdQCQ0v5iHgyrmn2uGjNAM42w3ESLOYn5FoxgZqgEU6Z6JovppLb5xew9gZeMsomYTMGXYa-mcOCw6Y415PQKy23LfMEa8NZparcYQp5bYDNzIBI1zvyJoQ-CBWW2eKMEPCZvGiijVALLle3qEG_ZA&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;423&quot; data-original-width=&quot;640&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgg8t2T5VZLWFZC6dhuPXgwE_UnN8IFyXJCQ6Zg4mdQCQ0v5iHgyrmn2uGjNAM42w3ESLOYn5FoxgZqgEU6Z6JovppLb5xew9gZeMsomYTMGXYa-mcOCw6Y415PQKy23LfMEa8NZparcYQp5bYDNzIBI1zvyJoQ-CBWW2eKMEPCZvGiijVALLle3qEG_ZA&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is happening on my main system that has 3 monitors (2 are 120Hz), an AMD CPU with integrated graphics and a discrete Nvidia GPU.&amp;nbsp; The monitors are connected to the motherboard (1 HDMI and 2 DisplayPort that are daisy-chained) rather than to the discrete graphics so I can preserve as much VRAM for LLM inference.&lt;p&gt;&lt;/p&gt;&lt;p&gt;Initially, I though the culprit was the Nvidia driver since the most common responses on the Internet mention them.&amp;nbsp; The next most common response was to turn off hardware acceleration in Chrome.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;chrome://gpu &lt;/b&gt;revealed that the iGPU was only being allocated 512MB of memory which not enough with a multi-monitor setup.&amp;nbsp; This was being automatically set in the BIOS so I changed the UMA Frame Buffer Size (Found under NB Configuration)&amp;nbsp; to 1GB.&lt;/p&gt;&lt;p&gt;Next, Chrome showed it knew there are two graphics option so this tells it to almost use the integrated graphics.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&lt;i&gt;google-chrome-stable --disable-gpu-driver-bug-workarounds --gpu-testing-vendor-id=&amp;lt;vendor id&amp;gt; --gpu-testing-device-id=&amp;lt;device id&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;There are some settings for the Nvidia card that might also improve stability.&amp;nbsp; Edit &lt;b&gt;/etc/modprobe.d/nvidia.conf&lt;/b&gt;&amp;nbsp;and add the following settings&amp;nbsp;might improve stability but might also slow waking up:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;options nvidia &quot;NVreg_PreserveVideoMemoryAllocations=1&quot;
options nvidia &quot;NVreg_TemporaryFilePath=/var/tmp&quot;
options nvidia &quot;NVreg_EnableS0ixPowerManagement=1&quot;
options nvidia &quot;NVreg_PreserveVideoMemoryAllocations=1&quot;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/pre&gt;&lt;p&gt;To make sure the system leverage these values:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&lt;i&gt;sudo dracut -f 
sudo reboot&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;i&gt;Tip: Restart the Cinnamon process without losing your open windows by pressing &lt;code data-index-in-node=&quot;200&quot; data-path-to-node=&quot;20&quot;&gt;Alt + F2&lt;/code&gt;, typing &lt;code data-index-in-node=&quot;217&quot; data-path-to-node=&quot;20&quot;&gt;r&lt;/code&gt;, and hitting &lt;code data-index-in-node=&quot;232&quot; data-path-to-node=&quot;20&quot;&gt;Enter&lt;/code&gt;&lt;/i&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/561330139266635470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/05/chrome-and-fedora-crashes-with-multi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/561330139266635470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/561330139266635470'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/05/chrome-and-fedora-crashes-with-multi.html' title='Chrome and Fedora Crashes With Multi-Monitor Setup'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgg8t2T5VZLWFZC6dhuPXgwE_UnN8IFyXJCQ6Zg4mdQCQ0v5iHgyrmn2uGjNAM42w3ESLOYn5FoxgZqgEU6Z6JovppLb5xew9gZeMsomYTMGXYa-mcOCw6Y415PQKy23LfMEa8NZparcYQp5bYDNzIBI1zvyJoQ-CBWW2eKMEPCZvGiijVALLle3qEG_ZA=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-1747109850299559043</id><published>2026-04-19T17:38:00.000-07:00</published><updated>2026-04-19T17:38:32.039-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>Fedora 42 to 43</title><content type='html'>&lt;p&gt;&amp;nbsp;Time to do another &lt;a href=&quot;https://docs.fedoraproject.org/en-US/quick-docs/upgrading-fedora-offline/&quot;&gt;upgrade of Fedora&lt;/a&gt; (from 42 to 43).&amp;nbsp; I didn&#39;t find any immediate issue with the upgrade so nothing to report.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/1747109850299559043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/04/fedora-42-to-43.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1747109850299559043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1747109850299559043'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/04/fedora-42-to-43.html' title='Fedora 42 to 43'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-3280097110182839506</id><published>2026-04-10T22:31:00.000-07:00</published><updated>2026-04-10T22:31:35.326-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>CLI and Terminal utilities</title><content type='html'>&lt;p&gt;&amp;nbsp;Recent developments with AI has brought renewed interest in command line tools and terminal apps.&amp;nbsp; Linux had always had a rich collection of CLI utilities, but I wanted to check out what new options are now available.&amp;nbsp; This is my running list of things I&#39;ve found interesting but haven&#39;t spent enough time for me to recommend it on my tools page.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/charmbracelet/glow&quot;&gt;Glow&lt;/a&gt; - a terminal markdown viewer written in Go.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/jesseduffield/lazygit&quot;&gt;LazyGit&lt;/a&gt; - terminal UI for Git written in Go.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/hpjansson/chafa&quot;&gt;Chafa&lt;/a&gt; - view images in the terminal written in C.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ys-l/csvlens&quot;&gt;cvslens&lt;/a&gt; - terminal viewer of CSV files written in Rust&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/3280097110182839506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/04/cli-and-terminal-utilities.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/3280097110182839506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/3280097110182839506'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/04/cli-and-terminal-utilities.html' title='CLI and Terminal utilities'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-6559627682728900765</id><published>2026-04-07T17:04:00.000-07:00</published><updated>2026-04-07T17:04:05.446-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OSX"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Aerospace, Sketchybar, Jankyborders to Make OSX Workable</title><content type='html'>&lt;p&gt;I&#39;ve been using a combination of a Linux and ChromeOS as my work laptops, but my current job now has me using a Macbook Pro which I haven&#39;t touched in over 10 years.&amp;nbsp; A combination of the way OSX behaves and the workflow necessary for my particular work environment (Slack, Outlook, Claude Code, etc.) made me realize that I really needed to configure it if I expect to have a half decent work experience.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZTpX2aZVtCSgeqApvYSFm8yERuD8bOJ2rvqelocxcuucmTVxSo-QfVEf_NbbG7ufPL6XIpJ4JAJ0PkMiKCtwEaWC2pqcUoDFQ-EKYRQbCWXKj7PSotHK6tNzQD_typySPgyaLpv_8vv4IkuVmurxgjzcV4zFsde3JMpim4ljgWtigV9KpXr_VZM5Tq8w/s3431/aerospace.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2156&quot; data-original-width=&quot;3431&quot; height=&quot;251&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZTpX2aZVtCSgeqApvYSFm8yERuD8bOJ2rvqelocxcuucmTVxSo-QfVEf_NbbG7ufPL6XIpJ4JAJ0PkMiKCtwEaWC2pqcUoDFQ-EKYRQbCWXKj7PSotHK6tNzQD_typySPgyaLpv_8vv4IkuVmurxgjzcV4zFsde3JMpim4ljgWtigV9KpXr_VZM5Tq8w/w400-h251/aerospace.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Aerospace Windows Manager&lt;/h2&gt;&lt;p&gt;With the sheer number of different windows (apps and many browser windows), I couldn&#39;t function with a floating windows manager.&amp;nbsp; OSX&#39;s spaces/Mission Control was not effective in taming the chaos so I decided to use &lt;a href=&quot;https://github.com/nikitabobko/AeroSpace&quot;&gt;Aerospace&lt;/a&gt;, a tiling windows manager influenced by i3wm.&amp;nbsp; With Aerospace, having one application per workspace is much more intuitive and natural because of how well it&#39;s shortcuts are integrated with it.&amp;nbsp; It was almost instinctive to have my browser windows in the B workspace because the shortcut to it is simply Alt-B and Aerospace allowed you to configure so that whenever a browser window is opened that it can automatically put in the B workspace.&amp;nbsp; Along with not having all the gazillions windows overlapping each other was enough for me to use it, but the additional features, programmability and keyboard friendliness made it even more worth while for me to adopt it.&lt;/p&gt;&lt;h2&gt;SketchyBar&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/felixkratz/sketchybar&quot;&gt;SketchyBar&lt;/a&gt; is a nice complement to Aerospace.&amp;nbsp; It&#39;s a programmable OSX menu replacement, but I have it running vertically exclusively for Aerospace where it shows the Aerospace workspaces and what is running in each workspace.&lt;/p&gt;&lt;h2&gt;JankyBorders&lt;/h2&gt;&lt;p&gt;When there are multiple windows in one workspace, sometimes it wasn&#39;t obvious which was the active window.&amp;nbsp; &lt;a href=&quot;https://github.com/FelixKratz/JankyBorders&quot;&gt;JankyBorders&lt;/a&gt; is an utility program that draws a more visible border around the active window to make it more easily identifiable.&lt;/p&gt;&lt;h2&gt;Integrating Aerospace, SketchyBar and JankyBorders&lt;/h2&gt;&lt;p&gt;AeroSpace and JankyBoarder complements each other and doesn&#39;t exactly require integration but since Aerospace can be configured to run external programs as part of its startup it is simple to simply have Aerospace launch JankyBorder.&lt;/p&gt;&lt;p&gt;Integrating Aerospace and SketchyBar took a little more effort but the basic steps are:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;[Aerospace] Have Aerospace start SketchyBar.&lt;/li&gt;&lt;li&gt;[Aerospace] Tell Aerospace that whenever there is a chance to a workspace that it should call SketchyBar to tell it of an event change and pass along the workspace that is in focus.&lt;/li&gt;&lt;li&gt;[SketchyBar] Set its config file (~/config/sketchybar/sketchybarrc) to call Aerospace&#39;s command line app to get the active workspaces and apps in each workspace to be added to the SketchyBar menu.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;My &lt;a href=&quot;https://github.com/lazyhacker/dotfiles/blob/master/aerospace.toml&quot;&gt;~/.aerospace.toml&lt;/a&gt; and &lt;a href=&quot;https://github.com/lazyhacker/dotfiles/tree/master/sketchybar&quot;&gt;~/.config/sketchybar/[sketchybarrc | aerospace.sh]&lt;/a&gt; can be found on Github.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/6559627682728900765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/04/aerospace-sketchybar-jankyborders-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/6559627682728900765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/6559627682728900765'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/04/aerospace-sketchybar-jankyborders-to.html' title='Aerospace, Sketchybar, Jankyborders to Make OSX Workable'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZTpX2aZVtCSgeqApvYSFm8yERuD8bOJ2rvqelocxcuucmTVxSo-QfVEf_NbbG7ufPL6XIpJ4JAJ0PkMiKCtwEaWC2pqcUoDFQ-EKYRQbCWXKj7PSotHK6tNzQD_typySPgyaLpv_8vv4IkuVmurxgjzcV4zFsde3JMpim4ljgWtigV9KpXr_VZM5Tq8w/s72-w400-h251-c/aerospace.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-2894004448077775862</id><published>2026-02-28T16:14:00.000-08:00</published><updated>2026-02-28T17:22:17.017-08:00</updated><title type='text'>The &#39;25 Chicago Bears Season</title><content type='html'>&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhgqkdtnaxIZ7BH7F4sOKWikYpcmzDLtxF6fBRvZBmosTZyDZKZ9xg5jt_9eeOYTX6kwjKIgr4dbV_FCzMNJU3wgcLIKf3Xt1wUZQUMP856JS_zvBss0KDj3-7ZtUH0VDEhPschVQBDlK75Wp31kHKsUunRMMKTfuzgW6yZNNIqeeFs_I279ak4cYG1T8w&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Chicago Bears have not been a very good football team for years. The team suffered from collapses, inability to score on offense (traditionally relied on defense), poor coaching and a host of issues on the field.&amp;nbsp; Against our rivals, The Green Bay Packers we&#39;ve suffered from late game collapse or just have not been competitive.&amp;nbsp; Playoff hopes often ended before the mid-point of the season.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;This all came to head in &#39;24 season.&amp;nbsp; After starting out well at 4-2, a loss on a l&lt;a href=&quot;https://www.youtube.com/watch?v=eRt-eMZWmm4&quot;&gt;ast second Hail Mary play to the Washington Commanders&lt;/a&gt; started team on an embarrassing 10-game losing streak that included seem them being dominated, playing like amateurs on the field, and multiple epic collapses.&amp;nbsp; The &#39;24 season epitomizes the same old Bears moniker.&amp;nbsp; This was made all the more frustrating by the hope the fan base had with the number 1 overall pick of QB Caleb Williams and the #9&amp;nbsp; pick WR Rome Odunze.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;During this period:&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;The Bears lost to the Packers on a&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=_EPwlIqg6fA&quot;&gt;blocked field goal&lt;/a&gt; which came a week after another&amp;nbsp;&lt;a href=&quot;https://www.espn.com/nfl/story/_/id/42592753/bears-kicker-cairo-santos-accepts-blame-stink-blocks&quot;&gt;field goal was blocked by the Vikings&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Botched on clock management against the Lions.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;The one saving grace was that they beat the Packers on the last game of the season with, of all things, a&lt;a href=&quot;https://www.youtube.com/watch?v=DmA08lBOa68&quot;&gt; field goal by Carlos Santos &lt;/a&gt;as time expired.&amp;nbsp; That last win would carry the fan base through the entire off-season.&amp;nbsp; It was such a wonderful game for the Bears that the &lt;a href=&quot;https://www.youtube.com/watch?v=xYxSxA-rcLk&quot;&gt;NFL uploaded the entire game&lt;/a&gt; to sustain the fans through the off season.&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;The 2025 Chicago Bears Season&lt;/h2&gt;&lt;h2 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhXg-VqMY0FrfuvjjPfW2cDNs5bFLBnOPrRFmUxfo8EqvM-M8EcNcp7Wvprost0ZiDQG9cnqFFS8JgKfuBXnHX8Oyk7h8qgxia4JnE2jQprs64LzAd55QRTdvVrhZdFZ7GpsT34PunhfUjbXrMXuRwBB8M5tQztd-kbzlW-NqmRmNxjDVo9oeqBBJMlpAM&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhXg-VqMY0FrfuvjjPfW2cDNs5bFLBnOPrRFmUxfo8EqvM-M8EcNcp7Wvprost0ZiDQG9cnqFFS8JgKfuBXnHX8Oyk7h8qgxia4JnE2jQprs64LzAd55QRTdvVrhZdFZ7GpsT34PunhfUjbXrMXuRwBB8M5tQztd-kbzlW-NqmRmNxjDVo9oeqBBJMlpAM&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/h2&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Now comes the &#39;25 season.&amp;nbsp; The Bears landed new head coach, Ben Johnson, which was by-far the biggest news for the Bears.&amp;nbsp; &amp;nbsp;Some off-season signings addressing the O-line (a heavily criticized weakness through the previous season) gave some sparks of optimism, but lingering concerns about the Bears were still there.&amp;nbsp; Caleb Williams was called a bust, the draft choices were met with skepticism, and doubts about the front office and the organization continued the narrative of &quot;how are the Bears going to screw it up this time?&quot;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Long time Bears fans, like any fan, always had a large vat of hope-ium but truly most fans are probably just praying (Da Pope, if you&#39;re listening) for a season of growth in in Ben Johnson&#39;s first year (&quot;we&#39;d be great if we reach 6-11 and show that we&#39;re competitive&quot;).&amp;nbsp; &amp;nbsp;Here is a fan base that have seen decades of futility and have been conditioned to avoid expecting too much&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi5ZiViFWqN--aCvqVyERU0IEubSrsr8e2d8f0LDdufyQr3NxtsTvWt7hXU93Omo-xTfoMkvvbznO_Yl5EO-m9esdqJSEAPCzvuorlBX6hCrw_xWfvSKpHAG5q6-WdiydbJ1rUA3ui7pWFaVAPPkp91iDBzTXgrgYffkOXa8Ijuec6ulnXsQ77viKdLLQc&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;124&quot; data-original-width=&quot;220&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi5ZiViFWqN--aCvqVyERU0IEubSrsr8e2d8f0LDdufyQr3NxtsTvWt7hXU93Omo-xTfoMkvvbznO_Yl5EO-m9esdqJSEAPCzvuorlBX6hCrw_xWfvSKpHAG5q6-WdiydbJ1rUA3ui7pWFaVAPPkp91iDBzTXgrgYffkOXa8Ijuec6ulnXsQ77viKdLLQc&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;With that, let&#39;s get into the season what was the &#39;25 Chicago Bears&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 1:&amp;nbsp; &lt;a href=&quot;https://youtu.be/LQUNYGKKxsM?si=FLiwUjattxsElRoc&quot;&gt;Minnesota Vikings vs Chicago Bears&lt;/a&gt;&amp;nbsp;(0-1)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;First game optimism.&amp;nbsp; Started out strong and getting fans excited to see the new Bears offense under Ben Johnson and initially it didn&#39;t disappoint with the Bears taking a 17-6 lead going into the the 4th quarter.&amp;nbsp; Fans felt positive seeing the growth they wanted to see, but in the 4th quarter JJ McCarthy lead the Vikings on multiple scoring drives to take a 27-17 at the 2:53 remaining mark.&amp;nbsp; 3 consecutive TDs that made the Bears look confused on defense and the Viking QB looking like the star that the Vikings was hoping for.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Caleb Williams came on the field and drove down the field with his arm and legs to deliver a TD with 2:02 remaining despite initially having a TD overturned as short of the goal line.&amp;nbsp; On the next play, the Bears easily scores.&amp;nbsp; &amp;nbsp;The Bears received one more possession with :02 seconds left but the Bears come out losing.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;This script is similar to the Bear&#39;s history with the exception that after giving up 3 straight TDs that the Bears responded with a TD of their own and didn&#39;t just call it in.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 2:&amp;nbsp; &lt;a href=&quot;https://youtu.be/aW1zg-Tcyl4?si=5kik30EdQ3fHzQpd&quot;&gt;Chicago Bears at Detroit Lions&lt;/a&gt;&amp;nbsp;(0-2)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Ben Johnson returns to Detroit after been their OC for the past few years.&amp;nbsp; The Lions destroyed the Bears winning 52 to 21.&amp;nbsp; Oh, oh.&amp;nbsp; This is the the Bears that fans feared.&amp;nbsp; This wasn&#39;t a shoot-out loss.&amp;nbsp; The Bears got crushed and the only non-Bears thing about it is that they scored 21 points on 3 offensive TDs.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Fans are feeling like the Bears are still the Bears.&amp;nbsp; The media is seconding guessing everything the Bears do.&amp;nbsp; Is Johnson over his head?&amp;nbsp; Is Caleb a bust?&amp;nbsp; The Bears have no defense (can&#39;t stop the run, opposing QBs come out each games very clean), can&#39;t protect their own QB and no run game themselves.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 3: &lt;a href=&quot;https://youtu.be/if1afRCR1jI?si=ofPlIVfsHVYvdCYJ&quot;&gt;Dallas Cowboys at Chicago Bears&lt;/a&gt;&amp;nbsp;(1-2)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Dallas comes into the game feeling good at 1-1 with their offense running as their fans hoped.&amp;nbsp; I&#39;m sure they were looking forward to coming to a game against a team that have given buckets of points and can&#39;t pressure the QB.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Instead, the Bears came out with a convincing 31-14 win that included shutting out the Cowboys in the second half.&amp;nbsp; Bears fans were happy but also knows that the team does give them a nugget or two per season so they have&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 4: Chicago Bears at Las Vegas Raiders (2-2)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Even by week 4, the Raider was not considered a good team but the Bears was only able to keep the game close.&amp;nbsp; Entering half time trailing 9-14 only after a third field with 53 seconds before the half, this was classic Bears.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The teams traded TDs in the third quarter which put the score at 16-21 and continued to trail 19-24 with 6:45 to go in the 4th.&amp;nbsp; The Bears took the lead with 1:34 remaining, but as familiar to most fans, their opponents marched down to field goal range.&amp;nbsp; Fans saw this happen plenty of time from both sides.&amp;nbsp; Either their opponents win the game on a field goal or the Bears will lose the game on missing or blocked field goals (per how they lost the previous year on consecutive weeks -- one being to the Packers).&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;But something very un-Bears-like happened this time.&amp;nbsp; The Bears &lt;a href=&quot;https://youtu.be/wGMK_VShUx0?si=jsSVhqif7olvjL7O&quot;&gt;blocked the field goal&lt;/a&gt; and preserved the &lt;a href=&quot;https://youtu.be/wGMK_VShUx0?si=jsSVhqif7olvjL7O&quot;&gt;25-24 win&lt;/a&gt;.&amp;nbsp; Alright, alright, Bears fans can be on the positive side of this show for a week!&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Bye Week&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Bears went into the bye week at 2-2 with lots of questions, but nobody thought there was anything special to this season.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 6: Chicago Bears at Washington Commanders (3-2)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Finally it is time to play the team that started the Bears on the 10-games downward spiral from last year.&amp;nbsp; &amp;nbsp;For Bears fans this wasn&#39;t any other game.&amp;nbsp; This was necessary to start shedding the ghost of last season and beyond.&amp;nbsp; The Bears jumped to a 13-0 lead and then to 16-10, but in the 3rd quarter the Commanders took the 17-16 lead.&amp;nbsp; The Bears&#39;s offense with a good drive that resulted in a BLOCKED field goal.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Commanders added another TD at the start of the fourth quarter for a 16-24 lead.&amp;nbsp; The Bears responded with a quick TD of their own with a big Caleb to Swift play.&amp;nbsp; The 2pt conversion failed so the Bears continued to trail 22-24 with 10:26 to go.&amp;nbsp; &lt;a href=&quot;https://youtu.be/gPQKhtRPkH8?si=z3h4X62aWR11Ba6A&quot;&gt;With 3:07 minutes to go, the Commanders fumbled a hand-off that was recovered by the Bears at the 44 yard line&lt;/a&gt;.&amp;nbsp; Relying mostly on the run, Caleb took the Bears down the field for a 38 yard FG attempt.&amp;nbsp; With their primary kicker out, Jake Moody, who just joined the team this week and was activated from the practice squad the same day, kicked the game winning field goal as time expired.&amp;nbsp; This is the same Jake Moody that the 49er&#39;s released because he missed big pressure kicks for them that came through in the wet and raining weather to seal the Bears&#39; second comeback victory when trailing in the 4th quarter.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 7 &lt;a href=&quot;https://youtu.be/KxzN3rcAlc8?si=xRfsnO7xcZWaUnIP&quot;&gt;New Orleans Saints at Chicago Bears&lt;/a&gt;&amp;nbsp;(4-2)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Saints visited the Bears for Week 7 resulting in a 26-14 win and a 4 game win streak.&amp;nbsp; The Saints were at the bottom of the standings at 1-6 so the Bears was expected to win this game at home.&amp;nbsp; During this win streak, the Bears have been getting turn-overs even though the overall defense still felt weak having given up plays while playing the bend-but-don&#39;t-break philosophy of defense.&amp;nbsp; The Bears run game has started establishing itself and the o-line has been protecting Caleb.&amp;nbsp; In this particular game, Caleb acknowledged he didn&#39;t play well but the overall team game was good and the Bears found themselves at 4-2 after starting 0-2.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 8 Chicago Bears at Baltimore Ravens (4-3)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Baltimore Ravens came to Soldier Field on a 4-game losing streak and a backup QB.&amp;nbsp; Despite their record, the Ravens are still a respected team so fans felt it would be a good time to take a measure of where the Bears are.&amp;nbsp; The Bears lost 16-30 so yeah, same &#39;ol Bears...&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 9 Chicago Bears at Cincinnati Bengals (5-3)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;A much needed bounce-back game, the Bears kept it close going into half time trailing 17-20 even though the Bengals started with a kickoff return TD and gave up another big TD play from backup QB Joe Flacco.&amp;nbsp; The Bears missed a field goal near the end of the half that would&#39;ve tied the game, but came out hot in the second half.&amp;nbsp; With just 4:53 left in the game, the Bears were up two TDs at 41-27, but over the course of around 4 minutes the Bengals were able to score 15 points (1 TD, 1 TD + 2pt conversion) to take the lead with 54 seconds remaining.&amp;nbsp; We&#39;re looking at a monumental collapse before our eyes and it brings back that there&#39;s no lead big enough for the Bears to lose.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;a href=&quot;https://youtu.be/xtuYBrBoipE?si=GVEcQVOglCKQuK0O&quot;&gt;Caleb took the field to lead a 4 plays 72 yard game winning drive in under a minute ending with a 58 yard TD pass to Colston Loveland&lt;/a&gt;.&amp;nbsp; This play and comeback was what everyone talks about and remembers but it needs to be remembered that the Bears was on the verge of a major collapse but Caleb settled the offense to go for a game winning drive which goes against the franchise history.&amp;nbsp;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The start of the Cardiac Bears.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 10 New York Giants at Chicago Bears (6-3)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Giants were a team in disarray at 2-7 but was able to get big plays and led 20-10 with 10:19 left in the 4th quarter.&amp;nbsp; By this time, the Bears were developing a reputation for getting turn-overs (even as their bend-don&#39;t-break style has given up big plays), offense able to make big plays, they have a run game and they are winning games because of Caleb Williams.&amp;nbsp; That said, the Bears haven&#39;t come back from being down 10 points in the 4th since 2021.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;With 3:56 left, Caleb throws a TD pass to Rome Odonze&amp;nbsp; to cut the lead to 3.&amp;nbsp; The defense played big with a sack to get the ball back to the offense.&amp;nbsp; Caleb took 1:06 to score a touchdown in 4 plays for 53 yards.&amp;nbsp; The defense sealed the victory and the Bears found themselves with a&lt;a href=&quot;https://youtu.be/Z2-hNJ7_fCg?si=N18sKYzm15QUCCfc&quot;&gt;nother comeback win in the 4th quarter&lt;/a&gt;.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 11 Chicago Bears at Minnesota Vikings (7-3)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;A rematch from week 1 had the Bears leading 16-3 going into the 4th quarter, but the Vikings scored 2 TDs in the 4th quarter to go up 16-17 with 50 seconds left.&amp;nbsp; On the ensuing kick-off, the special teams had a huge return.&amp;nbsp; Although Carlos Santos had missed a 45 yard FG earlier, he nails the 44 yard FG as time expires to give the Bears another come from behind win.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;At this point, the way the Bears are winning is starting to look special.&amp;nbsp; Unlike previous teams, this team does make big plays regularly especially in the 4th quarter.&amp;nbsp; This is coming from the air and on the ground.&amp;nbsp; While the defense is still suspected to play a whole game, they are able to somehow come up with turn-overs.&amp;nbsp; There is a confidence by the players AND the fans that the Bears are never out of the game.&amp;nbsp; The Bears are winning in what some might say in miraculous ways.&amp;nbsp; In this game, the Bears got that one special team right as they needed it most and won the game in 50 seconds.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;This game was Caleb Williams &lt;a href=&quot;https://youtu.be/SKrRiWiU3tE?si=lKd0eoSzUCq6AIpx&quot;&gt;5th fourth quarter comeback win&lt;/a&gt; of the season.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 12 Pittsburgh Steelers at Chicago Bears (8-3)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;With growing confidence in the team, Bears fans were hoping that Aaron Rodgers will be the QB for the Steelers as they visited Soldier Fields.&amp;nbsp; Rodgers, as the QB for the Packers, had dominated the Bears and he wasn&#39;t shy about telling the city of Chicago, the fans and Bears that he &quot;owned the Bears.&quot;&amp;nbsp; (Leave it on the field, Rodgers.&amp;nbsp; Try to stay classy if you can.)&amp;nbsp; Rodgers ended up not playing due to an injury.&amp;nbsp; The final score was Bear&#39;s 28-31 win and an 8-3 record.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 13 &lt;a href=&quot;https://youtu.be/XFCfHZ_Zpt4?si=jOf8xv1R7IGyMuK-&quot;&gt;Chicago Bears at Philadelphia Eagles&lt;/a&gt;&amp;nbsp;(9-3)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Doubters of the Bears were aplenty still despite winning 8 out of their 10 previous games.&amp;nbsp; People pointed out that the Bear&#39;s schedule was soft or that they were just &quot;lucky&quot; to have pulled out so many wins.&amp;nbsp; Finally, they said, the defending Superbowl Champions will show the world that the Bears are pretenders and not contenders.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Instead, the Bears ran the ball down the Eagles&#39; throat with 2 players rushing over 100 yards and finishing with 281 total yards on the ground.&amp;nbsp; The 24-15 win over the Eagles on Thanksgiving was convincing and put the Bears at 9-3 and atop of the NFC North.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Usually by now Bears fans have been looking towards the draft and not the NFC North standings.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 14 Chicago Bears at Green Bay Packers (9-4)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;While the world might have viewed the Eagles game as a benchmark for the Bears, Bears fans know that the true measure starts with beating the Packers.&amp;nbsp; &amp;nbsp;Although the win against the Packers in the last game of the 2024 season was satisfying, this is the first time the Ben Johnson Bears are facing the Packers.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Packers were comfortably leading 3-14 going into the half and still had a 10 point 11-21 lead with 2:10 left in the third quarter.&amp;nbsp; Unlike the Bears of old, this team fought back and tied the game up with 8:32 left in the fourth quarter.&amp;nbsp; The Packers put up another TD with 4:28 left and Bears fans felt something they haven&#39;t felt in a long time (or ever?).&amp;nbsp; They felt that Caleb was going to lead them to victory.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;a href=&quot;https://youtu.be/FxWTZy8Y6hs?si=L8RJgrHyc9bBiBiy&quot;&gt;Caleb made big plays, went 60 yards and with 22 seconds faced a fourth-and-1&lt;/a&gt;.&amp;nbsp; He took a shot at the end zone and was intercepted by the Packer&#39;s Nixon.&amp;nbsp; The Packers celebrated and took over the NFC North.&amp;nbsp; Packers fans were rejoicing and felt that all is right with the world now that they can look down on the Bears in the standings.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/pz0uO9zq-p8&quot; width=&quot;434&quot; youtube-src-id=&quot;pz0uO9zq-p8&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 15 Cleveland Browns at Chicago Bears (10-4)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Not letting themselves be let down, the Bears bounced back with a 31-3 win over the Browns.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 16 &lt;a href=&quot;https://www.youtube.com/watch?v=tnX85oZOV40&quot;&gt;Green Bay Packers at Chicago Bears&lt;/a&gt;&amp;nbsp;(11-4)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Wanting revenge for the loss at Green Bay just two weeks ago, the Bears came out with almost no energy.&amp;nbsp; The Bears were shutout at the half trailing 6-0 and although they managed a field goal and a fumble, the Packers added a touchdown and now trailed 13-6 going into the fourth quarter.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FzOLrsGW5DY&quot;&gt;The Bears and Packers traded field goals and with 3:04 left the Bears were only able to manage a field goal and still trailed the Packers 16-9&lt;/a&gt;.&amp;nbsp; Initial criticism on the field goal wasn&#39;t taking the FG but that the time it took to set it up took them a couple of seconds past the 2-minute warning and thus losing a critical time stoppage that the Bears needed for that slim chance to get the ball back before the game ends.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;So, with 1:59 left the Bears had to try an on-side kick.&amp;nbsp; If the Packers got the ball, the game was over.&amp;nbsp; There wouldn&#39;t be enough time for the Bears to get the ball back.&amp;nbsp; This is even too much to ask of the most optimistic of Bears fans, but these are the 2025 Cardiac Bears and they try every possession.&amp;nbsp; With a 8% chance of getting the onside kick, the &lt;a href=&quot;https://youtu.be/tnX85oZOV40?si=AaxKSl9DvgVCM0ZS&quot;&gt;Bears somehow was able to do it and gave Caleb 1:56 to get at least 7 points&lt;/a&gt;.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Caleb drives the Bears down to the red zone brimming with multiple big throws and catches, but finds himself facing 4th and 4 with 28 seconds left.&amp;nbsp; Not getting a first down meant the game was over.&amp;nbsp; The Packers broke through the line and forced Caleb to back pedal, he found a receiver in the corner of the end zone for a TD.&amp;nbsp; With the extra point, the Bears somehow manage to tie the game and send it into overtime.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;Starting with the ball, the Packers made a huge play to get into Bears territory.&amp;nbsp; On a big third-1 the Bears stopped the Packers.&amp;nbsp; On the ensuing 4th-and-1, the Packers fumble and turn the ball over on downs.&amp;nbsp; A few key plays brought the Bears to the Packers 45 and then Caleb went for the win with deep ball to DJ Moore who had Keishan Nixon draped all over him.&amp;nbsp; &lt;a href=&quot;https://youtu.be/qVv5qxwTeRw?si=x3y8Ola2AkkkIEMJ&quot;&gt;Bears win and regain the top of the NFC North&lt;/a&gt;.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;OT win over the Packers?!?&amp;nbsp; Who are these Bears?!?&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/53zQhmbyaiI&quot; width=&quot;465&quot; youtube-src-id=&quot;53zQhmbyaiI&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Iceman legend really grew with this win and it brought the kind of &lt;a href=&quot;https://www.youtube.com/watch?v=eqteP4BYJ0c&quot;&gt;game reaction from Packers fan&lt;/a&gt; that have been the hallmark of Bears fans for years.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 17 &lt;a href=&quot;https://www.youtube.com/watch?v=iReb07eggsY&quot;&gt;Chicago Bears at San Francisco 49ers&lt;/a&gt;. (11-5)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;In a battle for the top seed in the NFC, the Bears went toe-to-toe with the Niners (&lt;a href=&quot;https://www.youtube.com/watch?v=vGL_O7kEXQM&quot;&gt;Full Game&lt;/a&gt;). In another spectacular ending scenario and less than 2 minutes, Caleb Williams and his receivers made big plays especially with conversions on 4th downs to stay alive.&amp;nbsp; A trick play at the goal line fell just short of the goal resulting in having to quickly rush the plan with 4 seconds on the clock for a final shot.&amp;nbsp; Caleb showed the escape artist ability that he&#39;s been earning throughout this season but his final throw at the end zone fell short.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;I&#39;m sure many people thought that the Bears were going to win this one and the 49er&#39;s must&#39;ve felt a sense of relief even though they didn&#39;t want to admit it with comments like &quot;they earned the win.&quot;&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Week 18 Detroit Lions at Chicago Bears (11-6)&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;After the Lions put up 52 on the Bears in week 2, this game ended with a Bears 19-16 loss to a 9-8 Lions team that was already eliminated from the playoffs.&amp;nbsp; The Bears had secured the NFC North and will be the #2 seed in the playoffs.&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;This was a game that saw the Lions jump to a 16-0 lead by halftime and then see the Bears fight back to tie the game at 16-16 including completing 2 2-pt conversions.&amp;nbsp; The Lion had the final possession and was able to win on a field goal with 1:41 remaining.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Playoffs Wildcard Round Green Bay Packers at Chicago Bears (Win)&lt;/h3&gt;&lt;div&gt;&lt;a href=&quot;https://youtu.be/6mEgeIgY1C4?si=wZ4Vk6gjqFeHOfFH&quot;&gt;A classic by the end of the game.&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhXg-VqMY0FrfuvjjPfW2cDNs5bFLBnOPrRFmUxfo8EqvM-M8EcNcp7Wvprost0ZiDQG9cnqFFS8JgKfuBXnHX8Oyk7h8qgxia4JnE2jQprs64LzAd55QRTdvVrhZdFZ7GpsT34PunhfUjbXrMXuRwBB8M5tQztd-kbzlW-NqmRmNxjDVo9oeqBBJMlpAM&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhgqkdtnaxIZ7BH7F4sOKWikYpcmzDLtxF6fBRvZBmosTZyDZKZ9xg5jt_9eeOYTX6kwjKIgr4dbV_FCzMNJU3wgcLIKf3Xt1wUZQUMP856JS_zvBss0KDj3-7ZtUH0VDEhPschVQBDlK75Wp31kHKsUunRMMKTfuzgW6yZNNIqeeFs_I279ak4cYG1T8w&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Packers secure the 7th seed so that brought them to Soldier Field.&amp;nbsp; The Packers had stated that they preferred to have fallen to the 7th seed and play the Bears.&amp;nbsp; They got their wish.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;338&quot; src=&quot;https://www.youtube.com/embed/IBq8gQIrLsE&quot; width=&quot;464&quot; youtube-src-id=&quot;IBq8gQIrLsE&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;The Packers dominated the Bears through three quarters before the &lt;a href=&quot;https://www.youtube.com/watch?v=khFtx7_O2vY&quot;&gt;Bears stormed back &lt;/a&gt;with yet &lt;a href=&quot;https://youtu.be/nuDJV-rvswg?si=0_AVsBz-_66NVQgT&quot;&gt;another come from behind victory led by Caleb Williams.&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://youtu.be/tnX85oZOV40?si=MK3UNolFmMrkAshW&quot;&gt;The famous 4th-and-8&lt;/a&gt;&amp;nbsp;showed Caleb facing a 4th down that would be the last play of the game unless he can convert.&amp;nbsp; This played showed everything that made Caleb special: leadership under pressure, escaping from what would&#39;ve been a sack by every other QB and making the big play.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;This wasn&#39;t a typically comeback where the Bears got momentum and rode it to victory.&amp;nbsp; In the middle of their comeback, the Packers actually scored a TD.&amp;nbsp; It could&#39;ve been the momentum killer that ended many comebacks, but this Bears team were not deterred.&amp;nbsp; They just kept come back until they took the lead and won.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The emotions of both fan bases captured by Tom Grossi:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/KxT1UxLAy8o&quot; width=&quot;413&quot; youtube-src-id=&quot;KxT1UxLAy8o&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ZBUVq7Gl3HI&quot;&gt;Packers fans are not used to this &lt;/a&gt;against the Bears especially twice in the same season.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/XXeqDgi9EvI&quot; width=&quot;410&quot; youtube-src-id=&quot;XXeqDgi9EvI&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;&quot;&gt;It&#39;s hard to express the euphoria of Bears fans seeing their team beating the rival AND eliminating them from the playoffs.&lt;/p&gt;&lt;h3 style=&quot;line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;&quot;&gt;Playoffs Divisional Round Chicago Bears at Los Angeles Rams&lt;/h3&gt;&lt;div&gt;For most of the season, the Bears were viewed as being lucky more than good.&amp;nbsp; They were starting to get recognized for not being bad, but the national media did not consider them to be contenders.&amp;nbsp; They beat the Eagles and took on the 49ers until the final play.&amp;nbsp; Now they are facing eventual Superbowl Champs who have been viewed as one of the top teams all season.&amp;nbsp; In this game, the Bears showed they belonged.&amp;nbsp; Watching this game in a vacuum will have any observer think that they were two comparable teams capable of winning the game.&amp;nbsp; &lt;a href=&quot;https://www.youtube.com/watch?v=H-KJys_K15w&quot;&gt;Caleb had one of the most amazing throws in NFL playoffs history&lt;/a&gt; facing 4th down on the last play in regular to throw a TD to send the game to overtime.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: left;&quot;&gt;Recap&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Chicago Bears provided NFL fans the best games of the season and one that Bears fan will remember.&amp;nbsp; The Bears won games that was &lt;a href=&quot;https://www.youtube.com/watch?v=L5CmV0I22jE&quot;&gt;statistically not suppose to be possible&lt;/a&gt;&amp;nbsp;and this didn&#39;t include the game against the Rams.&amp;nbsp; The fans really love this team and just because they were winning.&amp;nbsp; I felt that the fans really liked the players of the teams.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=du27R7PN290&quot;&gt;Top 10 Offensive Plays&lt;/a&gt;&amp;nbsp;(team compilation).&amp;nbsp; The defense also had some amazing take-aways this year.&lt;/li&gt;&lt;li&gt;The NFL had &lt;a href=&quot;https://www.youtube.com/watch?v=bOGGoY4KLZo&quot;&gt;5 Bears play in their top 20 plays&lt;/a&gt; of the seasons including the #1.&lt;/li&gt;&lt;li&gt;Multiple Bears games were in the &lt;a href=&quot;https://www.youtube.com/watch?v=N3bVnOMTtcE&quot;&gt;top games of the season&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;NFL awarded DJ Moore&#39;s overtime TD catch against the Packers in week 17 the NFL Moment of the Year.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/2894004448077775862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/02/the-25-chicago-bears-season.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/2894004448077775862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/2894004448077775862'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/02/the-25-chicago-bears-season.html' title='The &#39;25 Chicago Bears Season'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhXg-VqMY0FrfuvjjPfW2cDNs5bFLBnOPrRFmUxfo8EqvM-M8EcNcp7Wvprost0ZiDQG9cnqFFS8JgKfuBXnHX8Oyk7h8qgxia4JnE2jQprs64LzAd55QRTdvVrhZdFZ7GpsT34PunhfUjbXrMXuRwBB8M5tQztd-kbzlW-NqmRmNxjDVo9oeqBBJMlpAM=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-5538607711166437265</id><published>2026-01-03T00:40:00.000-08:00</published><updated>2026-01-03T00:52:25.593-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Woodworking"/><title type='text'>Woodpecker Taper Sled</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div&gt;The &lt;a href=&quot;https://www.woodpeck.com/woodpeckers-taper-sled.html&quot;&gt;Woodpecker Taper Sled &lt;/a&gt;(not to be confused with their &lt;a href=&quot;https://www.woodpeck.com/precision-taper-jig.html&quot;&gt;taper jig&lt;/a&gt;) is not cheap at $220 before taxes and shipping.&amp;nbsp; The Internet is filled with guides on how to make cheap taper sleds from the most basic ones using just scraps and screws to very elaborate ones utilizing clamps, t-tracks, etc.&amp;nbsp; Most commercially available sleds seems to be about $100 (plus-or-minus $30). The Woodpecker Taper Sled is twice that price so is this another example of paying a brand name premium?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi9jF1TyA83rFGVD91ckdqKmay9wUZ7w8TpNEZ6JTdvyhWjhR-qOoIdobI8oVEAaDnozXYefjrCWVzPirLXf4FxqCocSYRGruL5cdY-B_gvHWEGfORwo1WmOSMXpOTRTFtcbdwITHtfOqnSyE1JuKc6zZEbqvlxdxRc6E4pZH-YCxfRan--FbyWX0V4I04&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1200&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi9jF1TyA83rFGVD91ckdqKmay9wUZ7w8TpNEZ6JTdvyhWjhR-qOoIdobI8oVEAaDnozXYefjrCWVzPirLXf4FxqCocSYRGruL5cdY-B_gvHWEGfORwo1WmOSMXpOTRTFtcbdwITHtfOqnSyE1JuKc6zZEbqvlxdxRc6E4pZH-YCxfRan--FbyWX0V4I04&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Compared to a DIY basic sled even a $100 commercial ones might be overpriced, but what about a more elaborate version that is reusable and adaptable similar to the commercial one?&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I decided to price out what it might cost me to build an similar sled to the Woodpecker sled:&lt;/div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Miter Bar ($30) - these wouldn&#39;t be as fancy as the ones Woodpecker use so it would require manual adjustments.&lt;/li&gt;&lt;li&gt;Jig Kit ($30) - I got lazy and didn&#39;t want to price out the specific knobs and bolts and would just buy a common kit with everything I&#39;d need.&amp;nbsp;&lt;/li&gt;&lt;li&gt;T-slot Bit ($40) - Woodpecker cut t-slots directly into the plywood rather than using T-tracks so I&#39;m estimating this is how much a t-slot bit will cost me.&lt;/li&gt;&lt;li&gt;Hold-down clamps ($16) - A pair of hold-downs are relatively cheap.&lt;/li&gt;&lt;li&gt;Fence ($20) - Woodpecker uses a steel knuckle fence that a Superstrut might be able to mostly mimic.&lt;/li&gt;&lt;li&gt;Plywood ($40) - Rough estimate based on a half sheet of 3/4&quot; plywood considering how prices have been fluctuating so much.&lt;/li&gt;&lt;li&gt;Mount Rack - Can be made from scraps but wouldn&#39;t be as nice as the steel hangers the sled comes with.&lt;/li&gt;&lt;li&gt;Non-slip surface (???) - might skip this as I don&#39;t know what this is.&lt;/li&gt;&lt;li&gt;Tape measure ($10)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The total comes to $186 with only the T-slot bit being usable beyond the sled.&amp;nbsp; That&#39;s only a $34 savings with some of the parts being downgrades (miter bar, fence, mount rack) and there&#39;s also the time and labor to consider.&amp;nbsp; The materials of the Woodpecker sled seems to be higher quality then what other commercial sleds comes with (e.g. the fence of most commercial sleds seems to be a straight piece of plywood, mdf or plastic) for what its worth.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;None of this information will give a general answer as to whether it&#39;s better to buy versus build.&amp;nbsp; If you get joy building jigs then I&#39;d recommend building your own.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you rather not build then it becomes whether the Woodpecker sled is twice as good as other commercial sleds.&amp;nbsp; I ultimately decided to go with the Woodpecker sled.&amp;nbsp; I previously built a very basic sled with just scraps and screws and it was okay.&amp;nbsp; I had &quot;build a complete taper sled&quot; on my todo list that I just kept putting off (thus labor time obviously is a factor in my case) and I like the &quot;extras&quot; that Woodpecker sled has: adjustable miter bar, steel fence, and mount-it rack.&amp;nbsp; These all added to its value above other commercial sleds.&amp;nbsp; The time and effort saved from building the jig was worth it for me.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/5538607711166437265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2026/01/woodpecker-taper-sled.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/5538607711166437265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/5538607711166437265'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2026/01/woodpecker-taper-sled.html' title='Woodpecker Taper Sled'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEi9jF1TyA83rFGVD91ckdqKmay9wUZ7w8TpNEZ6JTdvyhWjhR-qOoIdobI8oVEAaDnozXYefjrCWVzPirLXf4FxqCocSYRGruL5cdY-B_gvHWEGfORwo1WmOSMXpOTRTFtcbdwITHtfOqnSyE1JuKc6zZEbqvlxdxRc6E4pZH-YCxfRan--FbyWX0V4I04=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-1247171794921475485</id><published>2025-12-25T19:20:00.000-08:00</published><updated>2026-01-02T11:46:24.325-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DIY"/><category scheme="http://www.blogger.com/atom/ns#" term="Woodworking"/><title type='text'>Garage Shop Air Filter</title><content type='html'>&lt;p&gt;The &lt;a href=&quot;https://en.wikipedia.org/wiki/Corsi%E2%80%93Rosenthal_Box&quot;&gt;Corsi-Rosenthal Box&lt;/a&gt; is a DIY air purifier that uses HVAC filters and a simple box fan.&amp;nbsp; I originally built one during Covid and later moved it to my garage where I do my woodworking.&amp;nbsp; After having it on a cart for awhile, I decided to mount it from the ceiling where I plugged it into to a smart switch so I can turn it on/off with an app and where it doesn&#39;t take up floor space.&amp;nbsp; I also when from a 4 filter design to a 5 filter design.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifGl68CGBGfiGWCinBQJoXYpJ_WbfA4V-02BpuIFNJFUmwh6roKseiHHfmORLD1MJ-Ovx0XToYXxyOmHxaz2EZb_Z3AHc6t-O7mv-eKC1J7xd3ECN7mwZNL9a0ud8ODAeAnerJgkt8fgnARu5jQNACK26J55ATcJmDJ2e06jFMlTQVfxQu86UudpP7vWI/s2511/air-filter.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2511&quot; data-original-width=&quot;2148&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifGl68CGBGfiGWCinBQJoXYpJ_WbfA4V-02BpuIFNJFUmwh6roKseiHHfmORLD1MJ-Ovx0XToYXxyOmHxaz2EZb_Z3AHc6t-O7mv-eKC1J7xd3ECN7mwZNL9a0ud8ODAeAnerJgkt8fgnARu5jQNACK26J55ATcJmDJ2e06jFMlTQVfxQu86UudpP7vWI/s320/air-filter.jpg&quot; width=&quot;274&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;It&#39;s bigger then commercial air filters which goes from $100 to $800 so it&#39;s about the price of the cheapest commercial ones.&amp;nbsp; Performance-wise, research on Corsi-Rosenthal boxes has shown that they perform very well.&amp;nbsp; Making it just requires 4 or 5 filters, a box fan and tape.&lt;/p&gt;&lt;p&gt;For a garage shop, I don&#39;t need anything fancy.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/1247171794921475485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/12/shop-air-filter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1247171794921475485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1247171794921475485'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/12/shop-air-filter.html' title='Garage Shop Air Filter'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifGl68CGBGfiGWCinBQJoXYpJ_WbfA4V-02BpuIFNJFUmwh6roKseiHHfmORLD1MJ-Ovx0XToYXxyOmHxaz2EZb_Z3AHc6t-O7mv-eKC1J7xd3ECN7mwZNL9a0ud8ODAeAnerJgkt8fgnARu5jQNACK26J55ATcJmDJ2e06jFMlTQVfxQu86UudpP7vWI/s72-c/air-filter.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-7253459915369509842</id><published>2025-07-07T18:53:00.000-07:00</published><updated>2025-07-07T18:53:40.693-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DIY"/><category scheme="http://www.blogger.com/atom/ns#" term="Woodworking"/><title type='text'>Drill Press Table</title><content type='html'>&lt;p&gt;&amp;nbsp;After many, many years, I finally got around to building a drill press table.&amp;nbsp; The drill press was a tool that I thought that I&#39;d use frequently when I bought it but I found myself generally avoiding it instead.&amp;nbsp; I think it is because of the setup that was needed whenever I needed to use it particularly all the clamps that ended up getting used and trying to balance the work piece on the small round cast iron table that it comes with.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj96slHJFSON4E8vWrC4kTlm5VWcmrbTwokR3fBBx-TdWlG2QhU7DLIRETSJzUPFOsaura5pheTbo_YBCX-y8QV1UqqEl2NPS5vxD5VRru5Y2o4zUMFL_Czx6N-qNUIVtokXeqO45g43RWhL_aY6dyBuTUiBiIxKz_XTl4z06YPucMkSgHj04_MvQuXnrY/s4080/drillpresstable.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;4080&quot; data-original-width=&quot;3072&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj96slHJFSON4E8vWrC4kTlm5VWcmrbTwokR3fBBx-TdWlG2QhU7DLIRETSJzUPFOsaura5pheTbo_YBCX-y8QV1UqqEl2NPS5vxD5VRru5Y2o4zUMFL_Czx6N-qNUIVtokXeqO45g43RWhL_aY6dyBuTUiBiIxKz_XTl4z06YPucMkSgHj04_MvQuXnrY/s320/drillpresstable.jpg&quot; width=&quot;241&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The dimensions of the drill press table is 12&quot; deep by 24&quot; wide.&amp;nbsp; The thickness is 2 sheets of 3/4&quot; Baltic birch plywood since that&#39;s what I had on hand laminated together so there is enough thickness to allow for putting in the T-tracks used by the fence and hold-down clamps.&amp;nbsp; The fence 2 1/2&quot; tall and is made from the cutoffs that I had from the Baltic birch.&lt;/p&gt;&lt;p&gt;Two thing missing that is common on many DIY tables are tracks on the fence to allow for a stop block and having a replaceable sacrificial top area are that gets drilled in.&amp;nbsp; &amp;nbsp;I didn&#39;t have any extra T-Tracks for the stop block and I usually just use a scrap piece of wood and a clamp when I need one.&amp;nbsp; I plan to add the sacrificial piece when I chew into the current top to see what areas that would normally chew up.&lt;/p&gt;&lt;p&gt;For now, I&#39;ll see if having the table will make me use it more often.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/7253459915369509842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/07/drill-press-table.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/7253459915369509842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/7253459915369509842'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/07/drill-press-table.html' title='Drill Press Table'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj96slHJFSON4E8vWrC4kTlm5VWcmrbTwokR3fBBx-TdWlG2QhU7DLIRETSJzUPFOsaura5pheTbo_YBCX-y8QV1UqqEl2NPS5vxD5VRru5Y2o4zUMFL_Czx6N-qNUIVtokXeqO45g43RWhL_aY6dyBuTUiBiIxKz_XTl4z06YPucMkSgHj04_MvQuXnrY/s72-c/drillpresstable.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-8328229826242683135</id><published>2025-06-18T14:29:00.000-07:00</published><updated>2025-06-18T14:29:43.507-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Go"/><category scheme="http://www.blogger.com/atom/ns#" term="Golang"/><title type='text'>My Contribution to LLM Knowledge?</title><content type='html'>&lt;p&gt;When I first started to learn Go many years ago, I wrote a Wator simulation with Go&amp;nbsp;and uploaded the code to a Github repo.&amp;nbsp; A few months ago, I wanted to learn how to write a 2D game with graphics so I decided to do a new implementation of Wator using Go and Ebitengine.&lt;/p&gt;&lt;p&gt;There was a bug that I got stuck on and because LLMs are all the rage, I decided to ask Google&#39;s Gemini 1.5 to assist me.&amp;nbsp; Gemini generated some code output in response to my request but as I was looking at what it produced, it seemed awfully familiar.&amp;nbsp; I went back and looked at my old Wator code and sure enough it was very similar (including a bug that was in the original code).&amp;nbsp; When I asked Gemini for some of its sources for coming up with the answer it listed my repo as one of them.&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;Basically,&amp;nbsp; I asked an LLM a question and it responded with my own answer.&amp;nbsp; There weren&#39;t many examples of Wator in Go so it wasn&#39;t because I had written something great, but I still found it neat and funny this happened.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/8328229826242683135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/06/my-contribution-to-llm-knowledge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/8328229826242683135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/8328229826242683135'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/06/my-contribution-to-llm-knowledge.html' title='My Contribution to LLM Knowledge?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-2778046164289336558</id><published>2025-04-23T20:09:00.000-07:00</published><updated>2025-04-23T20:09:28.786-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Management"/><title type='text'>Why Big Companies Move Slow</title><content type='html'>&lt;div&gt;Big companies have resources, talent, and market reach, but compared to small start-ups with less resources, talent and reach they often seem to be slow and lumbering.&amp;nbsp; &amp;nbsp;Is this the inevitable result of becoming a large company?&amp;nbsp; Many companies are slow but in a different sense from the big-versus-small comparison.&amp;nbsp; Large company velocity takes into consideration &quot;scale&quot; and can still move nimbly and quickly within that context, but the complexity of scale often overwhelms the organization resulting in them becoming a slow and lumbering company.&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Scale&lt;/h2&gt;&lt;div&gt;To be fair to large companies, comparing launching something between a start-up and a large company isn&#39;t an apples-to-apples comparison because there&#39;s often a lot additional requirements placed on a companies that has reach a certain scale.&amp;nbsp; Some of these requirements come externally (e.g. government regulations) and some internally (existing user base, supporting existing infrastructure and use cases).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It isn&#39;t lost on the employees how cumbersome internal requirements can be:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/3t6L-FlfeaI&quot; width=&quot;320&quot; youtube-src-id=&quot;3t6L-FlfeaI&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having had to work on these systems, there are often valid reasons behind the requirements, but it can still be hair-pulling frustrating sometimes to have to consider all the additional requirements for what seems like a simple singular task.&amp;nbsp; Objectively, though, the team within the large company might have a higher velocity then a team in a small company because for a given feature A, one had 10 requirements to meet while the other only had 3.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This doesn&#39;t mean that big companies are not slower than start-ups because many big companies looses their nimbleness due to self-inflicted wounds because of the complexity of increased scale:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Complacency&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Hesitancy&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Bureaucracy&lt;/b&gt;: Navigating the corporate maze can feel like a full-time job (though, let&#39;s be real, some structure is necessary).&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Complacency&lt;/h2&gt;&lt;div&gt;The mantra of &quot;If it ain&#39;t broke, don&#39;t fix it.&quot; can take hold at large companies especially those that have had success.&amp;nbsp; This often comes from the top where the leadership is more comfortable keeping the status quo because things are going well and don&#39;t want to risk destabilizing the business.&amp;nbsp; This isn&#39;t limited to just mature companies but can happen with growth companies.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No matter if the decision to just stay the course is correct or not, if the sense of complacency from the top seeps into rank-and-file then the culture of complacency will take hold.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Hesitancy&lt;/h2&gt;&lt;div&gt;Fear stiles innovation and at large companies there can be a perception that more is at stake at both the company and individual levels.&amp;nbsp; This hesitancy occurs at all levels of the organization.&amp;nbsp; &amp;nbsp;The CEOs might fear how a change will impact their bottom line and individual might fear how it will affect their prospects at the company.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Bureaucracy&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;When a company grows (a good problem to have!), bureaucracy sets in but bureaucracy itself isn&#39;t a bad thing.&amp;nbsp; The truth is that when a company scales up it is going to become more complex and it will require organization.&amp;nbsp; A small 3 person start-up doesn&#39;t need any process to communicate effectively, but a 100 member engineering org will descend into chaos without some agreed upon method for working together.&amp;nbsp; Large companies often organically evolve into a matrix organization with defined roles and responsibilities, but fail to recognize the that they went from a single node to a graph of nodes.&amp;nbsp; Company leaders continue to try to optimize each node and they ignore the edges connecting the nodes.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Big companies will have more people who can handle things at the node level while it is mainly the leadership who can affect the edges.&amp;nbsp; The irony is that leadership often focus more on the nodes while their teams struggles to navigate through the edges.&amp;nbsp;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Possible Solutions&lt;/h2&gt;&lt;div&gt;So, how do we combat the corporate slow-down? While this isn&#39;t a complete solution, here are some strategies:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Embrace Small, Nimble Teams&lt;/b&gt;: Have small and empowered teams that can move nimbly.&amp;nbsp; Give the team autonomy to solve the problem which helps against complacency and hesitancy.&amp;nbsp; The small team also reduces need for a lot of process within the team for coordination.&amp;nbsp; It is key for leaders to communicate with them on expectations, be transparent and show trust and support.&amp;nbsp; Leaders should also focus on handling coordination between teams.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Provide a &quot;Guide&quot;&lt;/b&gt;: Shield engineering teams from excessive corporate overhead. Dedicated project managers (not just program managers who push the burden onto engineers) can handle the administrative load.&amp;nbsp; This is to address bureaucracy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Focus on External Competition&lt;/b&gt;: Internal rivalry is a distraction. Aim for external benchmarks.&amp;nbsp; This addresses complacency and hesitancy when there is an external opponent to focus on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Leadership Support&lt;/b&gt;: Leadership should recognize that they created a matrix for the org and the teams don&#39;t need help at the node level but the edge traversal.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Maintain Momentum&lt;/b&gt;: Long projects can drain morale. Celebrate small wins and define clear milestones.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Instill Urgency&lt;/b&gt;: Set targets based on external market realities, ensuring team buy-in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The key is to recognize that speed and agility aren&#39;t just startup perks. They&#39;re essential for any company that wants to thrive in today&#39;s fast-paced world. By addressing these challenges head-on, we can unlock the true potential of big companies and empower them to innovate at the speed of change.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/2778046164289336558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/04/why-big-companies-move-slow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/2778046164289336558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/2778046164289336558'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/04/why-big-companies-move-slow.html' title='Why Big Companies Move Slow'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/3t6L-FlfeaI/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-7314538168868376425</id><published>2025-03-25T22:50:00.000-07:00</published><updated>2025-03-27T11:04:36.462-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Why the Model Context Protocol (MCP) Is Confusing</title><content type='html'>
 &lt;p&gt;**Update 3/26/2025 **&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://openai.github.io/openai-agents-python/mcp/&quot;&gt;OpenAI added MCP support to their agent SDK&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------&lt;/p&gt;&lt;p&gt;
  On Nov. 25, 2024, Anthropic published a
  &lt;a href=&quot;https://www.anthropic.com/news/model-context-protocol&quot;&gt;
   blog post about the Model Context Protocol (MCP)
  &lt;/a&gt;
  .&amp;nbsp; It didn’t get too much attention at the time because it wasn’t an announcement of much significance.&amp;nbsp; Suddenly in 2025, MCP has gotten a lot of hype and attention and have also caused a lot of confusion as to why there are so many YouTube face talking about it.
 &lt;/p&gt;
 &lt;p&gt;
  It was nice that Anthropic published how they connect Claude with tools in the Claude Desktop app even if the post&amp;nbsp;was a bit of marketing to sell it as an standard and to encourage an open community.&amp;nbsp; There is a technical aspect (a protocol) to it, but it felt like it was a business play to get developers to extend Claude with plugins.
 &lt;/p&gt;
 &lt;p&gt;
  Large Language Models like Claude cannot perform any actions.&amp;nbsp; They’re like a brain with no body.&amp;nbsp; They might know that an email should be sent, but they can’t actually send the email.&amp;nbsp; To connect the “thought” (send email) with the action requires basic programming.&amp;nbsp; Using MCP is how Anthropic does it but it isn’t the only way.&amp;nbsp; Let’s take a look at various ways that this is accomplished and then see how MCP fits in.
 &lt;/p&gt;
 &lt;h2&gt;
  You Are the Agent
 &lt;/h2&gt;
 &lt;p&gt;
  In this scenario, a person goes to claude.ai and has a conversation with Claude about writing an email to invite someone to lunch.&amp;nbsp; Claude generates the email body letting the person know to copy it an email program to send.&amp;nbsp; The person manually copies that text into their email or calendar app and sends the invitation.&amp;nbsp; The person is the agent because they are performing the action.&lt;/p&gt;
 &lt;h2&gt;
  Using an AI Assistant
 &lt;/h2&gt;
 &lt;p&gt;
  Here, a person uses an app (this can be a web app, desktop app, mobile app, etc.) such as a personal assistant ala Jarvis from Iron Man.&amp;nbsp; The user asks Jarvis to send an email to invite someone for lunch.&amp;nbsp; Jarvis composes the invitation message and sends the invitation through a calendar app so that it also records the event on the calendar.&amp;nbsp; So how does Jarvis do this?
 &lt;/p&gt;
 &lt;h3&gt;
  Method 1
 &lt;/h3&gt;
 &lt;ol&gt;&lt;li&gt;Jarvis sends your question to LLM along with prompts describing available tool(s).&lt;/li&gt;&lt;li&gt;Jarvis looks at the response to determine what tools to use.&lt;/li&gt;&lt;li&gt;Jarvis executes the chosen tool(s) through the tool API&lt;/li&gt;&lt;li&gt;The results are sent back to LLM&lt;/li&gt;&lt;li&gt;LLM formulates a natural language response&lt;/li&gt;&lt;li&gt;The response is displayed to you!&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;
  In the early days (2023), this might be done like this:
 &lt;/p&gt;
 &lt;p&gt;
  The user speaks to Jarvis, “Jarvis, invite Thor to lunch next Wednesday.”
 &lt;/p&gt;
 &lt;p&gt;
  The Jarvis code passes the text to an LLM along with an additional prompt:
 &lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&lt;i&gt;Respond to the user, but if the request is to add to a calendar then respond in JSON:

  {
    Tool: “calendar”
    Invitee: name
    Date: date
    Time: time
    Body: message
  }&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&lt;/span&gt;
  &lt;/p&gt;
 &lt;/blockquote&gt;
 &lt;p&gt;
  The Jarvis program will get the response and if the response is a tool response it will parse the JSON and call the calendar API.&lt;/p&gt;
 &lt;p&gt;
  The Jarvis code calls the LLM again with the text, “tell the user that the invite was successfully sent” and then return the response to the user.&lt;/p&gt;
 &lt;h3&gt;
  Method 2
 &lt;/h3&gt;
 &lt;ol&gt;&lt;li&gt;Developer registers available tools&lt;/li&gt;&lt;li&gt;Jarvis sends your question to LLM&lt;/li&gt;&lt;li&gt;LLM analyzes the available tools and decides which one(s) to use&lt;/li&gt;&lt;li&gt;Jarvis executes the chosen tool(s) through the tool API&lt;/li&gt;&lt;li&gt;The results are sent back to LLM&lt;/li&gt;&lt;li&gt;LLM formulates a natural language response&lt;/li&gt;&lt;li&gt;The response is displayed to you!&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;
  An enhancement was added to many LLM’s API to allow developers to register tools, their purpose and parameters. The Jarvis code will register a tool called “calendar”, give it a description such as “Tool to add, update and remove user’s calendar.”, and what parameters it needed.
 &lt;/p&gt;
 &lt;p&gt;
  Now, when Jarvis passes “Jarvis, invite Thor to lunch next week,” to the LLM, it will respond with JSON and Jarvis can call the calendar API.&lt;/p&gt;
 &lt;p&gt;
  The Jarvis code calls the LLM again with the text, “tell the user that the invite was successfully sent” and then return the response to the user.&lt;/p&gt;
 &lt;h3&gt;
  Method 3 (MCP)
 &lt;/h3&gt;
 &lt;ol&gt;&lt;li&gt;User registers available tools.&lt;/li&gt;&lt;li&gt;Jarvis sends your question to Claude&lt;/li&gt;&lt;li&gt;Claude analyzes the available tools and decides which one(s) to use&lt;/li&gt;&lt;li&gt;Jarvis executes the chosen tool(s) through the MCP server who calls the tool API&lt;/li&gt;&lt;li&gt;The results are sent back to Claude&lt;/li&gt;&lt;li&gt;Claude formulates a natural language response&lt;/li&gt;&lt;li&gt;The response is displayed to you!&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;
  With MCP, the user (on desktop/mobile) or developer (on cloud) registers MCP servers with Jarvis.&amp;nbsp; Jarvis can then get the tools description from the MCP Server which it passes to the LLM.
 &lt;/p&gt;
 &lt;p&gt;
  When Jarvis passes “Jarvis, invite Thor to lunch next week,” to the LLM, the LLM will determine the tool to use.
 &lt;/p&gt;
 &lt;p&gt;
  Jarvis will then call the MCP server to send the calendar invite.
 &lt;/p&gt;
 &lt;p&gt;
  The Jarvis code calls the LLM again with the text, “tell the user that the invite was successfully sent” and then return the response to the user.&lt;/p&gt;
 &lt;h2&gt;
  Comparison
 &lt;/h2&gt;
 &lt;p&gt;
  With the MCP, tool registration is passed to the user and the tool description is handed off to the tool developer, but otherwise the steps remain the same.
 &lt;/p&gt;
 &lt;div align=&quot;left&quot; dir=&quot;ltr&quot; style=&quot;margin-left: 0pt;&quot;&gt;
  &lt;table style=&quot;border-collapse: collapse; border: none; table-layout: fixed; width: 468pt;&quot;&gt;
   &lt;tbody&gt;
    &lt;tr style=&quot;height: 0pt;&quot;&gt;
     &lt;td style=&quot;background-color: #4a86e8; border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;&quot;&gt;
      &lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
       &lt;span face=&quot;Arial,sans-serif&quot; style=&quot;background-color: transparent; color: white; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;&quot;&gt;
        Method 2
       &lt;/span&gt;
      &lt;/p&gt;
     &lt;/td&gt;
     &lt;td style=&quot;background-color: #4a86e8; border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;&quot;&gt;
      &lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
       &lt;span face=&quot;Arial,sans-serif&quot; style=&quot;background-color: transparent; color: white; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;&quot;&gt;
        Method 3
       &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;&quot;&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Developer registers available tools&lt;/li&gt;&lt;li&gt;Jarvis sends your question to LLM&lt;/li&gt;&lt;li&gt;LLM analyzes the available tools and decides which one(s) to use&lt;/li&gt;&lt;li&gt;Jarvis executes the chosen tool(s) through the tool API&lt;/li&gt;&lt;li&gt;The results are sent back to LLM&lt;/li&gt;&lt;li&gt;LLM formulates a natural language response&lt;/li&gt;&lt;li&gt;The response is displayed to you!&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
     &lt;/td&gt;
     &lt;td style=&quot;border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;&quot;&gt;
      &lt;div&gt;&lt;ol&gt;&lt;li&gt;User registers available tools.&lt;/li&gt;&lt;li&gt;Jarvis sends your question to Claude&lt;/li&gt;&lt;li&gt;Claude analyzes the available tools and decides which one(s) to use&lt;/li&gt;&lt;li&gt;Jarvis executes the chosen tool(s) through the MCP server who calls the tool API&lt;/li&gt;&lt;li&gt;The results are sent back to Claude&lt;/li&gt;&lt;li&gt;Claude formulates a natural language response&lt;/li&gt;&lt;li&gt;The response is displayed to you!&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
     &lt;/td&gt;
    &lt;/tr&gt;
   &lt;/tbody&gt;
  &lt;/table&gt;
 &lt;/div&gt;
 &lt;p&gt;
  Comparing the different methods shows that the steps are the same but just the implementation is different.&amp;nbsp; This is one reason there’s a lot of confusion because seems to be very little benefit.&lt;/p&gt;
 &lt;p&gt;
  Having a standard protocol can be advantageous but only when all the LLM adopts it otherwise it is just how to interact with Claude.
 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiFKciXo3rrRRZsL-jgGchwTT_xSCzHVx7VGzn5QlaMjOPQpQ5Lz5MvKob0HRY8KUVMFTtCJwLZ43ENcwK8dcfKM0pdk9Wmg4leishaMtZ-UEof3-vtZT1I2fwTbpLnU6EY0tj-5B8bg7OooSPF59VqytPFF9kpK79BcfWXUHwHAXd7dSuVFKSfaTEaFPA&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;386&quot; data-original-width=&quot;629&quot; height=&quot;196&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiFKciXo3rrRRZsL-jgGchwTT_xSCzHVx7VGzn5QlaMjOPQpQ5Lz5MvKob0HRY8KUVMFTtCJwLZ43ENcwK8dcfKM0pdk9Wmg4leishaMtZ-UEof3-vtZT1I2fwTbpLnU6EY0tj-5B8bg7OooSPF59VqytPFF9kpK79BcfWXUHwHAXd7dSuVFKSfaTEaFPA&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;MCP servers are potentially reusable and might ease integration which is a benefit since it’ll be like having only one API to learn.&amp;nbsp; This requires wide adoption and availability which isn’t a given even if it is backed by one of the big LLM providers.
 &lt;/p&gt;
 &lt;h2&gt;
  Shortcomings of the MCP
 &lt;/h2&gt;
 &lt;p&gt;
  As a protocol, there are a lot of shortcomings and technical benefits are minor.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
 &lt;p&gt;
  Some technical shortcomings are:
 &lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;
   There’s no discovery mechanism other than manual registration of MCP servers.
  &lt;/li&gt;
  &lt;li&gt;
   There’s now extra MCP servers in the tech stack that can be achieved by a library.
  &lt;/li&gt;
 &lt;/ul&gt;&lt;div&gt;Thus the main benefits will mainly come if the protocol is adopted as a standard.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/7314538168868376425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/03/model-context-protocol-mcp-minimally.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/7314538168868376425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/7314538168868376425'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/03/model-context-protocol-mcp-minimally.html' title='Why the Model Context Protocol (MCP) Is Confusing'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiFKciXo3rrRRZsL-jgGchwTT_xSCzHVx7VGzn5QlaMjOPQpQ5Lz5MvKob0HRY8KUVMFTtCJwLZ43ENcwK8dcfKM0pdk9Wmg4leishaMtZ-UEof3-vtZT1I2fwTbpLnU6EY0tj-5B8bg7OooSPF59VqytPFF9kpK79BcfWXUHwHAXd7dSuVFKSfaTEaFPA=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-1132551298428537049</id><published>2025-03-21T22:40:00.000-07:00</published><updated>2025-03-21T22:40:03.337-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Go"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>Running Kokoro-82M Text-to-Speech on Fedora with Nivdia GPU with Podman</title><content type='html'>&lt;p&gt;I got interested in &lt;a href=&quot;https://huggingface.co/hexgrad/Kokoro-82M&quot;&gt;Kokoro&lt;/a&gt;, a new text-to-speech model that only uses 82 million parameters but is one of the top models on the TTS leaderboard.&amp;nbsp; I wanted to run it locally and a quick way to try it is to use &lt;a href=&quot;https://github.com/remsky/Kokoro-FastAPI&quot;&gt;Kokoro-FastAPI&lt;/a&gt; which comes in a Docker container.&amp;nbsp; The README on Kokoro-FastAPI’s github has instructions using Docker (with or without GPU), but I’m using Podman so I need to do some setup on Fedora to enable &lt;a href=&quot;https://podman-desktop.io/docs/podman/gpu&quot;&gt;Podman access the GPU&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The instructions on the Podman and Nvidia site have you set up an Nvidia Repository to get the container kit that enables Podman to access the GPU, but in my previous post on &lt;a href=&quot;https://blog.lazyhacker.com/2024/09/installing-nvidia-and-cuda-drivers-on.html&quot;&gt;installing Nvidia and CUDA drivers&lt;/a&gt; on Fedora I mentioned that there can be dependency conflicts.&amp;nbsp; I wasn&#39;t sure if the Nvidia container kit might also cause problems, but fortunately, you can just install the packages from Fedora&#39;s repo and avoid possible headaches:&amp;nbsp;&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;sudo dnf install golang-github-nvidia-container-toolkit&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Assuming that you already installed Podman (if not, follow the &lt;a href=&quot;https://docs.fedoraproject.org/en-US/quick-docs/installing-docker/&quot;&gt;Fedora doc on installing Docker and/or Podman&lt;/a&gt;) and you have an GPU, you can download and run:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;docker run --device nvidia.com/gpu=all -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-gpu:v0.2.2&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;If SELinux blocks Podman from accessing the GPU, you can follow &lt;a href=&quot;https://podman-desktop.io/docs/podman/gpu&quot;&gt;Podman&#39;s instruction about giving permission for containers to access the GPU&lt;/a&gt;:&amp;nbsp;&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;sudo setsebool -P container_use_devices true&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Then run the `docker run ...` command above and it should start.&lt;/p&gt;&lt;p&gt;This a quick way to give Kokoro a try.&amp;nbsp; I&#39;ll probably try to run it next with Go by using the onnxruntime to load the Kokoro-Onnx model.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/1132551298428537049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/03/running-kokoro-82m-text-to-speech-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1132551298428537049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1132551298428537049'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/03/running-kokoro-82m-text-to-speech-on.html' title='Running Kokoro-82M Text-to-Speech on Fedora with Nivdia GPU with Podman'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-4644068542990918233</id><published>2025-02-18T21:05:00.000-08:00</published><updated>2025-02-19T18:28:25.313-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><title type='text'>How I Avoid Doomscrolling/Doomsurfing</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;p&gt;For those not familiar with term, doomscrolling, Wikipedia describes it as:&lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;Doomscrolling or doomsurfing is the act of spending an excessive amount of time reading large quantities of news, particularly negative news, on the web and social media.&lt;/i&gt; (&lt;a href=&quot;https://en.wikipedia.org/wiki/Doomscrolling&quot;&gt;Wikipedia&lt;/a&gt;)&lt;/blockquote&gt;&lt;p&gt;There are negative consequences of doomscrolling on people&#39;s mental and physical health such as increased stress, anxiety, depression, isolation, etc.&amp;nbsp; Suggestions on how to break the habit and combat its negative effects include limiting the amount of screen time and seek out more positive news.&amp;nbsp; &amp;nbsp;In our current environment there are numerous powerful forces working to keep people doomscrolling&amp;nbsp;such as corporations prioritizing engagement (keeping you hooked), publishers vying for your attention (often through negative news), and political leaders fueling fear.&lt;/p&gt;&lt;p&gt;Although I don&#39;t spend much time on social media, I do regularly read the news, follow current events and various feeds on topics I&#39;m interested in.&amp;nbsp; &amp;nbsp;To avoid doomscrolling some people are able to stop following the news altogether, but I find that to be difficult to achieve for myself.&amp;nbsp; Since publishers don&#39;t provide readers much control over what is shown, I built my own news aggregation site: &lt;a href=&quot;https://news.lazyhacker.com&quot;&gt;news.lazyhacker.com&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Now, instead of seeing what publishers want me to see:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH0M5ZT7DsL9vuCvX3drHWLuvMdJm_-jm3uwddxwALJQtViG4Jip7nYaeWNy8tWXmkdzM0mj4DsliiTC1B85Y_wGXZK3CRv6HmH7OL__up70jqEAaqoGXHgd4nEXJWcbNqVBhnKRNrkH98HGBFcAo53x1bU2_Y-ejOAfAciNXve4-aZ4z9YkHTkS-JCgM/s621/image.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;597&quot; data-original-width=&quot;621&quot; height=&quot;308&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH0M5ZT7DsL9vuCvX3drHWLuvMdJm_-jm3uwddxwALJQtViG4Jip7nYaeWNy8tWXmkdzM0mj4DsliiTC1B85Y_wGXZK3CRv6HmH7OL__up70jqEAaqoGXHgd4nEXJWcbNqVBhnKRNrkH98HGBFcAo53x1bU2_Y-ejOAfAciNXve4-aZ4z9YkHTkS-JCgM/s320/image.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Or these set of headlines&amp;nbsp; from feeds (which also illustrate how much political news is pushed on to us:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;- Judge Chutkan rejects call from Democratic AGs for temporary restraining order blocking DOGE’s access to federal data - CNN
- Russia and US agree to work toward ending Ukraine war in a remarkable diplomatic shift - The Associated Press
- Pope Francis, still hospitalized, has pneumonia in both lungs - The Washington Post
- Fact Sheet: President Donald J. Trump Expands Access to In Vitro Fertilization (IVF) - The White House
- National Science Foundation fires roughly 10% of its workforce - NPR
- &#39;Executive order&#39; cited as reason for sudden closure of JFK Library in Boston - WCVB Boston
- Ensuring Accountability for All Agencies - The White House
- Native American Activist Leonard Peltier Released From Prison - The New York Times
- Donald Trump signals Ukraine should hold elections as part of Russia peace deal - Financial Times
- Senate GOP pushes ahead with budget bill that funds Trump&#39;s mass deportations and border wall - The Associated Press
- Brazil Charges Bolsonaro With Attempting a Coup - The New York Times&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;I see a variety of headlines based on my own preferences:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;- Pope Francis, still hospitalized, has pneumonia in both lungs - The Washington Post
- National Science Foundation fires roughly 10% of its workforce - NPR
- &#39;Executive order&#39; cited as reason for sudden closure of JFK Library in Boston - WCVB Boston
- Rare deep-sea ‘doomsday fish’ washes up on Canary Islands coast - The Independent
- Hamas to release 6 more hostages, bodies of 4 others - ABC News
- Dramatic video shows moment Delta plane flipped after landing in Toronto - ABC News
- Futures Rise After S&amp;amp;P 500 Hits High; Two Earnings Losers Late - Investor&#39;s Business Daily
- Nvidia’s 50-series cards drop support for PhysX, impacting older games - Ars Technica
- AMD Ryzen AI Max+ 395 Analysis - Strix Halo to rival Apple M4 Pro/Max with 16 Zen 5 cores and iGPU on par with RTX 4070 Laptop - Notebookcheck.net
- Nintendo is killing its Gold Points loyalty program - Engadget
iPhone 17 Air Leaks Look More Like Google Pixel - Forbes&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The source of the headlines can come from different feeds from places like Google News, Reddit, and any source that offers a RSS feed.&amp;nbsp; The site takes the headlines from the feeds and run it through a set of rules that I defined in natural language (e.g. &quot;Remove political headlines, headlines about political figures or those who are not politicians but politically active.&quot;) to strip out any headlines that I might not want to see.&amp;nbsp; I purposely don&#39;t show any images and only update the site every couple of hours.&amp;nbsp; The former reduces the chance of me wanting to read an article because of the image rather then the substance and the latter reduces my urge to constantly refresh because I know that there will be no new headlines for another 2 hours.&lt;/p&gt;&lt;p&gt;Now, instead of finding myself being lured into doomscrolling, I can go to my site and see something like this:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiSh5LHK1Y-bNL-Nd4dy6-jHMYGMrYPE6n5lBqruzdaFc7cIKOEuNbNhY5mI9ankOrH3vEHHyl-0ZseEXB777d-yGMBM2Xx8slbOIYdKeR0TC7geIDp_1pt_ifSlxulArILIHjiHSPom7JTe-bEQNWwRMlZzMda0PNWoP2pLVZlnY3c6Vmb0ZML7JUNlhU&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;490&quot; data-original-width=&quot;1068&quot; height=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiSh5LHK1Y-bNL-Nd4dy6-jHMYGMrYPE6n5lBqruzdaFc7cIKOEuNbNhY5mI9ankOrH3vEHHyl-0ZseEXB777d-yGMBM2Xx8slbOIYdKeR0TC7geIDp_1pt_ifSlxulArILIHjiHSPom7JTe-bEQNWwRMlZzMda0PNWoP2pLVZlnY3c6Vmb0ZML7JUNlhU=w400-h184&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/4644068542990918233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/02/combating-doomscrollingdoomsurfing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/4644068542990918233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/4644068542990918233'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/02/combating-doomscrollingdoomsurfing.html' title='How I Avoid Doomscrolling/Doomsurfing'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH0M5ZT7DsL9vuCvX3drHWLuvMdJm_-jm3uwddxwALJQtViG4Jip7nYaeWNy8tWXmkdzM0mj4DsliiTC1B85Y_wGXZK3CRv6HmH7OL__up70jqEAaqoGXHgd4nEXJWcbNqVBhnKRNrkH98HGBFcAo53x1bU2_Y-ejOAfAciNXve4-aZ4z9YkHTkS-JCgM/s72-c/image.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-4746064378249253675</id><published>2025-02-15T21:49:00.000-08:00</published><updated>2025-02-16T11:44:02.294-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Golang"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><title type='text'>WebAssembly (WASM) with Go (Golang) Basic Example</title><content type='html'>&lt;p&gt;I &lt;a href=&quot;https://blog.lazyhacker.com/2018/06/go-with-webassembly-early-examples.html&quot;&gt;first wrote about using Go for WebAssembly&lt;/a&gt; (WASM) 6 years ago right before the release of Go 1.11 which was the first time Go supported compiling to WASM.&amp;nbsp; Go&#39;s initial support for WASM had many limitations (some I listed in my &lt;a href=&quot;https://blog.lazyhacker.com/2018/06/go-with-webassembly-early-examples.html&quot;&gt;initial article&lt;/a&gt;) which have since been addressed so I decided to revisit the topic with some updated example of using Go for WASM.&lt;/p&gt;&lt;p&gt;Being able to compile code to WASM now allow:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Go programs to run in the browser.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Go functions to be called by JavaScript in the browser.&lt;/li&gt;&lt;li&gt;Go code to call JavaScript functions through syscall/js.&lt;/li&gt;&lt;li&gt;Go code access to the DOM.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Setup&lt;/h3&gt;&lt;p&gt;Go&#39;s official Wiki now has an &lt;a href=&quot;https://go.dev/wiki/WebAssembly&quot;&gt;article&lt;/a&gt; on the basics of using Go for WASM including how to set the compile target and setup.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A quick summary of the steps to the process:&lt;/p&gt;&lt;p&gt;Compile to WASM with the output file ending as wasm since it&#39;s likely that the mime type set in /etc/mime probably use the wasm extension.&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&amp;gt; GOOS=js GOARCH=wasm go build -o &amp;lt;filename&amp;gt;.wasm&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Copy the JavaScript support file to your working directory (wherever your http server will serve it from).&amp;nbsp; It&#39;s necessary to use the matching wasm_exec.js for the version of the Go being used so maybe put this as part of the build script.&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&amp;gt; cp &quot;$(go env GOROOT)/lib/wasm/wasm_exec.js&quot; .&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Then add the following to the html file to load the WASM binary:&amp;nbsp;&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px; text-align: left;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&amp;lt;script src=&quot;wasm_exec.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;const go = new Go();
    WebAssembly.instantiateStreaming(fetch(&quot;main.wasm&quot;), go.importObject).then((result) =&amp;gt; {
                go.run(result.instance);
    });
&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Keeping It Running&lt;/h3&gt;&lt;p&gt;It is a good starting point but the Go code example is too simplistic.&amp;nbsp; It only demonstrates that the WASM binary that is created by Go can be loaded by having write a line to the browser&#39;s console.&amp;nbsp; The Go program basically gets loaded by the browser, prints a line and exits.&amp;nbsp; &amp;nbsp;Most of the time, it&#39;s probably desirable to have the WASM binary get loaded and stay running.&amp;nbsp; This can be achieved by either having having a channel that keeps waiting:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;c := make(chan struct{}, 0)
&amp;lt;- c&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;or even easier:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;select {}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Have either of these at the end of main() will keep the program alive after it gets loaded into the browser.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;In Place of JavaScript&lt;/h3&gt;&lt;p&gt;Being able to access the DOM excites me the most because it allows me to avoid writing JavaScript followed by being able to run Go programs in the browsers.&amp;nbsp; While I think the inter-op between Go and JavaScript is probably the most practical application, it&#39;s not something I&#39;ve had to do much since I&#39;m not a front-end developing doing optimizations or trying to reuse Go code between the front-end and back-end.&lt;/p&gt;&lt;p&gt;&lt;i&gt;I don&#39;t mind using HTML for UI development or even CSS, I&#39;m just personally not a fan of JavaScript.&amp;nbsp; This isn&#39;t&amp;nbsp;to say that it is bad, just I prefer other languages just like some people prefer C++, Java, Python, etc.&amp;nbsp; I don&#39;t have fun writing JavaScript like I do with with Go if though I know JavaScript.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Take a basic example of a web app (index.html) with a button to illustrate:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: courier;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;                                                                 
  &amp;lt;html lang=&quot;en&quot;&amp;gt;                                                                  
  &amp;lt;head&amp;gt;                                                                          
      &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;                                                        
      &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;        
      &amp;lt;title&amp;gt;Example&amp;lt;/title&amp;gt;                                         
  &amp;lt;/head&amp;gt;                                                                           
  &amp;lt;body&amp;gt;                                                                          
                                                                                  
      &amp;lt;button id=&quot;myButton&quot;&amp;gt;Click Me&amp;lt;/button&amp;gt;                                                                                                     
                                                                                  
  &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;JavaScript is used to attach an event to it so that when the button is clicked, an alert message pops up:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;pre style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: courier;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;    // Select the button element                                            
    const button = document.getElementById(&#39;myButton&#39;);                     
                                                                                  
    // Attach an event listener to the button                               
    button.addEventListener(&#39;click&#39;, function() {                           
       alert(&#39;Button clicked!&#39;);                                           
    }); 
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;With WASM, the JavaScript can be replaced with Go code:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt; package main                                                                       
                                                                                     
  import (                                                                                                                                                   
                                                                                     
      &quot;honnef.co/go/js/dom/v2&quot;                                                       
  )                                                                                  
                                                                                  
  func main() {                                                                   
                                                                                  
      document := dom.GetWindow().Document() &lt;/i&gt; &lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: white;&quot;&gt;                                   
           
      // Select the button element                                                                       
      &lt;/span&gt;&lt;b style=&quot;color: white;&quot;&gt;button := document.GetElementByID(&quot;myButton&quot;)                               
                                                                                  
      // Attach an event listener to the button
      button.AddEventListener(&quot;click&quot;, false, func(dom.Event) {                   
          dom.GetWindow().Alert(&quot;Button clicked!&quot;)                                
      }) &lt;/b&gt;&lt;span style=&quot;color: white;&quot;&gt;                                                                         
                                                                                  
&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: #666666;&quot;&gt;      select {}
  }&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;In this case, the Go code looks extremely similar to the JavaScript code because I&#39;m using the&amp;nbsp;&lt;a href=&quot;https://pkg.go.dev/honnef.co/go/js/dom/v2&quot;&gt;honnef.co/go/js/dom/v2&lt;/a&gt; package.&amp;nbsp; It is a Go binding to the JavaScript DOM APIs and I find that it makes it more convenient than using syscall/js directly.&lt;/p&gt;&lt;p&gt;Why do I prefer this over writing JavaScript especially when they look so similar?&amp;nbsp; &amp;nbsp;The main reason is that most code is not just calling an API.&amp;nbsp; There&#39;s other logic that are implemented and for those, I can use Go and Go&#39;s libraries along with the benefits of a compiled and type safe language.&amp;nbsp;&lt;/p&gt;&lt;p&gt;There are still things that needs to be considered before just using Go and WASM for general consumer production web app.&amp;nbsp; The binary size can be large so it needs to be considered for your audience, but if I&#39;m doing my own hobby project for myself or corporate apps where I know the user have fast connections, or if app performance and functionality outweighs the initial download and memory usage, I&#39;d try to use it.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/4746064378249253675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/02/webassembly-wasm-with-go-golang-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/4746064378249253675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/4746064378249253675'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/02/webassembly-wasm-with-go-golang-update.html' title='WebAssembly (WASM) with Go (Golang) Basic Example'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-1712088492835875941</id><published>2025-02-10T12:30:00.000-08:00</published><updated>2025-02-20T16:36:13.634-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>The Death of Software Engineering Is Premature</title><content type='html'>&lt;p&gt;There is a lot to be excited about when it comes to advancement in language models.&amp;nbsp; The people that benefit the most are software engineers because it can enhance the productivity of knowledgeable engineers.&amp;nbsp;&lt;/p&gt;&lt;p&gt;While a simple prompt such as &quot;build me a web app with a conversation interface,&quot; will result in a functional web app (this is great because building a basic commodity application is now accessible to everyone),&amp;nbsp; these aren&#39;t the type of applications software engineers are normally tasked to write.&amp;nbsp; Software engineers are tasked with building multi-layered and evolving software that can&#39;t be fully described with a few prompts.&amp;nbsp; To build the software that businesses need requires skilled and knowledgeable people to direct the engineering work of the AI.&lt;/p&gt;&lt;p&gt;I built a &lt;a href=&quot;https://blog.lazyhacker.com/2025/02/using-aillm-to-implement-news-headline.html&quot;&gt;simple app to filter news headlines&lt;/a&gt; that is small enough to be digestible in a post that I think shows how far a layman can go with building software using LLMs and why software engineers are still needed.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;The First Prompt&lt;/h2&gt;&lt;p&gt;Let&#39;s start with what many executives might think makes software engineers unnecessary:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;Build me an app that will filter out political articles from Google News.&lt;/i&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;ChatGPT understood enough to generate an app using keywords to filter the headlines.&amp;nbsp; One time it created a React app and a second time it used Python.&amp;nbsp; Both times it used newsapi.org to get the news feeds and require you to understand how to build and run the app.&amp;nbsp; The main issue is that the app isn&#39;t really what I wanted.&amp;nbsp; It provides news search which the results are then matched with keywords to decide what to filter out.&amp;nbsp; I wanted the news that I normally see when I visit news.google.com minus the political articles so I tell ChatGPT precisely that:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;I don&#39;t want to search for news.&amp;nbsp; I want to see the articles that I see when visiting news.google.com minus political articles&lt;/i&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The first time I asked ChatGPT it understood this enough to switch to using the Google News RSS feed which is excellent\!&amp;nbsp; The second time, it concluded that the way is to scrape news.google.com.&amp;nbsp; Both of these prompts highlight that some specialized knowledge is needed.&amp;nbsp; Does the programming language matter?&amp;nbsp; Should it use RSS or web scraping?&amp;nbsp; How do you run the code it generates?&amp;nbsp; Can these questions be ignored? Who in the organization does the CEO expect to be able to answer these questions?&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;The Second Prompt&lt;/h2&gt;&lt;p&gt;While the CEO might not be able to use the AI, it is possible that a non-engineer or someone who doesn&#39;t know how to program can know enough to give more details in the prompt that improves on the first prompt.&amp;nbsp; A technical product manager could give the AI the extra details:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;single page web app using material design&amp;nbsp; &amp;nbsp;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;have a header with the company logo on the left&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;have a settings menu on the right side of the header&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;...&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;web app will get the list of headlines to display&amp;nbsp; &amp;nbsp;&lt;/li&gt;&lt;li&gt;pull headlines from RSS feeds and have a LLM return the items that are not political&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;build it with language X on the backend and basic Javascript and CSS on the front end.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;(4) was included to demonstrate how software often needs to fit in with a business&#39; existing infrastructure.&amp;nbsp; If the AI returns a React app but there is no infrastructure to build and deploy React apps then we&#39;d be looking at additional costs and efforts to add that ability simply because the AI had no knowledge of what is reasonable for a specific business.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;LLMs are capable of generating this app although the generated code didn&#39;t actually work and I had to guide it to how to fix things but for now let&#39;s assume that the LLM generated a fully working app.&amp;nbsp;&lt;/p&gt;&lt;p&gt;If we were to stop here then we might conclude that software engineers aren&#39;t needed anymore, but I believe the conclusion is actually that for companies that previously did not have engineers that they now have access to some skills their organization never had before.&amp;nbsp; For example, a small company who has an office manager built a spreadsheet that they&#39;re running their business on would benefit because while their spreadsheet worked it is still limited.&amp;nbsp; The next step to expand the spreadsheet that would previously require some coding knowledge to extend the worksheet can now be done by the office manager with the aid of an AI.&amp;nbsp; There is cost saving for the company because they didn&#39;t have to hire a consultant (these companies probably don&#39;t have enough work to hire a full time engineer to be on staff).&lt;/p&gt;&lt;p&gt;Remember that I left out a number of things that the AI cannot do including turning the code into an app and deploying the app, but the biggest hurdle would be if the AI did not meet all the requirements for the app initially.&amp;nbsp; I had success prompting the AI to make certain changes and enhancements but multiple times the AI would make a change that didn&#39;t work and go further-and-further down the rabbit hole and no prompting got it to fix the problem until I have it very specific instructions on how to fix (&quot;In function X, change the max/min values to be Y for variable V&quot;).&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Basically, maintaining, fixing and enhancing the app is where the challenge is and that&#39;s where most engineers are spending their time.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;The Third Prompt&lt;/h2&gt;&lt;p&gt;Prompt 3 (in real life was actually what I did first) was the fastest and most productive way towards building a working application and this was to have a design and give the AI many specific implementation instructions.&amp;nbsp; I knew the architecture, algorithm and code structure and used that knowledge to guide the AI so that it was essentially very fast typist of code:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Write a FetchRSS function that takes in a string value for the RSS feed configuration file path.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;In FetchRSS, open up the configuration file and loop through each line to get the URL.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;For each URL, fetch it and parse the RSS response into a slice of strings&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Oh, ignore any lines that are blank or starts with &#39;\#&#39;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Since I enjoyed typing out code, I tended to write my own stuff but for the &quot;boring&quot; codes (e.g. handling when err \!= nil) I&#39;ll have the AI write it.&lt;/p&gt;&lt;p&gt;I was able to complete the code much faster, make fewer trips to look up references and documentation and with few bugs from typos.&lt;/p&gt;&lt;p&gt;Here&#39;s the problem, though.&amp;nbsp; While AI is capable of generating valid code, it isn&#39;t &quot;working&quot; code.&amp;nbsp; It isn&#39;t code that can be used directly in a business&#39; infrastructure.&amp;nbsp; AI is still struggling to understand an entire code base and writing code that works within a business requires also understanding the environment the code is running in.&amp;nbsp; If the code will be run in complete isolation then it might be able to run but even a simple function such as &quot;GetUserName&quot; depends on where the user name is stored?&amp;nbsp; What integration must the AI be aware of in order to get the user name?&amp;nbsp; In a real environment, the AI simply just gives code snippets that the engineer must still adapt into the organization&#39;s infrastructure.&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Having an AI capable of building software for your business is not realistic.&amp;nbsp; My example app is too simplistic to be any company&#39;s product and it still wasn&#39;t able to do that.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Having a knowledgeable person on staff using AI will increase your staff&#39;s ability to do their jobs better and allow companies to do things they previously couldn&#39;t but most of these things are not things software engineers typically do.&amp;nbsp; &amp;nbsp;If companies try to have non-engineers do software engineering work with the AI will likely result in decreased productivity.&amp;nbsp; Any gains from having something done quickly at the beginning will also be quickly overshadowed by the inability to maintain and enhance the software.&lt;/p&gt;&lt;p&gt;It is ultimately a decision companies have to make for themselves.&amp;nbsp; Is a % reduction in compensating engineers a greater value then expanding by factors the productivity and capabilities of the engineers (reduce cost vs growth)?&amp;nbsp;&lt;/p&gt;&lt;p&gt;What is complex today will not be as complex tomorrow.&amp;nbsp; They will become common and AI will be able to take care of those things, but as AI takes over more of the common stuff that will allow engineers to tackle the next level of complexity with more originality because businesses will need it to survive.&amp;nbsp; There are leaders at technology companies boasting about being able to get rid of their software engineers or how they will stop hiring more engineers.&amp;nbsp; &amp;nbsp;These leaders are making a choice to make cheap commodity products in exchange for growth and innovation, but they might find themselves racing to the bottom instead of accelerating to the top.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Can AI someday outpace people?&amp;nbsp; Maybe.&amp;nbsp; But it&#39;s not now.&amp;nbsp; Declaring that engineers aren&#39;t needed is pre-mature.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/1712088492835875941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/02/the-death-of-software-engineering-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1712088492835875941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/1712088492835875941'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/02/the-death-of-software-engineering-is.html' title='The Death of Software Engineering Is Premature'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-4148182585550556983</id><published>2025-02-10T11:32:00.000-08:00</published><updated>2025-02-10T11:34:34.707-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Go"/><category scheme="http://www.blogger.com/atom/ns#" term="Golang"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><title type='text'>Using AI/LLM to Implement a News Headline Filter</title><content type='html'>There are news topics that I&#39;d rather avoid being bombarded with, but options for filtering headlines on the news sites are generally very limited.&amp;nbsp; You can tell Google News to block certain sources and there&#39;s an &quot;fewer like this&quot; option which doesn&#39;t seem to do anything, but neither will block topics (e.g.&quot;politics&quot;, &quot;reality TV shows&quot;, etc. ) so you still end up getting bombarded with things you don&#39;t want to see even in your &quot;personalized&quot; views.&amp;nbsp; Fortunately, sites like Google News provide RSS feeds that makes it easier to get the list of headlines, links and descriptions and avoid trying to scrape websites which can be brittle as the sites can change their layout at any time.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I decided to write my own filter take out things that I&#39;m not interested in and publish the result to a site that I can access from any browser.&amp;nbsp; The simplest way (and one that doesn&#39;t even need site to host the result) is to have a list of blocked words and drop any headlines with those words.&amp;nbsp; As long as the app can access the RSS feed even a mobile app can easily handle this kind of filtering, but creating and maintaining an effective block list becomes a challenge.&amp;nbsp; A political news article isn&#39;t going to be &quot;Political Article on City Council Votes On Artificial Turf at Parks.&amp;nbsp; This is a good use case for using a language model to categorize a headline instead of using a keyword filter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I created a prompt in natural language explaining what I don&#39;t want to see along with some additional details to add to common definitions and then sent my instructions with the list of headlines to the language model and have it return a filtered list:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;Remove all political headlines.&amp;nbsp; Headlines that includes political figures, and celebrities who are active in politics such as Elon Musk should also be removed.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Being able to use natural language to handle categorization makes it so much easier to build the app.&amp;nbsp; The categorization would&#39;ve been the most challenging part of the project, but the LLM allowed me to get good results very quickly (took just a few minutes to get the first results but some more time to tweak the prompt).&amp;nbsp; Another benefit with the large language models such as Gemini is that it understand multiple languages so while I gave my instructions in English, it can filter headlines in French, Chinese, Japanese, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using an language model does mean giving up some control such as relying on what the model interprets &quot;political&quot; to mean.&amp;nbsp; Prompts can help refine the model&#39;s interpretation but sometimes a headline makes it through the filter and it is not as easy to determine compared to being able to see the algorithm and determine the reasoning.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I encountered a problem where the LLM&#39;s response stopped midway.&amp;nbsp; This was because&amp;nbsp; LLMs have limits on input and output tokens (how much info you can send out and the size of the response it will send back).&amp;nbsp; The input token limit is so high that I&#39;m not likely to have enough headlines to even remotely approach it&#39;s limit (Gemini is 1 million tokens for the free tier and 2 million tokens for the paid tier and I&#39;ll be using around 20,000).&amp;nbsp; The output limit is much smaller (~8k) so if I wanted it to send back the complete details of the filtered headlines (title and link) it won&#39;t be able to.&amp;nbsp; To address this problem, I send the LLM the headlines with an index and have it return just the index.&amp;nbsp; If it was a 100 headlines then size of the output is less than 200 tokens.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A cron job will execute the program and write the result as JSON to the server where the web page will load the JSON&amp;nbsp; and display the headlines:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiimh3aPe_mhRPzWcIt2O3rZ8X3ksOaDHlW8eSZQ9ZUMiBBZsHEub8jN2EvF9aFQFPLvVfrKY4oQrF039Cots4mP8f6Pn3wuLtFoVtm8Z2ggaURfC8nDR_zR7PyBS3K4sT0QewNp1uGnKzxVd9mkCtBFE-k3Z4CeDmflcAAIJ7USVccYezAy0hFc2p21lo&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;596&quot; data-original-width=&quot;1833&quot; height=&quot;130&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiimh3aPe_mhRPzWcIt2O3rZ8X3ksOaDHlW8eSZQ9ZUMiBBZsHEub8jN2EvF9aFQFPLvVfrKY4oQrF039Cots4mP8f6Pn3wuLtFoVtm8Z2ggaURfC8nDR_zR7PyBS3K4sT0QewNp1uGnKzxVd9mkCtBFE-k3Z4CeDmflcAAIJ7USVccYezAy0hFc2p21lo=w400-h130&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The code is on &lt;a href=&quot;https://github.com/lazyhacker/gnewsrss&quot;&gt;Github&lt;/a&gt;&amp;nbsp;and you can see it is very simple program.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/4148182585550556983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/02/using-aillm-to-implement-news-headline.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/4148182585550556983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/4148182585550556983'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/02/using-aillm-to-implement-news-headline.html' title='Using AI/LLM to Implement a News Headline Filter'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiimh3aPe_mhRPzWcIt2O3rZ8X3ksOaDHlW8eSZQ9ZUMiBBZsHEub8jN2EvF9aFQFPLvVfrKY4oQrF039Cots4mP8f6Pn3wuLtFoVtm8Z2ggaURfC8nDR_zR7PyBS3K4sT0QewNp1uGnKzxVd9mkCtBFE-k3Z4CeDmflcAAIJ7USVccYezAy0hFc2p21lo=s72-w400-h130-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-6695409450255557798</id><published>2025-01-26T00:08:00.000-08:00</published><updated>2025-01-26T00:08:19.589-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Upgrading from Fedora 40 to 41</title><content type='html'>&lt;p&gt;&amp;nbsp;Decided it&#39;s time to upgrade from &lt;a href=&quot;https://docs.fedoraproject.org/en-US/quick-docs/upgrading-fedora-offline/&quot;&gt;Fedora 40 to 41&lt;/a&gt;&amp;nbsp;and it was a smooth upgrade.&amp;nbsp; Will update if I run into any issues, but I&#39;ve already been running 41 on a laptop for a couple of months so I know that 41 works for what I need and this time it was to upgrade systems that was already running an earlier version.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/6695409450255557798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/01/upgrading-from-fedora-40-to-41.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/6695409450255557798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/6695409450255557798'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/01/upgrading-from-fedora-40-to-41.html' title='Upgrading from Fedora 40 to 41'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-6546461954904653923</id><published>2025-01-01T13:37:00.004-08:00</published><updated>2025-01-01T13:37:15.677-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><title type='text'>Powerline Error in VIM with Git</title><content type='html'>&lt;p&gt;On Fedora 41, opening a Go file that is checked into Git results an error message that flashes briefly before VIM shows the file.&amp;nbsp; I&#39;m not sure what is the exact cause but it went away when I uninstalled powerline and reinstalled it.&amp;nbsp; &amp;nbsp;When uninstalling just powerline, it also uninstalled VIM for some reason the re-install was actually `dnf install vim powerline`.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/6546461954904653923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2025/01/powerline-error-in-vim-with-git.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/6546461954904653923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/6546461954904653923'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2025/01/powerline-error-in-vim-with-git.html' title='Powerline Error in VIM with Git'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-3621667725270018166</id><published>2024-12-28T20:59:00.000-08:00</published><updated>2025-03-12T12:48:54.688-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gadgets"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>Framework 13 (AMD) First Impressions</title><content type='html'>&lt;p&gt;I recently purchased a &lt;a href=&quot;https://frame.work/products/laptop-diy-13-gen-amd/configuration/new&quot;&gt;Framework 13 (AMD)&lt;/a&gt;&amp;nbsp;laptop to replace my 7 years old Razer Stealth as my travel companion and wanted to share my first impressions after taking it on a trip and using it for about a month.&lt;/p&gt;&lt;p&gt;My main criteria for a travel laptop is that it must be light, but as I&#39;ve gotten older I&#39;ve added a few more things to look for:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Display must support good scaling.&amp;nbsp; &amp;nbsp;As displays have improve their resolutions, everything shown has gotten smaller so I have to scale it up for it to be comfortable for my eyes.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Replaceable battery.&amp;nbsp; As evident from using my previous laptop for 7 years and still not feeling the need to upgrade, I tend to keep my laptop for a long time especially since I don&#39;t rely on my laptop to be my primary driver.&amp;nbsp; While most parts of a laptop are capable of lasting awhile, batteries are a different story.&amp;nbsp; I&#39;ve had to replace the battery on my Razer twice because they started to swell.&amp;nbsp; This is not exclusive to Razer as I&#39;ve had it happen on Macbooks and Pixelbooks as well.&lt;/li&gt;&lt;li&gt;Linux support.&amp;nbsp; I mostly use Linux especially for development so I&#39;m most comfortable with it, but I occasionally do have use for Windows (some games the family plays, camera apps, etc.).&amp;nbsp; They key reason, though, is that Windows is commercial and I don&#39;t want to be forced to pay to upgrade if it is not necessary.&amp;nbsp; The Razer Stealth ran Windows 10 and Microsoft says it&#39;s not compatible with Windows 11 so I either have to live without security updates or try to install Linux when Razer doesn&#39;t support Linux in anyway.&amp;nbsp; Having good Linux support is a way to future proof the laptop somewhat.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Given these criteria, I settled on the Framework.&amp;nbsp; It is lightweight (1.3 kg/2.9 lb) with a&amp;nbsp;13.5&quot; 2880x1920 120Hz 2.8K matte display (the uniqueness of Framework is that it is modular so you can have different displays even if new ones are released in the future) that is a 3:2 ratio which allows better scaling especially with Linux.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The battery is replaceable (nearly everything on the Framework is replaceable/up-gradable) and it fully supports Linux (Ubuntu and Fedora being the officially supported ones but seems like most Linux distributions will work) even the finger print sensor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;First Impressions&lt;/h2&gt;&lt;div&gt;Ordering the Framework, especially the DIY version, presents you with more choices than the typical ordering process.&amp;nbsp; Not only do you pick how much disk storage you want, you have options for what brand/specs you want and this is for all the major components:&amp;nbsp; display &amp;amp; bezel, keyboard, CPU,memory, storage, memory, ports.&amp;nbsp; If you&#39;re familiar with computer components, most of the parts are understandable from the description but for the keyboard it didn&#39;t explain what the difference is between US-English, International-English Linux and International-English (International English has the Euro key and Linux swaps out the Windows key with a Super key).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was impressed how quickly the laptop shipped and arrived given it that it comes directly from Taiwan (where it was manufactured) and that each order have different sets of expansion ports (although I did pick a pretty standard set of ports).&amp;nbsp; It arrived faster then the 5-7 business days it listed when I ordered.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The packaging was nicely done to prevent anything from shifting during transit and everything is recyclable. The packaging include a screw driver needed to assemble all the components.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It took about 20 minutes to put everything together and the instructions were good.&amp;nbsp; A lot of people can probably figure it out even without the instructions, but the instructions really prepares you.&amp;nbsp; It suggests putting on the bezel starting at the bottom first and that definitely allowed it to fit better without fidgeting and it warn that the first boot will take longer so you don&#39;t worry about whether it not immediately starting up meant that you did something wrong.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It gives pretty good instructions on installing the operating system.&amp;nbsp; For Windows, it anticipated that you might not want to use a Microsoft account so it tells you how to bypass it and how to deal with the fact that during installation the laptop drivers aren&#39;t there so how do you get pass the part where Microsoft wants to have networking working just to complete the installation.&amp;nbsp; For Linux, the instructions was decent but maybe a little outdated especially with the screenshot.&amp;nbsp; Although Fedora is one of the two officially supported distributions, the Ubuntu guides seemed more comprehensive.&amp;nbsp; They also favor Gnome in their instructions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can get the Framework with either an Intel process/motherboard or AMD processor/motherboard and although the general sense that the AMD version performs better there&#39;s more information on the Intel stuff.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The display looks very nice with good contrast and brightness.&amp;nbsp; It&#39;s very comfortable to the eyes and scaling in Linux was not a problem.&amp;nbsp; No complaints about the touch pad and it worked with Linux out-of-the-box.&amp;nbsp; The keyboard is comfortable with good travel and spacing.&amp;nbsp; It wasn&#39;t too squishy.&amp;nbsp; If the Thinkpad is the bar, this isn&#39;t as good as that, but better then the last Macbook Pro I used .&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The fingerprint sensor worked out-of-the-box as well, but if you aren&#39;t using Gnome, you need to use the command-line tool, fprintd-enroll, to register your finger print.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It&#39;s not clear whether Framework thinks you should run tuned-ppd to manage power profiles for both Intel and AMD or whether that&#39;s just for Intel and to stick with power-profiles-daemon for AMD.&amp;nbsp; On Fedora 41, if you install power-profiles-daemon then each time it wants to change the profile (such as when you plug/un-plug the power) SELinux will block it and give you a warning.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Although I had no problems with WIFI, the wifi chip it comes with always seem to have a weaker signal than other devices.&amp;nbsp; I think some people swap it out with the one that comes with the Intel board so it&#39;s something I&#39;m watching out for.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;ve been pretty happy with the laptop so far and hope it&#39;ll last a long time.&amp;nbsp; I like the company&#39;s mission and hope they continue to succeed with their vision of modular, sustainable and environmentally friendly laptops.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;System Configuration&lt;/h2&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;AMD Ryzen™ 5 7640U&lt;/li&gt;&lt;li&gt;2880x1920 120Hz 2.8K matte display&lt;/li&gt;&lt;li&gt;Crucial RAM 32GB Kit (2x16GB) DDR5 5600MHz&lt;/li&gt;&lt;li&gt;WD_BLACK 2TB SN850X NVMe SSD Solid State Drive - Gen4 PCIe, M.2 2280, Up to 7,300 MB/s&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/3621667725270018166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2024/12/framework-13-amd-first-impressions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/3621667725270018166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/3621667725270018166'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2024/12/framework-13-amd-first-impressions.html' title='Framework 13 (AMD) First Impressions'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-8185857551460164572</id><published>2024-12-16T15:00:00.001-08:00</published><updated>2024-12-16T15:00:12.487-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gadgets"/><title type='text'>Using Physical Key for SSH, Git, Github For More Security</title><content type='html'>&lt;p&gt;Normally, when using SSH (including SSH with Git), you generate a private and public key.&amp;nbsp; The public key is what you give to others (e.g. Github).&amp;nbsp; The private key should be kept secure and not be shared with anyone.&amp;nbsp; I don&#39;t like keeping my private keys on my laptop because mobile devices have a higher chance of being lost, stolen, or unknowingly accessed.&amp;nbsp; One solution is use a physical security key to store the private key that is plugged in to the laptop when needed.&lt;/p&gt;&lt;p&gt;To set this up requires having a security key such as the Yubikey from &lt;a href=&quot;https://www.yubico.com/&quot;&gt;Yubico&lt;/a&gt;.&amp;nbsp; Then it is a matter of generating a key pair with SSH:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;&amp;gt; ssh-keygen -t ecdsa-sk  # -t ed25519-sk is also an option but not always supported&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;This will generate the private key on the security key.&amp;nbsp; The generated id_ecdsa_sk file in the SSH directory is just a reference to the security key instead of the normal private key.&amp;nbsp; The id_ecdsa_sk.pub is the public key that you would share.&amp;nbsp; Whenever ssh needs to authenticate, the key will blink and with a tap of the key you&#39;ll be good to go!&lt;/p&gt;&lt;p&gt;For each computer that you want to use the key, you&#39;ll need to copy the reference key file to the SSH directory.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/8185857551460164572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2024/12/using-physical-key-for-ssh-git-github.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/8185857551460164572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/8185857551460164572'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2024/12/using-physical-key-for-ssh-git-github.html' title='Using Physical Key for SSH, Git, Github For More Security'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2802075472139289461.post-2266122421435182436</id><published>2024-12-13T16:56:00.004-08:00</published><updated>2024-12-13T16:56:26.290-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>Installing Windows 11 without WIFI/Network Connection</title><content type='html'>&lt;p&gt;&amp;nbsp;When installing Windows 11, it assumes you have a network connection and doesn&#39;t let you proceed with the installation.&amp;nbsp; To bypass this, press Shift+F10 to open a terminal and type:&lt;/p&gt;&lt;pre style=&quot;background: rgb(54, 63, 72); border-radius: 6px; box-sizing: border-box; line-height: 15.68px; margin-bottom: 1.1em; overflow-wrap: break-word; padding: 10.2188px 12.7812px;&quot;&gt;&lt;span style=&quot;color: white; font-family: menlo, monaco, monospace;&quot;&gt;&lt;span style=&quot;font-size: 12.8px; text-wrap-mode: wrap;&quot;&gt;oobe\bypassnro&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The laptop will restart and when it reaches the network connection page there will be a new option for no network that will allow you to continue the installation.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.lazyhacker.com/feeds/2266122421435182436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.lazyhacker.com/2024/12/installing-windows-11-without.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/2266122421435182436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2802075472139289461/posts/default/2266122421435182436'/><link rel='alternate' type='text/html' href='http://blog.lazyhacker.com/2024/12/installing-windows-11-without.html' title='Installing Windows 11 without WIFI/Network Connection'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>