commit b99ced3adf321a8c5a3f9427efe21f600cc00315
parent 032d3a08dd79badf1f80654688850395f206be6b
Author: Riaz <riaz@riazj.com>
Date: Sun, 5 Apr 2026 09:48:56 -0700
Remove fluff
https://steinbaugh.com/posts/posix.html
https://romanzolotarev.com/bsd/vi.html
Diffstat:
11 files changed, 29 insertions(+), 210 deletions(-)
diff --git a/LICENSE b/LICENSE
@@ -1,21 +1,14 @@
-MIT License
+BSD Zero Clause License
-Copyright (c) 2023 Riaz
+Copyright (C) 2023 by Riaz
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/articles/dictionaries.html b/articles/dictionaries.html
@@ -1,90 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-<meta charset="utf-8">
-<title>Notes on Offline English Dictionaries | Riaz's Website</title>
-<link rel="stylesheet" href="/style.css">
-<link rel="icon" href="data:,">
-<meta name="description" content="Notes on offline English dictionaries with dictd or a shell script for GCIDE">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-</head>
-<body>
-<h1>Notes on Offline English Dictionaries</h1>
-<hr>
-<article>
-<pre>export SDCV_PAGER=less</pre>
-<pre>
-alt + d
- phrase="$(:|dmenu -p "Define:")" && st <a href="https://aur.archlinux.org/packages/stardict-wordnet">sdcv</a> "$phrase"
-</pre>
-<h2>Previous Setups</h2>
-<h3>dictd</h3>
-<p><a href="https://wiki.archlinux.org/title/Dictd">Install dictd, and configure it to use offline dictionaries.</a></p>
-<p>To use dict with dmenu, create an index. The following assumes that you are using the WordNet dictionary.</p>
-<pre>
-cd ~/.local/state
-cp /usr/share/dictd/wn.index .
-sed "s/ .*//g" wn.index | sort -n > wn.tmp && mv wn.tmp wn.index
-</pre>
-<p>Note that in the sed command above, there is a tab, but your browser might show a space. If you copy it to your clipboard, it should work regardless.</p>
-<p>To use this with sxhkd:</p>
-<pre>
-alt + shift + d
- definition="$XDG_RUNTIME_DIR/dmenu_dict"; \
- dict "$(dmenu -i -l 10 < $XDG_STATE_HOME/wn.index)" > "$definition"; \
- [ -s "$definition" ] && st less -+F -c "$definition"
-</pre>
-<h3>GCIDE</h3>
-<pre>
-cd gcide
-for f in CIDE*; do; mv $f "${f#*.}"; done
-mkdir info; find -maxdepth 1 -type f -not -name "?" -exec mv {} info \;
-find -maxdepth 1 -type f -exec sh -c 'sed "s/<ldquo\//<q>/g; s/<rdquo\//<\/q>/g" "$1" > tmp && mv tmp "$1" || rm tmp' echo {} \;
-sed "s/<ent> /<ent>/" K > K.tmp && mv K.tmp K
-def word # or dmenu_def, shell scripts below, licensed under BSD0
-# repeat the following to replace GCIDE's non-standard markup while referencing webfont.txt
-find -maxdepth 1 -type f -exec sh -c 'sed "s/<cced\//ç/g; s/<Cced\//Ç/" "$1" > tmp && mv tmp "$1" || rm tmp' echo {} \;
-</pre>
-<pre>
-#!/bin/sh -e
-
-DICT="$HOME/data/books/dictionary"
-
-phrase="${*:-$(cat)}"
-# e.g. gum ammoniac is with dictionary entries that start with A
-[ "$phrase" = "-t" ] && { thorough=1; phrase="$(cat)"; }
-phrase="$(printf "%s" "$phrase" | tr '[:lower:]' '[:upper:]' | sed 's=\\=\\\\=g; s=\/=\\\/=g')"
-
-letter="$(printf "%.1s" "$phrase")"
-case "$letter" in
- "'") end="${phrase#?}"; letter="${end%"${end#?}"}" ;; # second char
- "-") search_files="$(grep -irl "<ent>$phrase</ent>" "$DICT")" ;;
- ".") letter="V" ;;
- [0-9]|"\\") letter="A" ;;
-esac
-
-: "${search_files="$DICT/$letter"}"
-definitions="$(printf "%s\n" "$search_files" | xargs sed -n "/<ent>$phrase<\/ent>/I,/^$/p")"
-[ "$thorough" ] && [ -z "$definitions" ] && {
- search_files="$(grep -irl "<ent>$phrase</ent>" "$DICT")"
- definitions="$(printf "%s\n" "$search_files" | xargs sed -n "/<ent>$phrase<\/ent>/I,/^$/p")"
-}
-
-printf "%s" "$definitions" | w3m -dump -T text/html
-</pre>
-<pre>
-#!/bin/sh -e
-
-DICT="$HOME/data/books/dictionary"
-CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/dmenu_def"
-
-[ -f "$CACHE" ] || grep -orh --exclude-dir=info "<ent>.*</ent>" "$DICT" |
- sed "s/<.\?ent>//g" | sort -n | uniq > "$CACHE"
-
-dmenu -i -l 10 < "$CACHE" | def -t
-</pre></article>
-<footer>
-<hr>
-<a href="/">Home Page</a></footer>
-</body>
-</html>
diff --git a/articles/efficiently-publish-to-website.html b/articles/efficiently-publish-to-website.html
@@ -5,73 +5,34 @@
<title>Efficiently Publish to a Website | Riaz's Website</title>
<link rel="stylesheet" href="/style.css">
<link rel="icon" href="data:,">
-<meta name="description" content="Alternatives to typing out the full path of the host for publishing to a website (upload, rsync, and git)">
+<meta name="description" content="How to use rsync instead of scp to transfer files to a host">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>Efficiently Publish to a Website</h1>
<hr>
<article>
-<p>Summary: <code>alias publish="rsync -rtvzP --filter=':- .gitignore' --exclude='.git*' ~/website_path/ user@hostname.com:/path/to/destination"</code></p>
-<h2>Abbreviated SCP</h2>
<p>I used to run the following commands to upload files to this website:</p>
<pre>
-scp file user@hostname.com:/home/public
-scp articles/article-name user@hostname.com:/home/public/articles</pre>
-<p>Typing out the path of the host is tedious, so I wrote a shell script to do it.</p>
-<pre>
-#!/bin/sh
-
-[ "$1" = "-a" ] && shift && scp "$@" user@hostname.com:/home/public/articles && exit
-scp "$@" user@hostname.com:/home/public</pre>
-<p><code>[ "$1" = "-a" ]</code> checks if the first argument is <code>-a</code>. <code>&&</code> causes the following command to run only if the previous statement succeeded. <code>shift</code> removes the first argument. Then, the files (<code>$@</code>) are uploaded to the articles' folder. If the <code>-a</code> option is not present, the files will be uploaded to the public folder.</p>
-<p>Now, the process of uploading files looks like this:</p>
-<pre>
-upload file
-upload -a articles/article-name</pre>
-<h2>Rsync</h2>
-<p>The problem with that method is that the files need to be stated. To avoid this, rsync can be used.</p>
-<pre>rsync -rtvzP --filter=':- .gitignore' --exclude='.git*' ~/riazj.com/ user@hostname.com:/home/public</pre>
-<p>Those options mean the following:</p>
+scp file1 file2 user@host:
+scp articles/file3 user@host:/home/public/articles</pre>
+<p>Typing out the path of the host is tedious, so rsync can be used. This command can be added to <code>.git/hooks/pre-push</code> to run on <code>git push</code>.</p>
+<pre>rsync -rtzP --delete --exclude="*git" ~/website/ user@host:/home/public</pre>
<ul>
<li>-r: recursively</li>
<li>-t: transfer modification times, allowing unmodified files to be skipped</li>
-<li>-v: increase verbosity, showing the files uploaded</li>
<li>-z: compress files for uploading</li>
<li>-P: if a large file fails to be uploaded, continue from where it was instead of uploading its entirety</li>
-<li>--filter':- .gitignore': do not upload files that are listed in .gitignore</li>
-<li>--exclude='.git*': do not upload files or folders starting with ".git" in the name</li>
+<li>--delete: delete files from the receiving side that aren't locally present</li>
+<li>--exclude="*git": exclude this pattern from uploading and following rules like --delete</li>
</ul>
-<p>The slash after the folder name (<code>riazj.com/</code>) is there for uploading the contents of the folder and not the folder itself to the location. Without the slash, it would result in <code>/home/public/riazj.com</code>.</p>
-<h2>Git and SCP</h2>
-<p>I do not recommend using this method unless there is a reason to not use rsync. rsync is faster than this script. I wrote this before I decided to use rsync for my website.</p>
-<p>An <a href="https://docs.codeberg.org/security/ssh-key/">SSH key</a> to automatically sign in to the host is required.</p>
-<pre>
-#!/bin/sh
-
-changed_files="$(git diff-tree --no-commit-id --name-only origin/main..HEAD -r)"
-
-for file in "$changed_files"; do
- [ -e "$file" ] || { ssh user@hostname.com "rm -f $file"; continue; }
- [ "${file#*articles/}" != "$file" ] && scp "$file" user@hostname.com:/home/public/articles && continue
- scp "$file" user@hostname.com:/home/public
-done
-
-git push</pre>
-<p>This script is meant to be run before <code>git push</code> so that it can see the files that were changed in the local commits.</p>
-<p><code>[ -e "$file" ]</code> checks if the file exists. If it does not, it is removed. <code>continue</code> skips to the next iteration of the loop.</p>
-<p><code>[ "${file#*articles/}" != "$file" ]</code> checks if the file's path is not the same after trying to remove the string "articles/" from the start of it. If it is not the same as before, it must mean that the file path starts with "articles/". The file is then uploaded to the articles' folder.</p>
-<p>If the previous commands did not run, the file is uploaded to the public folder.</p>
-<p>This script does not account for removing an old file that has been renamed. It can be expanded on by using <code>git diff-tree --no-commit-id --name-status origin/main..HEAD -r</code> and grep to find the renamed files.</p>
-<h2>Update: 2025 Feb 25th</h2>
-<p>I added the following to <code>.ssh/config</code>, allowing me to run <code>ssh riazj</code> or <code>rsync file riazj:</code>.</p>
+<p>The slash after the folder name is there for uploading the contents of the folder and not the folder itself. Without the slash, it would result in <code>/home/public/website</code>.</p>
+<p>I wrote the following in <code>.ssh/config</code>, allowing me to run <code>ssh riazj</code> or <code>rsync file riazj:</code>.</p>
<pre>
Host riazj
Hostname nfsnssh.com
User riazpy_riazj
Port 22</pre>
-<h2>Update: 2025 Jul 2nd</h2>
-<p>I added the rsync command to <code>.git/hooks/pre-push</code> so that I can publish to the website with <code>git push</code> instead of using a script to run both commands.</p>
</article>
<footer>
<hr>
diff --git a/articles/estrogeneration.html b/articles/estrogeneration.html
@@ -23,7 +23,7 @@
<p>Fasting for a challenging period of time can exchange old fat for improved cells and remove estrogenics. The schedule that I find to be beneficial is fasting on Mondays and Thursdays from dawn to sunset.</p>
<p>Many estrogenics can be found in crowded swimming pools at levels concerning for children because people's lotion, shampoo, deodorant, and lipstick can be washed into the pool. Avoid crowded pools.</p>
<p>The author says in the book that silicone is fine. However, make sure that it is not brightly colored, as the colorants may contain endocrine disruptors.</p>
-<p>Dr. Jay's website and the products that he uses to avoid estrogenics can be viewed <a href="https://www.ajconsultingcompany.com/whatiuse.html">here</a>. <a href="https://www.ajconsultingcompany.com/plans.html">Here is a list of recommendations from the book</a>:</p>
+<p>Dr. Jay's website and the products that he uses to avoid estrogenics can be viewed <a href="https://www.ajconsultingcompany.com/whatiuse.html">here</a>. <a href="https://www.ajconsultingcompany.com/plans.html">The author has avoidance plans for different levels of effort</a>.</p>
<p>Eliminate foods and drinks that are in the category of or include:</p>
<ul>
<li>processed food</li>
diff --git a/articles/fix-frogfind-content-display.html b/articles/fix-frogfind-content-display.html
@@ -12,12 +12,12 @@
<h1>How to Fix FrogFind's Incorrect Display of Websites</h1>
<hr>
<article>
-<p><a href="http://frogfind.com/">FrogFind</a> would not load the information on my home page. However, other pages, such as the articles that I have written, would load. This was likely due to FrogFind using <a href="https://github.com/mozilla/readability">Mozilla's Readability library</a> to find the main content of a page.</p>
-<p>Wrapping a <main> tag around the index page allowed FrogFind to properly detect the HTML. When I tried the same solution on my contact page, FrogFind was still unable to show its information. The work-around was to wrap it in an <article> tag.</p>
+<p><a href="http://frogfind.com/">FrogFind</a> would not load the information on my home page. However, other pages, such as the articles that I have written, would load. This was likely a result of FrogFind using a <a href="https://github.com/fivefilters/readability.php">PHP port of Mozilla's Readability.js</a> to find the main content of a page.</p>
+<p>Wrapping a <main> tag around the index page allowed FrogFind to properly detect the HTML. When I tried the same solution on my contact page, FrogFind was still unable to show its information. The workaround was to wrap it in an <article> tag.</p>
<p>The <main> tag tends to work more on pages with list items. If a page does not include lists, the <article> tag should be used.</p>
<h2>FrogFind Does Not Read Relative Paths Correctly</h2>
<p>On modern browsers, if <code>https://riazj.com/articles/fix-frogfind-content-display</code> is opened, any links on that page to another file like <a href="repairing-thinkpads-and-macbooks"><code>href="repairing-thinkpads-and-macbooks"</code></a> will be within the articles' folder because the current page is in that folder. With FrogFind, it will instead search from the root domain (<code>https://riazj.com</code>). This means that if one article links to another without stating the absolute path (<code>/articles/article-name</code>), FrogFind will look at <code>https://riazj.com/article-name</code>.</p>
-<p>The solutions that I have found are to add a <base> tag in the <head> tag of the affected pages, or to type out the full path. Since the number of people visiting this site through FrogFind besides me is likely zero, I have decided to not change the articles' links.</p>
+<p>The solutions that I have found are to add a <base> tag in the <head> tag of the affected pages or to type out the full path. Since the number of people visiting this site through FrogFind besides me is likely zero, I have decided not to change the articles' links.</p>
</article>
<footer>
<hr>
diff --git a/articles/format-html.html b/articles/format-html.html
@@ -12,7 +12,7 @@
<h1>I Quit Using Prettier to Format HTML</h1>
<hr>
<article>
-<p>Lugging a node_modules folder <a href="https://tsh.io/wp-content/uploads/2019/06/node-modules-app-performance_.png">larger</a> than the size of my website and installing a JavaScript package manager to get something as simple as an HTML formatter carries too much software complexity.</p>
+<p>Lugging a node_modules folder larger than the size of my website and installing a JavaScript package manager to get something as simple as an HTML formatter carries too much software complexity.</p>
<p>A less bloated alternative is <a href="https://www.html-tidy.org/">Tidy</a>. I decided against switching since it doesn't result in the same style of indentation and line wrapping as Prettier.</p>
<p>More recently, I considered how many websites I visit use Prettier's code style. Later, I realized even prettier.io's HTML, including its page <a href="https://prettier.io/users">highlighting its users</a>, doesn't follow its format! The author of Prettier doesn't use it for <a href="https://jlongster.com/">his own website</a>. If the author doesn't care, why should I?</p>
<h2>Options</h2>
diff --git a/articles/technology-i-use.html b/articles/technology-i-use.html
@@ -23,6 +23,7 @@
</li>
<li>Text Editor: <a href="https://martanne.github.io/vis/">vis</a></li>
<li>Document Viewer: <a href="https://pwmt.org/projects/zathura/">zathura</a></li>
+<li>Dictionary: <a href="https://aur.archlinux.org/packages/stardict-wordnet">sdcv</a></li>
<li>Terminal: <a href="https://st.suckless.org/">st</a></li>
<li>Hotkey Daemon: <a href="https://github.com/baskerville/sxhkd">sxhkd</a></li>
<li>Status Bar: <a href="https://github.com/LemonBoy/bar">lemonbar</a></li>
diff --git a/articles/wifi.html b/articles/wifi.html
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-<meta charset="utf-8">
-<title>System Crash Due to Wi-Fi Card | Riaz's Website</title>
-<link rel="stylesheet" href="/style.css">
-<link rel="icon" href="data:,">
-<meta name="description" content="Solution to system-wide freezes due to Wi-Fi card and Linux kernel">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-</head>
-<body>
-<h1>System Crash Due to Wi-Fi Card</h1>
-<hr>
-<article>
-<p>I recently changed Wi-Fi cards and started experiencing crashes. Switching network managers, init systems, and browsers did not work, but switching from linux to linux-lts did.</p>
-<p>After shutting down from a crash, dinit mentioned this.</p>
-<pre>eth0: NIC Link is down</pre>
-<p>When I tried shutting down after switching to OpenRC, there was a mention of <code>[drm] GPU</code> and an error about unmounting file systems.</p>
-<p>If I waited too long, all keyboard input was locked, and I had to remove the laptop's battery. Sometimes, the Caps Lock key flashed, indicating kernel panic. Some examples that caused the crashes were</p>
-<ul>
-<li>playing a video, closing the laptop for it to suspend, and reopening the laptop</li>
-<li>pressing next on a Google form</li>
-<li>joining a Zoom meeting</li>
-<li>doing actions that use plenty of bandwidth, such as loading many videos</li>
-</ul>
-</article>
-<footer>
-<hr>
-<a href="/">Home Page</a></footer>
-</body>
-</html>
diff --git a/articles/wmutils.html b/articles/wmutils.html
@@ -13,18 +13,9 @@
<hr>
<article>
<p><a href="https://github.com/wmutils/core">wmutils</a> is a set of tools for X window manipulation. These individual programs can be combined to uniquely manage windows.</p>
-<p>When I used dwm, I set the monocle layout to the default and rarely used the tiling mode. My workflow looked like this:</p>
-<ol>
-<li>Work in a window.</li>
-<li>Open a second window that is referenced (such as a web browser).</li>
-<li>Run a few commands in a third window.</li>
-<li>Try to go to the previous one for reference.</li>
-<li>Waddle around with Alt+j or Alt+k after realizing the opposite was needed, or move a window to a different tag.</li>
-</ol>
-<p>With wmutils, this is no longer a problem as it provides a program to change the stacking order, allowing me to bind Alt+Tab to switch between the last two focused windows.</p>
-<p>The scripts I use are based on z3bra's from the <a href="https://github.com/wmutils/contrib">contrib repo</a>. In my <a href="/git/dotfiles/file/.config/xinitrc">xinitrc</a>, I call the <a href="/git/dotfiles/file/.local/bin/winwatch.html">winwatch script</a> (depends on <a href="https://github.com/wmutils/opt">wew</a>) to fullscreen windows on the MAP X event and focus the previous window when one is destroyed. The MAP event is used rather than CREATE to work with web browsers that create multiple windows.</p>
-<p>In dwm, even when in monocle mode, other windows were still visible at a small gap to the bottom of my screen. With the <a href="/git/dotfiles/file/.local/bin/fullscreen.html">script for fullscreening</a>, a fullscreen means a fullscreen.</p>
-<p>For a status bar, instead of using xsetroot, I now use <a href="https://github.com/LemonBoy/bar">lemonbar</a> with this command: <code>while status; do sleep 1m; done | lemonbar -d -F '#ccc' &</code>. The -d option prevents it from being focused or deleted by <a href="/git/dotfiles/file/.config/sxhkd/sxhkdrc.html">my keybinds</a>. The <a href="/git/dotfiles/file/.local/bin/status.html">status command</a> does the following: <code>echo "%{r} $(cat /sys/class/power_supply/BAT0/capacity)% | $(date +%I:%M) | $(uptime -p)"</code>. The <code>%{r}</code> right-aligns the text.</p>
+<p>The scripts I use are based on z3bra's from the <a href="https://github.com/wmutils/contrib">contrib repo</a>. When <a href="/git/dotfiles/file/.config/sx/sxrc">starting an Xorg server</a>, I call the <a href="/git/dotfiles/file/.local/bin/winwatch">winwatch script</a> (depends on <a href="https://github.com/wmutils/opt">wew</a>) to fullscreen windows on the MAP X event and focus the previous window when one is destroyed. The MAP event is used rather than CREATE to work with web browsers that create multiple windows.</p>
+<p>When I used dwm, even when in monocle mode, other windows were still visible in a small gap at the bottom of my screen. With the <a href="/git/dotfiles/file/.local/bin/fullscreen">script for fullscreening</a>, a fullscreen means a fullscreen.</p>
+<p>For a status bar, I use <a href="https://github.com/LemonBoy/bar">lemonbar</a> with this command: <code>while status; do sleep 1m; done | lemonbar -d -F '#ccc' &</code>. The -d option prevents it from being focused or deleted by <a href="/git/dotfiles/file/.config/sxhkd/sxhkdrc">my keybinds</a>. The <a href="/git/dotfiles/file/.local/bin/status">status command</a> does the following: <code>echo "%{r} $(cat /sys/class/power_supply/BAT0/capacity)% | $(date +%I:%M) | $(uptime -p)"</code>. The <code>%{r}</code> right-aligns the text.</p>
<p>In the fullscreen script, there is an offset, preventing the windows from hiding the status bar. xprop can be used to find the resolution of a window.</p>
</article>
<footer>
diff --git a/index.html b/index.html
@@ -16,11 +16,9 @@
<h2>Articles</h2>
<ul>
<li><time datetime="2025-10-15">2025 Oct 15</time> <a href="/articles/interracial">Interracial Couples</a></li>
-<li><time datetime="2025-10-04">2025 Oct 04</time> <a href="/articles/wifi">System Crash Due to Wi-Fi Card</a></li>
<li><time datetime="2025-08-08">2025 Aug 08</time> <a href="/articles/git">Self-Host Git Repositories with Stagit</a></li>
<li><time datetime="2025-07-28">2025 Jul 28</time> <a href="/articles/wmutils">Managing Windows Without a WM</a></li>
<li><time datetime="2025-07-24">2025 Jul 24</time> <a href="/articles/pw">Write a Password Manager in POSIX Shell</a></li>
-<li><time datetime="2025-06-08">2025 Jun 08</time> <a href="/articles/dictionaries">Notes on Offline English Dictionaries</a></li>
<li><time datetime="2025-02-27">2025 Feb 27</time> <a href="/articles/format-html">I Quit Using Prettier to Format HTML</a></li>
<li><time datetime="2024-12-06">2024 Dec 06</time> <a href="/articles/powerschool-absence">Unable to Submit PowerSchool Absence Reports</a></li>
<li><time datetime="2024-11-09">2024 Nov 09</time> <a href="/articles/installing-alpine-linux">Notes on Installing Alpine Linux</a></li>
diff --git a/links.html b/links.html
@@ -15,13 +15,10 @@
<li><a href="https://x220.mcdonnelltech.com/resources/">ThinkPad X220s</a></li>
<li><a href="https://wttr.in/">Weather Forecast (curl wttr.in)</a></li>
<li><a href="https://cht.sh/">Cheat Sheets (curl cht.sh)</a></li>
-<li><a href="https://steinbaugh.com/">Technology Cheat Sheets</a></li>
<li><a href="https://github.com/filiparag/wikiman">Offline Unix Documentation</a></li>
-<li><a href="https://romanzolotarev.com/vi.html">Edit Text with vi(1)</a></li>
<li><a href="https://www.shellcheck.net/">ShellCheck: Linter</a></li>
<li><a href="https://explainshell.com/">Shell Commands Explained</a></li>
<li><a href="https://github.com/StevenBlack/hosts">Host Files for Blocking Websites</a></li>
-<li><a href="https://jgthms.com/web-design-in-4-minutes/">Web Design in 4 Minutes</a></li>
<li><a href="https://systemfontstack.com/">System Font Stack</a></li>
<li><a href="https://spencermortensen.com/articles/email-obfuscation/">Email Obfuscation for Websites</a></li>
<li><a href="https://useplaintext.email/">Use Plain Text Emails</a></li>
@@ -34,7 +31,6 @@
<li><a href="https://www.eff.org/nsa-spying">The NSA is Spying on Americans</a></li>
<li><a href="https://img.washingtonpost.com/wp-srv/special/politics/prism-collection-documents/images/prism-slide-4.jpg">PRISM Internet Surveilance</a> (<a href="https://img.washingtonpost.com/wp-srv/special/politics/prism-collection-documents/images/prism-slide-5.jpg">Timeline</a>)</li>
<li><a href="/files/NIBRS_Table_11_Offenders_Race_by_Offense_Category_2024.pdf">NIBRS Offenders by Race 2024</a> (<a href="https://cde.ucr.cjis.gov/LATEST/webapp/#/pages/downloads">Source</a>)</li>
-<li><a href="https://www.unpopulation.org/en/development/desa/population/publications/pdf/ageing/replacement-es.pdf">Jewish Replacement Migration</a></li>
<li><a href="https://xyproblem.info/">The XY Problem</a></li>
<li><a href="https://zenofpython.org/">Zen of Python</a></li>
</ul>