<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Code Yarns Tech Blog</title>
    <link>https://codeyarns.com/tech/</link>
    <description>Online journal of posts about computers and fixes to common issues.</description>
    <atom:link href="https://codeyarns.com/tech/" rel="self" type="application/rss+xml"/>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <lastBuildDate>Fri, 10 Apr 2026 03:24:10 +0000</lastBuildDate>
    <item>
      <title>Tech links of April 2026</title>
      <link>https://codeyarns.com/tech/2026-04-10-tech-links-of-april-2026.html</link>
      <description>&lt;h1&gt;&lt;a href="https://youtu.be/6vVzPnU7KwM"&gt;Insights from NVIDIA Research | NVIDIA GTC - YouTube&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Talk by Bill Dally at GTC 2026.&lt;/li&gt;
&lt;li&gt;Low latency decode at right end of pareto: At concurrency 1, generation of 1 token touches all the weights of the model and the results have to be updated all through the model. So, bandwidth (data movement) and latency (communication) limited.&lt;/li&gt;
&lt;li&gt;High efficiency decode at left end of pareto: energy (data movement) limited.&lt;/li&gt;
&lt;li&gt;Key limiter of LLM decode on GPU is data movement: reading KV cache (for attention block) and expert weights (for MoE block) from HBM.&lt;/li&gt;
&lt;li&gt;SOL for on-chip communication is wire delay: 1ns for 2mm, 30ns for one end of chip to another end.&lt;/li&gt;
&lt;li&gt;Standard LLM training: pre-training -&amp;gt; SFT (Supervised Fine Tuning) -&amp;gt; RL (Reinforcement Learning)&lt;/li&gt;
&lt;li&gt;RLP (RL Pretraining): Do explicit reasoning trace before predicting next token.&lt;/li&gt;
&lt;li&gt;GROOT: one foundation model for all types of robots.&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-04-10-tech-links-of-april-2026.html</guid>
      <pubDate>Fri, 10 Apr 2026 03:20:27 +0000</pubDate>
    </item>
    <item>
      <title>Image Capture</title>
      <link>https://codeyarns.com/tech/2026-04-09-image-capture.html</link>
      <description>&lt;p&gt;&lt;a href="https://support.apple.com/guide/image-capture/welcome/mac"&gt;&lt;strong&gt;Image Capture&lt;/strong&gt;&lt;/a&gt; is the built-in app on MacOS that can be used to scan photos or pages from a scanner.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scanners&lt;/strong&gt;:
The scanners that are detected and visible on the left side.
If a scanner you plugged in with a USB cable is not listed, you might need to install its driver.
Select one of the scanners to be able to scan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scan details&lt;/strong&gt;:
Click the Show Details button at the bottom-right corner to choose text/black &amp;amp; white/color and DPI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scanning to PDF&lt;/strong&gt;:
Make sure to select the Format as PDF in the Details.
By default, a separate PDF file is created for each scan.
If you want to scan a set of pages to a single PDF, choose &lt;em&gt;Combine into single document&lt;/em&gt; option in Details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tried with&lt;/strong&gt; Image Capture 8.0 and MacOS Tahoe 26.4&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-04-09-image-capture.html</guid>
      <pubDate>Thu, 09 Apr 2026 05:32:01 +0000</pubDate>
    </item>
    <item>
      <title>GoAccess</title>
      <link>https://codeyarns.com/tech/2026-04-08-goaccess.html</link>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/GoAccess"&gt;&lt;strong&gt;GoAccess&lt;/strong&gt;&lt;/a&gt; is an open-source log analyzer and interactive viewer for the terminal or the browser.
I like to use it to see the traffic to nginx.&lt;/p&gt;
&lt;h1&gt;Install&lt;/h1&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo apt install goaccess
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;View nginx traffic&lt;/h1&gt;
&lt;p&gt;For a live view of the traffic at the terminal:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ goaccess /var/log/nginx/access.log --log-format=COMBINED
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Generate a interactive HTML file and view it from the browser at &lt;code&gt;yourdomain.com/stats.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo goaccess /var/log/nginx/access.log -o /var/www/html/stats.html --log-format=COMBINED
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Tried with:&lt;/strong&gt; GoAccess 1.8.1 and Ubuntu 24.04&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-04-08-goaccess.html</guid>
      <pubDate>Wed, 08 Apr 2026 03:04:29 +0000</pubDate>
    </item>
    <item>
      <title>nginx</title>
      <link>https://codeyarns.com/tech/2026-04-08-nginx.html</link>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Nginx"&gt;&lt;strong&gt;Nginx&lt;/strong&gt;&lt;/a&gt; is a popular web server for Linux.&lt;/p&gt;
&lt;h1&gt;Install&lt;/h1&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo apt install nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Serve HTTP website&lt;/h1&gt;
&lt;p&gt;By default, webpages are served at the IP address of the computer from port 80.
To configure this, edit the &lt;code&gt;/etc/nginx/sites-available/default&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Check the configuration using:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo nginx -t
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Restart the server:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;nginx serves the files in &lt;code&gt;/var/www/html/&lt;/code&gt; directory at the root of the website.&lt;/p&gt;
&lt;p&gt;Go to &lt;code&gt;http://&amp;lt;ip-address&amp;gt;&lt;/code&gt; in the browser to view the default nginx file.&lt;/p&gt;
&lt;h1&gt;Serve website with domain&lt;/h1&gt;
&lt;p&gt;Create a new file &lt;code&gt;/etc/nginx/sites-available/yourdomain.com&lt;/code&gt; with the server configuration.&lt;/p&gt;
&lt;p&gt;Put a symbolic link to this file:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;HTTPS certificate&lt;/h1&gt;
&lt;p&gt;Install certificate generator:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo apt install certbot python3-certbot-nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Generate the certificate for your domain:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This generates the certificate files and also adds the necessary configuration to &lt;code&gt;/etc/nginx/sites-available/yourdomain.com&lt;/code&gt; automatically.&lt;/p&gt;
&lt;p&gt;Check auto renewal:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Tried with:&lt;/strong&gt; nginx 1.24.0 and Ubuntu 24.04&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-04-08-nginx.html</guid>
      <pubDate>Wed, 08 Apr 2026 02:39:14 +0000</pubDate>
    </item>
    <item>
      <title>uv</title>
      <link>https://codeyarns.com/tech/2026-03-27-uv.html</link>
      <description>&lt;p&gt;&lt;a href="https://github.com/astral-sh/uv"&gt;&lt;strong&gt;uv&lt;/strong&gt;&lt;/a&gt; is a package and project manager for Python projects.
It fully replaces two things: manually using virtual environments and managing packages.
It is super fast, ironically because it is written in Rust!&lt;/p&gt;
&lt;h1&gt;Install&lt;/h1&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Usage&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Initialize the directory of the Python project by invoking this inside the directory:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv init
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This creates a &lt;code&gt;pyproject.toml&lt;/code&gt; with project metadata and &lt;code&gt;.python-version&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add a package that this project depends on:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv add markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Remove a package from this project:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv remove markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Run the program:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv run foobar.py
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This automatically creates a virtual environment with directory &lt;code&gt;.venv&lt;/code&gt; (if it does not already exist) and &lt;code&gt;uv.lock&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To commit the uv files in the project directory to Git:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ git add pyproject.toml uv.lock
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;To migrate an older project (that uses explicit venv and pip) to uv:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ /bin/rm -f old_venv_dir

$ uv init

$ uv add -r requirements.txt

$ /bin/rm requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;To remove uv from a project directory:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ rm -rf pyproject.toml uv.lock .python-version .venv
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;List the Python versions and their locations:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv python list
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Update itself:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv self update
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Self contained scripts&lt;/h1&gt;
&lt;p&gt;For single file scripts, it is easier to put the package dependencies metadata in the script itself.
uv can support this in a way that is compliant with &lt;a href="https://peps.python.org/pep-0723/"&gt;PEP 723&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use uv to add the packages to the script:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv add --script foobar.py markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This adds the &lt;code&gt;markdown&lt;/code&gt; package as a dependency at the top of the &lt;code&gt;foobar.py&lt;/code&gt; script.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make the script executable and running it is as simple as:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ ./foobar.py
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;How is this working with no extra directories and files added in our project directory?
uv manages all the metadata and packages for this script in a global cache, separately for each script.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To remove a package as dependency of the script:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv remove --script foobar.py markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;To view tree of package dependencies:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv tree --script foobar.py
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Cache&lt;/h1&gt;
&lt;p&gt;The cache is where uv maintains the package and Python information for scripts where we inline the metadata.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To see where this cache is located:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv cache dir
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;To prune the cache:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv cache prune
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;To empty the cache:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv cache clean
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Tried with:&lt;/strong&gt; uv 0.11.2&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-03-27-uv.html</guid>
      <pubDate>Fri, 27 Mar 2026 03:59:14 +0000</pubDate>
    </item>
    <item>
      <title>human.json</title>
      <link>https://codeyarns.com/tech/2026-03-24-humanjson.html</link>
      <description>&lt;p&gt;&lt;a href="https://codeberg.org/robida/human.json"&gt;&lt;strong&gt;human.json&lt;/strong&gt;&lt;/a&gt; is a simple decentralized mechanism created by &lt;a href="https://robida.net/"&gt;Beto Dealmeida&lt;/a&gt; to discover human-authored websites and for owners of such sites to declare authorship.
It essentially helps build a human-curated network of trusted sites.&lt;/p&gt;
&lt;h1&gt;For website owner&lt;/h1&gt;
&lt;p&gt;To assert that your website is human-authored, follow 2 simple steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add a &lt;code&gt;human.json&lt;/code&gt; at the root of your domain in this format:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;{
    &amp;quot;url&amp;quot;: &amp;quot;https://codeyarns.com&amp;quot;,
    &amp;quot;version&amp;quot;: &amp;quot;0.1.1&amp;quot;,
    &amp;quot;vouches&amp;quot;: [
        {&amp;quot;url&amp;quot;: &amp;quot;https://nedbatchelder.com&amp;quot;, &amp;quot;vouched_at&amp;quot;: &amp;quot;2026-03-22&amp;quot;},
        {&amp;quot;url&amp;quot;: &amp;quot;https://daringfireball.net&amp;quot;, &amp;quot;vouched_at&amp;quot;: &amp;quot;2026-03-22&amp;quot;},
        {&amp;quot;url&amp;quot;: &amp;quot;https://stratechery.com&amp;quot;, &amp;quot;vouched_at&amp;quot;: &amp;quot;2026-03-23&amp;quot;}
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The contents of the JSON file describe the domain of your own site and also list the other websites which you believe are human-authored.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add this line in the header of your HTML files:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;&amp;lt;link rel=&amp;quot;human-json&amp;quot; href=&amp;quot;/human.json&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;For web users&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install the Firefox extension from &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/human-json-verifier/"&gt;here&lt;/a&gt;.
Make sure the addon is pinned to the toolbar, so that its traffic light icon is visible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Toolbar icon is ⚪️ when there is no information on the website you are visiting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Toolbar icon is 🟢 or 🟡 or 🟠 depending on whether it is 1/2/3 hops away from a website you trust as human-authored.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you visit a website which has human.json, you can click on the addon button and click &lt;em&gt;Trust this site&lt;/em&gt; to add it and the list of sites in its human.json file to your network (being tracked by your addon).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-03-24-humanjson.html</guid>
      <pubDate>Tue, 24 Mar 2026 04:04:57 +0000</pubDate>
    </item>
    <item>
      <title>Claude Code</title>
      <link>https://codeyarns.com/tech/2026-03-20-claude-code.html</link>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Claude_(language_model)#Claude_Code"&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/a&gt; is the CLI agentic AI tool by Anthropic designed to aid in software development.&lt;/p&gt;
&lt;h1&gt;Install&lt;/h1&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew install --cask claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Basics&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Invoke&lt;/strong&gt; &lt;code&gt;claude&lt;/code&gt; at the root of any project directory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ask&lt;/strong&gt; it questions in natural language about the codebase in that directory to learn more about the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement&lt;/strong&gt; code changes by asking it in natural language.
It will show you the diff before writing the changes to the files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Commit&lt;/strong&gt; the code changes to Git using natural language.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Drop into shell&lt;/strong&gt; by suspending Claude Code using &lt;code&gt;ctrl z&lt;/code&gt;.
This is useful to run shell commands.
Jump back into the suspended Claude session using &lt;code&gt;fg&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clear&lt;/strong&gt; the current conversation history with &lt;code&gt;/clear&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Everytime Claude Code is invoked, it does not remember the previous session.
To make it &lt;strong&gt;resume&lt;/strong&gt; the most recent session in that directory, use &lt;code&gt;claude -c&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://code.claude.com/docs/en/commands"&gt;Built-in commands&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/btw&lt;/code&gt;: Ask a side question that does not add to the current context window.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/compact&lt;/code&gt;: Compress the context window by replacing with a summary.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/context&lt;/code&gt;: Display visualization of current model info, context window usage, memory used by &lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt; and skills.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/cost&lt;/code&gt;: Show total cost in $ from token usage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/fast&lt;/code&gt;: Check if fast mode is ON or OFF. Also use to toggle it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/init&lt;/code&gt;: Initialize the project with &lt;code&gt;CLAUDE.md&lt;/code&gt; if it does not exist already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/insights&lt;/code&gt;: Generates a report of your Claude Code usage at &lt;code&gt;~/.claude/usage-data/report.html&lt;/code&gt;.
Be prepared to be severely judged and reviewed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://code.claude.com/docs/en/skills"&gt;Skills&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A &lt;strong&gt;skill&lt;/strong&gt; is a way for the user to extend the toolkit of Claude Code with additional and specific functionality.&lt;/p&gt;
&lt;p&gt;A skill is specified in a &lt;code&gt;SKILL.md&lt;/code&gt; file like this:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;---
name: use-super-power
description: Use the super power of Unix tools to answer my query.
---

Here is a list of Unix tools you should invoke when answering the query:
- du
- df
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;name&lt;/code&gt; is the name of the skill, written typically in lowercase, no spaces and separated by hyphens.
For example &lt;code&gt;use-super-power&lt;/code&gt;.
User can explicitly invoke it as &lt;code&gt;/use-super-power&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;description&lt;/code&gt; is a user-friendly description of the skill in English.
The skill will be used by Claude Code automatically if user asks something that is similar to what is in the description.&lt;/p&gt;
&lt;p&gt;This file can be located for use by any project as &lt;code&gt;~/.claude/skills/use-super-power/SKILL.md&lt;/code&gt;.
Or it can be located inside a specific directory for use only by that project: &lt;code&gt;/home/joe/my-gnu-kernel/.claude/skills/use-super-power/SKILL.md&lt;/code&gt;.
Other files required by the skill can be placed alongside in its directory.&lt;/p&gt;
&lt;p&gt;To invoke a skill explicitly, use its name: &lt;code&gt;/use-super-power&lt;/code&gt;.
This loads the skill and also runs its with any input argument provided.&lt;/p&gt;
&lt;p&gt;If the skill is loaded based on user's textual description, Claude Code shows that the skill is being loaded:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;Skill(use-super-power)
  ⎿  Successfully loaded skill
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The loaded skills at any point in time can be seen by typing &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Currently there is no way to ask Claude to load skills located in a specific random directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tried with:&lt;/strong&gt; Claude Code 2.1.79&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-03-20-claude-code.html</guid>
      <pubDate>Fri, 20 Mar 2026 20:39:14 +0000</pubDate>
    </item>
    <item>
      <title>How to make a Firefox addon</title>
      <link>https://codeyarns.com/tech/2026-03-20-how-to-make-a-firefox-addon.html</link>
      <description>&lt;p&gt;One of the best features of Firefox is the availability of a large number of addons.
It is pretty easy to create a Firefox addon and with AI tools the bar is lowered to create addons to enhance your browsing experience in many little ways.&lt;/p&gt;
&lt;h1&gt;Develop the addon&lt;/h1&gt;
&lt;p&gt;Developing an addon involves at least a &lt;code&gt;manifest.json&lt;/code&gt; and additional HTML/JS/CSS files they pull in.&lt;/p&gt;
&lt;p&gt;Example of &lt;code&gt;manifest.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;{
  &amp;quot;manifest_version&amp;quot;: 2,
  &amp;quot;name&amp;quot;: &amp;quot;BoostMyWebpage&amp;quot;,
  &amp;quot;version&amp;quot;: &amp;quot;1.0&amp;quot;,
  &amp;quot;description&amp;quot;: &amp;quot;Boost my webpage with EXTRA power!&amp;quot;,
  &amp;quot;browser_specific_settings&amp;quot;: {
    &amp;quot;gecko&amp;quot;: {
      &amp;quot;id&amp;quot;: &amp;quot;boostmywebpage@extension-without-data-collection&amp;quot;,
      &amp;quot;data_collection_permissions&amp;quot;: {
        &amp;quot;required&amp;quot;: [&amp;quot;none&amp;quot;]
      }
    }
  },
  &amp;quot;permissions&amp;quot;: [
    &amp;quot;activeTab&amp;quot;
  ],
  &amp;quot;browser_action&amp;quot;: {
    &amp;quot;default_popup&amp;quot;: &amp;quot;boostmywepage.html&amp;quot;,
    &amp;quot;default_title&amp;quot;: &amp;quot;Boost My Webpage&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Test the addon&lt;/h1&gt;
&lt;p&gt;To test the addon, you can temporarily add the addon to the current sessio of Firefox.
To do this go to &lt;code&gt;about:debugging&lt;/code&gt; and choose the link to add the &lt;code&gt;manifest.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Once the addon is added to the Firefox session, test and debug it.
The addon is automatically removed the next time Firefox is restarted.&lt;/p&gt;
&lt;h1&gt;Submit the addon&lt;/h1&gt;
&lt;p&gt;For permanent use, the addon needs to be verified and signed by Mozilla into a &lt;code&gt;.xpi&lt;/code&gt; file.
You can additionally also choose to publish it publicly to the online Firefox addons registry.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zip up the addon files:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ zip -r boostmywebpage.zip manifest.json boostmywebpage.html boostmywebpage.js boostmywebpage.css
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;a href="https://addons.mozilla.org/developers"&gt;Mozilla Addons Developers&lt;/a&gt; page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Login and choose to Submit a new addon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upload the &lt;code&gt;.zip&lt;/code&gt; file for validation and signing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You receive an email once they approve and you can download the &lt;code&gt;.xpi&lt;/code&gt; file to install into Firefox.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bingo! You have your own Firefox addon.&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-03-20-how-to-make-a-firefox-addon.html</guid>
      <pubDate>Fri, 20 Mar 2026 05:55:55 +0000</pubDate>
    </item>
    <item>
      <title>Kensington SlimBlade Pro EQ Trackball</title>
      <link>https://codeyarns.com/tech/2026-03-16-kensington-slimblade-pro-eq-trackball.html</link>
      <description>&lt;p&gt;I have been using trackballs instead of mice for almost 18 years now.
Last year, I upgraded to a &lt;a href="https://www.kensington.com/p/products/electronic-control-solutions/trackball-products/slimblade-pro-eq-trackball/"&gt;&lt;strong&gt;Kensington SlimBlade Pro EQ Trackball&lt;/strong&gt;&lt;/a&gt; from my trusty &lt;a href="2020-04-19-kensington-expert-mouse-wireless-trackball.html"&gt;Kensington Expert Mouse Wireless Trackball&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SKU: K72084NA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Size&lt;/strong&gt;:
This trackball is smaller, slimmer and lighter than my previous trackball.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wireless&lt;/strong&gt;:
Just like my previous trackball, this one supports using Bluetooth and also using a wireless 2.4GHz Nano receiver.
It does not support connecting to multiple computers over Bluetooth though.
So, between the Bluetooth and wifi, it can only connect to 2 computers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Charging&lt;/strong&gt;:
A USB cable can be used to charge the trackball.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wired&lt;/strong&gt;:
When connected by a USB cable to a computer, it can also be used as a wired trackball with that computer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-03-16-kensington-slimblade-pro-eq-trackball.html</guid>
      <pubDate>Mon, 16 Mar 2026 16:35:39 +0000</pubDate>
    </item>
    <item>
      <title>Macbook Neo</title>
      <link>https://codeyarns.com/tech/2026-03-12-macbook-neo.html</link>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/MacBook_Neo"&gt;&lt;strong&gt;Macbook Neo&lt;/strong&gt;&lt;/a&gt; is an entry-level laptop from Apple that was launched in 2026.
I was impressed by the features and performance available for the $600 price and obtained it on launch day.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://www.apple.com/macbook-neo/specs/"&gt;Specifications&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Chip: A18 Pro&lt;/li&gt;
&lt;li&gt;Memory: 8 GB&lt;/li&gt;
&lt;li&gt;Storage: 256 GB&lt;/li&gt;
&lt;li&gt;Display: 2408x1506&lt;/li&gt;
&lt;li&gt;Battery: 36.5 watt hour&lt;/li&gt;
&lt;li&gt;Weight: 1.23 kg&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Missing features&lt;/h1&gt;
&lt;p&gt;Features I miss on the Neo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Touch ID&lt;/strong&gt;:
The $600 version of Neo does not have Touch ID, you need to get the $700 version for that.
Without Touch ID, I need to type in my entire password everytime I unlock this computer.
This is a huge hassle if you want to use your Apple.com login or have a complex local login.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Camera status light&lt;/strong&gt;:
There is no light to indicate that the camera is ON.
This is a privacy miss, since I have come to rely on that light to know that I am on camera when I am multi-tasking in some non-video-call window.
However, Daring Fireball &lt;a href="https://daringfireball.net/linked/2026/03/12/macbook-neo-on-screen-camera-indicator"&gt;pointed out&lt;/a&gt; that there is actually a 🟢 &lt;em&gt;green dot&lt;/em&gt; indicator that appears in the Menu Bar at the top-right corner (beside the time) only when the camera is on.
I think this is a decent compromise, though I think Apple should give us a MacOS option to always display this at the corner (can be grayed out when camera is not in use).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.apple.com/guide/macbook-neo/"&gt;Macbook Neo: Getting Started Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-03-12-macbook-neo.html</guid>
      <pubDate>Thu, 12 Mar 2026 05:43:10 +0000</pubDate>
    </item>
    <item>
      <title>Tech links of March 2026</title>
      <link>https://codeyarns.com/tech/2026-03-10-tech-links-of-march-2026.html</link>
      <description>&lt;h1&gt;&lt;a href="https://daringfireball.net/2026/03/the_iphone_17e"&gt;The iPhone 17e&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;The $599 iPhone 17e, with the A19, benchmarks faster in single-core CPU performance than the $599 MacBook Neo, with the year-old A18 Pro.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post also has a useful pricing comparison table for the iPhones on sale right now.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://daringfireball.net/2026/03/599_not_a_piece_of_junk_macbook_neo"&gt;Thoughts and Observations on the MacBook Neo&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;The MacBook Neo is not a footnote or hobby, or a pricing stunt to get people in the door before upselling them to a MacBook Air. It’s the first major new Mac aimed at the consumer market in the Apple Silicon era.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://daringfireball.net/2026/03/the_macbook_neo"&gt;The MacBook Neo&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;The Neo is a mass-market device that was conceived of, designed, and engineered to expand the Mac user base to a larger audience. It’s a design statement too, but of a different sort — emphasizing practicality above all else. It’s just a goddamn lovely tool, and fun too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/code-is-cheap/"&gt;Writing code is cheap now&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Delivering new code has dropped in price to almost free... but delivering good code remains significantly more expensive than that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post has a good definition of "good code".&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/red-green-tdd/"&gt;Red/green TDD&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Every good model understands "red/green TDD" as a shorthand for the much longer "use test driven development, write the tests first, confirm that the tests fail before you implement the change that gets them to pass".&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://www.modular.com/blog/the-claude-c-compiler-what-it-reveals-about-the-future-of-software"&gt;The Claude C Compiler: What It Reveals About the Future of Software&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;The most interesting lesson from the Claude C Compiler is not that AI can build a compiler. It’s how it built one. CCC didn’t invent a new architecture or explore an unfamiliar design space. Instead, it reproduced something strikingly close to the accumulated consensus of decades of compiler engineering: structurally correct, familiar, and grounded in well-understood techniques.&lt;/p&gt;
&lt;p&gt;CCC shows that AI systems can internalize the textbook knowledge of a field and apply it coherently at scale. AI can now reliably operate within established engineering practice. This is a genuine milestone that removes much of the drudgery of repetition and allows engineers to start closer to the state of the art.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://www.nytimes.com/2026/02/18/opinion/ai-software.html"&gt;The A.I. Disruption We’ve Been Waiting for Has Arrived&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;November was, for me and many others in tech, a great surprise. Before, A.I. coding tools were often useful, but halting and clumsy. Now, the bot can run for a full hour and make whole, designed websites and apps that may be flawed, but credible. I spent an entire session of therapy talking about it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://samhenri.gold/blog/20260312-this-is-not-the-computer-for-you/"&gt;“This Is Not The Computer For You”&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;This computer is for the kid who doesn’t have a margin to optimize.
Who can’t wait for the right tool to materialize.
Who is going to take what’s available and push it until it breaks and learn something permanent from the breaking.&lt;/p&gt;
&lt;p&gt;The reviews can tell you what a computer is for. They have very little interest in what you might become because of one.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://www.terrygodier.com/the-last-quiet-thing"&gt;The Last Quiet Thing&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Fantastic essay that compares the simple &lt;a href="2022-02-01-casio-f91w.html"&gt;Casio F-91W&lt;/a&gt; with all the digital gadgets of today that need our constant attention.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nothing you own is finished. Everything exists in a state of permanent incompletion, permanently needing. Your phone needs updates, needs charging, needs storage cleared, needs passwords rotated.
Your apps need permissions reviewed, terms accepted, preferences re-configured after every update.
Your subscriptions need evaluating, need renewing, need canceling, need justifying to yourself every month when the charge appears. The purchase isn't the end of anything. It's the first day of a relationship you didn't agree to, with no clean way out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://simonwillison.net/2026/Mar/14/pragmatic-summit/"&gt;My fireside chat about agentic engineering at the Pragmatic Summit&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Highlights from this Simon Willison interview is full of practical advise for vide coding and agentic engineering &lt;/p&gt;
&lt;h1&gt;&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/what-is-agentic-engineering/"&gt;What is agentic engineering?&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;I use the term agentic engineering to describe the practice of developing software with the assistance of coding agents.&lt;/p&gt;
&lt;p&gt;What are coding agents? They're agents that can both write and execute code.&lt;/p&gt;
&lt;p&gt;What's an agent? Agents run tools in a loop to achieve a goal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/how-coding-agents-work/"&gt;How coding agents work&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;A coding agent is a piece of software that acts as a harness for an LLM, extending that LLM with additional capabilities that are powered by invisible prompts and implemented as callable tools.&lt;/p&gt;
&lt;p&gt;Coding agents are designed with this optimization in mind - they avoid modifying earlier conversation content to ensure the cache is used as efficiently as possible.&lt;/p&gt;
&lt;p&gt;The defining feature of an LLM agent is that agents can call tools.
A tool is a function that the agent harness makes available to the LLM.&lt;/p&gt;
&lt;p&gt;Coding agents usually start every conversation with a system prompt, which is not shown to the user but provides instructions telling the model how it should behave.&lt;/p&gt;
&lt;p&gt;Reasoning, sometimes presented as thinking in the UI, is when a model spends additional time generating text that talks through the problem and its potential solutions before presenting a reply to the user.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/subagents/"&gt;Subagents&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;LLMs are restricted by their context limit - how many tokens they can fit in their working memory at any given time. These values have not increased much over the past two years even as the LLMs themselves have seen dramatic improvements in their abilities - they generally top out at around 1,000,000, and benchmarks frequently report better quality results below 200,000.&lt;/p&gt;
&lt;p&gt;Carefully managing the context such that it fits within those limits is critical to getting great results out of a model.&lt;/p&gt;
&lt;p&gt;Subagents provide a simple but effective way to handle larger tasks without burning through too much of the coding agent’s valuable top-level context.
When a coding agent uses a subagent it effectively dispatches a fresh copy of itself to achieve a specified goal, with a new context window that starts with a fresh prompt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://platform.openai.com/tokenizer"&gt;OpenAI Tokenizer&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Online visualization tool to view the tokens and token IDs of any input text.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://www.nytimes.com/2026/03/12/magazine/ai-coding-programming-jobs-claude-chatgpt.html"&gt;Coding After Coders: The End of Computer Programming as We Know It&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;When you behold the prompt file of a coder using A.I., you are viewing a record of the developer’s attempts to restrain the agents’ generally competent, but unpredictably deviant, actions.&lt;/p&gt;
&lt;p&gt;If you want to put a number on how much more productive A.I. is making the programmers at mature tech firms like Google, it’s 10 percent, Sundar Pichai, Google’s chief executive, has said.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://simonwillison.net/2026/Feb/21/claws/"&gt;Andrej Karpathy talks about "Claws"&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;"Claw" is becoming a term of art for the entire category of OpenClaw-like agent systems - AI agents that generally run on personal hardware, communicate via messaging protocols and can both act on direct instructions and schedule tasks.
It even comes with an established emoji 🦞&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://thatshubham.com/blog/news-audit"&gt;The 49MB Web Page&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Taking a cursory look at the network waterfall for a single article load reveals a sprawling, unregulated programmatic ad auction happening entirely in the client's browser.
Before the user finishes reading the headline, the browser is forced to process dozens of concurrent bidding requests to exchanges like Rubicon Project (fastlane.json) and Amazon Ad Systems.&lt;/p&gt;
&lt;p&gt;The background invisible pixel drops and redirects to doubleclick.net and casalemedia help stitch the user's cross-site identity together across different ad networks. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://www.augmentcode.com/blog/how-we-hire-ai-native-engineers-now"&gt;How we hire AI-native engineers now: our criteria | Augment Code&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Coding still matters. But increasingly, it’s the part machines can help with.
More important now is judgment: the ability to choose the right problems, make sound architectural decisions, and direct both humans and agents toward meaningful outcomes.&lt;/p&gt;
&lt;p&gt;“It works” is easy. “It will keep working in production” is much harder.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://arxiv.org/abs/2409.12941v3"&gt;Satyapriya Krishna - 2024 - Fact, Fetch, and Reason: A Unified Evaluation of Retrieval-Augmented Generation&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Proposes FRAMES (Factuality, Retrieval, And reasoning MEasurement Set), a dataset and unified framework designed to assess LLM performance in end-to-end RAG scenarios.&lt;/li&gt;
&lt;li&gt;Dataset is 824 samples, each question requiring 2-15 Wikipedia articles.&lt;/li&gt;
&lt;li&gt;For multi-step evaluation, model is asked a question and instruction to generate k search queries used to extract the top Wiki articles. This is appended to the context and repeated n times and asked the question with this final appended context.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://gerrit-review.googlesource.com/Documentation/user-attention-set.html"&gt;Gerrit Code Review - Attention Set&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;2 principles for good team velocity in code reviews:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Reviewers are expected to respond in a timely manner when it is their turn. If you don’t plan to respond within ~24h, then you should either remove yourself from the attention set or you should at least send a clarification message to the change owner.&lt;/p&gt;
&lt;p&gt;Change owners are expected to manage the attention set of their changes carefully. They should make sure that reviewers are only in the attention set when the owner waits for a response from them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://shkspr.mobi/blog/2026/03/im-ok-being-left-behind-thanks/"&gt;I’m OK being left behind, thanks! – Terence Eden’s Blog&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;An alternate perspective.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm utterly content to wait until their hype has been realised.
Why should I invest in learning the equivalent of WordStar for DOS when Google Docs is coming any-day-now?
If this tech is as amazing as you say it is, I'll be able to pick it up and become productive on a timescale of my choosing not yours.
It is 100% OK to wait and see if something is actually useful.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;&lt;a href="https://shkspr.mobi/blog/2025/06/gadget-review-treedix-usb-cable-tester/"&gt;Gadget Review: Treedix USB Cable Tester – Terence Eden’s Blog&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Fantastic gadget to use with all the USB cables at home and work to learn about the myriad details of USB and to separate the good cables from the bad.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://www.youtube.com/watch"&gt;Oil pressure is the only thing keeping an engine alive - YouTube&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Technology Connections gem uses the car engine &lt;em&gt;oil pressure&lt;/em&gt; warning to delve into the workings of the internal combustion engine, engine block, pistons, crankshaft and oil pump.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://github.com/danveloper/flash-moe/blob/main/paper/flash_moe.pdf"&gt;Daniel Woods - 2026 - Flash-MoE: Streaming a 397B Parameter Mixture-of-Experts Model from NVMe at 5.7 Tokens/Second on Consumer Hardware&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Developed using autoresearch protocol. Author and Claude Code. AI generated the Metal shaders, Objective-C pipeline.&lt;/li&gt;
&lt;li&gt;Qwen3.5-397B-A17B runs on Macbook Pro (M3 Max) with 48GB unified memory at 5 TPS. Weights streaming from NVMe SSD for experts, 2-bit experts and inference engine in Objective-C calling Metal GPU compute shaders.&lt;/li&gt;
&lt;li&gt;LPDDR has 400GB/s and NVMeSSD has 17GB/s.&lt;/li&gt;
&lt;li&gt;Unified memory means a Metal buffer allocated by GPU can be accessed by CPU and vice versa.&lt;/li&gt;
&lt;li&gt;Choose Top-4 experts instead of Top-10.&lt;/li&gt;
&lt;li&gt;Non-expert weights use 5.5GB.&lt;/li&gt;
&lt;li&gt;Expert weights are 200 GB for 4-bit and 120 GB for 2-bit. Stored in format that enables direct access to expert weights by expert index.&lt;/li&gt;
&lt;li&gt;Both 4-bit and 2-bit weights are quantized in groups of 64 values, with BF16 float+bias for each 64 and actual quantized values stored in UINT32 chunks.&lt;/li&gt;
&lt;li&gt;Attention, softmax and Top-K, tokenizer on CPU, rest on GPU with 5 Metal compute shaders.&lt;/li&gt;
&lt;li&gt;pread to directly read from expert weight file to memory buffer used by Metal shader.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://arxiv.org/abs/2411.19108v2"&gt;Feng Liu - 2024 - Timestep Embedding Tells: It's Time to Cache for Video Diffusion Model&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Diffusion models are the backbone of video generation. Their performance bottleneck is sequential nature of denoising steps.&lt;/li&gt;
&lt;li&gt;Uniform caching relies on observation that model outputs are similar between consecutive timesteps. But fails if output varies between timesteps.&lt;/li&gt;
&lt;li&gt;Figure 4 is a good illustration of the transformer diffusion module, its inputs and outputs.&lt;/li&gt;
&lt;li&gt;None of the 3 inputs are ideal by themselves: text embedding remains constant, timestep embedding does not reflect the input and noisy input is not sensitive to time.&lt;/li&gt;
&lt;li&gt;So, the timestep embedding modulated noisy input is used by TEACache (Timestep Embedding Aware Cache).&lt;/li&gt;
&lt;li&gt;Graphs in Figure 3 show a strong correlation between model output and the timestep-modulated-noisy-input chosen by TEACache.&lt;/li&gt;
&lt;li&gt;TEACache checks if accumulated relative L1-distance of this signal is less than a threshold to decide whether to use cached output.&lt;/li&gt;
&lt;li&gt;To resolve scaling bias, a polynomial fitting is applied on the L1 distance computation using Numpy poly1d.&lt;/li&gt;
&lt;li&gt;Results show 2-4x speedup with a small drop in visual quality.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://arxiv.org/abs/2503.06923v2"&gt;Jiacheng Liu - 2025 - From Reusing to Forecasting: Accelerating Diffusion Models with TaylorSeers&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Introduces TaylorSeer specifically for DIT models: method to approximate higher-order derivatives of features and predict features in future timesteps.&lt;/li&gt;
&lt;li&gt;It argues that features over timesteps have a stable trajectory, so can instead of cache-then-reuse of feature caching, this paper proposes cache-then-forecast. Depending on the forecast, cached features are reused or computed from scratch.&lt;/li&gt;
&lt;li&gt;Figure 3 compares naive caching to TaylorSeer, with use of increasing O (orders of finite differences).&lt;/li&gt;
&lt;li&gt;Cache stores a feature and its 1 to m-th order finite differences. Taylor's series expansion is used to predict feature at next timestep using these cached data (Eq 10).&lt;/li&gt;
&lt;li&gt;Experiments for T2I and T2V use $\mathcal{N}$ &lt;em&gt;unified forced activation period&lt;/em&gt; (aka how many steps to run before full recompute) and $\mathcal{O}$ (order of Taylor expansion). Results show 5x speedup on FLUX/HunyuanVideo. Ironically, the best results (Table 2) use just $\mathcal{O} = 1$, but good $\mathcal{N} = 6$.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://artificialanalysis.ai/methodology/agentperf"&gt;AA-AgentPerf Methodology&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Benchmark from Artificial Analysis that measures how many active users can be supported on real-world agentic trajectories while meeting performnance targets.&lt;/li&gt;
&lt;li&gt;Private dataset of coding trajectories, includes 12 programming languages, generated from public code repositories.&lt;/li&gt;
&lt;li&gt;Two models are used: DeepSeek V3.2 and GPT-OSS-120B, each with its own set of SLO (Service Level Objectives) of P25 output TPS and P95 TTFT.&lt;/li&gt;
&lt;li&gt;Binary search is used to determine the maximum number of users that can be supported for each SLO.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://arxiv.org/abs/2603.23971v1"&gt;Lingjiao Chen - 2026 - The Price Reversal Phenomenon: When Cheaper Reasoning Models End Up Costing More&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Study that compares the API prices of reasoning language models (RLM) to their actual usage cost. Found pricing reversal phenomenon: lower unit price RLM costs more on work. Root caused to disparity in thinking token consumption between RLM.&lt;/li&gt;
&lt;li&gt;Figure 1 shows graphs of listed price versus actual cost of popular RLM.&lt;/li&gt;
&lt;li&gt;RLM produce both visible response tokens and invisible thinking tokens, the latter varies by order of magnitude among RLM for the same query and dominates the actual cost.&lt;/li&gt;
&lt;li&gt;Tests 8 RLM on 8 datasets covering math, puzzles, chat, science, QA, coding.&lt;/li&gt;
&lt;li&gt;User pays separately for each query. Cost to user is price of input/output tokens weighted by number of input/output tokens - Eq 1.&lt;/li&gt;
&lt;li&gt;Found that price reversal is pervasive and can be as much as 28x for certain model-test pairs. Rankings can vary based on task/test.&lt;/li&gt;
&lt;li&gt;Removal of thinking token cost restores the ranking of models to be consistent with price.&lt;/li&gt;
&lt;li&gt;Code: https://github.com/lchen001/pricing-reversal&lt;/li&gt;
&lt;li&gt;Online app: https://price-reversal.streamlit.app/&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-03-10-tech-links-of-march-2026.html</guid>
      <pubDate>Tue, 10 Mar 2026 05:25:37 +0000</pubDate>
    </item>
    <item>
      <title>iTerm2</title>
      <link>https://codeyarns.com/tech/2026-02-28-iterm2.html</link>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/ITerm2"&gt;&lt;strong&gt;iTerm2&lt;/strong&gt;&lt;/a&gt; is an open-source alternative to the &lt;a href="2025-04-29-macos-terminal.html"&gt;&lt;strong&gt;Terminal&lt;/strong&gt;&lt;/a&gt; app that ships with MacOS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Split&lt;/strong&gt;:
The window can be split to create a new terminal session.
Press &lt;code&gt;command d&lt;/code&gt; to split vertically or &lt;code&gt;shift command d&lt;/code&gt; to split horizontally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change shell&lt;/strong&gt;:
To set a different shell as the default one, go to Settings -&amp;gt; Profiles -&amp;gt; General -&amp;gt; Command.
Choose &lt;em&gt;Custom Shell&lt;/em&gt; and provide the full path to the shell binary.
For example: &lt;code&gt;/opt/homebrew/bin/fish&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tried with:&lt;/strong&gt; iTerm2 and MacOS Tahoe 26.3&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-28-iterm2.html</guid>
      <pubDate>Sat, 28 Feb 2026 00:23:02 +0000</pubDate>
    </item>
    <item>
      <title>Batteries</title>
      <link>https://codeyarns.com/tech/2026-02-27-batteries.html</link>
      <description>&lt;h1&gt;&lt;a href="https://en.wikipedia.org/wiki/Nine-volt_battery"&gt;9V Battery&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smoke alarms&lt;/strong&gt;:
These alarms can be in places that are difficult to reach, so it is best to choose a battery that lasts the longest.
The recommendation is to pick a &lt;em&gt;Lithium&lt;/em&gt; non-rechargeable battery with 10-year shelf life and the maxmimum capacity (on 2026-02-27 this was &lt;em&gt;1200 mAh&lt;/em&gt;).
Avoid rechargeable or alkaline batteries.
I ended up choosing &lt;a href="https://www.amazon.com/dp/B0887W4985"&gt;Tenergy&lt;/a&gt; batteries for this purpose.&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-27-batteries.html</guid>
      <pubDate>Fri, 27 Feb 2026 18:32:47 +0000</pubDate>
    </item>
    <item>
      <title>PageFind</title>
      <link>https://codeyarns.com/tech/2026-02-23-pagefind.html</link>
      <description>&lt;p&gt;&lt;a href="https://pagefind.app/"&gt;&lt;strong&gt;PageFind&lt;/strong&gt;&lt;/a&gt; can be used to add search capability to any static website.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ python3 -m pip install 'pagefind[extended]'
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Index&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To index the HTML webpages located in a local directory:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ python3 -m pagefind --site ../my_website_files
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This adds the index files and also the required JS files in &lt;code&gt;../my_website_files/pagefind&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;If you prefer to use &lt;code&gt;uv&lt;/code&gt; to run pagefind:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ uv run --with &amp;quot;pagefind[bin]&amp;quot;  python3 -m pagefind --site ../my_website_files
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Add search box&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add this HTML code to all the website HTML files to get the search box:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;&amp;lt;link href=&amp;quot;/pagefind/pagefind-component-ui.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;/pagefind/pagefind-component-ui.js&amp;quot; type=&amp;quot;module&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;pagefind-searchbox style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&amp;lt;/pagefind-searchbox&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Upload the new HMTL files and also all the contents of the &lt;code&gt;../my_website_files/pagefind&lt;/code&gt; directory online to have your website with search.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tried with:&lt;/strong&gt; PageFind 1.5.0&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-23-pagefind.html</guid>
      <pubDate>Mon, 23 Feb 2026 01:46:18 +0000</pubDate>
    </item>
    <item>
      <title>Wallbox Pulsar Plus</title>
      <link>https://codeyarns.com/tech/2026-02-15-wallbox-pulsar-plus.html</link>
      <description>&lt;p&gt;&lt;a href="https://wallbox.com/"&gt;&lt;strong&gt;Wallbox&lt;/strong&gt;&lt;/a&gt; makes home EV chargers and their &lt;a href="https://wallbox.com/en_us/pulsar-plus-ev-charger"&gt;&lt;strong&gt;Pulsar Plus&lt;/strong&gt;&lt;/a&gt; compact EV charger is what we found in our home when we moved in.&lt;/p&gt;
&lt;h1&gt;Specifications&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Model: PUP1&lt;/li&gt;
&lt;li&gt;Output: 25 ft&lt;/li&gt;
&lt;li&gt;EVC: Type 1&lt;/li&gt;
&lt;li&gt;Power: 9.6 kW&lt;/li&gt;
&lt;li&gt;Version: NEMA 14-50P&lt;/li&gt;
&lt;li&gt;Color: Black&lt;/li&gt;
&lt;li&gt;Enclosure type: 4&lt;/li&gt;
&lt;li&gt;Input/Output: 208/240 VAC, 60 Hz, 40 A&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Usage&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;App&lt;/strong&gt;:
The &lt;a href="https://wallbox.com/en_us/wallbox-app"&gt;Wallbox app&lt;/a&gt; is required to view, configure, monitor and control the Pulsar Plus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Changing ownership&lt;/strong&gt;:
We could not use the Wallbox app since the Pular Plus charger was already linked to the email address of our previous owner.
To change ownership, we had to contact &lt;a href="mailto:service.na@wallbox.com"&gt;service.na@wallbox.com&lt;/a&gt; with proof of home ownership and the serial number of our unit.
In 24 hours, they promptly unlinked the previous owner and associated this unit with our email address.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-15-wallbox-pulsar-plus.html</guid>
      <pubDate>Sun, 15 Feb 2026 20:25:00 +0000</pubDate>
    </item>
    <item>
      <title>Instapaper</title>
      <link>https://codeyarns.com/tech/2026-02-11-instapaper.html</link>
      <description>&lt;p&gt;&lt;a href="https://www.instapaper.com/"&gt;&lt;strong&gt;Instapaper&lt;/strong&gt;&lt;/a&gt; is an online service to save articles from the web to read later.
It is similar to the now-discontinued &lt;a href="https://en.wikipedia.org/wiki/Pocket_(service)"&gt;&lt;strong&gt;Pocket&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Saving a webpage&lt;/strong&gt;:
Webpages can be saved manually by adding their link in the Instapaper webpage.
A more convenient option is to install their &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/instapaper-official/"&gt;Firefox extension&lt;/a&gt; and click its toolbar button on any webpage.
An older method is its &lt;a href="https://www.instapaper.com/save"&gt;bookmarklet&lt;/a&gt;, which works, but is deprecated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Archive&lt;/strong&gt;:
There is no &lt;em&gt;read&lt;/em&gt; operation, instead we can &lt;em&gt;archive&lt;/em&gt; an article after reading it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;:
Any saved article can be associated to any number of tags.
The tag can be assigned (or created new) when adding an article using the Firefox extension.
The tag remains associated with the article even when the article is archived.
The Instapaper interface always shows &lt;em&gt;all&lt;/em&gt; the articles associated with a tag, whether it is archived or not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Folders&lt;/strong&gt;:
This is an older feature, that is now deprecated and will be removed soon.
Adding an article to a folder cannot be done when saving it using the extension.
That needs to be done later in the webpage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-11-instapaper.html</guid>
      <pubDate>Wed, 11 Feb 2026 02:57:19 +0000</pubDate>
    </item>
    <item>
      <title>Homebrew</title>
      <link>https://codeyarns.com/tech/2026-02-05-homebrew.html</link>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Homebrew_(package_manager)"&gt;&lt;strong&gt;Homebrew&lt;/strong&gt;&lt;/a&gt; is a package manager for MacOS to install, remove or update applications/libraries from the shell.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Download and install the latest &lt;code&gt;.pkg&lt;/code&gt; installer from the &lt;a href="https://github.com/Homebrew/brew/releases/"&gt;Github releases page&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Install a package&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A package is called &lt;em&gt;bottle&lt;/em&gt; and installing it is called &lt;em&gt;pouring&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew install foobar_app
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The binaries installed by Homebrew can be seen at &lt;code&gt;/opt/Homebrew/opt&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Add a package repository&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Online package repository is called a &lt;em&gt;tap&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew tap foobar_repo
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update package info&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To update package information about Homebrew itself and the installed packages:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew update
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Upgrade packages&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To actually upgrade all the installed Homebrew and packages:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To upgrade a specific package:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew upgrade foobar_pkg
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To search for a package name in the repositories:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew search foobar_pkg
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clean&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To clean older packages and information:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew cleanup
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Tried with:&lt;/strong&gt; Homebrew 5.0.13 and MacOS Tahoe 26.2&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-05-homebrew.html</guid>
      <pubDate>Thu, 05 Feb 2026 05:37:23 +0000</pubDate>
    </item>
    <item>
      <title>Reminders</title>
      <link>https://codeyarns.com/tech/2026-02-05-reminders.html</link>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Reminders_(Apple)"&gt;&lt;strong&gt;Reminders&lt;/strong&gt;&lt;/a&gt; is a todo app, or a task management app that works across MacOS and iOS, with syncing through iCloud.
Apple calls these todo items or tasks as &lt;em&gt;reminders&lt;/em&gt;, so I will use this term in this post.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The app was pre-installed on my MacOS.
For iOS devices, it can be installed from the App Store &lt;a href="https://apps.apple.com/us/app/reminders/id1108187841"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Online&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It can also be used through iCloud online &lt;a href="https://www.icloud.com/reminders/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reminders&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click on any list and you can add reminders inside it.
Optionally, a reminder can also be assigned reminder date/time, repeat cadence, and tags.
Clicking the checkbox circle marks the reminder as &lt;em&gt;completed&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lists&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The kinds of lists that can be created are: standard, smart list and groceries.
In addition to its name, a list can be given a color and an icon.&lt;/p&gt;
&lt;p&gt;A list shows the un-completed reminders by default.
Click on &lt;em&gt;Show&lt;/em&gt; to see both completed and un-completed reminders.
Click on &lt;em&gt;Clear&lt;/em&gt; to remove the completed reminders.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sections&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sections can be added in a list to organize the reminders inside a list.
Moving a reminder between sections is a bit tricky - &lt;em&gt;grab&lt;/em&gt; the reminder in a non-text portion on the right and drag it.
If you click in its text section, it gets into edit mode, which is irritating.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.apple.com/guide/reminders/welcome/mac"&gt;Reminders User Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-05-reminders.html</guid>
      <pubDate>Thu, 05 Feb 2026 04:51:48 +0000</pubDate>
    </item>
    <item>
      <title>Browserino</title>
      <link>https://codeyarns.com/tech/2026-02-05-browserino.html</link>
      <description>&lt;p&gt;&lt;a href="https://github.com/AlexStrNik/Browserino"&gt;&lt;strong&gt;Browserino&lt;/strong&gt;&lt;/a&gt; is a browser selector for MacOS, a tool that lets me pick the browser I want to open every URL that I click in any non-browser application.
I find this useful since my default browser choice is Chrome, but there are certain links that I want to open with Firefox or Safari.
It is similar to &lt;a href="2023-03-20-hurl.html"&gt;&lt;strong&gt;Hurl&lt;/strong&gt;&lt;/a&gt;, which I use on Windows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The easiest way to install is using Brew:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ brew tap AlexStrNik/Browserino

$ brew install browserino --no-quarantine
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Settings&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Open the app to see its Settings.
First thing to do is to click the &lt;em&gt;Make default&lt;/em&gt; button to make Browserino the default browser.
This means that clicking on any ULR in any non-browser application will go through Browserino now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tried with&lt;/strong&gt;: Browserino 1.1.16 and MacOS Tahoe 26.2&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-05-browserino.html</guid>
      <pubDate>Thu, 05 Feb 2026 04:40:02 +0000</pubDate>
    </item>
    <item>
      <title>Tech links of February 2026</title>
      <link>https://codeyarns.com/tech/2026-02-01-tech-links-of-february-2026.html</link>
      <description>&lt;h1&gt;&lt;a href="https://world.hey.com/jason/the-obvious-the-easy-and-the-possible-2e11a3fb"&gt;The Obvious, the Easy, and the Possible&lt;/a&gt; (Jason Fried)&lt;/h1&gt;
&lt;p&gt;Much of the tension in product development and interface design comes from trying to balance the obvious, the easy, and the possible.
The thing(s) people do all the time, the always stuff, should be obvious.
The things that should be easy are the things that people do frequently, but not always.
[Possible] these are things people do sometimes.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://blog.jim-nielsen.com/2025/icons-in-menus/"&gt;Icons in Menus Everywhere — Send Help&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;MacOS Tahoe has broken Apple's own guidelines by adding an icon for &lt;em&gt;every&lt;/em&gt; menu item.
This is just visual clutter and increased my cognitive load when looking at menu items.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://www.smbc-comics.com/comic/version"&gt;SMBC: Version&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Funny strip on the naming and versioning of DL models.&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-02-01-tech-links-of-february-2026.html</guid>
      <pubDate>Sun, 01 Feb 2026 18:52:47 +0000</pubDate>
    </item>
    <item>
      <title>Ollama</title>
      <link>https://codeyarns.com/tech/2026-01-30-ollama.html</link>
      <description>&lt;p&gt;&lt;a href="https://ollama.com/"&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/a&gt; is an inference program to download and run LLM models on your local computer.&lt;/p&gt;
&lt;h1&gt;Download and run&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Download and install:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ curl -fsSL https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Pull a model and run it:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ ./ollama pull smollm:135m

$ ./ollama run smollm:135m

&amp;gt;&amp;gt;&amp;gt; Is cat an animal?
Yes

&amp;gt;&amp;gt;&amp;gt; /bye
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Build and run&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Install golang if you do not have it already:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo apt golang-go
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Download the code:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ git clone https://github.com/ollama/ollama.git

$ cd ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Build it:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ go generate .

$ go build .
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Pull a model and run it:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ ./ollama pull smollm:135m

$ ./ollama run smollm:135m

&amp;gt;&amp;gt;&amp;gt; Is cat an animal?
Yes

&amp;gt;&amp;gt;&amp;gt; /bye
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ready to rock!&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-30-ollama.html</guid>
      <pubDate>Fri, 30 Jan 2026 03:32:52 +0000</pubDate>
    </item>
    <item>
      <title>vLLM</title>
      <link>https://codeyarns.com/tech/2026-01-30-vllm.html</link>
      <description>&lt;p&gt;&lt;a href="https://vllm.ai/"&gt;&lt;strong&gt;vLLM&lt;/strong&gt;&lt;/a&gt; is an open-source LLM framework built on PyTorch.&lt;/p&gt;
&lt;h1&gt;Build and run from source&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Get the code:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ git clone https://github.com/vllm-project/vllm.git

$ cd vllm
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Create a Python virtual environment:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ python3 -m venv vllm_venv

$ source vllm_venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Install the requirements:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ python3 -m pip install -r requirements/common.txt

$ python3 -m pip install -r requirements/cuda.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Build vLLM:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ python3 -m pip install -e .
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Run the vLLM server with a small model:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ python3 -m vllm.entrypoints.openai.api_server \
    --model HuggingFaceTB/SmolLM2-135M-Instruct \
    --dtype float16 \
    --gpu-memory-utilization 0.5 \
    --max-model-len 128 \
    --enforce-eager \
    --disable-log-stats \
    --kv-cache-dtype fp8
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The server is now running and listening on port 8000.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In a separate shell, send a query to the vLLM server:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ vllm chat --model HuggingFaceTB/SmolLM2-135M-Instruct \
    --quick &amp;quot;How many letters are in the English alphabet?&amp;quot;

Using model: HuggingFaceTB/SmolLM2-135M-Instruct
The English alphabet has 26 letters.
&lt;/code&gt;&lt;/pre&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-30-vllm.html</guid>
      <pubDate>Fri, 30 Jan 2026 02:23:04 +0000</pubDate>
    </item>
    <item>
      <title>Slurm</title>
      <link>https://codeyarns.com/tech/2026-01-28-slurm.html</link>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Slurm_Workload_Manager"&gt;&lt;strong&gt;Slurm (Simple Linux Utility for Resource Management)&lt;/strong&gt;&lt;/a&gt; is a Linux job scheduler commonly used on compute clusters and supercomputers.&lt;/p&gt;
&lt;h1&gt;Common options&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-A&lt;/code&gt; or &lt;code&gt;--account&lt;/code&gt;: Use the specified account for the Slurm command. For example &lt;code&gt;--account=biology_team&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;sinfo&lt;/h1&gt;
&lt;p&gt;This command prints information about the nodes in the cluster.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;List all nodes: &lt;code&gt;sinfo&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Print total number of nodes: &lt;code&gt;sinfo -o "%D"&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Print all possible &lt;strong&gt;states&lt;/strong&gt; of nodes in the cluster: &lt;code&gt;sinfo -h -o "%T" | sort -u&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;List the nodes in a specified state. For example, to list idle nodes: &lt;code&gt;sinfo -t idle&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;sbatch&lt;/h1&gt;
&lt;p&gt;This is the command to submit a script to Slurm to run on the next node that becomes available.
This command exits immediately printing out the Slurm job ID.&lt;/p&gt;
&lt;p&gt;Common options passed to this command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-o&lt;/code&gt; or &lt;code&gt;--output&lt;/code&gt;: File to write standard output to. For example &lt;code&gt;-o out-%j.txt&lt;/code&gt; writes to a filename with the current Slurm job ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-e&lt;/code&gt; or &lt;code&gt;--error&lt;/code&gt;: File to write standard error to. For example &lt;code&gt;-e err-%j.txt&lt;/code&gt; writes to a filename with the current Slurm job ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-G&lt;/code&gt; or &lt;code&gt;--gpus&lt;/code&gt;: Specify the number of GPUs required. For example &lt;code&gt;--gpus=4&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--wrap&lt;/code&gt;: Specify the command to wrap into a dummy script. Since Slurm looks for a script file by default, &lt;code&gt;--wrap&lt;/code&gt; is a trick to use when you just want to run a command on the node. For example &lt;code&gt;--wrap="hostname"&lt;/code&gt; prints the hostname in the node we get and exits.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;squeue&lt;/h1&gt;
&lt;p&gt;This command prints out the entire list of Slurm jobs in the queue right now.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-u&lt;/code&gt; or &lt;code&gt;--user&lt;/code&gt;: List the jobs of the specified user. For example &lt;code&gt;--user=joe&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;scct&lt;/h1&gt;
&lt;p&gt;This command can be used to find information about jobs that are already completed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-j&lt;/code&gt; or &lt;code&gt;--jobs&lt;/code&gt;: Find information of the specified jobs. For example &lt;code&gt;-j 123456&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;sacctmgr&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;To find which accounts you have access to on a cluster:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sacctmgr -nP show assoc where user=$(whoami) format=account
&lt;/code&gt;&lt;/pre&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-28-slurm.html</guid>
      <pubDate>Wed, 28 Jan 2026 21:56:55 +0000</pubDate>
    </item>
    <item>
      <title>Google Gemini</title>
      <link>https://codeyarns.com/tech/2026-01-21-google-gemini.html</link>
      <description>&lt;p&gt;&lt;a href="https://gemini.google.com/app"&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt;&lt;/a&gt; is a popular AI assistant and the official one from Google.
It has quickly become my replacement of search engines.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;On the web&lt;/strong&gt;: It can be used in any browser by visiting &lt;a href="https://gemini.google.com/app"&gt;gemini.google.com&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;iOS app&lt;/strong&gt;:
Install from the App Store &lt;a href="https://apps.apple.com/us/app/google-gemini/id6477489729"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MacOS/Linux app&lt;/strong&gt;:
There is no official app, so I create a web app instead.
Open &lt;a href="https://gemini.google.com/app"&gt;gemini.google.com&lt;/a&gt; in Google Chrome, and choose ⋮ -&amp;gt; Cast, Save and Share -&amp;gt; Install Page as App.
After this Google Gemini is available as a MacOS app to open and run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New chat&lt;/strong&gt;:
Keyboard shortcut on Linux is &lt;code&gt;Ctrl Shift o&lt;/code&gt; and on MacOS it is &lt;code&gt;Cmd Shift o&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-21-google-gemini.html</guid>
      <pubDate>Wed, 21 Jan 2026 22:37:50 +0000</pubDate>
    </item>
    <item>
      <title>NetNewsWire</title>
      <link>https://codeyarns.com/tech/2026-01-12-netnewswire.html</link>
      <description>&lt;p&gt;&lt;a href="https://netnewswire.com/"&gt;&lt;strong&gt;NetNewsWire&lt;/strong&gt;&lt;/a&gt; is a highly-acclaimed classic RSS reader for MacOS, iPhone and iPad.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;:
For MacOS, download and install the ZIP file from its website.
For iPhone/iPad, go to the App Store and install it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add feeds&lt;/strong&gt;:
Provide the website URL that has the feed or the RSS/ATOM feed URL.
By default, the feeds are downloaded and maintained locally on your device.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sync&lt;/strong&gt;:
To sync between MacOS and iPhone/iPad, we need to use iCloud or the FreshRSS self-hosted feed aggregator.
I found that the sync is super-slow through iCloud.
For FreshRSS, provide the credentials and API URL as specified &lt;a href="2026-01-12-freshrss.html"&gt;here&lt;/a&gt;.
I think FreshRSS is the best option, since I can read my feeds on my iPhone, on my Macbook and also continue reading on my home Linux computer (through the self-hosted FreshRSS URL).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-12-netnewswire.html</guid>
      <pubDate>Mon, 12 Jan 2026 04:17:19 +0000</pubDate>
    </item>
    <item>
      <title>FreshRSS</title>
      <link>https://codeyarns.com/tech/2026-01-12-freshrss.html</link>
      <description>&lt;p&gt;&lt;a href="https://www.freshrss.org/"&gt;&lt;strong&gt;FreshRSS&lt;/strong&gt;&lt;/a&gt; is a free RSS feed aggregator that can be used to read RSS feeds online and also exposes an API that can be used with desktop/mobile RSS apps.
Its source code can be &lt;a href="https://github.com/FreshRSS/FreshRSS"&gt;seen on Github&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Install&lt;/h1&gt;
&lt;p&gt;Instead of using it from source code, I find it easier to use its pre-built Docker container.
To get it running from Docker container:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prepare the Docker packages and user setup:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ sudo apt install -y docker.io docker-compose
$ sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Log out and log back in for group changes to take effect.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a directory for it and enter it:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ mkdir ~/freshrss
$ cd ~/freshrss
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;code&gt;~/freshrss/docker-compose.yml&lt;/code&gt; file and add these lines to it:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;version: '2.4'
services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    hostname: freshrss
    restart: unless-stopped
    logging:
      options:
        max-size: 10m
    volumes:
      - ./data:/var/www/FreshRSS/data
      - ./extensions:/var/www/FreshRSS/extensions
    environment:
      TZ: America/Los_Angeles  # Change to your timezone
      CRON_MIN: '*/20'         # Checks for updates every 20 mins
    ports:
      - &amp;quot;80:80&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Launch the container:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;code&gt;http://&amp;lt;public-ip&amp;gt;&lt;/code&gt; to access the FreshRSS online setup wizard for the first time.
You will need to provide a &lt;em&gt;login&lt;/em&gt; and &lt;em&gt;password&lt;/em&gt;.
Go with default options and let it pick &lt;code&gt;SQLite&lt;/code&gt; as the database to make life easy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Usage&lt;/h1&gt;
&lt;p&gt;In your browser, go to &lt;code&gt;http://&amp;lt;public-ip&amp;gt;&lt;/code&gt;.
You can add feeds, that appear under &lt;em&gt;Uncategorized&lt;/em&gt; category unless you create and move them to new categories.&lt;/p&gt;
&lt;h1&gt;API access&lt;/h1&gt;
&lt;p&gt;To read RSS feeds from desktop and mobile apps through FreshRSS, we need to enable API access.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the online interface go to the gear icon in the top-right corner.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;em&gt;Authentication&lt;/em&gt;, enable &lt;em&gt;Allow API access&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;em&gt;Profile&lt;/em&gt;, go to API password and add a password.
Go to &lt;code&gt;http://&amp;lt;public-ip&amp;gt;/api/&lt;/code&gt; to check the API access is working.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to your RSS application and provide the username, API password and the API path.
For Google Reader compatible API, the path is &lt;code&gt;http://&amp;lt;public-ip&amp;gt;/api/greader.php&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;API access can be used by your favorite application to add or remove feeds, mark as read or favorite and all other normal operations possible through the FreshRSS UI.&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-12-freshrss.html</guid>
      <pubDate>Mon, 12 Jan 2026 03:59:33 +0000</pubDate>
    </item>
    <item>
      <title>Oracle Cloud Infrastructure</title>
      <link>https://codeyarns.com/tech/2026-01-12-oracle-cloud-infrastructure.html</link>
      <description>&lt;p&gt;&lt;a href="https://www.oracle.com/cloud/"&gt;&lt;strong&gt;Oracle Cloud Infrastructure (OCI)&lt;/strong&gt;&lt;/a&gt; is one of the largest Cloud Service Providers (CSP) of the world.
It offers a &lt;a href="https://www.oracle.com/cloud/free/"&gt;&lt;strong&gt;Free Tier&lt;/strong&gt;&lt;/a&gt; that is great for home users who have minimal need of a cloud instance.
The rest of the information on this page is based on my experience with the Free Tier.&lt;/p&gt;
&lt;h1&gt;Create an account&lt;/h1&gt;
&lt;p&gt;From the Free Tier page, follow the online direction to create a new account.
You will be required to provide details of a valid credit card, but it will not be charged.
You will need to associate an &lt;em&gt;email address&lt;/em&gt;, but also create an &lt;em&gt;account name&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Note that the account creation was not immediate, it took a day and I could verify my login worked only after a day.&lt;/p&gt;
&lt;h1&gt;Create an instance&lt;/h1&gt;
&lt;p&gt;An instance is the first step to get access to a compute node where we can install and run software.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;From top-left menu, go to Compute -&amp;gt; Instances and choose &lt;em&gt;Create instance&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;strong&gt;Placement&lt;/strong&gt;, I let it pick the default that was &lt;code&gt;pamH:US-SANJOSE-1-AD-1&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;strong&gt;Image&lt;/strong&gt;, I chose &lt;code&gt;Canonical Ubuntu 24.04&lt;/code&gt;.
I noticed that both Oracle Linux and Canoncial Ubuntu images were all listed as &lt;em&gt;Free&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;strong&gt;Shape&lt;/strong&gt;, I let it pick the default &lt;code&gt;VM.Standard.E2.1.Micro&lt;/code&gt; since that was the only one marked as &lt;em&gt;Always Free-eligible&lt;/em&gt;.
This came with a 1-core CPU, 1 GB memory and 0.48 Gbps network bandwidth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;strong&gt;Networking&lt;/strong&gt; section, under &lt;em&gt;Primary VNIC&lt;/em&gt; I used the default options of &lt;em&gt;Select existing virtual cloud network&lt;/em&gt; and &lt;em&gt;Select existing subnet&lt;/em&gt;.
Since we need a public IP address to SSH to, I enabled the &lt;em&gt;Automatically assign public IPv4 address&lt;/em&gt; option.
In the &lt;em&gt;Add SSH keys&lt;/em&gt; section, I pasted my public SSH key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The instance creation took 5 minutes and the instance was listed as &lt;em&gt;Running&lt;/em&gt;.
Note the username (default was &lt;code&gt;ubuntu&lt;/code&gt; in my case) and the &lt;em&gt;public IP&lt;/em&gt; address.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;
The first instance I created did not have the public IP option enabled for choosing.
I messed with the firewall (see below), deleted this instance, created a new instance and it had the public IP option.
Go figure!&lt;/p&gt;
&lt;h1&gt;Configure the firewall&lt;/h1&gt;
&lt;p&gt;All incoming web traffic is blocked by default.
To enable incoming traffic at certain ports, we must open them in the OCI firewall.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;From top-left menu, go to Networking -&amp;gt; Virtual cloud networks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From the list, choose your VCN and go to its &lt;em&gt;Security&lt;/em&gt; -&amp;gt; &lt;em&gt;Security Lists&lt;/em&gt; section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on the &lt;em&gt;Default Security List&lt;/em&gt; -&amp;gt; Security rules.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;em&gt;Add Ingress Rules&lt;/em&gt; and provide &lt;em&gt;Source CIDR&lt;/em&gt; as &lt;code&gt;0.0.0.0/0&lt;/code&gt;, IP protocol as &lt;code&gt;TCP&lt;/code&gt;, Destination ports as &lt;code&gt;80,443&lt;/code&gt; (or the ports required by your web application) and allow both HTTP and HTTPS traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;SSH to the instance&lt;/h1&gt;
&lt;p&gt;To SSH to the public IP address of the instance:&lt;/p&gt;
&lt;pre class="codehilite"&gt;&lt;code&gt;$ ssh -i &amp;lt;path-to-private-key&amp;gt; ubuntu@&amp;lt;public-ip&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can now work in this compute instance by installing Ubuntu packages, install Docker images and work as if at a local Ubuntu computer.&lt;/p&gt;
&lt;p&gt;If you need to SSH from multiple computers, add the public key from each of those to the &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file on the OCI instance.&lt;/p&gt;
&lt;h1&gt;Access web application&lt;/h1&gt;
&lt;p&gt;To run a web application, install it and then access it through the browser at the address &lt;code&gt;http://&amp;lt;public-ip&amp;gt;/&lt;/code&gt;.
If there a API exposed by the app, then &lt;code&gt;http://&amp;lt;public-ip&amp;gt;/&amp;lt;api-path&amp;gt;&lt;/code&gt;.&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-12-oracle-cloud-infrastructure.html</guid>
      <pubDate>Mon, 12 Jan 2026 03:10:21 +0000</pubDate>
    </item>
    <item>
      <title>Firefox Cheatsheet</title>
      <link>https://codeyarns.com/tech/2026-01-08-firefox-cheatsheet.html</link>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.mozilla.org/en-US/kb/ai-chatbot"&gt;Use AI Chatbots&lt;/a&gt;:
Press &lt;code&gt;⌃ x&lt;/code&gt; (MacOS) or &lt;code&gt;Ctrl Alt x&lt;/code&gt; (Linux) to toggle the &lt;strong&gt;AI chatbot&lt;/strong&gt; sidebar on the left.
The first time it will ask you to pick from the various chatbots like Google Gemini, ChatGPT and others.
In addition to directly using the AI chatbot sidebar, I find it useful to highlight text on a webpage and click the ✨ (sparkles) button that appears beside the text to feed it to the AI chatbot.&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-08-firefox-cheatsheet.html</guid>
      <pubDate>Thu, 08 Jan 2026 23:07:37 +0000</pubDate>
    </item>
    <item>
      <title>Tech links of January 2026</title>
      <link>https://codeyarns.com/tech/2026-01-06-tech-links-of-january-2026.html</link>
      <description>&lt;h1&gt;&lt;a href="https://tonsky.me/blog/tahoe-icons/"&gt;It’s hard to justify Tahoe icons&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Damning post on how MacOS Tahoe is overloaded with tiny, meaningless, inconsistent UI icons.
Apple seems to have completely forgotten its own 1992 HIG.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://sqlite.org/whyc.html"&gt;Why SQLite is written in C&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;C is fast, compatible with all libraries and can be written in an object-oriented manner (if required).
Provides a list of requirements for Rust before it will be considered.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://addyosmani.com/blog/21-lessons/"&gt;21 Lessons From 14 Years at Google&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Solid list of learnings, matched a lot with my experience in big tech companies.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The best engineers are obsessed with solving user problems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Being right is cheap. Getting to right together is the real work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bias towards action. Ship. You can edit a bad page, but you can’t edit a blank one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clarity is seniority. Cleverness is overhead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Novelty is a loan you repay in outages, hiring, and cognitive overhead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your code doesn’t advocate for you. People do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The best code is the code you never had to write.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At scale, even your bugs have users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most “slow” teams are actually misaligned teams.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Focus on what you can control. Ignore what you can’t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Abstractions don’t remove complexity. They move it to the day you’re on call.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Writing forces clarity. The fastest way to learn something better is to try teaching it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The work that makes other work possible is priceless - and invisible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you win every debate, you’re probably accumulating silent resistance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When a measure becomes a target, it stops measuring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Admitting what you don’t know creates more safety than pretending you do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your network outlasts every job you’ll ever have.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most performance wins come from removing work, not adding cleverness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Process exists to reduce uncertainty, not to create paper trails.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Eventually, time becomes worth more than money. Act accordingly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are no shortcuts, but there is compounding.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="https://jvns.ca/blog/2024/09/12/reasons-i--still--love-fish/"&gt;Reasons I still love the fish shell&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;All the same reasons why I have been using Fish as my default shell since 2013.&lt;/p&gt;
&lt;h1&gt;&lt;a href="https://simonwillison.net/2025/Dec/31/the-year-in-llms/"&gt;2025: The year in LLMs&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Simon Willison's mega summary of 2025.&lt;/p&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-06-tech-links-of-january-2026.html</guid>
      <pubDate>Tue, 06 Jan 2026 22:22:00 +0000</pubDate>
    </item>
    <item>
      <title>How to self host Google Fonts</title>
      <link>https://codeyarns.com/tech/2026-01-01-how-to-self-host-google-fonts.html</link>
      <description>&lt;p&gt;Bored with using regular fonts for my website, I finally decided to try &lt;a href="https://en.wikipedia.org/wiki/Web_typography#Web_fonts"&gt;&lt;strong&gt;web fonts&lt;/strong&gt;&lt;/a&gt;.
&lt;a href="https://en.wikipedia.org/wiki/Google_Fonts"&gt;&lt;strong&gt;Google Fonts&lt;/strong&gt;&lt;/a&gt; seems to be the preferred choice of web fonts since it has more than 1500 open-source fonts.
I did not want every load of my webpages to pull in the font file from Google servers, so I looked for a way to self host the font files.&lt;/p&gt;
&lt;p&gt;Many of the Google fonts are available in &lt;a href="https://en.wikipedia.org/wiki/TrueType"&gt;&lt;strong&gt;TTF&lt;/strong&gt;&lt;/a&gt; format.
These files are large and the recommended lightweight file format for website is apparently &lt;a href="https://en.wikipedia.org/wiki/Web_Open_Font_Format"&gt;&lt;strong&gt;Web Open Font Format 2.0 (WOFF2)&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I found the website &lt;a href="https://gwfh.mranftl.com/fonts"&gt;&lt;strong&gt;Google Webfonts Helper&lt;/strong&gt;&lt;/a&gt;, created by &lt;a href="https://mranftl.com/"&gt;&lt;strong&gt;Mario Ranftl&lt;/strong&gt;&lt;/a&gt;, to be a one-stop resource for self-hosting Google fonts.
I can pick a font and select charsets and styles to view how the font rendering looks.
For the selected styles, it gave me the &lt;code&gt;font-face&lt;/code&gt; definition CSS that I would need to add to my CSS file.
Furthermore, it also provides a download of the &lt;code&gt;.woff2&lt;/code&gt; font files for the chosen charsets and styles.&lt;/p&gt;
&lt;p&gt;Self-hosting these web fonts was easy with the Google Webfonts Helper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose the font, charsets and styles for which you need the WOFF2 files.&lt;/li&gt;
&lt;li&gt;Copy the CSS font face definition to your CSS file.&lt;/li&gt;
&lt;li&gt;In your CSS formatting, use the new font name.&lt;/li&gt;
&lt;li&gt;Download the WOFF2 files and place them in &lt;code&gt;fonts/&lt;/code&gt; directory of your website.&lt;/li&gt;
&lt;li&gt;Upload the new CSS file and the font files to your website and the newly rendered webpage should be using them.&lt;/li&gt;
&lt;/ul&gt;</description>
      <guid isPermaLink="true">https://codeyarns.com/tech/2026-01-01-how-to-self-host-google-fonts.html</guid>
      <pubDate>Thu, 01 Jan 2026 20:00:20 +0000</pubDate>
    </item>
  </channel>
</rss>
