]> git.za3k.com Git - blog.git/commitdiff
Better markdown conversion
authorZachary Vance <za3k@za3k.com>
Wed, 17 Jul 2024 21:51:35 +0000 (17:51 -0400)
committerZachary Vance <za3k@za3k.com>
Wed, 17 Jul 2024 21:51:35 +0000 (17:51 -0400)
210 files changed:
blog
html2markdown.js
html2markdown.py
posts-md/116.md
posts-md/20-minute-interruptions.md
posts-md/2020-books.md
posts-md/2020-review.md
posts-md/2021-books.md
posts-md/2022-books.md
posts-md/2022-year-in-review.md
posts-md/2023-flash-media-longevity-testing-3-years-later.md
posts-md/3-more-games.md
posts-md/3-new-games-deadly-education-rpg-logic-potions-emperical-zendo.md
posts-md/a-mystery-in-the-text-editor.md
posts-md/a-pixel-art.md
posts-md/all-the-recipes.md
posts-md/amazon-aws.md
posts-md/android-backup-on-arch-linux.md
posts-md/april-fools-puzzle-contest-solutions.md
posts-md/april-fools-puzzle-contest.md
posts-md/archiving-all-bash-commands-typed.md
posts-md/archiving-all-web-traffic.md
posts-md/archiving-github.md
posts-md/archiving-gmail.md
posts-md/archiving-twitch.md
posts-md/archiving-twitter.md
posts-md/articles-section.md
posts-md/backup-android-on-plugin.md
posts-md/banh-chung.md
posts-md/blast-furance.md
posts-md/blueprint-maker-13-complete.md
posts-md/board-game-travel-kit.md
posts-md/capturing-video-on-debian-linux-with-the-blackmagic-intensity-pro-4k-card.md
posts-md/cardboard-mail-holders.md
posts-md/configuring-mailxs-mailrc-with-gmail.md
posts-md/controlling-a-computercraft-turtle-remotely.md
posts-md/cookbook.md
posts-md/crawling-etiquette.md
posts-md/cron-email-and-sending-email-to-only-one-address.md
posts-md/dd-spells-srd-vs-5e-players-handbook.md
posts-md/dd-story-time.md
posts-md/ddos.md
posts-md/default-twitter-icons.md
posts-md/dependency-resolution-in-javascript.md
posts-md/diy-hard-drive-carrying-case.md
posts-md/diy-keyboards-and-how-keyboards-work.md
posts-md/domain-names-for-sale.md
posts-md/dungeon-master-ii-spell-runes.md
posts-md/e-ink-laptop.md
posts-md/easel-toy.md
posts-md/encrypted-root-on-debian-part-2-unattended-boot.md
posts-md/etherpad.md
posts-md/even-more-uri-handlers-in-linux.md
posts-md/fabric1-aur-package.md
posts-md/first-aid-kit.md
posts-md/flash-media-longevity-testing-4-years-later.md
posts-md/games-i-like.md
posts-md/garden-signs-on-wall-tiles-pt-2.md
posts-md/garden-signs-on-wall-tiles.md
posts-md/getting-rid-of-mold.md
posts-md/getting-the-adafruit-pro-trinket-3-3v-to-work-in-arch-linux.md
posts-md/github-com-archive-background-research.md
posts-md/good-time-estimation.md
posts-md/hack-a-day-2023-2.md
posts-md/hack-a-day-2023-is-done.md
posts-md/hack-a-day-2023.md
posts-md/hack-a-day-day-01-perquackey.md
posts-md/hack-a-day-day-04-lashed-table.md
posts-md/hack-a-day-day-06-doodlemoji-alchemy.md
posts-md/hack-a-day-day-06.md
posts-md/hack-a-day-day-08-receipt-zine.md
posts-md/hack-a-day-day-10-typewriter.md
posts-md/hack-a-day-day-11-raytraced-rain.md
posts-md/hack-a-day-day-12-screensavers.md
posts-md/hack-a-day-day-13-blueprint-maker.md
posts-md/hack-a-day-day-14-bytebeat-synth.md
posts-md/hack-a-day-day-17-tower-of-choices.md
posts-md/hack-a-day-day-18-a-i-grab-bag.md
posts-md/hack-a-day-day-2-raytracing.md
posts-md/hack-a-day-day-20-hillsfar-lockpicking-spritesheet.md
posts-md/hack-a-day-day-22-homemade-pcbs.md
posts-md/hack-a-day-day-23-packing.md
posts-md/hack-a-day-day-28-90s-sitcom.md
posts-md/hack-a-day-day-29-speed-reading.md
posts-md/hack-a-day-day-30-music-of-the-celestial-spheres.md
posts-md/hack-a-day-hack-a-battle.md
posts-md/hack-a-day-hack-a-blog.md
posts-md/hack-a-day-hack-a-bug.md
posts-md/hack-a-day-hack-a-chat.md
posts-md/hack-a-day-hack-a-clock.md
posts-md/hack-a-day-hack-a-crop.md
posts-md/hack-a-day-hack-a-dictionary.md
posts-md/hack-a-day-hack-a-farm.md
posts-md/hack-a-day-hack-a-hang.md
posts-md/hack-a-day-hack-a-hell.md
posts-md/hack-a-day-hack-a-homepage.md
posts-md/hack-a-day-hack-a-line.md
posts-md/hack-a-day-hack-a-link-2.md
posts-md/hack-a-day-hack-a-link.md
posts-md/hack-a-day-hack-a-machine.md
posts-md/hack-a-day-hack-a-mandelbrot.md
posts-md/hack-a-day-hack-a-minigame.md
posts-md/hack-a-day-hack-a-paste.md
posts-md/hack-a-day-hack-a-snake.md
posts-md/hack-a-day-hack-a-song.md
posts-md/hack-a-day-hack-a-sound.md
posts-md/hack-a-day-hack-a-stats.md
posts-md/hack-a-day-hack-a-tank.md
posts-md/hack-a-day-hack-a-tile.md
posts-md/hack-a-day-hack-a-tv-guide.md
posts-md/hack-a-day-hack-an-adventure.md
posts-md/hack-a-day-hack-an-asteroid.md
posts-md/hack-a-day-hack-an-experiment.md
posts-md/hack-a-day-hack-an-icecube-failure.md
posts-md/hack-a-day-hack-an-mmo.md
posts-md/hack-a-day-hack-an-uptime.md
posts-md/hack-a-day-website.md
posts-md/hello-world.md
posts-md/hillsfar-lockpicking-20-complete.md
posts-md/how-to-retire-for-infinity-years.md
posts-md/html-css-cheatsheet.md
posts-md/installing-canon-imageclass-lbp-6000-on-64-bit-debian.md
posts-md/installing-email-with-postfix-and-dovecot.md
posts-md/introducing-the-zorchpad-display-demo.md
posts-md/irc.md
posts-md/ircpuzzles-2024.md
posts-md/is-rick-and-morty-out-season-5.md
posts-md/is-rick-and-morty-out-season-6.md
posts-md/life-logging-in-2019.md
posts-md/linux-print-server.md
posts-md/mail-filtering-with-dovecot.md
posts-md/making-a-hardware-random-number-generator.md
posts-md/making-my-finances-public.md
posts-md/making-signs-on-wall-tiles.md
posts-md/markdown-support.md
posts-md/meeple-initiative-tracker.md
posts-md/migrating-an-existing-debian-installation-to-encrypted-root.md
posts-md/mon8.md
posts-md/money-orders.md
posts-md/moreorcs-com.md
posts-md/multi-universe-rpg-toy.md
posts-md/my-todo-list.md
posts-md/ogs2021-27-million-go-games.md
posts-md/ok-mixnet.md
posts-md/old-wikipedia-urdu.md
posts-md/old-wikipedia.md
posts-md/one-page-rpgs.md
posts-md/one-screenshot-per-minute.md
posts-md/open-nntp-server.md
posts-md/painting.md
posts-md/pandora-songs.md
posts-md/paper-archival.md
posts-md/pixel-alphabet.md
posts-md/pixel-art-a-cool-cat.md
posts-md/pompompom.md
posts-md/printable-todo-list.md
posts-md/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi.md
posts-md/problem-log-txt.md
posts-md/qr-backup-2.md
posts-md/qr-backup-v1-1.md
posts-md/qr-backup.md
posts-md/raspberry-pi-comparison.md
posts-md/relay-music.md
posts-md/repulsive-dots.md
posts-md/roasted-chickpeas.md
posts-md/running-a-forge-server-on-headless-linux.md
posts-md/scan-organizer.md
posts-md/scheme-interpreter.md
posts-md/screen-and-tmux-ides.md
posts-md/scroll-props.md
posts-md/setting-up-ssl-certificates-using-startssl.md
posts-md/software-section.md
posts-md/sql-views.md
posts-md/steak-tartare-3.md
posts-md/storage-prices-2019-07.md
posts-md/storage-prices-2020-01.md
posts-md/storage-prices-2022-07.md
posts-md/storage-prices-2023-01.md
posts-md/streaming-linux-twitch-using-ffmpeg-and-alsa.md
posts-md/stylish.md
posts-md/terminal-goal-rationality-techniques.md
posts-md/testing-scrapers-faster.md
posts-md/the-bible-translated-to-the-new-latin.md
posts-md/the-double-lives-of-books.md
posts-md/time-log-transcribed.md
posts-md/time-management-optimizers-satisficers-minimizers.md
posts-md/timelog-analysis.md
posts-md/tiny-cute-vampire-bat.md
posts-md/tty-audit-logs.md
posts-md/understanding-gzip-2.md
posts-md/url-handlers-in-linux.md
posts-md/usb-flash-longevity-testing-year-2.md
posts-md/when-is-rick-and-morty-out-season-4-episode-6.md
posts-md/whiteboard-partition.md
posts-md/whoosh.md
posts-md/whsh.md
posts-md/wip-dead-tree-publishing-2.md
posts-md/wip-dead-tree-publishing-3.md
posts-md/wip-dead-tree-publishing-4.md
posts-md/wip-dead-tree-publishing.md
posts-md/xp-boot-usb-stick.md
posts-md/year-in-review.md
posts-md/youtube-autodl.md
posts-md/zorchpad-keyboard-update.md
posts-md/zorchpad-update-cardboard-mockup-mk1.md
posts-md/zorchpad-update-first-3d-print.md
posts-md/zorchpad-update-keyboard.md
templates/feed.mustache.html
templates/layout.mustache.html
templates/postcombined.mustache.html

diff --git a/blog b/blog
index bb7a179c2a823cb0c79f017eb95fe72169ff09ab..ad06892d31d45dd173e99d85a022ac78afcdf4af 100755 (executable)
--- a/blog
+++ b/blog
@@ -22,11 +22,11 @@ import chevron as mustache
 import collections
 import datetime
 import math
-import markdown2
 import os, os.path
 import re
 import subprocess
 import yaml
+from markdown2html import markdown2html
 
 from pathlib import Path
 
@@ -107,7 +107,6 @@ def scale(i1, range1, range2):
     i2 = frac2 * (range2.stop - range2.start) + range2.start
     return i2
 
-md2html = markdown2.markdown
 
 RELOAD_HTML = b"""
 <script>
@@ -229,6 +228,7 @@ class Post(Templatable):
     def __init__(self, parsed, blog, parsed_md):
         super().__init__(blog)
         self.post, self.comments = parsed.pop("content").split("<!-- comments -->\n")
+        self.post = self.post.replace("<!-- blogpost -->","")
         self.main_display = True
         self.md = parsed_md["content"]
         for k, v in parsed.items():
@@ -240,7 +240,7 @@ class Post(Templatable):
 
     @property
     def md_html(self):
-        return md2html(self.md)
+        return '<div class="entry-content">{}</div>'.format(markdown2html(self.md))
 
     @property
     def output_path_html(self):
index 11b5bee219d460487cf3ec34490fcc37f834484c..2e3903028fe61085a6480b92351c1f1199f272f2 100644 (file)
@@ -1,18 +1,54 @@
 var TurndownService = require('turndown')
-const fs = require("fs");
+var turndownPluginGfm = require('joplin-turndown-plugin-gfm')
+const fs = require("fs")
+
+function repeat (character, count) {
+  return Array(count + 1).join(character)
+}
+
+var myPlugin = {
+    pre: function(turndownService) {
+      turndownService.addRule('preNoCode', {
+        filter: function (node, options) {
+          return (node.nodeName === 'PRE' && !node.firstElementChild)
+        },
+
+        replacement: function (content, node, options) {
+          var code = node.textContent
+          var fence = "```"
+          var language = ''
+
+          return (
+            '\n\n' + fence + language + '\n' +
+            code.replace(/\n$/, '') +
+            '\n' + fence + '\n\n'
+          )
+        },
+      })
+    },
+
+    preserveHTMLMatching: function(turndownService) {
+
+    },
+}
+
 
 // Preview options at https://mixmark-io.github.io/turndown/
 var turndownService = new TurndownService({
-    linkStyle: 'referenced',
-    hr: '---',
-    headingStyle: 'atx',
-    emDelimiter: '*',
-    linkReferenceStyle: 'full',
-    bulletListMarker: '-',
+  linkStyle: 'inlined',
+  hr: '---',
+  headingStyle: 'atx',
+  emDelimiter: '*',
+  linkReferenceStyle: 'full',
+  bulletListMarker: '-',
+  codeBlockStyle: 'fenced',
 })
+turndownService.use(turndownPluginGfm.tables)
+turndownService.use(myPlugin.pre)
+turndownService.keep('iframe')
+//turndownService.use(myPlugin.preserveHTMLMatching)
 
 const html = fs.readFileSync(0, "utf-8");
 const markdown = turndownService.turndown(html)
 process.stdout.write(markdown);
 process.stdout.write('\n');
-
index b4f29f797cddbb1b5154e457d19be7360b44c785..07ddcad44aeb6e70f84a174e6ff26b8bc1386295 100644 (file)
@@ -14,11 +14,17 @@ class Post():
 
     @staticmethod
     def html2markdown(html):
-        result = subprocess.run(CMD, input=html.encode("utf8"), capture_output=True, check=True)
+        result = subprocess.run(CMD, input=html.encode("utf8"), capture_output=True)
+        try:
+            result.check_returncode()
+        except subprocess.CalledProcessError:
+            print(result.stdout.decode('utf8'))
+            print(result.stderr.decode('utf8'))
+            raise
         return result.stdout.decode("utf8")
 
     def convert(self):
-        self.data["content"] = self.html2markdown(self.data["content"])
+        self.data["content"] = self.html2markdown(self.data["content"].split("<!-- comments -->")[0])
 
     def save(self, target_dir):
         target_dir.mkdir(parents=True, exist_ok=True)
index bf0a9cc071efbe0a3131e49cfe270621b3647ddf..6b8540e29ba579943d09c921c8ebae303c9b5b98 100644 (file)
@@ -16,8 +16,6 @@ wordpress_slug: '116'
 ---
 > The best practice or goal emphasized above with respect to templates and views is KISS and DRY. As long as the implementation does not become overly complex and difficult to grok, keep the template code DRY, otherwise KISS principle overrides the need to have template code that does not repeat itself.
 > 
-> –[Vertebrae Framework][1]
+> –[Vertebrae Framework](http://pixelhandler.github.io/vertebrae/notes/backbone-dot-js-and-mustache-dot-js-small-views-and-templates/2012/01/09/)
 
 A nice illustration of conflicting positive principles and resolution.
-
-[1]: http://pixelhandler.github.io/vertebrae/notes/backbone-dot-js-and-mustache-dot-js-small-views-and-templates/2012/01/09/
index d0ed48b2f1967278d2e859ccf35abd01e13d31a8..2ba061fea75b0a4f8b8020b517930e86cd2d5714 100644 (file)
@@ -15,7 +15,7 @@ wordpress_slug: 20-minute-interruptions
 ---
 Very, very early in my self-improvement journey, I tried adding a 20 minute timer to my life. Every 20 minutes of my waking life, it went off. I’d explicitly say to myself what it was I was doing (“Watching TV” or “Talking to Fred”). It’s important to have a verbal or written note of what you’re doing.
 
-I added a specific prompt at one point: “What am I doing, and why?”. I don’t think goals are how I think about things today, but it’s how I tried to think back then ([goal factoring][1]). Today I might ask, “What am I doing, and do I want to be doing it? Do I want to be doing it this way?”
+I added a specific prompt at one point: “What am I doing, and why?”. I don’t think goals are how I think about things today, but it’s how I tried to think back then ([goal factoring](https://www.lesswrong.com/tag/goal-factoring#:~:text=Goal%20Factoring%20is%20a%20rationality,that%20better%20accomplish%20the%20goals.)). Today I might ask, “What am I doing, and do I want to be doing it? Do I want to be doing it this way?”
 
 The basic 20-minute check-in process was very helpful to me. Some benefits:
 
@@ -23,5 +23,3 @@ The basic 20-minute check-in process was very helpful to me. Some benefits:
 -   **What am I doing, and do I want to be doing it?** Interrupting default activities (a type of inertia). Watching TV until I get bored of it takes me 2-10 hours, if I don’t have a timer. Having a timer interrupt me let me say “well, maybe this will be the last episode, then.” It’s easy to get into a low-energy state for leisure activities where you don’t notice the passage of time. And it’s important to note, I don’t have any rules. I can keep watching TV all night if I want to. This helps me avoid doing it out of pure inertia. (It also really keyed me in that TV does not really “recharge” my batteries. Other relaxation is better.)
 -   **Do I want to be doing it, or doing it this way?** Interrupting bad approaches (a type of inertia). Sometimes, I get stubborn. I’ll keep trying to solve a problem in one way, for way too long. Having a regular interruption keys me into how long I’ve been doing that. I’ll notice I should maybe try a different approach or a work-around. Or give up.
 -   **Ding!** Providing a check-in. I’ll just take stock, and say “hey, am I really having fun? is this even useful?”. Sometimes I’m just doing something dumb. Or sometimes I forget to have fun or take a break for too long. This is my reminder to check in with my strategic system; my emotions; my body.
-
-[1]: https://www.lesswrong.com/tag/goal-factoring#:~:text=Goal%20Factoring%20is%20a%20rationality,that%20better%20accomplish%20the%20goals.
index 4cd3c0c2a854cfcba8e1920026f0f98690da5ccb..43fde3e187d32c2bbfb594ea38b6427c1dee3e05 100644 (file)
@@ -24,11 +24,11 @@ A Crucible of Souls by Mitchell Hogan
 Alcatraz and the Evil Librarians by Brandon Sanderson  
 A Memory Called Empire, by Arkady Martine  
 Apex (Nexus 3) by Ramez Naam  
-[A Practical Guide to Evil][1], to end of book 5  
+[A Practical Guide to Evil](https://practicalguidetoevil.wordpress.com/table-of-contents/), to end of book 5  
 Arena by Holly Jennings  
 Ariel by Steven Barnett  
 Ascend Online by Luke Chmilenko  
-[Bastard Operator from Hell][2]  
+[Bastard Operator from Hell](http://bofh.bjash.com/)  
 Circe, by Madeline Miller  
 City of Brass by S A Chakrabarty p1-460  
 Cold Comfort Farm by Stella Gibbons  
@@ -54,7 +54,7 @@ House of Earth and Blood by Sarah Maas
 Ithenalin’s Restoration by Lawrence Watt-Evans  
 Lament by Maggie Stiefvater  
 Legacy of the Fallen by Luke Chmilenko p1-316  
-**[Lone Wolf][3] / Kai adventure series 1-5, magnakai 1, by Joe Dever  
+**[Lone Wolf](https://www.projectaon.org/en/Main/Books) / Kai adventure series 1-5, magnakai 1, by Joe Dever  
 **Magic for Liars by Sarah Gailey  
 Magician by Raymond Feist  
 Magicians by Lev Grossman  
@@ -77,7 +77,7 @@ Relics of War by Lawrence Watt-Evans
 Starfish (Rifters 1) by Peter Watts  
 Shades of Milk and Honey by Mary Robinette Kowal (all)  
 Shift (Silo 6-8) by Hugh Howey  
-[Shining Path][4] by Matthew Skala  
+[Shining Path](https://shiningpathbook.com/) by Matthew Skala  
 Shouldn’t You Be In School? by Lemony Snicket  
 Sister Sable, by T Mountebank, p1-378  
 Skysworn by Will Wight  
@@ -115,7 +115,7 @@ The Wiz Biz by Rick Cook
 The Woven Ring by MD Presley, p1-28  
 Three-Body Problem by Cixin Liu  
 Three Men in a Boat by Jerome K. Jerome  
-[Twig][5] by wildbow (arc 1-18)  
+[Twig](https://twigserial.wordpress.com/) by wildbow (arc 1-18)  
 Uncrowned by Will Wight  
 Underlord by Will Wight  
 **Unsong by Scott Alexander**  
@@ -130,7 +130,7 @@ Wool by Hugh Howey (v1-5)
 507 Mechanical Movements by Henry T Brown  
 Advanced Magick for Beginners by Alan Chapman  
 Broadcast Channels with Confidential Messages  
-[Busy Beaver Frontier][6] by Scott Aaronson. I did some [work][7] based on it.  
+[Busy Beaver Frontier](https://www.scottaaronson.com/blog/?p=4916) by Scott Aaronson. I did some [work](https://github.com/za3k/busy_beaver) based on it.  
 Computational Geometry by Mark de Berg  
 Craeft by Alexander Langlands  
 D&D 5e Player’s Handbook  
@@ -140,24 +140,13 @@ Forrest Mim’s Engineer’s Notebook
 Forrest Mim’s Mini Notebook  
 Intel’s x86-64 manual  
 Introduction to Analysis by Maxwell Rosenlicht  
-**[Kademelia][8] by Peter Maymounkov  
-**[kleiman v wright][9] australian tax document  
+**[Kademelia](https://www.researchgate.net/publication/2492563_Kademlia_A_Peer-to-peer_Information_System_Based_on_the_XOR_Metric) by Peter Maymounkov  
+**[kleiman v wright](https://library.za3k.com/law%20documents/kleiman%20v%20wright%20-%20austrialian%20taxation%20office%20findings.pdf) australian tax document  
 Incremental String Searching by Bertrand Meyer (KNP algorithm)  
 Rules to One Night Ultimate Werewolf  
 The Art of Computer Programming, v1, v3 by Donald Knuth (parts)  
 The Pragmatic Programmer  
 The Rust Programming Language  
-**[There’s Plenty of Room at the Bottom][10] by Richard Feynman  
+**[There’s Plenty of Room at the Bottom](https://web.pa.msu.edu/people/yang/RFeynman_plentySpace.pdf) by Richard Feynman  
 **Total Money Makeover by Dave Ramsey  
 W65025 manual (6502 clone)
-
-[1]: https://practicalguidetoevil.wordpress.com/table-of-contents/
-[2]: http://bofh.bjash.com/
-[3]: https://www.projectaon.org/en/Main/Books
-[4]: https://shiningpathbook.com/
-[5]: https://twigserial.wordpress.com/
-[6]: https://www.scottaaronson.com/blog/?p=4916
-[7]: https://github.com/za3k/busy_beaver
-[8]: https://www.researchgate.net/publication/2492563_Kademlia_A_Peer-to-peer_Information_System_Based_on_the_XOR_Metric
-[9]: https://library.za3k.com/law%20documents/kleiman%20v%20wright%20-%20austrialian%20taxation%20office%20findings.pdf
-[10]: https://web.pa.msu.edu/people/yang/RFeynman_plentySpace.pdf
index 2deafd7321c0ddd89c4eebdf836e69b15a1b4077..216836c6e148a0f735a854595adb9c74c5e856fa 100644 (file)
@@ -19,30 +19,22 @@ What happened in 2020? Well,
 -   I stayed inside. I’ve been getting groceries delivered, even–I’ve been somewhere other than my house maybe twice since COVID-19 lockdown started.
 -   I started watching wayyy more videos, especially video game streams.
 -   I looked into buying land in Colorado and living in an RV
--   I [transcribed][1] my log books, and started coverting them all to a standard, computer-parsable format (mostly done, one left).
--   I deleted [bs][2].
--   I figured out [twitch streaming][3], both with a standalone capture card and on linux.
+-   I [transcribed](https://blog.za3k.com/time-log-transcribed/) my log books, and started coverting them all to a standard, computer-parsable format (mostly done, one left).
+-   I deleted [bs](https://blog.za3k.com/postmortem-bs-store/).
+-   I figured out [twitch streaming](https://blog.za3k.com/streaming-linux-twitch-using-ffmpeg-and-alsa/), both with a standalone capture card and on linux.
 -   I got hardware random number generators to work.
--   I designed v1 and v2 of a protocol to allow a set of computers to store a large amount of content. It’s designed to back up things like the Internet Archive. I’m calling the project “valhalla”, after ArchiveTeams’s project [valhalla][4] and IA.BAK.
+-   I designed v1 and v2 of a protocol to allow a set of computers to store a large amount of content. It’s designed to back up things like the Internet Archive. I’m calling the project “valhalla”, after ArchiveTeams’s project [valhalla](https://wiki.archiveteam.org/index.php/Valhalla) and IA.BAK.
 -   I learned to use an oscilloscope, and bit-banged SPI and I2C for a while, trying to get a 9-axis sensor to work unsuccessfully.
 -   I learned how to make a pretty good pizza
 -   I played a bunch of video games
--   I [worked][5] on the Lazy Beaver [problem][6], and tied the state of the art.
+-   I [worked](https://github.com/za3k/busy_beaver) on the Lazy Beaver [problem](https://oeis.org/A337805), and tied the state of the art.
 -   I made a master TODO list, and finished every single TODO I had that took an hour or less.
 -   I figured out how to make VMs in Linux and run them all the time
 -   I got a tablet, and learned GIMP and InkScape well enough to draw some stuff.
 -   I wrote a custom client for omegle
 -   I did a yearly backup
 -   I did various research. I learned about algorithms, data structures, RALA, and quantum physics.
--   I wrote up my [cookbook][7] and released it.
+-   I wrote up my [cookbook](https://blog.za3k.com/cookbook/) and released it.
 -   I wrote some blog posts 🙂
 -   Four of my friends moved to Ohio, two from nearby me. I only know one person in the state I’m in well at this point.
 -   A friend of mine got out of jail and got to go home.
-
-[1]: https://blog.za3k.com/time-log-transcribed/
-[2]: https://blog.za3k.com/postmortem-bs-store/
-[3]: https://blog.za3k.com/streaming-linux-twitch-using-ffmpeg-and-alsa/
-[4]: https://wiki.archiveteam.org/index.php/Valhalla
-[5]: https://github.com/za3k/busy_beaver
-[6]: https://oeis.org/A337805
-[7]: https://blog.za3k.com/cookbook/
index 91ced3abc0cc253fef5dd27c3fac26592f4ca8b3..4bcfbb0b419832c1a2d272dd5301c68240546ed7 100644 (file)
@@ -65,7 +65,7 @@ Malazan (Malazan 1) by Steven Erikson
 **Mistress of the Empire by Raymond Feist and Janny Wurts  
 Servant of the Empire by Raymond Feist and Janny Wurts  
 Dragon’s Egg (Cheela 1) by Robert L Forward  
-**[Mother of Learning][1] by Domagoj Kurmaic/nobody103**  
+**[Mother of Learning](https://www.royalroad.com/fiction/21220/mother-of-learning) by Domagoj Kurmaic/nobody103**  
 Books of Magic by Neil Gaiman  
 The Midnight Library by Matt Haig  
 The Warehouse by Rob Hart  
@@ -140,11 +140,11 @@ Thousand Li 3 by Tao Wong
 Thousand Li 4 by Tao Wong  
 Thousand Li 5 by Tao Wong  
 Sorcerer’s Legacy by Janny Wurts (see also Feist)  
-[Heretical Edge][2] by ceruleuanscrawling  
-[Mark of the Fool][3] by UnstoppableJuggernaut  
-[there is no antimemetics division][4] by qntm  
-[Only Villains Do That][5] by Webbonomicon  
-[Worm][6] by wildbow
+[Heretical Edge](https://ceruleanscrawling.wordpress.com/table-of-contents/) by ceruleuanscrawling  
+[Mark of the Fool](https://www.royalroad.com/fiction/41618/mark-of-the-fool-a-progression-fantasy) by UnstoppableJuggernaut  
+[there is no antimemetics division](https://scp-wiki.wikidot.com/antimemetics-division-hub) by qntm  
+[Only Villains Do That](https://www.royalroad.com/fiction/40182/only-villains-do-that) by Webbonomicon  
+[Worm](https://parahumans.wordpress.com/) by wildbow
 
 **Nonfiction:**
 
@@ -161,10 +161,3 @@ Primitive Technology by John Plant
 Monero whitepaper by Nicolas van Saberhagen  
 Secrets and Lies by Bruce Schneier  
 The Cuckoo’s Egg by Clifford Stoll
-
-[1]: https://www.royalroad.com/fiction/21220/mother-of-learning
-[2]: https://ceruleanscrawling.wordpress.com/table-of-contents/
-[3]: https://www.royalroad.com/fiction/41618/mark-of-the-fool-a-progression-fantasy
-[4]: https://scp-wiki.wikidot.com/antimemetics-division-hub
-[5]: https://www.royalroad.com/fiction/40182/only-villains-do-that
-[6]: https://parahumans.wordpress.com/
index cb9ff2b4c2223a4c14ef189f4d2d960f028488f4..3748f402b6a96abbb173cf338feb7a7d7826c056 100644 (file)
@@ -61,7 +61,7 @@ In Other Lands by Sarah Rees
 Insane City by Dave Barry  
 Iron Prince by Bryce O’Conner and Luke Chmilenko  
 Isolate (Grand Illusion 1) by L E Modesitt Jr  
-**[The Kevin Jenkins Experience][1] by Hambone  
+**[The Kevin Jenkins Experience](https://deathworlders.com/books/deathworlders/chapter-00-kevin-jenkins-experience/) by Hambone  
 **Kusuriya no Hitorigoto / Alchemist’s Journal by Natsu Hyuuga et al  
 The Left-handed Booksellers of London by Garth Nix  
 Lock In by John Scalzi  
@@ -145,5 +145,3 @@ Sigbovik 2021
 Spymistress by William Stevenson  
 What If? by Randall Munroe  
 What If? 2 by Randall Munroe
-
-[1]: https://deathworlders.com/books/deathworlders/chapter-00-kevin-jenkins-experience/
index 590c800234e890b45039173a3f538b63a5c77235..b7bb017f71fc1299901dd84cfec457b03f6102f6 100644 (file)
@@ -26,9 +26,9 @@ Happily I already knew many people where I was moving, and I also started attend
 
 ## Games
 
-I started two D&D games in 2022. One ended before session 1, the other exploded after two months. I had a nice time playing as a player in “Index Card RPG”, though. I ran a session of [lexicon][1], which went pretty well. We quit before getting to the letter Z, but that’s a design flaw in Lexicon–it’s way too long.
+I started two D&D games in 2022. One ended before session 1, the other exploded after two months. I had a nice time playing as a player in “Index Card RPG”, though. I ran a session of [lexicon](https://za3k.com/archive/lexicon1/), which went pretty well. We quit before getting to the letter Z, but that’s a design flaw in Lexicon–it’s way too long.
 
-I participated in the 2022 April Fools Puzzle Contest, on #ircpuzzles. I came in [7th][2].
+I participated in the 2022 April Fools Puzzle Contest, on #ircpuzzles. I came in [7th](https://blog.ircpuzzles.org/2022/04/2022-april-fools-rankings/).
 
 ## This and that
 
@@ -36,28 +36,28 @@ A little travel. I went to Missouri to visit friends. I got to go to my friends
 
 I read “The Art of Computer Programming” volumes 1 and 2. Donald Knuth sent me a check for finding a 0x1.2 bugs.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/04/san_serriffe-1024x375.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/04/san_serriffe-1024x375.jpg)](https://blog.za3k.com/wp-content/uploads/2023/04/san_serriffe-scaled.jpg)
 
 I got a snakebite lip piercing.
 
 I made a first-aid kit, which I’m realizing I didn’t write up. My thinking was that it’s bad to give medical advice when you don’t know anything about medicine.
 
-I made a new blast furnace with my sister, which we never used ([old one][4]).
+I made a new blast furnace with my sister, which we never used ([old one](https://blog.za3k.com/blast-furance/)).
 
-I made an [e-ink laptop][5].
+I made an [e-ink laptop](https://blog.za3k.com/e-ink-laptop/).
 
 ## Software
 
-In November, I did [Hack-a-Day][6], a project I conceived to do a new computer project every day of the month that I could show off to others. As part of it, I learned web sockets, webRTC, unity3D, game programming. In all, there were around 30 projects–click the link to see them all.
+In November, I did [Hack-a-Day](https://za3k.com/hackaday), a project I conceived to do a new computer project every day of the month that I could show off to others. As part of it, I learned web sockets, webRTC, unity3D, game programming. In all, there were around 30 projects–click the link to see them all.
 
--   I made huge improvements to [qr-backup][7]. Its basically “done” for the CLI version.
--   I wrote [youtube-autodl][8], a program to automatically download a feed of youtube videos and sort them into folders.
+-   I made huge improvements to [qr-backup](https://github.com/za3k/qr-backup/). Its basically “done” for the CLI version.
+-   I wrote [youtube-autodl](https://blog.za3k.com/youtube-autodl/), a program to automatically download a feed of youtube videos and sort them into folders.
 -   I wrote a video linter for my personal video collection.
--   I wrote a [screenshotter][9], which takes one screenshot a minute of my laptop (encrypted) and archives them indefinitely.
--   I re-wrote [is rick and morty out.com][10] for Season 6.
--   I wrote [record-shell][11] and installed it on my computers. It records all shell sessions, etc including ssh sessions.
--   I wrote [Doodle RPG][12], which I was quite proud of. It ran for a good while and tapered off. It supports mobile!
--   I did a couple late hack-a-day followups: a [bug reporter][13] and [hack-a-spring][14] (unfinished).
+-   I wrote a [screenshotter](https://blog.za3k.com/one-screenshot-per-minute/), which takes one screenshot a minute of my laptop (encrypted) and archives them indefinitely.
+-   I re-wrote [is rick and morty out.com](http://isrickandmortyout.com/) for Season 6.
+-   I wrote [record-shell](http://isrickandmortyout.com/) and installed it on my computers. It records all shell sessions, etc including ssh sessions.
+-   I wrote [Doodle RPG](https://doodle-rpg.com/), which I was quite proud of. It ran for a good while and tapered off. It supports mobile!
+-   I did a couple late hack-a-day followups: a [bug reporter](https://blog.za3k.com/hack-a-day-hack-a-bug/) and [hack-a-spring](https://tilde.za3k.com/hackaday/spring/) (unfinished).
 -   Worked on beggar-my-neighbor solver.
 
 ## Habits
@@ -70,33 +70,14 @@ I tried an experiment with “no-computer” sundays. This was super productive
 
 I started limiting myself to one youtube video per day. That went great and I’ve kept it up.
 
-Every year I have a checklist of things to do. I did them. Two of the more well-known are my [storage cost survey][15] and my [media longevity test][16].
+Every year I have a checklist of things to do. I did them. Two of the more well-known are my [storage cost survey](https://blog.za3k.com/storage-prices-2022-07/) and my [media longevity test](https://www.reddit.com/r/DataHoarder/comments/tb26cy/flash_media_longevity_testing_2_years_later/).
 
-I [sorted my scans][17] into folders. I decided not to do the whole process (transcribe the handwritten documents, etc) for the thousands of scans, because it wouldn’t be worth the time. I’ll wait and see what I can do with AI in a few years, maybe.
+I [sorted my scans](https://blog.za3k.com/scan-organizer/) into folders. I decided not to do the whole process (transcribe the handwritten documents, etc) for the thousands of scans, because it wouldn’t be worth the time. I’ll wait and see what I can do with AI in a few years, maybe.
 
 # Writing
 
-You can read most of what I wrote here! On a blog! Of particular interest might be my new [index page][18].
+You can read most of what I wrote here! On a blog! Of particular interest might be my new [index page](https://za3k.com/blog).
 
 I also wrote a short story, *Earth II*. It’s not online because it’s bad.
 
 I had to remove library.za3k.com because of DMCAs.
-
-[1]: https://za3k.com/archive/lexicon1/
-[2]: https://blog.ircpuzzles.org/2022/04/2022-april-fools-rankings/
-[3]: https://blog.za3k.com/wp-content/uploads/2023/04/san_serriffe-scaled.jpg
-[4]: https://blog.za3k.com/blast-furance/
-[5]: https://blog.za3k.com/e-ink-laptop/
-[6]: https://za3k.com/hackaday
-[7]: https://github.com/za3k/qr-backup/
-[8]: https://blog.za3k.com/youtube-autodl/
-[9]: https://blog.za3k.com/one-screenshot-per-minute/
-[10]: http://isrickandmortyout.com/
-[11]: http://isrickandmortyout.com/
-[12]: https://doodle-rpg.com/
-[13]: https://blog.za3k.com/hack-a-day-hack-a-bug/
-[14]: https://tilde.za3k.com/hackaday/spring/
-[15]: https://blog.za3k.com/storage-prices-2022-07/
-[16]: https://www.reddit.com/r/DataHoarder/comments/tb26cy/flash_media_longevity_testing_2_years_later/
-[17]: https://blog.za3k.com/scan-organizer/
-[18]: https://za3k.com/blog
index 90f3ebe2f24eb522be9ede3e1755c6ba8a33d2ca..10e3bfe81214c9c43ee18b385adec31a3fe2025f 100644 (file)
@@ -15,20 +15,14 @@ updated: 2023-01-09 11:30:39-07:00
 wordpress_id: 979
 wordpress_slug: 2023-flash-media-longevity-testing-3-years-later
 ---
--   [Year 0][1] – I filled 10 32-GB Kingston flash drives with random data.
--   [Year 1][2] – Tested drive 1, zero bit rot. Re-wrote drive 1 with the same data.
--   [Year 2][3] – Tested drive 2, zero bit rot. Re-tested drive 1, zero bit rot. Re-wrote drives 1-2 with the same data.
+-   [Year 0](https://www.reddit.com/r/DataHoarder/comments/e3nb2r/longterm_reliability_testing/) – I filled 10 32-GB Kingston flash drives with random data.
+-   [Year 1](https://www.reddit.com/r/DataHoarder/comments/lwgsdr/research_flash_media_longevity_testing_1_year/) – Tested drive 1, zero bit rot. Re-wrote drive 1 with the same data.
+-   [Year 2](https://www.reddit.com/r/DataHoarder/comments/tb26cy/flash_media_longevity_testing_2_years_later/) – Tested drive 2, zero bit rot. Re-tested drive 1, zero bit rot. Re-wrote drives 1-2 with the same data.
 -   Year 3 – Tested drive 3, zero bit rot. Re-tested drives 1-2, zero bit rot. Re-wrote drives 1-3 with the same data.
 
 This year they were stored in a box on my shelf.
 
 Will report back in 1 more year when I test the fourth 🙂
 
--   [FAQ][4]
--   [Reddit][5]
-
-[1]: https://www.reddit.com/r/DataHoarder/comments/e3nb2r/longterm_reliability_testing/
-[2]: https://www.reddit.com/r/DataHoarder/comments/lwgsdr/research_flash_media_longevity_testing_1_year/
-[3]: https://www.reddit.com/r/DataHoarder/comments/tb26cy/flash_media_longevity_testing_2_years_later/
-[4]: https://blog.za3k.com/usb-flash-longevity-testing-year-2/
-[5]: https://www.reddit.com/r/DataHoarder/comments/102razr/flash_media_longevity_testing_3_years_later/
+-   [FAQ](https://blog.za3k.com/usb-flash-longevity-testing-year-2/)
+-   [Reddit](https://www.reddit.com/r/DataHoarder/comments/102razr/flash_media_longevity_testing_3_years_later/)
index bd011f87a2ff01639ee3691cc82195a246410586..3068c2c2f0ee2916f674df4c1275d5853667717c 100644 (file)
@@ -13,17 +13,12 @@ updated: 2021-02-09 18:45:17-07:00
 wordpress_id: 560
 wordpress_slug: 3-more-games
 ---
-I’ve added a central **games** page [https://za3k.com/mygames.md][1] to my website, with all the games I designed. The new games:
+I’ve added a central **games** page [https://za3k.com/mygames.md](https://za3k.com/mygames.md) to my website, with all the games I designed. The new games:
 
-[Loot Boxes][2]. Untested. Easy storytelling game for 2-4 players. The players have an inventory of absurd random items, and must solve challenges using each item in turn.
+[Loot Boxes](https://za3k.com/archive/lootboxes.md). Untested. Easy storytelling game for 2-4 players. The players have an inventory of absurd random items, and must solve challenges using each item in turn.
 
-[Stupid Russia][3]. Tested. Party game for 10+ people. Each player is a spy director at the Stupid KGB, and must report as many codenames to the Inspector as possible, swapping secret information with other players. The players had fun, especially adopting bad accents. The rules were too hard to understand, and it was too much work and no fun for me as the Inspector. Overall I’d just recommend Stupid Conspiracies instead.
+[Stupid Russia](https://za3k.com/archive/stupid_russia.md). Tested. Party game for 10+ people. Each player is a spy director at the Stupid KGB, and must report as many codenames to the Inspector as possible, swapping secret information with other players. The players had fun, especially adopting bad accents. The rules were too hard to understand, and it was too much work and no fun for me as the Inspector. Overall I’d just recommend Stupid Conspiracies instead.
 
-[Stupid Conspiracies][4]. Untested. Party Game for 8+ people. Each player tries to recruit the others into their conspiracy, for about half an hour. It’s a re-write of the core idea in Stupid Russia. Overall, big party games are just too hard for me to organize.
+[Stupid Conspiracies](https://za3k.com/archive/conspiracies.md). Untested. Party Game for 8+ people. Each player tries to recruit the others into their conspiracy, for about half an hour. It’s a re-write of the core idea in Stupid Russia. Overall, big party games are just too hard for me to organize.
 
 I also playtested “No this cannot be! I AM INVINCIBLE!”. It ran about 45 minutes prep (not fun) and 45 minutes playtime, which was the main problem. Overall the play time was fun. I rewrote it to have MUCH easier prep, and for the game to be generally easier. I also re-wrote the rules of “Ninjas Ninjas Ninjas” without a playtest. I don’t think it will ever be too popular but it has a soft spot for me.
-
-[1]: https://za3k.com/mygames.md
-[2]: https://za3k.com/archive/lootboxes.md
-[3]: https://za3k.com/archive/stupid_russia.md
-[4]: https://za3k.com/archive/conspiracies.md
index cda49251f0b20137312ecc2a4ebf50c4e546df78..a6d026ca7e6abf6d4b4d1e6a2390dda6a17cd829 100644 (file)
@@ -13,15 +13,10 @@ updated: 2021-06-05 15:38:40-07:00
 wordpress_id: 573
 wordpress_slug: 3-new-games-deadly-education-rpg-logic-potions-emperical-zendo
 ---
--   [Emperical Zendo][1], a semi-competitive game for 3-8 players based on the icehouse game Zendo. Vaguely based on rants by Bayesians.
--   [Logic Potions][2], a competitive game about deductive logic and making new rules for 2-4 players. Actual gameplay quickly gets complicated as players add more rules about brewing potions. Inspired by “Imaginary Go Fish” and “Emperical Zendo”.
--   [Deadly Education RPG][3], a traditional pen+paper RPG game based on Naomi Novik’s “Deadly Education”. Reading the book is not required.
+-   [Emperical Zendo](https://za3k.com/archive/emperical_zendo.md), a semi-competitive game for 3-8 players based on the icehouse game Zendo. Vaguely based on rants by Bayesians.
+-   [Logic Potions](https://za3k.com/archive/logic_potions.md), a competitive game about deductive logic and making new rules for 2-4 players. Actual gameplay quickly gets complicated as players add more rules about brewing potions. Inspired by “Imaginary Go Fish” and “Emperical Zendo”.
+-   [Deadly Education RPG](https://za3k.com/archive/deadly.md), a traditional pen+paper RPG game based on Naomi Novik’s “Deadly Education”. Reading the book is not required.
 
 All three are untested as of posting.
 
-See also: [List of all games][4]
-
-[1]: https://za3k.com/archive/emperical_zendo.md
-[2]: https://za3k.com/archive/logic_potions.md
-[3]: https://za3k.com/archive/deadly.md
-[4]: https://za3k.com/mygames.md
+See also: [List of all games](https://za3k.com/mygames.md)
index 6d9fd62d29129a29d40e514ba8b85a4f7bfd19c9..4fc81b27274ab42867ae6efb958292111d4980f9 100644 (file)
@@ -15,58 +15,63 @@ wordpress_slug: a-mystery-in-the-text-editor
 ---
 Hello, Linux terminal users! Let me present you a simple feature you’ve all seen, but might not have noticed.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/01-mystery.png)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/01-mystery.png)](https://blog.za3k.com/wp-content/uploads/2024/05/01-mystery.png)
 
 You’re on the terminal, and you open a text editor of chice–nano, vim, emacs, acme etc.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/02-mystery.png)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/02-mystery.png)](https://blog.za3k.com/wp-content/uploads/2024/05/02-mystery.png)
 
 After you edit for a bit, you close the editor.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/03-mystery.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/03-mystery.png)](https://blog.za3k.com/wp-content/uploads/2024/05/03-mystery.png)
 
 Now you’re back where you left off. My question is, *how?* How does nano remember what used to be on screen? How does it get restored? Is nano doing this, or bash?
 
-Well, I took at look at the [source code][4] to *nano*. Then I thought, “whoa! that’s way too complicated.” So I found a much simpler project called *ted* someone made to educate themselves. That was [also][5] a little complicated, but both seemed to use ncurses. So I wrote the following simple program, which *also* displays something and then restores the screen. Even though it’s very simple, it still works.
-
-    // Compile with: gcc -lncurses editor.c -o editor
-    
-    #include <curses.h>
-    #include <stdio.h>
-    
-    int main(int argc, char **argv) {
-        initscr();
-    
-        refresh();
-        printw("Hello world");
-        getch();
-    
-        endwin();
-        return 0;
-    }
+Well, I took at look at the [source code](https://github.com/madnight/nano/blob/master/src/nano.c) to *nano*. Then I thought, “whoa! that’s way too complicated.” So I found a much simpler project called *ted* someone made to educate themselves. That was [also](https://github.com/madnight/nano/blob/master/src/nano.c) a little complicated, but both seemed to use ncurses. So I wrote the following simple program, which *also* displays something and then restores the screen. Even though it’s very simple, it still works.
+
+```
+// Compile with: gcc -lncurses editor.c -o editor
+
+#include <curses.h>
+#include <stdio.h>
+
+int main(int argc, char **argv) {
+    initscr();
+
+    refresh();
+    printw("Hello world");
+    getch();
+
+    endwin();
+    return 0;
+}
+```
 
 Aha, so it’s something in ncurses, maybe. Let’s dive deeper.
 
 So *initscr()* presumably saves the state in some fashion. *endwin()* definitely restores it, because if we comment that out, the terminal stops being restored. Since *initscr()* probably does lots of other irrelevant logic, we could take a look at *endwin()* to dive in. But let’s do something even simpler first.
 
-As background, the linux command line is pretending to be an obsolete piece of hardware called a [terminal][6]. Specifically, it’s pretending to be a model called the DEC VT100 (or a later one, but they’re mostly backwards compatible). The terminal accepted text over a wire, and printed it to the screen.
+As background, the linux command line is pretending to be an obsolete piece of hardware called a [terminal](https://en.wikipedia.org/wiki/Computer_terminal). Specifically, it’s pretending to be a model called the DEC VT100 (or a later one, but they’re mostly backwards compatible). The terminal accepted text over a wire, and printed it to the screen.
 
 When it got special text, it would do special things. These are captured today as “escape codes”–special non-printable characters, which cause your software terminal to also do special things. What kind of special things? Well one example escape code is “Backspace”, which deletes the last character. Another code is “\\r\\n” (carriage return; new line), which goes to the beginning of the line, and down one.
 
 I suspect the answer to what’s happening with save and restore of my terminal might be some magic escape codes. So let’s just redirect the output to a file, and see what data is being center over the virtual wire to our virtual terminal.
 
-    $ ./editor >magic.txt
-    $ xxd < magic.txt
-    00000000: 1b28 421b 2930 1b5b 3f31 3034 3968 1b5b  .(B.)0.[?1049h.[
-    00000010: 313b 3530 721b 5b6d 0f1b 5b34 6c1b 5b48  1;50r.[m..[4l.[H
-    00000020: 1b5b 4a48 656c 6c6f 2077 6f72 6c64 6a1b  .[JHello worldj.
-    00000030: 5b35 303b 3148 1b5b 3f31 3034 396c 0d1b  [50;1H.[?1049l..
-    00000040: 5b3f 316c 1b3e                           [?1l.>
-    
+```
+$ ./editor >magic.txt
+$ xxd < magic.txt
+00000000: 1b28 421b 2930 1b5b 3f31 3034 3968 1b5b  .(B.)0.[?1049h.[
+00000010: 313b 3530 721b 5b6d 0f1b 5b34 6c1b 5b48  1;50r.[m..[4l.[H
+00000020: 1b5b 4a48 656c 6c6f 2077 6f72 6c64 6a1b  .[JHello worldj.
+00000030: 5b35 303b 3148 1b5b 3f31 3034 396c 0d1b  [50;1H.[?1049l..
+00000040: 5b3f 316c 1b3e                           [?1l.>
+```
 
 Well, that’s certainly a bunch of magic. Now something cool happens:
 
-    $ cat magic.txt
+```
+$ cat magic.txt
+```
 
 This command does *nothing visible*. It doesn’t print “Hello world”, even though that’s in the file. In other words, it’s printing Hello world, then really quick resetting the terminal. Just too fast for my poor human eyes to see.
 
@@ -76,86 +81,61 @@ One thing I immediately see in this file, is that it *doesn’t* seem to contain
 
 Okay, so somewhere in those 70 bytes is a magic code or two we want. Let’s examine all the bytes.
 
-What kinds of escape codes appear here? Hex **0x1b** is ESC, basically *the* escape sequence–it cues the terminal in that a special escape code is coming. **0x1b9b** ( **ESC** followed by **\[** )is the CSI escape code. [DEC private codes][7] refer to other escape sequences used by the DEC terminals like the VT00 (I’ll just shorten this to “DEC” below).
+What kinds of escape codes appear here? Hex **0x1b** is ESC, basically *the* escape sequence–it cues the terminal in that a special escape code is coming. **0x1b9b** ( **ESC** followed by **\[** )is the CSI escape code. [DEC private codes](https://en.wikipedia.org/wiki/VT100) refer to other escape sequences used by the DEC terminals like the VT00 (I’ll just shorten this to “DEC” below).
 
 Without further ado, let’s break down those 70 bytes. Apologies for any errors below–correct me in the comments.
 
 -   **0x1b** (B
-    -   Set first character set to US ASCII \[[xterm DEC guide][8]\]
+    -   Set first character set to US ASCII \[[xterm DEC guide](https://www.xfree86.org/current/ctlseqs.html)\]
 -   **0x1b** )0
-    -   Set second character set to “DEC Special Character and Line Drawing Set” \[[xterm DEC guide][9]\]
+    -   Set second character set to “DEC Special Character and Line Drawing Set” \[[xterm DEC guide](https://www.xfree86.org/current/ctlseqs.html)\]
 -   **0x1b9b** ?1049h
-    -   **Save cursor as in DECSC and use Alternate Screen Buffer, clearing it first.** \[[xterm CSI guide][10]\]
+    -   **Save cursor as in DECSC and use Alternate Screen Buffer, clearing it first.** \[[xterm CSI guide](https://www.xfree86.org/current/ctlseqs.html)\]
 -   ****0x1b**9b** 1;49r
-    -   DECSTBM: Set scrolling region to rows 1-49 \[[xterm CSI guide][11]\]  
+    -   DECSTBM: Set scrolling region to rows 1-49 \[[xterm CSI guide](https://www.xfree86.org/current/ctlseqs.html)\]  
         (When I ran the program, my terminal was 49 lines tall inside tmux–so the whole terminal in other words.)
 -   **0x1b9b** m
-    -   (Empty) color and style set comand \[[ANSI/CSI][12]\]  
+    -   (Empty) color and style set comand \[[ANSI/CSI](https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797)\]  
         I think this could be left out entirely.
 -   **0x0f (Ctrl-O)**
-    -   Shift In. Use the standard character set. \[[xterm][13]\]
+    -   Shift In. Use the standard character set. \[[xterm](https://www.xfree86.org/current/ctlseqs.html)\]
 -   **0x1b9b** 4l
-    -   RM: Replace Mode / IRM \[[xterm CSI guide][14]\]  
+    -   RM: Replace Mode / IRM \[[xterm CSI guide](https://www.xfree86.org/current/ctlseqs.html)\]  
         Typing doesn’t shift everything over, it writes over existing content.
 -   **0x1b9b** H
-    -   Move the cursor to “home” (top left of the screen) \[[ANSI/CSI][15]\]
+    -   Move the cursor to “home” (top left of the screen) \[[ANSI/CSI](https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797)\]
 -   **0x1b9b** J
-    -   Clear the screen \[[ANSI/CSI][16]\]
+    -   Clear the screen \[[ANSI/CSI](https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797)\]
 -   Hello worldj
     -   The program prints “Hello world”. The final j was echoed when I pressed “j” to exit.
 -   **0x1b9b** 49;1H
-    -   Move the cursor to line 49, column 1 — the bottom-left corner \[[ANSI/CSI][17]\]
+    -   Move the cursor to line 49, column 1 — the bottom-left corner \[[ANSI/CSI](https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797)\]
 -   **0x1b9b** ?1049l
-    -   **Use Normal Screen Buffer and restore cursor as in DECRC** \[[xterm CSI guide][18]\]
+    -   **Use Normal Screen Buffer and restore cursor as in DECRC** \[[xterm CSI guide](https://www.xfree86.org/current/ctlseqs.html)\]
 -   **0x0d (\\r or Ctrl-M)**
-    -   Carriage return \[[xterm][19]\]  
+    -   Carriage return \[[xterm](https://www.xfree86.org/current/ctlseqs.html)\]  
         Moves cursor to column 0
 -   ****0x1b**9b** ?1l
-    -   DECCKM reset: Re-enables the cursor? \[[VT100][20]\]
+    -   DECCKM reset: Re-enables the cursor? \[[VT100](https://vt100.net/docs/vt220-rm/chapter4.html#S4.6.18)\]
 -   **0x1b** \>
-    -   DECONM: Normal Keypad \[[xterm DEC guide][21], [VT100][22]\]
+    -   DECONM: Normal Keypad \[[xterm DEC guide](https://www.xfree86.org/current/ctlseqs.html), [VT100](https://vt100.net/docs/vt220-rm/chapter4.html#S4.6.18)\]
 
 OK, solved. The magic save bytes are **1b 9b 3f 31 30 34 39 68** (<ESC> \[?1049h). The magic restore bytes are **1b 9b 3f 31 30 34 39 6c** (<ESC> \[?1049l). And xterm or tmux is doing the save/restore magic, based on seeing this escape mode.
 
 Hmm, how minimal can we get a working file, I wonder?
 
-    #!/bin/sh
-    echo -ne '\x1b[?1049h' # Save terminal
-    echo -ne '\x1b[H'      # Home the cursor
-    echo "Hello world"
-    sleep 1
-    echo -ne '\x1b[?1049l' # Restore terminal
+```
+#!/bin/sh
+echo -ne '\x1b[?1049h' # Save terminal
+echo -ne '\x1b[H'      # Home the cursor
+echo "Hello world"
+sleep 1
+echo -ne '\x1b[?1049l' # Restore terminal
+```
 
 Yep. That works fine.
 
-ANSI: [https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797][23]  
-DEC: [https://vt100.net/emu/ctrlseq\_dec.html][24]  
-DEC: [https://vt100.net/docs/vt220-rm/chapter4.html#S4.6.18][25]  
-xterm’s control sequences: [https://www.xfree86.org/current/ctlseqs.html][26]
-
-[1]: https://blog.za3k.com/wp-content/uploads/2024/05/01-mystery.png
-[2]: https://blog.za3k.com/wp-content/uploads/2024/05/02-mystery.png
-[3]: https://blog.za3k.com/wp-content/uploads/2024/05/03-mystery.png
-[4]: https://github.com/madnight/nano/blob/master/src/nano.c
-[5]: https://github.com/madnight/nano/blob/master/src/nano.c
-[6]: https://en.wikipedia.org/wiki/Computer_terminal
-[7]: https://en.wikipedia.org/wiki/VT100
-[8]: https://www.xfree86.org/current/ctlseqs.html
-[9]: https://www.xfree86.org/current/ctlseqs.html
-[10]: https://www.xfree86.org/current/ctlseqs.html
-[11]: https://www.xfree86.org/current/ctlseqs.html
-[12]: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
-[13]: https://www.xfree86.org/current/ctlseqs.html
-[14]: https://www.xfree86.org/current/ctlseqs.html
-[15]: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
-[16]: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
-[17]: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
-[18]: https://www.xfree86.org/current/ctlseqs.html
-[19]: https://www.xfree86.org/current/ctlseqs.html
-[20]: https://vt100.net/docs/vt220-rm/chapter4.html#S4.6.18
-[21]: https://www.xfree86.org/current/ctlseqs.html
-[22]: https://vt100.net/docs/vt220-rm/chapter4.html#S4.6.18
-[23]: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
-[24]: https://vt100.net/emu/ctrlseq_dec.html
-[25]: https://vt100.net/docs/vt220-rm/chapter4.html#S4.6.18
-[26]: https://www.xfree86.org/current/ctlseqs.html
+ANSI: [https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797](https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797)  
+DEC: [https://vt100.net/emu/ctrlseq\_dec.html](https://vt100.net/emu/ctrlseq_dec.html)  
+DEC: [https://vt100.net/docs/vt220-rm/chapter4.html#S4.6.18](https://vt100.net/docs/vt220-rm/chapter4.html#S4.6.18)  
+xterm’s control sequences: [https://www.xfree86.org/current/ctlseqs.html](https://www.xfree86.org/current/ctlseqs.html)
index 4d112b8a7bd3a6671c86562ec54e2f38092cea34..fdeb52df17399f07562afde59958bb57c3993818 100644 (file)
@@ -15,6 +15,4 @@ updated: 2015-01-18 17:13:15-07:00
 wordpress_id: 101
 wordpress_slug: a-pixel-art
 ---
-[![A ninja turtle](https://blog.za3k.com/wp-content/uploads/2015/01/Screen-Shot-2015-01-13-at-11.12.20-AM.png)][1]
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/01/Screen-Shot-2015-01-13-at-11.12.20-AM.png
+[![A ninja turtle](https://blog.za3k.com/wp-content/uploads/2015/01/Screen-Shot-2015-01-13-at-11.12.20-AM.png)](https://blog.za3k.com/wp-content/uploads/2015/01/Screen-Shot-2015-01-13-at-11.12.20-AM.png)
index 49128f714a8e91f922bc7f174982b8155f2b2d4c..97b01f28bd05a82eb802e27f5f8aece8efd976af 100644 (file)
@@ -17,6 +17,4 @@ wordpress_slug: all-the-recipes
 ---
 I’ve crawled the largest english-language recipes sites, and parsed the results into JSON. Go do fun things with a database of 140,000 recipes!
 
-Not much to say here, just a link: [https://archive.org/details/recipes-en-201706][1]
-
-[1]: https://archive.org/details/recipes-en-201706
+Not much to say here, just a link: [https://archive.org/details/recipes-en-201706](https://archive.org/details/recipes-en-201706)
index efb3ffd866ea8bec67371febae6110f6cf2b5e5d..bdce2c68a9d95c873f72acbaefd2ff2bb69135b1 100644 (file)
@@ -13,8 +13,6 @@ updated: 2014-10-18 03:28:55-07:00
 wordpress_id: 7
 wordpress_slug: amazon-aws
 ---
-I was originally planning to write a rosetta-stone style guide for similar commands between digital ocean, google compute, and AWS. Instead, I spent all day writing this [CLI tool for EC2][1] which wraps the enormous and unintuitive AWS command-line tool. It’s not totally polished, namely you’ll have to hand-substitute some stuff at the top of the script that should properly go in a config file, but hopefully someone will find it useful.
+I was originally planning to write a rosetta-stone style guide for similar commands between digital ocean, google compute, and AWS. Instead, I spent all day writing this [CLI tool for EC2](https://github.com/vanceza/ec2-cli) which wraps the enormous and unintuitive AWS command-line tool. It’s not totally polished, namely you’ll have to hand-substitute some stuff at the top of the script that should properly go in a config file, but hopefully someone will find it useful.
 
 As a warning it terminates, not just stops, all amazon instances when asked.
-
-[1]: https://github.com/vanceza/ec2-cli
index e6926933d20648a6b41a78081f316e0b7fc3f5a8..8fa223e2de677a5e51defdb320891c44bc7c81d6 100644 (file)
@@ -16,28 +16,23 @@ updated: 2015-04-24 02:41:58-07:00
 wordpress_id: 63
 wordpress_slug: android-backup-on-arch-linux
 ---
-Edit: See [here][1] for an automatic version of the backup portion.
+Edit: See [here](https://blog.za3k.com/backup-android-on-plugin/ "Backup android on plugin") for an automatic version of the backup portion.
 
-Connecting android to Windows and Mac, pretty easy. On arch linux? Major pain. Here’s what I did, mostly via the help of the [arch wiki][2]:
+Connecting android to Windows and Mac, pretty easy. On arch linux? Major pain. Here’s what I did, mostly via the help of the [arch wiki](https://wiki.archlinux.org/index.php/MTP "arch wiki"):
 
 1.  Rooted my phone. Otherwise you can’t back up major parts of the file system (including text messages and most application data) \[EDIT: Actually, you can’t back these up over MTP even once you root your phone. Oops.\]
-2.  Installed [jmtpfs][3], a FUSE filesystem for mounting MTP, the new alternative to mount-as-storage on portable devices.
+2.  Installed [jmtpfs](https://aur.archlinux.org/packages/jmtpfs/ "jmtpfs"), a FUSE filesystem for mounting MTP, the new alternative to mount-as-storage on portable devices.
 3.  Enabled ‘user\_allow\_other’ in /etc/fuse.conf. I’m not sure if I **needed** to, but I did.
 4.  Plugged in the phone, and mounted the filesystem:
     
+    ```
     jmtpfs /media/android
+    ```
     
     The biggest pitfall I had was that if the phone’s screen is not unlocked at this point, mysterious failures will pop up later.
     
 5.  Synced the contents of the phone. For reasons I didn’t diagnose (I assume specific to FUSE), this actually fails as root:
     
-    rsync -aAXv --progress --fake-super --one-file-system /media/android --delete --delete-excluded "$SYNC\_DESTINATION"
-    
-
-1.  Pingback: [Backup android on plugin | Optimal Prime][4]
-    
-
-[1]: https://blog.za3k.com/backup-android-on-plugin/ "Backup android on plugin"
-[2]: https://wiki.archlinux.org/index.php/MTP "arch wiki"
-[3]: https://aur.archlinux.org/packages/jmtpfs/ "jmtpfs"
-[4]: https://blog.za3k.com/backup-android-on-plugin/
+    ```
+    rsync -aAXv --progress --fake-super --one-file-system /media/android --delete --delete-excluded "$SYNC_DESTINATION"
+    ```
index c222adc33a1d92539814341cc1ba3aa69a862c2e..5c8b7eb55e3689f78be0b270ae84f0e78d8a8524 100644 (file)
@@ -13,15 +13,8 @@ updated: 2023-04-23 16:32:02-07:00
 wordpress_id: 1011
 wordpress_slug: april-fools-puzzle-contest-solutions
 ---
-The April Fools Puzzle Contest is over. Congrats to the [winners][1].
+The April Fools Puzzle Contest is over. Congrats to the [winners](https://blog.ircpuzzles.org/2023/04/2023-april-fools-rankings/).
 
-I wrote up solutions for [2019][2], [2020][3], [2021][4], [2022][5], and [2023][6] (2023 not yet live).
+I wrote up solutions for [2019](https://blog.ircpuzzles.org/2023/04/2019-afpc-summary/), [2020](https://blog.ircpuzzles.org/2023/04/2020-afpc-summary/), [2021](https://blog.ircpuzzles.org/2023/04/2021-afpc-summary/), [2022](https://blog.ircpuzzles.org/2023/04/2022-afpc-summary/), and [2023](https://blog.ircpuzzles.org/category/solutions/) (2023 not yet live).
 
 Spoiler tags are available, so you see clues and incremental hints, if you missed the original contest and want to play one.
-
-[1]: https://blog.ircpuzzles.org/2023/04/2023-april-fools-rankings/
-[2]: https://blog.ircpuzzles.org/2023/04/2019-afpc-summary/
-[3]: https://blog.ircpuzzles.org/2023/04/2020-afpc-summary/
-[4]: https://blog.ircpuzzles.org/2023/04/2021-afpc-summary/
-[5]: https://blog.ircpuzzles.org/2023/04/2022-afpc-summary/
-[6]: https://blog.ircpuzzles.org/category/solutions/
index 48e1f9a952ca9f351b22c0a58a5fb83f1c489b91..4ef882d49966a2b613f011da5f87111ed34850ac 100644 (file)
@@ -13,12 +13,10 @@ updated: 2023-04-04 11:33:24-07:00
 wordpress_id: 1005
 wordpress_slug: april-fools-puzzle-contest
 ---
-See [https://blog.ircpuzzles.org/2023/04/2023-april-fools-live/][1] for how to play.
+See [https://blog.ircpuzzles.org/2023/04/2023-april-fools-live/](https://blog.ircpuzzles.org/2023/04/2023-april-fools-live/) for how to play.
 
 Every year, the libera IRC network has a puzzle contest starting on 04-01. (It’s not an april fools joke). It’s fun but quite difficult.
 
 This year I wrote about a third of the puzzles. Give them a try, either alone or as a team! It will be open indefinitely, but social activity will die off in a week or two.
 
 As of writing, no one has won (finished all the puzzles) just yet.
-
-[1]: https://blog.ircpuzzles.org/2023/04/2023-april-fools-live/
index ceb660ebd97278ccbe4f07bb03565e618577be5b..4e5c0d8e974d8dbbf5059d4c71a7fe568aa69e9c 100644 (file)
@@ -19,6 +19,7 @@ This one’s a quickie. Just a second of my config to record all bash commands t
 
 I do this in addition:
 
+```
 #~/.bash.d/eternal-history
 # don't put duplicate lines in the history
 HISTCONTROL=ignoredups
@@ -30,5 +31,6 @@ HISTFILESIZE=infinite
 # PID USER INDEX TIMESTAMP COMMAND
 export HISTTIMEFORMAT="%s "
 
-PROMPT\_COMMAND="${PROMPT\_COMMAND:+$PROMPT\_COMMAND ; }"'echo $$ $USER \\
-"$(history 1)" >> ~/.bash\_eternal\_history'
+PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"'echo $$ $USER \
+"$(history 1)" >> ~/.bash_eternal_history'
+```
index 424541062dd543709a5fd111bf71e6384c1ab9b9..f4e581034f860eab11d05131bf91bc2634dbbb96 100644 (file)
@@ -22,35 +22,45 @@ The end result is pretty slow for reasons I’m not totally sure of yet. It’s
 
 1.  Install the server
     
-    \# pip install warcproxy
+    ```
+    # pip install warcproxy
+    ```
     
 2.  Make a warcprox user to run the proxy as.
     
-    \# useradd -M --shell=/bin/false warcprox
+    ```
+    # useradd -M --shell=/bin/false warcprox
+    ```
     
 3.  Make a root certificate. You’re going to intercept HTTPS traffic by pretending to be the website, so if anyone gets ahold of this, they can fake being every website to you. Don’t give it out.
     
-    \# mkdir /etc/warcprox
+    ```
+    # mkdir /etc/warcprox
     # cd /etc/warcprox
     # sudo openssl genrsa -out ca.key 409
     # sudo openssl req -new -x509 -key ca.key -out ca.crt
     # cat ca.crt ca.key >ca.pem
     # chown root:warcprox ca.pem ca.key
     # chmod 640 ca.pem ca.key
+    ```
     
 4.  Set up a directory where you’re going to store the WARC files. You’re saving all web traffic, so this will get pretty big.
     
-    \# mkdir /var/warcprox
+    ```
+    # mkdir /var/warcprox
     # chown -R warcprox:warcprox /var/warcprox
+    ```
     
 5.  Set up a boot script for warcproxy. Here’s mine. I’m using supervisorctl rather than systemd.
     
+    ```
     #/etc/supervisor.d/warcprox.ini
-    \[program:warcprox\]
+    [program:warcprox]
     command=/usr/bin/warcprox -p 18000 -c /etc/warcprox/ca.pem --certs-dir ./generated-certs -g sha1
     directory=/var/warcprox
     user=warcprox
     autostart=true
     autorestart=unexpected
+    ```
     
 6.  Set up any browers, etc to use localhost:18000 as your proxy. You could also do some kind of global firewall config. Chromium in particular was pretty irritating on Arch Linux. It doesn’t respect $http\_proxy, so you have to pass it separate options. This is also a good point to make sure anything you don’t want recorded BYPASSES the proxy (for example, maybe large things like youtube, etc).
index 689911fe898a49764a82ee2c4a8120e29582e0fc..6ca1ecc7645cd9484d85734f1eb1614800c6b176 100644 (file)
@@ -15,7 +15,7 @@ updated: 2014-11-22 09:47:39-07:00
 wordpress_id: 41
 wordpress_slug: archiving-github
 ---
-[GitHub-Backup][1] is a small project to archive github repos to a local computer. It advertises that one reason to use it is
+[GitHub-Backup](https://github.com/clockfort/GitHub-Backup "GitHub-Backup") is a small project to archive github repos to a local computer. It advertises that one reason to use it is
 
 > You are paranoid tinfoil-hat wearer who needs to back up everything in triplicate on a variety of outdated tape media.
 
@@ -23,21 +23,24 @@ which describes why I was searching it out perfectly.
 
 I made a new account on my server (github) and cloned their repo.
 
+```
 sudo useradd -m github
 sudo -i- u github
 git clone git@github.com:clockfort/GitHub-Backup.git
+```
 
 Despite being semi-unmaintained, everything mostly works still. There were two exceptions–some major design problems around private repos. I only need to back up my public repos really, so I ‘solved’ this by issuing an Oauth token that only knows about public repos. And second, a small patch to work around a bug with User objects in the underlying Github egg:
 
--       os.system("git config --local gitweb.owner %s"%(shell\_escape("%s <%s>"%(repo.user.name, repo.user.email.encode("utf-8"))),))
+```
+-       os.system("git config --local gitweb.owner %s"%(shell_escape("%s <%s>"%(repo.user.name, repo.user.email.encode("utf-8"))),))
 +       if hasattr(repo.user, 'email') and repo.user.email:
-+               os.system("git config --local gitweb.owner %s"%(shell\_escape("%s <%s>"%(repo.user.name, repo.user.email.encode("utf-8"))),))
++               os.system("git config --local gitweb.owner %s"%(shell_escape("%s <%s>"%(repo.user.name, repo.user.email.encode("utf-8"))),))
+```
 
 Then I just shoved everything into a cron task and we’re good to go.
 
+```
 @hourly GitHub-Backup/github-backup.py -m -t  vanceza /home/github/vanceza
+```
 
-Edit: There’s a similar project for bitbucket I haven’t tried out: [https://bitbucket.org/fboender/bbcloner][2]
-
-[1]: https://github.com/clockfort/GitHub-Backup "GitHub-Backup"
-[2]: https://bitbucket.org/fboender/bbcloner
+Edit: There’s a similar project for bitbucket I haven’t tried out: [https://bitbucket.org/fboender/bbcloner](https://bitbucket.org/fboender/bbcloner)
index 7546e9805111e9a9f7bad59fc61ed68924964ece..33f3afa15121686eac6af9c86830e2b87a8fd634 100644 (file)
@@ -14,13 +14,12 @@ updated: 2014-11-23 13:14:46-07:00
 wordpress_id: 59
 wordpress_slug: archiving-gmail
 ---
-I set up an automatic archiver for gmail, using the special-purpose tool [gm-vault][1]. It was fairly straightforward, no tutorial here. The daily sync:
+I set up an automatic archiver for gmail, using the special-purpose tool [gm-vault](http://gmvault.org/). It was fairly straightforward, no tutorial here. The daily sync:
 
+```
 @daily cd ~gmail && cronic gmvault sync -d "/home/gmail/vanceza@gmail.com" vanceza@gmail.com
+```
 
 I’m specifying a backup folder here (-d) so I can easily support multiple accounts, one per line.
 
-[Cronic][2] is a tool designed to make cron’s default email behavior better, so I get emailed only on actual backup failures.
-
-[1]: http://gmvault.org/
-[2]: http://habilis.net/cronic/ "Cronic"
+[Cronic](http://habilis.net/cronic/ "Cronic") is a tool designed to make cron’s default email behavior better, so I get emailed only on actual backup failures.
index 184fd3e32595d489db29801c6507b9e666e7e45a..8267dca3a157f71f516555b656af5ce799d57f2b 100644 (file)
@@ -19,15 +19,17 @@ Install jq and youtube-dl
 
 Get a list of the last 100 URLs:
 
-curl https://api.twitch.tv/kraken/channels/${TWITCH\_USER}/videos?broadcasts=true&limit=100 | 
-  jq -r '.videos\[\].url' > past\_broadcasts.txt
+```
+curl https://api.twitch.tv/kraken/channels/${TWITCH_USER}/videos?broadcasts=true&limit=100 | 
+  jq -r '.videos[].url' > past_broadcasts.txt
+```
 
 Save them locally:
 
-youtube-dl -a past\_broadcasts.txt -o "%(upload\_date)s.%(title)s.%(id)s.%(ext)s"
+```
+youtube-dl -a past_broadcasts.txt -o "%(upload_date)s.%(title)s.%(id)s.%(ext)s"
+```
 
 Did it. youtube-dl is smart enough to avoid re-downloading videos it already has, so as long as you run this often enough (I do daily), you should avoid losing videos before they’re deleted.
 
-Thanks [jrayhawk][1] for the API info.
-
-[1]: http://www.omgwallhack.org/home/jrayhawk/
+Thanks [jrayhawk](http://www.omgwallhack.org/home/jrayhawk/) for the API info.
index 5807266cf486d726455154b33298c3ea404e6771..df069b3d4235794eb5906a3eb871c9b7f66a3be4 100644 (file)
@@ -16,27 +16,19 @@ updated: 2014-11-24 13:12:44-07:00
 wordpress_id: 61
 wordpress_slug: archiving-twitter
 ---
-([Output][1])
+([Output](https://za3k.com/~twitter_archive/))
 
 I wanted to archive twitter so that I could
 
 1.  Make sure old content was easily available
 2.  Read twitter in a one-per-line format without ever logging into the site
 
-[twitter\_ebooks][2] is a framework to make twitter bots, but it includes an ‘archive’ component to fetch historical account content which is apparently unique in that it 1) works with current TLS and 2) works the current twitter API. It stores the tweets in a JSON format which presumably matches the API return values. Usage is simple:
+[twitter\_ebooks](https://github.com/mispy/twitter_ebooks) is a framework to make twitter bots, but it includes an ‘archive’ component to fetch historical account content which is apparently unique in that it 1) works with current TLS and 2) works the current twitter API. It stores the tweets in a JSON format which presumably matches the API return values. Usage is simple:
 
 while read account
 do
-    [ebooks][3] archive "${account}" "archive/${account}.json"
-    [jq][4] -r 'reverse | .\[\] | "\\(.created\_at|@sh)\\t \\(.text|@sh)"' "archive/${account}.json" >"archive/${account}.txt"
+    [ebooks](https://github.com/mispy/twitter_ebooks) archive "${account}" "archive/${account}.json"
+    [jq](http://stedolan.github.io/jq/) -r 'reverse | .\[\] | "\\(.created\_at|@sh)\\t \\(.text|@sh)"' "archive/${account}.json" >"archive/${account}.txt"
 done <accounts.txt
 
-I ran into a bug with [upstream incompatibilities][5] which is easily fixed. Another caveat is that the twitter API only allows access 3200 tweets back in time for an account–all the more reason to set up archiving ASAP. Twitter’s rate-limiting is also extreme ([15-180 req/15 min][6]), and I’m [worried about][7] a problem where my naive script can’t make it through a list of more than 15 accounts even with no updates.
-
-[1]: https://za3k.com/~twitter_archive/
-[2]: https://github.com/mispy/twitter_ebooks
-[3]: https://github.com/mispy/twitter_ebooks
-[4]: http://stedolan.github.io/jq/
-[5]: https://github.com/mispy/twitter_ebooks/issues/34
-[6]: https://dev.twitter.com/rest/public/rate-limiting
-[7]: https://github.com/mispy/twitter_ebooks/issues/37
+I ran into a bug with [upstream incompatibilities](https://github.com/mispy/twitter_ebooks/issues/34) which is easily fixed. Another caveat is that the twitter API only allows access 3200 tweets back in time for an account–all the more reason to set up archiving ASAP. Twitter’s rate-limiting is also extreme ([15-180 req/15 min](https://dev.twitter.com/rest/public/rate-limiting)), and I’m [worried about](https://github.com/mispy/twitter_ebooks/issues/37) a problem where my naive script can’t make it through a list of more than 15 accounts even with no updates.
index 17d32086af6b2a9588ae2bc8e10e7445b505d6ce..43bbf07d8787cef8d308c6bf400161df580a55d1 100644 (file)
@@ -14,9 +14,6 @@ updated: 2022-07-06 11:26:32-07:00
 wordpress_id: 743
 wordpress_slug: articles-section
 ---
-I added an [articles section][1] to my website with all blog posts up until now.
+I added an [articles section](https://za3k.com/blog) to my website with all blog posts up until now.
 
-I also fixed the very, very old [archived blog][2] from 2014.
-
-[1]: https://za3k.com/blog
-[2]: https://za3k.com/archive/wordpress/
+I also fixed the very, very old [archived blog](https://za3k.com/archive/wordpress/) from 2014.
index 1f3499a4db076fe5c1c901ad2afa0b37bcbee714..6ea545b63c35923c18422fef7ccd730027721f3a 100644 (file)
@@ -15,7 +15,7 @@ updated: 2015-04-24 02:29:05-07:00
 wordpress_id: 177
 wordpress_slug: backup-android-on-plugin
 ---
-In a [previous post][1] I discussed how to backup android with rsync. In this post, I’ll improve on that solution so it happens when you plug the phone in, rather than manually. My solution happens to know I have only one phone; you should adjust accordingly.
+In a [previous post](https://blog.za3k.com/android-backup-on-arch-linux/ "Android backup on arch linux") I discussed how to backup android with rsync. In this post, I’ll improve on that solution so it happens when you plug the phone in, rather than manually. My solution happens to know I have only one phone; you should adjust accordingly.
 
 The process is
 
@@ -26,15 +26,18 @@ The process is
 
 First, let’s add a udev rule to auto-mount the phone when it’s plugged in and unlocked, and run appropriate scripts.
 
-\# 10-android.rules
+```
+# 10-android.rules
 ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0660", GROUP="plugdev", SYMLINK+="android", RUN+="/usr/local/bin/android-connected"
-ACTION=="remove", SUBSYSTEM=="usb", ENV{ID\_MODEL}=="Nexus\_4", RUN+="/usr/local/bin/android-disconnected"
+ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_MODEL}=="Nexus_4", RUN+="/usr/local/bin/android-disconnected"
+```
 
 Next, we’ll add android-connected and android-disconnected
 
+```
 #!/bin/bash
 # /usr/local/bin/android-connected
-if \[\[ "$1" != "-f" \]\]
+if [[ "$1" != "-f" ]]
 then
  echo "/usr/local/bin/android-connected -f" | /usr/bin/at now
  exit 0
@@ -45,42 +48,40 @@ sudo -u zachary /usr/local/bin/android-mountfs
 sudo -u zachary DISPLAY=:0 /usr/bin/notify-send "Mounted, backing up..."
 /usr/bin/flock /var/lock/phone-backup.pid sudo -u zachary /usr/local/bin/phone-backup-xenu
 sudo -u zachary DISPLAY=:0 /usr/bin/notify-send "Backup completed."
+```
 
-\# !/bin/sh
+```
+# !/bin/sh
 # /usr/local/bin/android-disconnected
 #!/bin/sh
 sudo -u zachary DISPLAY=:0 /usr/bin/notify-send "Android unplugged."
 sudo -u zachary /usr/local/bin/android-umountfs
+```
 
 We’ll add something to mount and unmount the system. Keeping in mind that mounting only works when the screen is unlocked we’ll put that in a loop that checks if the mount worked:
 
+```
 #!/bin/sh
 # /usr/local/bin/android-mountfs
 
-android\_locked()
+android_locked()
 {
 ls /media/android 2>/dev/null >/dev/null
-\[ "$?" -eq 2 \]
+[ "$?" -eq 2 ]
 }
 
 jmtpfs /media/android # mount
-while android\_locked; do
+while android_locked; do
   fusermount -u /media/android
   sleep 3
   jmtpfs /media/android # mount
 done
+```
 
+```
 #!/bin/sh
 # /usr/local/bin/android-umountfs
 fusermount -u /media/android
+```
 
 The contents of  /usr/local/bin/phone-backup are pretty me-specific so I’ll omit it, but it copies /media/android over to a server. (fun detail: MTP doesn’t show all information even on a rooted phone, so there’s more work to do)
-
-1.  Pingback: [Android backup on arch linux | Optimal Prime][2]
-    
-2.  Pingback: [Year in Review | Optimal Prime][3]
-    
-
-[1]: https://blog.za3k.com/android-backup-on-arch-linux/ "Android backup on arch linux"
-[2]: https://blog.za3k.com/android-backup-on-arch-linux/
-[3]: https://blog.za3k.com/year-in-review/
index 949dbcb539751d934e26f8adde08cdc8338a9d5c..91c8bf68746ffa26da3ab3982709ddc2ce643e9d 100644 (file)
@@ -15,15 +15,15 @@ wordpress_slug: banh-chung
 ---
 A few friends and I first experienced this traditional Vietnamese Tết (Lunar New Year) food while visiting years ago. We loved it, and recently I looked up how to make it myself. It’s not a well known food in the US, so I thought it would still be fun to share.
 
-I followed the recipe from “[Enjoy a simple life][1]“, but made a homemade cardboard mold as suggested by “[Takes Two Eggs][2]“.
+I followed the recipe from “[Enjoy a simple life](https://enjoyasimplelife.blogspot.com/2012/01/vegetarian-sticky-rice-banh-chung-chay.html)“, but made a homemade cardboard mold as suggested by “[Takes Two Eggs](https://takestwoeggs.com/banh-chung/)“.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/02/fork-crop-1024x808.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2024/02/fork-crop-1024x808.jpg)](https://blog.za3k.com/wp-content/uploads/2024/02/fork-crop.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/02/foil-crop-1024x826.jpg)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2024/02/foil-crop-1024x826.jpg)](https://blog.za3k.com/wp-content/uploads/2024/02/foil-crop.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/02/leaves-crop-1004x1024.jpg)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2024/02/leaves-crop-1004x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2024/02/leaves-crop.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/02/unwrapped-crop-1024x851.jpg)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2024/02/unwrapped-crop-1024x851.jpg)](https://blog.za3k.com/wp-content/uploads/2024/02/unwrapped-crop.jpg)
 
 Like a bread, this recipe takes a fair bit of time. I would start in the morning.
 
@@ -77,14 +77,5 @@ They last weeks and stay pretty tasty. You can freeze them if you want them to l
 
 Sources:
 
-1.  [https://enjoyasimplelife.blogspot.com/2012/01/vegetarian-sticky-rice-banh-chung-chay.html][7]
-2.  [https://takestwoeggs.com/banh-chung/][8]
-
-[1]: https://enjoyasimplelife.blogspot.com/2012/01/vegetarian-sticky-rice-banh-chung-chay.html
-[2]: https://takestwoeggs.com/banh-chung/
-[3]: https://blog.za3k.com/wp-content/uploads/2024/02/fork-crop.jpg
-[4]: https://blog.za3k.com/wp-content/uploads/2024/02/foil-crop.jpg
-[5]: https://blog.za3k.com/wp-content/uploads/2024/02/leaves-crop.jpg
-[6]: https://blog.za3k.com/wp-content/uploads/2024/02/unwrapped-crop.jpg
-[7]: https://enjoyasimplelife.blogspot.com/2012/01/vegetarian-sticky-rice-banh-chung-chay.html
-[8]: https://takestwoeggs.com/banh-chung/
+1.  [https://enjoyasimplelife.blogspot.com/2012/01/vegetarian-sticky-rice-banh-chung-chay.html](https://enjoyasimplelife.blogspot.com/2012/01/vegetarian-sticky-rice-banh-chung-chay.html)
+2.  [https://takestwoeggs.com/banh-chung/](https://takestwoeggs.com/banh-chung/)
index 4811ecfb68d64ffbf0d8f2385cc8cea57a012b8d..22f3d285f2666f392af54a15eacab0eafc192235 100644 (file)
@@ -16,31 +16,24 @@ updated: 2017-07-24 12:58:32-07:00
 wordpress_id: 430
 wordpress_slug: blast-furance
 ---
-We made a blast furnace, following David Gingery’s [The Charcoal Foundry][1]. Here are some pictures of the firing process. We haven’t melted or cast any metal yet.
+We made a blast furnace, following David Gingery’s [The Charcoal Foundry](https://www.amazon.com/Charcoal-Foundry-Build-Metal-Working/dp/1878087002). Here are some pictures of the firing process. We haven’t melted or cast any metal yet.
 
-[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-initial-burn.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-initial-burn.jpg)](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-initial-burn.jpg)
 
 Slow initial burn to drive out most of the water
 
-[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-blast.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-blast.jpg)](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-blast.jpg)
 
 Blast furnace in action to completely dry it
 
-[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-fan.jpg)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-fan.jpg)](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-fan.jpg)
 
 You can tell we’re trained professionals by the fan setup
 
-[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-grill.jpg)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-grill.jpg)](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-grill.jpg)
 
 Blast furnace meat is best meat
 
-[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-richard.jpg)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-richard.jpg)](https://blog.za3k.com/wp-content/uploads/2017/07/furnace-richard.jpg)
 
 Richard looking dubiously at the furnace
-
-[1]: https://www.amazon.com/Charcoal-Foundry-Build-Metal-Working/dp/1878087002
-[2]: https://blog.za3k.com/wp-content/uploads/2017/07/furnace-initial-burn.jpg
-[3]: https://blog.za3k.com/wp-content/uploads/2017/07/furnace-blast.jpg
-[4]: https://blog.za3k.com/wp-content/uploads/2017/07/furnace-fan.jpg
-[5]: https://blog.za3k.com/wp-content/uploads/2017/07/furnace-grill.jpg
-[6]: https://blog.za3k.com/wp-content/uploads/2017/07/furnace-richard.jpg
index afb17462c2cbdbf72ae2727f600ef6cda41883bc..b331baf5159dee1647217d8a88aad1e48a6f4c8c 100644 (file)
@@ -16,7 +16,7 @@ wordpress_slug: blueprint-maker-13-complete
 ---
 More followup for my house blueprint maker. The project is now done.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/12/2023-12-18-194312_1920x1080_scrot-crop.png)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2023/12/2023-12-18-194312_1920x1080_scrot-crop.png)](https://za3k.github.io/ha3k-13-blueprint/)
 
 New features include:
 
@@ -26,8 +26,4 @@ New features include:
 -   Move and Delete text and icons
 -   Share your finished project with a link
 
-See the demo [here][2]. The source code is [on github][3].
-
-[1]: https://za3k.github.io/ha3k-13-blueprint/
-[2]: https://za3k.github.io/ha3k-13-blueprint/
-[3]: https://github.com/za3k/ha3k-13-blueprint
+See the demo [here](https://za3k.github.io/ha3k-13-blueprint/). The source code is [on github](https://github.com/za3k/ha3k-13-blueprint).
index 3922c4ef4e1a3902d1a84d5757f79a3d42e8ace0..bb2a160dcb7c77d3ab881c1a18d573c0494055e4 100644 (file)
@@ -15,20 +15,16 @@ wordpress_slug: board-game-travel-kit
 ---
 I condensed some of card games into one box:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/08/cards_open-1024x710.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2023/08/cards_open-1024x710.jpg)](https://blog.za3k.com/wp-content/uploads/2023/08/cards_open-scaled.jpg)
 
 Left to right: Doomlings, Star Realms, The Mind, Chrononauts, FitzIt, Are you the traitor?, Are you a werewolf?, Hanabi, Set, Icehouse/Zendo rules, regular playing cards
 
 I’ve noticed that board game boxes tend to be a little big. I combined five into one box:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/08/box_open-1024x834.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/08/box_open-1024x834.jpg)](https://blog.za3k.com/wp-content/uploads/2023/08/box_open-scaled.jpg)
 
 Azul, Settlers of Catan, Clank, Concept, Nuclear War
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/08/both_closed-1024x843.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/08/both_closed-1024x843.jpg)](https://blog.za3k.com/wp-content/uploads/2023/08/both_closed.jpg)
 
 This is “portable” if you have a car trunk, maybe! It’s heavy as heck.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2023/08/cards_open-scaled.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2023/08/box_open-scaled.jpg
-[3]: https://blog.za3k.com/wp-content/uploads/2023/08/both_closed.jpg
index 964adf19942c3e874488025a855eae7737687569..cd4b85622c2a9924e24c4691acca94d22d25a91a 100644 (file)
@@ -16,7 +16,7 @@ wordpress_slug: capturing-video-on-debian-linux-with-the-blackmagic-intensity-pr
 ---
 Most of this should apply for any linux system, other than the driver install step. Also, I believe most of it applies to DeckLink and Intensity cards as well.
 
-My main source is [https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f71463][1]. I’ve re-written for clarity and Debian.
+My main source is [https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f71463](https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f71463). I’ve re-written for clarity and Debian.
 
 1.  Set up hardware. On the Intensity Pro 4K, I see a black screen on my TV when things are set up correctly (a clear rectangle, not just nothing).
 2.  From the Blackmagic site, download “Desktop Video SDK” version 10.11.4 (not the latest). Get the matching “Desktop Video” software for Linux.
@@ -41,30 +41,31 @@ My main source is [https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f714
       
     `ffmpeg -f decklink -list_formats 1 -i 'Intensity Pro 4K'` shows supported formats. Here’s what I see for the Intensity Pro 4K:
 
-    [decklink @ 0x561bd9881800] Supported formats for 'Intensity Pro 4K':
-            format_code     description
-            ntsc            720x486 at 30000/1001 fps (interlaced, lower field first)
-            pal             720x576 at 25000/1000 fps (interlaced, upper field first)
-            23ps            1920x1080 at 24000/1001 fps
-            24ps            1920x1080 at 24000/1000 fps
-            Hp25            1920x1080 at 25000/1000 fps
-            Hp29            1920x1080 at 30000/1001 fps
-            Hp30            1920x1080 at 30000/1000 fps
-            Hp50            1920x1080 at 50000/1000 fps
-            Hp59            1920x1080 at 60000/1001 fps
-            Hp60            1920x1080 at 60000/1000 fps
-            Hi50            1920x1080 at 25000/1000 fps (interlaced, upper field first)
-            Hi59            1920x1080 at 30000/1001 fps (interlaced, upper field first)
-            Hi60            1920x1080 at 30000/1000 fps (interlaced, upper field first)
-            hp50            1280x720 at 50000/1000 fps
-            hp59            1280x720 at 60000/1001 fps
-            hp60            1280x720 at 60000/1000 fps
-            4k23            3840x2160 at 24000/1001 fps
-            4k24            3840x2160 at 24000/1000 fps
-            4k25            3840x2160 at 25000/1000 fps
-            4k29            3840x2160 at 30000/1001 fps
-            4k30            3840x2160 at 30000/1000 fps
-    
+```
+[decklink @ 0x561bd9881800] Supported formats for 'Intensity Pro 4K':
+        format_code     description
+        ntsc            720x486 at 30000/1001 fps (interlaced, lower field first)
+        pal             720x576 at 25000/1000 fps (interlaced, upper field first)
+        23ps            1920x1080 at 24000/1001 fps
+        24ps            1920x1080 at 24000/1000 fps
+        Hp25            1920x1080 at 25000/1000 fps
+        Hp29            1920x1080 at 30000/1001 fps
+        Hp30            1920x1080 at 30000/1000 fps
+        Hp50            1920x1080 at 50000/1000 fps
+        Hp59            1920x1080 at 60000/1001 fps
+        Hp60            1920x1080 at 60000/1000 fps
+        Hi50            1920x1080 at 25000/1000 fps (interlaced, upper field first)
+        Hi59            1920x1080 at 30000/1001 fps (interlaced, upper field first)
+        Hi60            1920x1080 at 30000/1000 fps (interlaced, upper field first)
+        hp50            1280x720 at 50000/1000 fps
+        hp59            1280x720 at 60000/1001 fps
+        hp60            1280x720 at 60000/1000 fps
+        4k23            3840x2160 at 24000/1001 fps
+        4k24            3840x2160 at 24000/1000 fps
+        4k25            3840x2160 at 25000/1000 fps
+        4k29            3840x2160 at 30000/1001 fps
+        4k30            3840x2160 at 30000/1000 fps
+```
 
 Capture some video: `ffmpeg -raw_format argb -format_code Hp60 -f decklink -i 'Intensity Pro 4K' test.avi`
 
@@ -79,9 +80,5 @@ Troubleshooting
 
 Sources:
 
--   [https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f71463][2]
--   [https://ffmpeg.org/ffmpeg-devices.html#decklink][3]
-
-[1]: https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f71463
-[2]: https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f71463
-[3]: https://ffmpeg.org/ffmpeg-devices.html#decklink
+-   [https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f71463](https://gist.github.com/afriza/879fed4ede539a5a6501e0f046f71463)
+-   [https://ffmpeg.org/ffmpeg-devices.html#decklink](https://ffmpeg.org/ffmpeg-devices.html#decklink)
index 84fbd76ba1d55125ab29140f51fecf9e87162881..137638413ac7f7b98bdd643f6ffa86aaebe3d759 100644 (file)
@@ -18,10 +18,8 @@ wordpress_slug: cardboard-mail-holders
 ---
 Our house has seven people, so today I made some mail holders to put on our doors.
 
-[![cardboard_near0.5](https://blog.za3k.com/wp-content/uploads/2015/09/cardboard_near0.5-1024x768.jpg)][1]
+[![cardboard_near0.5](https://blog.za3k.com/wp-content/uploads/2015/09/cardboard_near0.5-1024x768.jpg)](https://blog.za3k.com/wp-content/uploads/2015/09/cardboard_near0.5.jpg)
 
 I basically had some long cardboard boxes, and cut them in half. Then I added new ends and separators in the middle.
 
 I’m not sure if they’ll actually get used. Mail on the floor looks bad, but these aren’t that hot either. If you make some and want to improve the look, you can cover everything in paper or cardstock.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/09/cardboard_near0.5.jpg
index a38fef89659751f7b15555c0ac5dde84529b1591..7b60335e8ff87f9b5365a88fcce4695c23fbb818 100644 (file)
@@ -16,6 +16,7 @@ wordpress_slug: configuring-mailxs-mailrc-with-gmail
 ---
 Here’s how I added gmail to .mailrc for the BSD program mailx, provided by the *s-nail* package in arch.
 
+```
 account gmail {
   set folder=imaps://example@gmail.com@imap.gmail.com
   set password-example@gmail.com@imap.gmail.com="PASS"
@@ -26,6 +27,7 @@ account gmail {
   set smtp-auth-password="PASS"
   set from="John Smith <example@gmail.com>"
 }
+```
 
 Replace **PASS** with your actual password, and **example@gmail.com** with your actual email. Read the documentation if you want to avoid plaintext passwords.
 
index 06c62070f83d4a7d4a1892f2b85042f61f05244c..d3d007e62d574e0420ede0aca75707665d98444b 100644 (file)
@@ -14,21 +14,22 @@ updated: 2015-11-29 23:04:07-07:00
 wordpress_id: 313
 wordpress_slug: controlling-a-computercraft-turtle-remotely
 ---
-[![Screen Shot 2015-10-18 at 7.16.59 PM](https://blog.za3k.com/wp-content/uploads/2015/10/Screen-Shot-2015-10-18-at-7.16.59-PM-1024x582.png)][1][![Screen Shot 2015-10-18 at 7.17.30 PM](https://blog.za3k.com/wp-content/uploads/2015/10/Screen-Shot-2015-10-18-at-7.17.30-PM-300x197.png)][2]
+[![Screen Shot 2015-10-18 at 7.16.59 PM](https://blog.za3k.com/wp-content/uploads/2015/10/Screen-Shot-2015-10-18-at-7.16.59-PM-1024x582.png)](https://blog.za3k.com/wp-content/uploads/2015/10/Screen-Shot-2015-10-18-at-7.16.59-PM.png)[![Screen Shot 2015-10-18 at 7.17.30 PM](https://blog.za3k.com/wp-content/uploads/2015/10/Screen-Shot-2015-10-18-at-7.17.30-PM-300x197.png)](https://blog.za3k.com/wp-content/uploads/2015/10/Screen-Shot-2015-10-18-at-7.17.30-PM.png)
 
-1.  Install Redis: [https://www.digitalocean.com/community/tutorials/how-to-install-and-use-redis][3]
+1.  Install Redis: [https://www.digitalocean.com/community/tutorials/how-to-install-and-use-redis](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-redis)
 2.  Install [Webdis  
-    ][4]
+    ](https://github.com/nicolasff/webdis)
 3.  Start a minecraft server with computercraft. You will need to have the http API enabled, which is the default.
-4.  Put down a turtle I recommend a turtle with a crafting square and a pickaxe. I also recommend giving it a label. If you’re not trying the [turtle replication challenge][5], either disable fuel or get a fair bit of starting fuel. Write down the computer’s id.
+4.  Put down a turtle I recommend a turtle with a crafting square and a pickaxe. I also recommend giving it a label. If you’re not trying the [turtle replication challenge](http://www.computercraft.info/forums2/index.php?/topic/4462-competition/), either disable fuel or get a fair bit of starting fuel. Write down the computer’s id.
 5.  Put down a chunk loader, if you’re in a modpack that has them, or DON’T log out. Computers and turtles can’t operate unless the chunks are loaded. If you’re putting down a chunkloader, I surrounded them with bedrock for foolproofing.
 6.  Open the turtle and download the following script, changing “redis.example.com” to your own redis instance: pastebin get 8FjggG9w startup  
     After you have the script saved as ‘startup’, run it or reboot the computer, and it should start listening for instructions.
     
+    ```
     redis = "http://redis.example.com" 
     queue = "sshbot" .. os.getComputerID()
-    return\_queue = queue .. "\_return"
-    print("Remote webdis queues on icyego: " .. queue .. " and " .. return\_queue)
+    return_queue = queue .. "_return"
+    print("Remote webdis queues on icyego: " .. queue .. " and " .. return_queue)
     print("Receiving remote commands.")
     
     function exec(str)
@@ -64,12 +65,14 @@ wordpress_slug: controlling-a-computercraft-turtle-remotely
           result2 = exec("return " .. str)
           if string.find(result2, "Error: ") then a=0 else result=result2 end
         end
-        http.post(redis, "LPUSH/" .. return\_queue .. "/" .. result)
+        http.post(redis, "LPUSH/" .. return_queue .. "/" .. result)
       end
     end
+    ```
     
 7.  On your local machine, save the following, again replacing “redis.example.com”:
     
+    ```
     #!/bin/bash
     function send() {
       curl -s -X POST -d "LPUSH/sshbot${1}/${2}" "http://redis.example.com" >/dev/null
@@ -77,11 +80,11 @@ wordpress_slug: controlling-a-computercraft-turtle-remotely
     }
     
     function get() {
-      curl -s -X GET "http://redis.example.com/BRPOP/sshbot${1}\_return/20.json" | jq .BRPOP\[1\]
+      curl -s -X GET "http://redis.example.com/BRPOP/sshbot${1}_return/20.json" | jq .BRPOP[1]
     }
     
-    if \[ $# -ne 1 \]; then
-      echo "Usage: rlwrap ./sshbot <COMPUTER\_ID>"
+    if [ $# -ne 1 ]; then
+      echo "Usage: rlwrap ./sshbot <COMPUTER_ID>"
       exit 1
     fi
     ID=$1
@@ -90,23 +93,6 @@ wordpress_slug: controlling-a-computercraft-turtle-remotely
       send ${ID} "$LINE"
       get ${ID}
     done
+    ```
     
 8.  Run: rlwrap ./sshbot <ID>, where <ID> is the turtle’s ID. You should be able to send commands to the computer now.
-
-1.  ![](https://secure.gravatar.com/avatar/b7fcc830b8a111f098fb64bdd96eedf2?s=40&d=mm&r=g)[Alex Booth][6] says:
-    
-    [April 25, 2018 at 9:27 am][7]
-    
-    Opening up ComputerCraft to the world using the http commands was an amazing idea from the developers!
-    
-    [Reply][8]
-    
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/10/Screen-Shot-2015-10-18-at-7.16.59-PM.png
-[2]: https://blog.za3k.com/wp-content/uploads/2015/10/Screen-Shot-2015-10-18-at-7.17.30-PM.png
-[3]: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-redis
-[4]: https://github.com/nicolasff/webdis
-[5]: http://www.computercraft.info/forums2/index.php?/topic/4462-competition/
-[6]: https://comparegamehosting.com/game/minecraft/
-[7]: https://blog.za3k.com/controlling-a-computercraft-turtle-remotely/#comment-3128
-[8]: https://blog.za3k.com/controlling-a-computercraft-turtle-remotely/?replytocom=3128#respond
index 2cb04ce4ee7ab8881e2a4b6d43ffdc2015c8c6b3..6bdfa4b71984979f052db1af991012de4a9d6aff 100644 (file)
@@ -15,7 +15,7 @@ updated: 2021-06-05 15:40:30-07:00
 wordpress_id: 525
 wordpress_slug: cookbook
 ---
-I filled up my paper notebook I use to keep recipes. I typed it up and edited it. It’s available for free online, as a .txt or .pdf file: [https://github.com/za3k/cookbook/releases][1]
+I filled up my paper notebook I use to keep recipes. I typed it up and edited it. It’s available for free online, as a .txt or .pdf file: [https://github.com/za3k/cookbook/releases](https://github.com/za3k/cookbook/releases)
 
 Note that most of these recipes are from online or printed sources. Some are written by me, family, or friends.
 
@@ -24,5 +24,3 @@ Note that most of these recipes are from online or printed sources. Some are wri
 ![](https://blog.za3k.com/wp-content/uploads/2020/05/outside.jpeg)
 
 ![](https://blog.za3k.com/wp-content/uploads/2020/05/toc.jpeg)
-
-[1]: https://github.com/za3k/cookbook/releases
index 4e836b80cfaf7327b1e6eb9333729dc87ec30ed3..9789b79d9211e8c4849c524dd07f0c9fa3b5774c 100644 (file)
@@ -31,7 +31,7 @@ Here are a couple reasons people want to ban automated scraping:
 1.  It costs them money (*bandwidth*). Or, it makes the site unusable because too many “people” (all you) are trying to access it at once (*congestion*). Usually, it costs them money because the scaper is *stupid*–it’s something like a badly written search engine, which opens up every comment in a blog as a separate page, or opens up an infinite series of pages. For example, I host a bunch of large binaries (linux installers–big!), and I’ve had a search engine try to download every single one, once an hour. As a scraper, you can can avoid causing these problems by
     -   rate-limiting your bot (ex. only scraping one page every 5-10 seconds, so you don’t overload their server). This is a good safety net–no matter what you do, you can’t break things too badly. If you’re downloading big files, you can also rate-limit your bandwidth or limit your total bandwidth quota.
     -   examining what your scraper is doing as it runs (so you don’t download a bunch of unncessessary garbage, like computer-generated pages or a nearly-identical page for every blog comment)
-    -   obeying [robots.txt][1], which you can probably get a scraping framework to do for you. you can choose to ignore robots.txt if you think you have a good reason to, but make sure you understand why robots.txt exists before you decide.
+    -   obeying [robots.txt](https://www.cloudflare.com/learning/bots/what-is-robots.txt/), which you can probably get a scraping framework to do for you. you can choose to ignore robots.txt if you think you have a good reason to, but make sure you understand why robots.txt exists before you decide.
     -   testing the site while you’re scraping by hand or with a computerized timer. If you see the site do something like load slower (even a little) because of what you’re doing, stop your scraper, and adjust your rate limit to be 10X smaller.
     -   make your scraper smart. download only the pages you need. if you frequently stop and restart the scraper, have it remember the pages you downloaded–use some form of local cache to avoid re-downloading things. if you need to re-crawl (for example to maintain a mirror) pass if-modified-since HTTP headers.
     -   declare an HTTP user-agent, which explains what you’re doing and how to contact you (email or phone) in case there is a problem. i’ve never had anyone actually contact me but as a site admin I have looked at user agents.
@@ -56,7 +56,7 @@ These are the things that may happen if you annoy a person or company on the int
 -   They may yell at you, send you an angry email, or send you a polite email asking you to stop and/or informing you that you’re banned and who to contact if you’d like to change that
 -   You may be sent a letter telling you to stop by a lawyer (a cease-and-desist letter), often with a threat of legal action if you do not
 -   You may be sued. This could be either a legitimate attempt to sue you, or a sort of extra-intimidating cease-and-desist letter. The attempt could be successful, unsuccessful but need you to show up in court, or could be something you can ignore althogether.
--   You may be charged with some criminal charge such as computer, wire, or mail fraud. The only case I’m aware of offhand is [Aaron Swartz][2]
+-   You may be charged with some criminal charge such as computer, wire, or mail fraud. The only case I’m aware of offhand is [Aaron Swartz](https://en.wikipedia.org/wiki/Aaron_Swartz)
 -   You may be brought up on some charge by the FBI, which will result in your computers being taken away and not returned, and possibly jailtime. This one will only happen if you are crawling a government site (and is not supposed to happen ever, but that’s the world we live in).
 
 For what it’s worth, so far I have gotten up to the “polite email” section in my personal life. I do a reasonable amount of scraping, mostly of smaller sites.
@@ -67,10 +67,6 @@ Craigslist, government sites, and traditional publishers (print, audio, and acad
 
 What a company will do once you publicly post all the information on their site is another matter, and I have less advice there. There are several sites that offer information about historical Amazon prices, for what that’s worth.
 
-You may find [this article][3] interesting (but unhelpful) if you are concerned about being sued. Jason Scott is one of the main technical people at the Internet Archive, and people sometimes object to things he posts online.
+You may find [this article](https://privacy-pc.com/articles/that-awesome-time-i-was-sued-for-two-billion-dollars-jason-scotts-extraordinary-experience.html) interesting (but unhelpful) if you are concerned about being sued. Jason Scott is one of the main technical people at the Internet Archive, and people sometimes object to things he posts online.
 
 In my personal opinion, suing people or bringing criminal charges does not work in general, because most people scraping do not live in the USA, and may use technical means to disguise who they are. Scrapers may be impossible to sue or charge with anything. In short, a policy of trying to sue people who scape your site, will result in your site still being scraped. Also, most people running a site don’t have the resources to sue anyone in any case. So you shouldn’t expect this to be a common outcome, but basically a small percentage of people (mostly crackpots) and companies (RIAA and publishers) may.
-
-[1]: https://www.cloudflare.com/learning/bots/what-is-robots.txt/
-[2]: https://en.wikipedia.org/wiki/Aaron_Swartz
-[3]: https://privacy-pc.com/articles/that-awesome-time-i-was-sued-for-two-billion-dollars-jason-scotts-extraordinary-experience.html
index ac7397d0fa74117a8d91d1ebe23a3118848b95e1..f7f079a905d885c5c1ceef830d56a0be9592592a 100644 (file)
@@ -17,19 +17,21 @@ wordpress_slug: cron-email-and-sending-email-to-only-one-address
 ---
 So you want to know when your monitoring system fails, or your cron jobs don’t run? Add this to your crontab:
 
-    MAILTO=me@me.com
+```
+MAILTO=me@me.com
+```
 
-Now install a mail-sending agent. I like ‘[nullmailer][1]‘, which is much smaller than most mail-sending agents. It can’t receive or forward mail, only send it, which is what I like about it. No chance of a spammer using my server for something nasty.
+Now install a mail-sending agent. I like ‘[nullmailer](http://untroubled.org/nullmailer/)‘, which is much smaller than most mail-sending agents. It can’t receive or forward mail, only send it, which is what I like about it. No chance of a spammer using my server for something nasty.
 
 The way I have it set up, I’ll have a server (avalanche) sending all email from one address (nullmailer@avalanche.za3k.com) to one email (admin@za3k.com), and that’s it. Here’s my setup on debian:
 
-    sudo apt-get install nullmailer
-    echo "admin@za3k.com" | sudo tee /etc/nullmailer/adminaddr # all mail is sent to here, except for certain patterns
-    echo "nullmailer@`hostname`.za3k.com" | sudo tee /etc/nullmailer/allmailfrom # all mail is sent from here
-    echo "`hostname`.za3k.com" | sudo tee /etc/nullmailer/defaultdomain # superceded by 'allmailfrom' and not used
-    echo "`hostname`.za3k.com" | sudo tee /etc/nullmailer/helohost # required to connect to my server. otherwise default to 'me'
-    echo "smtp.za3k.com smtp --port=587 --starttls" | sudo tee /etc/nullmailer/remotes && sudo chmod 600 /etc/nullmailer/remotes
+```
+sudo apt-get install nullmailer
+echo "admin@za3k.com" | sudo tee /etc/nullmailer/adminaddr # all mail is sent to here, except for certain patterns
+echo "nullmailer@`hostname`.za3k.com" | sudo tee /etc/nullmailer/allmailfrom # all mail is sent from here
+echo "`hostname`.za3k.com" | sudo tee /etc/nullmailer/defaultdomain # superceded by 'allmailfrom' and not used
+echo "`hostname`.za3k.com" | sudo tee /etc/nullmailer/helohost # required to connect to my server. otherwise default to 'me'
+echo "smtp.za3k.com smtp --port=587 --starttls" | sudo tee /etc/nullmailer/remotes && sudo chmod 600 /etc/nullmailer/remotes
+```
 
 Now just run `echo "Subject: sendmail test" | /usr/lib/sendmail -v admin@za3k.com` to test and you’re done!
-
-[1]: http://untroubled.org/nullmailer/
index c7ff56dc68f1a557ed531746280267ed8fe80518..4fb985c35ee31acece037401d8c2b3b43e4413ef 100644 (file)
@@ -14,7 +14,7 @@ updated: 2023-04-04 11:34:34-07:00
 wordpress_id: 997
 wordpress_slug: dd-spells-srd-vs-5e-players-handbook
 ---
-I’ve been working on a spell guide for D&D games. During the process, I researched the differences between the Dungeons and Dragons [5e Player’s Handbook][1] (PHB) and the [5e System Reference Document][2] (SRD).
+I’ve been working on a spell guide for D&D games. During the process, I researched the differences between the Dungeons and Dragons [5e Player’s Handbook](https://www.amazon.com/Players-Handbook-Dungeons-Dragons-Wizards/dp/0786965606) (PHB) and the [5e System Reference Document](https://dnd.wizards.com/resources/systems-reference-document) (SRD).
 
 For those that don’t know, in 3e Wizards of the Coast released the core rules of the game for free. They’ve continued to do so for 3.5, 4, and 5e. The 5e rules were released under Creative Commons recently (thanks!), in response to some community backlash over proposed licensing changes (eek!).
 
@@ -80,6 +80,3 @@ The following are renamed but present in the SRD, presumably for trademark reaso
 -   *bigby’s hand* becomes *arcane hand*
 -   *mordenkainen’s sword* becomes *arcane sword*
 -   *nystul’s magic aura* becomes *arcanist’s magic aura*
-
-[1]: https://www.amazon.com/Players-Handbook-Dungeons-Dragons-Wizards/dp/0786965606
-[2]: https://dnd.wizards.com/resources/systems-reference-document
index eb87681aaa4c91e85931dd71a59ffbcb214b8214..c8b0145a6712e42380f2f9536edaa0e5bbb8c894 100644 (file)
@@ -16,10 +16,8 @@ In my recent campaign, I had a handout for the players. I took it out, and on a
 
 I tore it into quarters in front of their eyes. I wrote on back of the handout pieces “**5**“, “**10**“, “**15**“, “**20**“. *“Make me an investigation check,”* I intoned in my best DM voice. “*I will grant you any pieces under your roll.*“
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/scraps-287x300.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/scraps-287x300.jpg)](https://blog.za3k.com/wp-content/uploads/2023/07/scraps.jpg)
 
 They got 23, so I gave them all four scraps. They taped it back together and got the whole handout.
 
 And they remembered that handout. They told players *in other campaigns* about the handout.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2023/07/scraps.jpg
index 827688101d616ab93d124f4a469ce51c32e684c8..e7ccad5759b9f2a9fb9e4a35dade4a073c8b181e 100644 (file)
@@ -16,16 +16,3 @@ wordpress_slug: ddos
 za3k.com was the site of a DDoS attack. I’m pretty sure this was because my wordpress installation was compromised, and the hacker who took control of my server was herself DDoSed.
 
 More updates to come, but the short story is that I’ll be formalizing my install and eventually containerizing + hardening everything
-
-1.  ![](https://secure.gravatar.com/avatar/beb5f01c762e3ac8276b7dfd7affa2ae?s=40&d=mm&r=g)Mircea Popescu says:
-    
-    [September 2, 2017 at 6:23 pm][1]
-    
-    Perhaps look into [http://trilema.com/2015/mika-epstein-aka-ipstenu-is-a-thoroughly-clueless-poser/][2]
-    
-    [Reply][3]
-    
-
-[1]: https://blog.za3k.com/ddos/#comment-2927
-[2]: http://trilema.com/2015/mika-epstein-aka-ipstenu-is-a-thoroughly-clueless-poser/
-[3]: https://blog.za3k.com/ddos/?replytocom=2927#respond
index e57b34119d9fbe46d9ca73923128f07d9c6ea315..ac9860d937b5e898e46b0c8bffa649d7556706b9 100644 (file)
@@ -17,7 +17,7 @@ wordpress_slug: default-twitter-icons
 ---
 The default twitter icon is an egg. There are six available. One is chosen at random for each new user.
 
-[![default_profile_1_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_1_bigger.png)][1] [![default_profile_2_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_2_bigger.png)][2] [![default_profile_3_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_3_bigger.png)][3] [![default_profile_4_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_4_bigger.png)][4] [![default_profile_5_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_5_bigger.png)][5] [![default_profile_6_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_6_bigger.png)][6]
+[![default_profile_1_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_1_bigger.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_1_bigger.png) [![default_profile_2_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_2_bigger.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_2_bigger.png) [![default_profile_3_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_3_bigger.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_3_bigger.png) [![default_profile_4_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_4_bigger.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_4_bigger.png) [![default_profile_5_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_5_bigger.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_5_bigger.png) [![default_profile_6_bigger](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_6_bigger.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_6_bigger.png)
 
 Hex colors for the six icons:
 
@@ -30,17 +30,4 @@ Hex colors for the six icons:
 
 Large versions of those icons:
 
-[![default_profile_1](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_1-300x300.png)][7] [![default_profile_2](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_2-300x300.png)][8] [![default_profile_3](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_3-300x300.png)][9] [![default_profile_4](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_4-300x300.png)][10] [![default_profile_5](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_5-300x300.png)][11] [![default_profile_6](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_6-300x300.png)][12]
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_1_bigger.png
-[2]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_2_bigger.png
-[3]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_3_bigger.png
-[4]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_4_bigger.png
-[5]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_5_bigger.png
-[6]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_6_bigger.png
-[7]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_1.png
-[8]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_2.png
-[9]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_3.png
-[10]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_4.png
-[11]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_5.png
-[12]: https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_6.png
+[![default_profile_1](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_1-300x300.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_1.png) [![default_profile_2](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_2-300x300.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_2.png) [![default_profile_3](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_3-300x300.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_3.png) [![default_profile_4](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_4-300x300.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_4.png) [![default_profile_5](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_5-300x300.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_5.png) [![default_profile_6](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_6-300x300.png)](https://blog.za3k.com/wp-content/uploads/2015/03/default_profile_6.png)
index 2f687f15dfa2a9c354e831059c3f4e8f1ab801b3..7fa7d0d165c8676921de2b79f3d692428697d1b8 100644 (file)
@@ -15,12 +15,8 @@ updated: 2015-11-02 18:36:57-07:00
 wordpress_id: 353
 wordpress_slug: dependency-resolution-in-javascript
 ---
-Sometimes I have a bunch of dependencies. Say, UI components that need other UI components to be loaded. I’d really just like to have everything declare dependencies and magically everything is loaded in the right order. It turns out that if use “require” type files this isn’t bad (google “dependency injection”), but for anything other than code loading you’re a bit lost. I did find [dependency-graph][1], but this requires the full list of components to run. I wanted a version would you could add components whenever you wanted–an [online][2] framework.
+Sometimes I have a bunch of dependencies. Say, UI components that need other UI components to be loaded. I’d really just like to have everything declare dependencies and magically everything is loaded in the right order. It turns out that if use “require” type files this isn’t bad (google “dependency injection”), but for anything other than code loading you’re a bit lost. I did find [dependency-graph](https://github.com/jriecken/dependency-graph), but this requires the full list of components to run. I wanted a version would you could add components whenever you wanted–an [online](https://en.wikipedia.org/wiki/Online_algorithm) framework.
 
-My take is here: [https://github.com/vanceza/dependencies-online][3]
+My take is here: [https://github.com/vanceza/dependencies-online](https://github.com/vanceza/dependencies-online)
 
 It has no requirements, and is available on npm as **dependencies-online**.
-
-[1]: https://github.com/jriecken/dependency-graph
-[2]: https://en.wikipedia.org/wiki/Online_algorithm
-[3]: https://github.com/vanceza/dependencies-online
index ee8360daa9a78cf5d11db2f491086e2e78807735..c5b9a48fda195e4a4e6eae86c28d7800d5b8045e 100644 (file)
@@ -19,15 +19,10 @@ updated: 2017-07-04 16:29:56-07:00
 wordpress_id: 418
 wordpress_slug: diy-hard-drive-carrying-case
 ---
-Today’s project was a hard drive carrying case. I wanted something to securely store hard drives. When I looked around on ebay and amazon, I saw some [nice cases][1] and some crappy plastic molded ones. Even the terrible ones were at least $50, so I made my own.
+Today’s project was a hard drive carrying case. I wanted something to securely store hard drives. When I looked around on ebay and amazon, I saw some [nice cases](https://www.amazon.com/gp/product/B007OXK0YM/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=za3k-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=B007OXK0YM&linkId=350884a6d81cab8bc2fd02af3ba9ce42) and some crappy plastic molded ones. Even the terrible ones were at least $50, so I made my own.
 
-[![HDD Carrying Case Exerior](https://blog.za3k.com/wp-content/uploads/2017/07/1.jpg)][2]
+[![HDD Carrying Case Exerior](https://blog.za3k.com/wp-content/uploads/2017/07/1.jpg)](https://blog.za3k.com/wp-content/uploads/2017/07/1.jpg)
 
-I bought a used ammo case at the rather excellent local army surplus store. Then I padded all sides. I had spare [EVA foam][3] “puzzle piece” style mats from a gym setup lying around. I cut out the pieces with scissors. That’s it.  I was expecting more steps, but nothing needed glued in place. I was planning on adding inserts for the empty slots, but it seems secure enough. If you’re making one, you could also glue the top onto the lid, so you don’t have to take it out manually.
+I bought a used ammo case at the rather excellent local army surplus store. Then I padded all sides. I had spare [EVA foam](https://en.wikipedia.org/wiki/Ethylene-vinyl_acetate) “puzzle piece” style mats from a gym setup lying around. I cut out the pieces with scissors. That’s it.  I was expecting more steps, but nothing needed glued in place. I was planning on adding inserts for the empty slots, but it seems secure enough. If you’re making one, you could also glue the top onto the lid, so you don’t have to take it out manually.
 
-[![HDD Case Interior](https://blog.za3k.com/wp-content/uploads/2017/07/2.v01.jpg)][4]
-
-[1]: https://www.amazon.com/gp/product/B007OXK0YM/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=za3k-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=B007OXK0YM&linkId=350884a6d81cab8bc2fd02af3ba9ce42
-[2]: https://blog.za3k.com/wp-content/uploads/2017/07/1.jpg
-[3]: https://en.wikipedia.org/wiki/Ethylene-vinyl_acetate
-[4]: https://blog.za3k.com/wp-content/uploads/2017/07/2.v01.jpg
+[![HDD Case Interior](https://blog.za3k.com/wp-content/uploads/2017/07/2.v01.jpg)](https://blog.za3k.com/wp-content/uploads/2017/07/2.v01.jpg)
index a38fd879235dfcf925298e04c202c27821d58b44..71214f4bcb95e9818f6bf1b250b5d5e98a86697c 100644 (file)
@@ -18,11 +18,11 @@ I’ve been pondering simple input methods for microcontrollers. One obvious ide
 
 Let’s look inside a commercial keyboard, and see if we can hook up to it:
 
-[![a photograph of the interior of a commercial keyboard. there is a PCB, with two layers of flexible conductor on top, all clamped down](https://blog.za3k.com/wp-content/uploads/2023/06/commercial-1024x549.jpg)][1]
+[![a photograph of the interior of a commercial keyboard. there is a PCB, with two layers of flexible conductor on top, all clamped down](https://blog.za3k.com/wp-content/uploads/2023/06/commercial-1024x549.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/commercial-scaled.jpg)
 
 Yikes. What’s going on? Well, let’s make our own little keyboard, and explore what’s going on. We’ll build it in three layers, or “index cards”:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/copper_parts-694x1024.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/copper_parts-694x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/copper_parts-scaled.jpg)
 
 The bottom layer has 6 vertical stripes. The top layer has 3 horizontal stripes. Each place they cross will be a “key” you can press.
 
@@ -30,21 +30,21 @@ In between them, we add a spacer layer (punched holes) so they keys are “up”
 
 This picture might help explain how they will go together:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/copper_layers-1024x705.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/copper_layers-1024x705.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/copper_layers-scaled.jpg)
 
 Now we assemble:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/copper_small.gif)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/copper_small.gif)](https://blog.za3k.com/wp-content/uploads/2023/06/copper_small.gif)
 
 The final keyboard has 6 x 3 = 18 “keys”. We write the hex digits plus a couple extra keys with marker.
 
 If I attach alligator clips to the second horizontal screw terminal, and fourth vertical screw terminals, and wire a battery and buzzer with the terminals, I get a connection beep only when I press the key “A”:
 
-[![Two terminals with alligator clips attached to row and column terminals, and a screwdriver pointing at the "A" key addressed.](https://blog.za3k.com/wp-content/uploads/2023/06/address-1024x622.jpg)][5]
+[![Two terminals with alligator clips attached to row and column terminals, and a screwdriver pointing at the "A" key addressed.](https://blog.za3k.com/wp-content/uploads/2023/06/address-1024x622.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/address-scaled.jpg)
 
 In a real computer, we obviously can’t just move alligator clips around. Instead, we attach wires to all 9 posts–three outputs wires for the horizontal lines, and six inputs for the vertical lines. We output a signal on the first horizontal line, and see if we can read it from any of the six vertical lines inputs. Then we output a signal on the second horizontal line, and see if we can read it, and so on for the third. Assuming only one key is pressed (or none), we can identify the key. This “scanning” process could be done thousands of times a second, rapidly enough that it can’t miss our slowpoke human fingers.
 
-[![Schematic of a keyboard, provided by Kragen](https://blog.za3k.com/wp-content/uploads/2023/06/schematic-1024x414.png)][6]
+[![Schematic of a keyboard, provided by Kragen](https://blog.za3k.com/wp-content/uploads/2023/06/schematic-1024x414.png)](http://falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWK0AckDMYwE4As3sA2SQgdgCYFsQFIaRd0aBTAWiwCgBncQ8bciEK4Q5XHToQALgCcArs24gi-QWFwixE8CFkKllPjkHpIm8VEt7FPMKSMDRY0Rcm75NhmAeDcwl9rSHkro6D4g6Cjmge76PKF8hhFREWaWQXFeiQh8fiKmIm7WSnbZic4F6bGeSUmVlUXBPCpJ6vlpjZneojlC7YU6xfFh4OQoySKlVUNZo+N54PbTTYtGY06TS501vWDrlVPbSip7422ry11r4-6Hg8EA7rxzytdQHE8n61On708-61a60gHx6bwSLxBTwhv1w3V+UOexleqj+KORP0ciMxglaWNBeJMI2RiJhjjh4URFLBERGSVJdN6tV6iOZRiW9NBUySLRZoN5RjKaP8Wj6qUKXI04vAUtF2NlFnOhwJzm5zjlKuiG2lpLS9TSGuhBosBy2oMimz4FoCaOtoutDVBCymC0NDBFFgWjqetyWHokHAASmL-P50IJtBYkNoYAgODIQyJbnt0vBEcnBL6+PLJimlWaE+dblKsBHwGmgzKk5MpeHLHQo-XkHGnuRVSm25b3gnO2Le6XU-BK72RRUyw26NH69AW9KB6bs-HpWG0gPJBXg5UV-lxwxJ03Y+aUvPjwWJmLrWvy0PNykwyk65H9zGZ06M+6uyCEwt-M6U+ubw-MUvV3RsX1ndg3nhYFQUg1F4XxJ44NaIUQQADxAVhxDoUIkEg0haXmFwQBkAB7B4AB0uC4ABjABDAA7KiAHNmAY5gZDoqRSJkDgACNwCQLARFwFBqFMah0JoEhwFCIRVRGcwQAAa2YABPLgHgASykGiAAsOAw2hBUnY9CCYJSAFsuJkLS0MMzDxAgMIRFYUgkDCAilIACjomipC0gA3ZgqIAG3IgAaKjSIABzYqiaNI0LQuYfyeIASgcvYCOocQCJTJTEtCuRLKYrgYrkZK5BiqiZGYLgtK4biZC4BysIwZJBHYchxJQJBJkELSysgcgRvQKipD0xqqOmrg+Mq0KuCmqQoq4OQuBCrg6KoyytJosjEoY2QkpS3iAFkgMqRgiWzURXwuh09QQG7LHIe7tQORwIToN64wevUDQoWlbt+jgLu3CIXp+97zgOFNvruuNvCYLD4SWVgwjOJYED2K16ADZjHO6UVUcSFBxgDJDqVG8ZSZtEFgwx48pSZkQTlEaToaQX7pwghCuoHElYOg2machDgpEc8ZyCB5CgbcXAZ0IbBSHUMAED6nBCDAdA2A1wcQAAE2YAAzOjKqkDhCeQ8nMO6BGvyl0RZZaeXr0RDHRptT2fvliW7dlSBaYHMW3Cw6ACEj7AxJ6tNBAQWAo+jgRCBxlAxDYagwDgI3TfN0LLetkPnHYDtXG7APNCDu2OWrgCPe5aufdEOvYNdrrw19iNYJltQWc7qsK9YUVzmHoHznrq3MLF7w6GH6u7hBSXh8VFmZ6lNwYHM0xVaoMAolIdB8EKaBU8gSOok88Q8CznPjbNi3YIH0fn7NDCx7ZgWZOwfrRhAWK2KsCKilNKMgqKBgACoABkZoMWCjIKQHFWpAA)
 
 Click to view interactive schematic (credit: Kragen)
 
@@ -58,7 +58,7 @@ For the above project, I used:
 -   A ruler
 -   A pen (NOT a pencil, since graphite is conductive)
 -   9 screws, 9 nuts, and 18 washes. I selected #6 American Wire Gauge, which is about 4mm thickness
--   [Copper tape][7]
+-   [Copper tape](https://www.amazon.com/dp/B07JNJCNVT)
 
 Did this work perfectly? Definitely not.
 
@@ -70,49 +70,20 @@ Did this work perfectly? Definitely not.
 
 This was my third attempt. Here’s the second, using aluminium foil. It worked at least as well, maybe better, but it was harder to make. I just taped the foil down, taking care not to cover the contact points. I am told the aluminium will gradually oxidize, making it non-conductive.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_parts-150x150.jpg)][8]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_parts-150x150.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_parts-scaled.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_layers-150x150.jpg)][9]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_layers-150x150.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_layers-scaled.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_03-150x150.jpg)][10]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_03-150x150.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_03-scaled.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_01-150x150.jpg)][11]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_01-150x150.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_01-scaled.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_02-150x150.jpg)][12]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_02-150x150.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_02-scaled.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/side_view-1024x576.jpg)][13]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/side_view-1024x576.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/side_view-scaled.jpg)
 
 And here’s one using graphite from drawing hard with a #2 pencil.. Graphite, it turns out, works terribly, and I couldn’t read a signal halfway down the index card. Despite what people have told me, I’m not yet convinced you can make a conductive wire out of it.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/graphite_parts-1024x442.jpg)][14]
-
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/graphite_done-1024x666.jpg)][15]
-
-1.  ![](https://secure.gravatar.com/avatar/f9bddb456724b83c643af6f44ae32042?s=40&d=mm&r=g)nortti says:
-    
-    [June 9, 2023 at 2:43 pm][16]
-    
-    “And better keyboards can detect multiple keys being pressed at once (N-key rollover), which I think they do by having a completely separate wire to each key.”
-    
-    You can keep a matrix arrangement and have N-key rollover by putting a diode in series with every switch
-    
-    [Reply][17]
-    
-
-[1]: https://blog.za3k.com/wp-content/uploads/2023/06/commercial-scaled.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2023/06/copper_parts-scaled.jpg
-[3]: https://blog.za3k.com/wp-content/uploads/2023/06/copper_layers-scaled.jpg
-[4]: https://blog.za3k.com/wp-content/uploads/2023/06/copper_small.gif
-[5]: https://blog.za3k.com/wp-content/uploads/2023/06/address-scaled.jpg
-[6]: http://falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWK0AckDMYwE4As3sA2SQgdgCYFsQFIaRd0aBTAWiwCgBncQ8bciEK4Q5XHToQALgCcArs24gi-QWFwixE8CFkKllPjkHpIm8VEt7FPMKSMDRY0Rcm75NhmAeDcwl9rSHkro6D4g6Cjmge76PKF8hhFREWaWQXFeiQh8fiKmIm7WSnbZic4F6bGeSUmVlUXBPCpJ6vlpjZneojlC7YU6xfFh4OQoySKlVUNZo+N54PbTTYtGY06TS501vWDrlVPbSip7422ry11r4-6Hg8EA7rxzytdQHE8n61On708-61a60gHx6bwSLxBTwhv1w3V+UOexleqj+KORP0ciMxglaWNBeJMI2RiJhjjh4URFLBERGSVJdN6tV6iOZRiW9NBUySLRZoN5RjKaP8Wj6qUKXI04vAUtF2NlFnOhwJzm5zjlKuiG2lpLS9TSGuhBosBy2oMimz4FoCaOtoutDVBCymC0NDBFFgWjqetyWHokHAASmL-P50IJtBYkNoYAgODIQyJbnt0vBEcnBL6+PLJimlWaE+dblKsBHwGmgzKk5MpeHLHQo-XkHGnuRVSm25b3gnO2Le6XU-BK72RRUyw26NH69AW9KB6bs-HpWG0gPJBXg5UV-lxwxJ03Y+aUvPjwWJmLrWvy0PNykwyk65H9zGZ06M+6uyCEwt-M6U+ubw-MUvV3RsX1ndg3nhYFQUg1F4XxJ44NaIUQQADxAVhxDoUIkEg0haXmFwQBkAB7B4AB0uC4ABjABDAA7KiAHNmAY5gZDoqRSJkDgACNwCQLARFwFBqFMah0JoEhwFCIRVRGcwQAAa2YABPLgHgASykGiAAsOAw2hBUnY9CCYJSAFsuJkLS0MMzDxAgMIRFYUgkDCAilIACjomipC0gA3ZgqIAG3IgAaKjSIABzYqiaNI0LQuYfyeIASgcvYCOocQCJTJTEtCuRLKYrgYrkZK5BiqiZGYLgtK4biZC4BysIwZJBHYchxJQJBJkELSysgcgRvQKipD0xqqOmrg+Mq0KuCmqQoq4OQuBCrg6KoyytJosjEoY2QkpS3iAFkgMqRgiWzURXwuh09QQG7LHIe7tQORwIToN64wevUDQoWlbt+jgLu3CIXp+97zgOFNvruuNvCYLD4SWVgwjOJYED2K16ADZjHO6UVUcSFBxgDJDqVG8ZSZtEFgwx48pSZkQTlEaToaQX7pwghCuoHElYOg2machDgpEc8ZyCB5CgbcXAZ0IbBSHUMAED6nBCDAdA2A1wcQAAE2YAAzOjKqkDhCeQ8nMO6BGvyl0RZZaeXr0RDHRptT2fvliW7dlSBaYHMW3Cw6ACEj7AxJ6tNBAQWAo+jgRCBxlAxDYagwDgI3TfN0LLetkPnHYDtXG7APNCDu2OWrgCPe5aufdEOvYNdrrw19iNYJltQWc7qsK9YUVzmHoHznrq3MLF7w6GH6u7hBSXh8VFmZ6lNwYHM0xVaoMAolIdB8EKaBU8gSOok88Q8CznPjbNi3YIH0fn7NDCx7ZgWZOwfrRhAWK2KsCKilNKMgqKBgACoABkZoMWCjIKQHFWpAA
-[7]: https://www.amazon.com/dp/B07JNJCNVT
-[8]: https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_parts-scaled.jpg
-[9]: https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_layers-scaled.jpg
-[10]: https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_03-scaled.jpg
-[11]: https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_01-scaled.jpg
-[12]: https://blog.za3k.com/wp-content/uploads/2023/06/aluminium_02-scaled.jpg
-[13]: https://blog.za3k.com/wp-content/uploads/2023/06/side_view-scaled.jpg
-[14]: https://blog.za3k.com/wp-content/uploads/2023/06/graphite_parts-scaled.jpg
-[15]: https://blog.za3k.com/wp-content/uploads/2023/06/graphite_done-scaled.jpg
-[16]: https://blog.za3k.com/diy-keyboards-and-how-keyboards-work/#comment-10102
-[17]: https://blog.za3k.com/diy-keyboards-and-how-keyboards-work/?replytocom=10102#respond
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/graphite_parts-1024x442.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/graphite_parts-scaled.jpg)
+
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/graphite_done-1024x666.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/graphite_done-scaled.jpg)
index f00b429ba5ff33331aa11b9c7c0a9d6bbcd4de30..4d84e83775e73547dafe08f2ac986846c7cdaee1 100644 (file)
@@ -13,11 +13,6 @@ updated: 2015-04-29 00:43:52-07:00
 wordpress_id: 109
 wordpress_slug: domain-names-for-sale
 ---
-For sale: [hotw.ink][1], [dripbrew.coffee][2], [brewed.coffee][3], [forget.io][4]
+For sale: [hotw.ink](http://hotw.ink/), [dripbrew.coffee](http://dripbrew.coffee/), [brewed.coffee](http://brewed.coffee/), [forget.io](http://forget.io)
 
 Contact me (make a comment or email) with offers.
-
-[1]: http://hotw.ink/
-[2]: http://dripbrew.coffee/
-[3]: http://brewed.coffee/
-[4]: http://forget.io
index 4f98848cb23bf47eb01544e2e6d9ac856abad0ce..6e5f4d1bbf585dfcdcffa1e89d56e72748b0184f 100644 (file)
@@ -13,22 +13,16 @@ updated: 2023-07-17 13:58:50-07:00
 wordpress_id: 1107
 wordpress_slug: dungeon-master-ii-spell-runes
 ---
-I’m a fan of the game [Dungeon Master II][1] (1993). In fact, I’m planning to get a tattoo of the rune system. So I looked around for a reference image. Here’s one from the game manual:
+I’m a fan of the game [Dungeon Master II](https://en.wikipedia.org/wiki/Dungeon_Master_II:_The_Legend_of_Skullkeep) (1993). In fact, I’m planning to get a tattoo of the rune system. So I looked around for a reference image. Here’s one from the game manual:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/glyphs-detailed.gif)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/glyphs-detailed.gif)](https://blog.za3k.com/wp-content/uploads/2023/07/glyphs-detailed.gif)
 
 This looked like a nice one, because it shows the game graphics:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/dm2runes-150x150.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/dm2runes-150x150.png)](https://blog.za3k.com/wp-content/uploads/2023/07/dm2runes.png)
 
 But there’s one problem–an entire row of runes is missing. Here’s a corrected one I made.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/dm2runes-2.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/dm2runes-2.png)](https://blog.za3k.com/wp-content/uploads/2023/07/dm2runes-2.png)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/just_runes.png)][5]
-
-[1]: https://en.wikipedia.org/wiki/Dungeon_Master_II:_The_Legend_of_Skullkeep
-[2]: https://blog.za3k.com/wp-content/uploads/2023/07/glyphs-detailed.gif
-[3]: https://blog.za3k.com/wp-content/uploads/2023/07/dm2runes.png
-[4]: https://blog.za3k.com/wp-content/uploads/2023/07/dm2runes-2.png
-[5]: https://blog.za3k.com/wp-content/uploads/2023/07/just_runes.png
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/just_runes.png)](https://blog.za3k.com/wp-content/uploads/2023/07/just_runes.png)
index 09fe07be7efc00a61e6a9379d5d8495825d5364b..321630423429e9fb1c42c6c3eb46e3bbe9927ded 100644 (file)
@@ -18,62 +18,62 @@ wordpress_slug: e-ink-laptop
 ---
 I’ve been prototyping an e-ink laptop.
 
-[![a wooden box with a keyboard inside and an e-ink screen mounted to it](https://blog.za3k.com/wp-content/uploads/2022/10/front_view_open-1024x768.jpg)][1]
+[![a wooden box with a keyboard inside and an e-ink screen mounted to it](https://blog.za3k.com/wp-content/uploads/2022/10/front_view_open-1024x768.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/front_view_open-scaled.jpg)
 
-[![a closed wooden box with a keyboard visible through a hole in the front](https://blog.za3k.com/wp-content/uploads/2022/10/front_view-300x225.jpg)][2]
+[![a closed wooden box with a keyboard visible through a hole in the front](https://blog.za3k.com/wp-content/uploads/2022/10/front_view-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/front_view-scaled.jpg)
 
 Closed “laptop”
 
-I’m not the first, there have been many other such devices before. I came up with the idea independently, but the specifics are heavily inspired by the [Ultimate Writer][3] by NinjaTrappeur in 2018. Similar to him, my use case is typing without distractions, and reading books. E-ink displays are quite slow to update, so I don’t think it can serve as a general purpose computer. Here’s a video of it in action. It operates at one frame per second.
+I’m not the first, there have been many other such devices before. I came up with the idea independently, but the specifics are heavily inspired by the [Ultimate Writer](https://alternativebit.fr/posts/ultimate-writer/) by NinjaTrappeur in 2018. Similar to him, my use case is typing without distractions, and reading books. E-ink displays are quite slow to update, so I don’t think it can serve as a general purpose computer. Here’s a video of it in action. It operates at one frame per second.
 
 The electronics are not fully done. They need better secured, and I’m going to redo the cabling and power back.
 
-[![an e-ink screen reading "hello world"](https://blog.za3k.com/wp-content/uploads/2022/10/screen_closeup-1024x768.jpg)][4]
+[![an e-ink screen reading "hello world"](https://blog.za3k.com/wp-content/uploads/2022/10/screen_closeup-1024x768.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/screen_closeup-scaled.jpg)
 
 I broke a screen over-tightening a nut. That said, I like this look pretty well! If the lid was thicker, I know how to avoid screws on the other side, too.
 
-[![a e-ink screen loose on a desk, covered in garbage](https://blog.za3k.com/wp-content/uploads/2022/10/early_garbage-crop-300x224.jpg)][5]
+[![a e-ink screen loose on a desk, covered in garbage](https://blog.za3k.com/wp-content/uploads/2022/10/early_garbage-crop-300x224.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/early_garbage-crop-scaled.jpg)
 
 Early screen progress. I got *something* to display, but not what I wanted.
 
-[![a mechanical keyboard in a box](https://blog.za3k.com/wp-content/uploads/2022/10/keyboard_closeup-300x225.jpg)][6]
+[![a mechanical keyboard in a box](https://blog.za3k.com/wp-content/uploads/2022/10/keyboard_closeup-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/keyboard_closeup-scaled.jpg)
 
 I found a really nice, cheap mechanical keyboard on ebay. The main downside is that it’s heavy–730g. It also consumes heavy amounts of power, even when not in use. I have a nearly identical keyboard that doesn’t, which I’ll use for v2.
 
-[![a homemade battery pack with four red lithium-ion batteries](https://blog.za3k.com/wp-content/uploads/2022/10/battery_back_closeup-300x225.jpg)][7]
+[![a homemade battery pack with four red lithium-ion batteries](https://blog.za3k.com/wp-content/uploads/2022/10/battery_back_closeup-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/battery_back_closeup-scaled.jpg)
 
 I made my own lithium-ion battery pack. It works well, but it doesn’t quite fit so I’m going to redo it with one less cell. It also needs an on/off switch and a right angle USB cable.
 
-[![a close-up of a raspberry pi in a box](https://blog.za3k.com/wp-content/uploads/2022/10/pi_closeup-300x225.jpg)][8]
+[![a close-up of a raspberry pi in a box](https://blog.za3k.com/wp-content/uploads/2022/10/pi_closeup-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/pi_closeup-scaled.jpg)
 
 The prototype is powered by a Raspberry Pi 3. The final version will use a microcontroller to save power. The Pi Zero can also be swapped in with no changes, and uses a third of the power. But it’s noticeably slower and takes 30 seconds to boot. For prototyping I’m using the Pi 3 for now.
 
 I’m not the best woodworker, but I’m slowly learning. Here are pictures of case and lid action.
 
-[![back view of a box with hinges](https://blog.za3k.com/wp-content/uploads/2022/10/added_back_stops-300x225.jpg)][9]
+[![back view of a box with hinges](https://blog.za3k.com/wp-content/uploads/2022/10/added_back_stops-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/added_back_stops-scaled.jpg)
 
 Hinged lid. The screen is on the bottom of the lid.
 
-[![back view of a wooden stop, closed](https://blog.za3k.com/wp-content/uploads/2022/10/back_stop-300x225.jpg)][10]
+[![back view of a wooden stop, closed](https://blog.za3k.com/wp-content/uploads/2022/10/back_stop-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/back_stop-scaled.jpg)
 
 A wooden stop on each side
 
-[![back view of a wooden stop, open](https://blog.za3k.com/wp-content/uploads/2022/10/back_stop_action-300x225.jpg)][11]
+[![back view of a wooden stop, open](https://blog.za3k.com/wp-content/uploads/2022/10/back_stop_action-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/back_stop_action-scaled.jpg)
 
 Wooden stop with lid open. It hits the bottom, bringing the lid/screen to a rest at vertical.
 
-[![picture of a latch, open](https://blog.za3k.com/wp-content/uploads/2022/10/hinge-300x225.jpg)][12]
+[![picture of a latch, open](https://blog.za3k.com/wp-content/uploads/2022/10/hinge-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/hinge-scaled.jpg)
 
 Latches on the side
 
-[![close-up of a hinge in cracked plywood](https://blog.za3k.com/wp-content/uploads/2022/10/hinge_crack-300x225.jpg)][13]
+[![close-up of a hinge in cracked plywood](https://blog.za3k.com/wp-content/uploads/2022/10/hinge_crack-300x225.jpg)](https://blog.za3k.com/wp-content/uploads/2022/10/hinge_crack-scaled.jpg)
 
 Don’t put hinges sideways into plywood. But if you do, drill big pilot holes. Out of six screw, one cracked a little.
 
 On the software end, shout outs to:
 
--   the creator of the [ultimate-writer][14] software, NinjaTrappeur, who has been encouraging (and explained the right way to rewrite the stack, if you wanted to today).
--   Ben Krasnow, who made a [video][15] about how to hack partial refresh on an e-ink display.
+-   the creator of the [ultimate-writer](https://github.com/NinjaTrappeur/ultimate-writer) software, NinjaTrappeur, who has been encouraging (and explained the right way to rewrite the stack, if you wanted to today).
+-   Ben Krasnow, who made a [video](https://www.youtube.com/watch?v=MsbiO8EAsGw&ab_channel=AppliedScience) about how to hack partial refresh on an e-ink display.
 
 There’s a few things I’d like to polish still–even as a prototype this isn’t fully done.
 
@@ -89,13 +89,13 @@ There’s also no default software, but that’s a feature. A prototype is for f
 
 Parts list
 
--   [7.5 inch e-ink screen][16] from Waveshare (not particularly good) – $60
+-   [7.5 inch e-ink screen](https://www.waveshare.com/7.5inch-e-paper-hat.htm) from Waveshare (not particularly good) – $60
 -   Raspberry Pi 3 (Pi Zero, etc also work with no changes) – $35 (but unavailable)
 -   microsd card – $7
 -   Plywood and boards, wood glue – $15
--   [Plexiglass][17] (to cover screen) – $10
+-   [Plexiglass](https://www.amazon.com/gp/product/B088LXM1P1) (to cover screen) – $10
 -   Bolts, washers, and nuts to secure it. – $5
--   Circular [window latch][18] x2 – $8 (or use $10 smaller [version][19])
+-   Circular [window latch](https://www.amazon.com/dp/B000CSGD1U) x2 – $8 (or use $10 smaller [version](https://www.amazon.com/dp/B09ZTLLC6K))
 -   Hinge x2 – $2
 -   Total: $142
 
@@ -107,23 +107,3 @@ Power budget (at 5V):
 -   Pi Zero W: 650mW
 
 A real-life test showed 5-6 hour battery life. Theory says (13Wh/battery \* 4 batteries / 2.7 watts)=20 hours battery life. I’m investigating the discrepancy. In theory, swapping for a Pi Zero W and a better keyboard would give 72-hour battery life.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2022/10/front_view_open-scaled.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2022/10/front_view-scaled.jpg
-[3]: https://alternativebit.fr/posts/ultimate-writer/
-[4]: https://blog.za3k.com/wp-content/uploads/2022/10/screen_closeup-scaled.jpg
-[5]: https://blog.za3k.com/wp-content/uploads/2022/10/early_garbage-crop-scaled.jpg
-[6]: https://blog.za3k.com/wp-content/uploads/2022/10/keyboard_closeup-scaled.jpg
-[7]: https://blog.za3k.com/wp-content/uploads/2022/10/battery_back_closeup-scaled.jpg
-[8]: https://blog.za3k.com/wp-content/uploads/2022/10/pi_closeup-scaled.jpg
-[9]: https://blog.za3k.com/wp-content/uploads/2022/10/added_back_stops-scaled.jpg
-[10]: https://blog.za3k.com/wp-content/uploads/2022/10/back_stop-scaled.jpg
-[11]: https://blog.za3k.com/wp-content/uploads/2022/10/back_stop_action-scaled.jpg
-[12]: https://blog.za3k.com/wp-content/uploads/2022/10/hinge-scaled.jpg
-[13]: https://blog.za3k.com/wp-content/uploads/2022/10/hinge_crack-scaled.jpg
-[14]: https://github.com/NinjaTrappeur/ultimate-writer
-[15]: https://www.youtube.com/watch?v=MsbiO8EAsGw&ab_channel=AppliedScience
-[16]: https://www.waveshare.com/7.5inch-e-paper-hat.htm
-[17]: https://www.amazon.com/gp/product/B088LXM1P1
-[18]: https://www.amazon.com/dp/B000CSGD1U
-[19]: https://www.amazon.com/dp/B09ZTLLC6K
index 660fa96acd4f120c4855843a83e68831fdff4fc1..dcc52de5e11c0e19782e805f37597fef3c73e57c 100644 (file)
@@ -13,9 +13,6 @@ updated: 2023-08-28 10:45:03-07:00
 wordpress_id: 1130
 wordpress_slug: easel-toy
 ---
-My friend Callen taught me some Godot, and we made an [Easel Toy][1]. You combine colors to make other colors. Nothing fancy.
+My friend Callen taught me some Godot, and we made an [Easel Toy](https://za3k.com/archive/easel/Cards_on_Slots.html). You combine colors to make other colors. Nothing fancy.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/08/2023-08-28-134208_1920x1080_scrot-crop-1024x648.png)][2]
-
-[1]: https://za3k.com/archive/easel/Cards_on_Slots.html
-[2]: https://za3k.com/archive/easel/Cards_on_Slots.html
+[![](https://blog.za3k.com/wp-content/uploads/2023/08/2023-08-28-134208_1920x1080_scrot-crop-1024x648.png)](https://za3k.com/archive/easel/Cards_on_Slots.html)
index 11782cdcbe5566dff7e3f04d33c4fe5ce206e132..7455d8df19d289b0324c87613a3735230db2d786 100644 (file)
@@ -19,56 +19,66 @@ I want my debian boot to work as follows:
 1.  If it’s in my house, it can boot without my being there. To make that happen, I’ll put the root disk key on a USB stick, which I keep in the computer.
 2.  If it’s not in my house, it needs a password to boot. This is the normal boot process.
 
-As in part 1, this guide is **debian-specific**. To learn more about the Linux boot process, see [part 1.][1]
+As in part 1, this guide is **debian-specific**. To learn more about the Linux boot process, see [part 1.](https://blog.za3k.com/migrating-an-existing-debian-installation-to-encrypted-root/)
 
 First, we need to prepare the USB stick. Use ‘dmesg’ and/or ‘lsblk’ to make a note of the USB stick’s path (/dev/sdae for me). I chose to write to a filesystem rather than a raw block device.
 
-    sudo mkfs.ext4 /dev/sdae # Make a filesystem directly on the device. No partition table.
-    sudo blkid /dev/sdae # Make a note of the filesystem UUID for later
+```
+sudo mkfs.ext4 /dev/sdae # Make a filesystem directly on the device. No partition table.
+sudo blkid /dev/sdae # Make a note of the filesystem UUID for later
+```
 
 Next, we’ll generate a key.
 
-    sudo mount /dev/sdae /mnt
-    sudo dd if=/dev/urandom of=/mnt/root-disk.key bs=1000 count=8
+```
+sudo mount /dev/sdae /mnt
+sudo dd if=/dev/urandom of=/mnt/root-disk.key bs=1000 count=8
+```
 
 Add the key to your root so it can actually decrypt things. You’ll be prompted for your password:
 
-    sudo cryptsetup luksAddKey ROOT_DISK_DEVICE /mnt/root-disk.key
+```
+sudo cryptsetup luksAddKey ROOT_DISK_DEVICE /mnt/root-disk.key
+```
 
 Make a script at /usr/local/sbin/unlockusbkey.sh
 
-    #!/bin/sh
-    USB_DEVICE=/dev/disk/by-uuid/a4b190b8-39d0-43cd-b3c9-7f13d807da48 # copy from blkid's output UUID=XXXX
-    
-    if [ -b $USB_DEVICE ]; then
-      # if device exists then output the keyfile from the usb key
-      mkdir -p /usb
-      mount $USB_DEVICE -t ext4 -o ro /usb
-      cat /usb/root-disk.key
-      umount /usb
-      rmdir /usb
-      echo "Loaded decryption key from USB key." >&2
-    else
-      echo "FAILED to get USB key file ..." >&2
-      /lib/cryptsetup/askpass "Enter passphrase"
-    fi
+```
+#!/bin/sh
+USB_DEVICE=/dev/disk/by-uuid/a4b190b8-39d0-43cd-b3c9-7f13d807da48 # copy from blkid's output UUID=XXXX
+
+if [ -b $USB_DEVICE ]; then
+  # if device exists then output the keyfile from the usb key
+  mkdir -p /usb
+  mount $USB_DEVICE -t ext4 -o ro /usb
+  cat /usb/root-disk.key
+  umount /usb
+  rmdir /usb
+  echo "Loaded decryption key from USB key." >&2
+else
+  echo "FAILED to get USB key file ..." >&2
+  /lib/cryptsetup/askpass "Enter passphrase"
+fi
+```
 
 Mark the script as executable, and optionally test it.
 
-    chmod +x /usr/local/sbin/unlockusbkey.sh
-    sudo /usr/local/sbin/unlockusbkey.sh | cmp /mnt/root-disk.key
+```
+chmod +x /usr/local/sbin/unlockusbkey.sh
+sudo /usr/local/sbin/unlockusbkey.sh | cmp /mnt/root-disk.key
+```
 
 Edit /etc/crypttab to add the script.
 
-    root PARTLABEL=root_cipher none luks,keyscript=/usr/local/sbin/unlockusbkey.sh
+```
+root PARTLABEL=root_cipher none luks,keyscript=/usr/local/sbin/unlockusbkey.sh
+```
 
 Finally, re-generate your initramfs. I recommend either having a live USB or keeping a backup initramfs.
 
-    sudo update-initramfs -u
+```
+sudo update-initramfs -u
+```
 
-\[1\] This post is loosely based on a chain of tutorials based on each other, including [this][2]  
-\[2\] However, those collectively looked both out of date and like they were written without true understanding, and I wanted to clean up the mess. More definitive information was sourced from the actual [cryptsetup][3] documentation.
-
-[1]: https://blog.za3k.com/migrating-an-existing-debian-installation-to-encrypted-root/
-[2]: https://www.oxygenimpaired.com/ubuntu-with-grub2-luks-encrypted-lvm-root-hidden-usb-keyfile
-[3]: https://cryptsetup-team.pages.debian.net/cryptsetup/README.initramfs.html
+\[1\] This post is loosely based on a chain of tutorials based on each other, including [this](https://www.oxygenimpaired.com/ubuntu-with-grub2-luks-encrypted-lvm-root-hidden-usb-keyfile)  
+\[2\] However, those collectively looked both out of date and like they were written without true understanding, and I wanted to clean up the mess. More definitive information was sourced from the actual [cryptsetup](https://cryptsetup-team.pages.debian.net/cryptsetup/README.initramfs.html) documentation.
index 7cd924f2d7f0bba224e6c3dcf5207f6741698ddf..cb4faf022e4d9f377a5f42b1ca72b79631df9d24 100644 (file)
@@ -11,6 +11,4 @@ updated: 2014-10-30 02:15:47-07:00
 wordpress_id: 24
 wordpress_slug: etherpad
 ---
-I host an [etherpad][1], which I just made public. You can make your own notes and edit them.
-
-[1]: https://etherpad.za3k.com
+I host an [etherpad](https://etherpad.za3k.com), which I just made public. You can make your own notes and edit them.
index 000900118de81700092244421f9e766014648d99..816c23399e06dda5145ebaeb6fad5561e4716fac 100644 (file)
@@ -17,6 +17,4 @@ Sometimes Linux wants to open files. I mostly use the command line, so I wrote s
 -   `open-text-file` opens your default text editor in a terminal. I set it as my program to open all text files.
 -   `open-directory` opens a terminal with that working directory. I set it as my program to open all directories.
 
-They’re both available in [short-programs][1]. Both default to xterm.
-
-[1]: https://github.com/za3k/short-programs?tab=readme-ov-file#open-directorytext-file
+They’re both available in [short-programs](https://github.com/za3k/short-programs?tab=readme-ov-file#open-directorytext-file). Both default to xterm.
index 5276a0a4367abb94be09bbfe513be8e22d212036..3d29e461f61ee9ad7feaf79d122cddcc6764f2c5 100644 (file)
@@ -16,8 +16,6 @@ wordpress_slug: fabric1-aur-package
 ---
 Fabric is a system administration tool used to run commands on remote machines over SSH. You program it using python. In 2018, Fabric 2 came out. In a lot of ways it’s better, but it’s incompatible, and removes some features I really need. I talked to the Fabric dev (bitprophet) and he seemed on board with keeping a Fabric 1 package around (and maybe renaming the current package to Fabric 2).
 
-Here’s an arch package: [https://aur.archlinux.org/packages/fabric1/][1]
+Here’s an arch package: [https://aur.archlinux.org/packages/fabric1/](https://aur.archlinux.org/packages/fabric1/)
 
 Currently Fabric 1 runs only on Python2. But there was a project to port it to Python 3 (confusingly named fabric3), which is currently attempting to merge into mainline fabric. Once that’s done, I’m hoping to see a ‘fabric1’ and ‘fabric2’ package in all the main distros.
-
-[1]: https://aur.archlinux.org/packages/fabric1/
index 7cede234ec5b7c0ed918f7b2f17af69df8f446c2..2ab416384e82c5cc8bc23ed07aa74348e78865e3 100644 (file)
@@ -12,121 +12,119 @@ updated: 2023-05-02 14:28:51-07:00
 wordpress_id: 1016
 wordpress_slug: first-aid-kit
 ---
-[![](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050139562-crop-1024x713.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050139562-crop-1024x713.jpg)](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050139562-crop-scaled.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050159341-crop-1024x720.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050159341-crop-1024x720.jpg)](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050159341-crop-scaled.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050204922.MP-crop-1024x796.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050204922.MP-crop-1024x796.jpg)](https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050204922.MP-crop.jpg)
 
-    Contents:
-    
-    First-aid kit contents, 1x large red bag
-    Left pocket, survival:
-    Compass, Small Magnetic
-    String
-    Magnesium rod (under compartment) - Use with knife if lighters run out
-    Misc fasteners and bags (in bag)
-    Water purification kit. Good for about 3 person-years.
-    Work gloves
-    
-    Right pocket, convenience:
-        Baby Powder - Prevents chafing. Also consider moleskin.
-        Earplugs
-        Floss
-        Face mask - For smoke or disease.
-        Glasses, spare, for Zachary
-        Lighter
-        Nail clippers
-        Petroleum Jelly - Chapped lips, protect wounds, help light tinder.
-        Razor
-        Sleeping mask
-        Toothbrush
-        Toothpaste
-    
-    Center compartment:
-        (right) Band-aids/plasters, various sizes - Use to cover small cuts
-        (right) Gauze and medicine directions
-        (bottom pocket) Grill lighter
-        (back) covid-19 test
-    
-        Thermometer, mouth
-        Tweezers
-    
-        Alocane-brand Lidocaine burn relief gel
-        Triple Antibiotic Ointment (may not work) - contains bacitracin,
-            neomycin, polymyxin. Prefer washing using sanitation bag.
-        Hydrocorozone cream - treats itch and rash
-    
-        Cotton swabs (in bag) - Clean wound
-        Gauze (in moleskin) - Wrap to stop bleeding, or use to clean a wound
-        Gauze (loose)
-        Moleskin - Patch blisters or prevent them from forming
-        Liquid Skin - Superglue. Disinfect small cuts, then brush on to close.
-        Q-tips - Clean wound
-    
-        Sanitation bag (see below)
-        Medicine box (see back)
-        Vitamins box (see back)
-    
-        Sanitation bag (in center compartment):
-            Water - Clean wounds. Slightly soapy. Refill and add campsuds and
-                povodone iodine to replenish.
-            Campsuds - Concentrated soap.
-            Povidone iodine - Use with water to create a sterile cleaning fluid.
-                Doesn't work to sanitize water (need 15min+80 drops/gal)
-    -------------------------
-        Medicine box (in center compartment):
-            Acetaminophen, 500mg, x20 - Longer white pill labeled 5500.
-                Non-NSAID pain medication. Does not reduce fever, only reduces pain
-                Use for people on certain medications or for headache.
-            Caffine, 200mg, x10 - Medium ycircular yellow pill labeled 44 226.
-                Take half with taurine to stay awake. Caffine impairs judgement
-            Calcium carbonate, 0.5g, x5 - Pastel colored large circular pills.
-                Antacid. Use for heartburn.
-            Ibuprofen, 200mg, x30 - Small circular red pill labeled I-2.
-                NSAID anti-inflammatory. Use to reduce fever or inflammation.
-                Low fevers fight diseases, don't remove them.
-            Loratadine, 10mg, x30 - Small oval white pill labeled L612.
-                Used to minor allergic reactions.
-            Melatonin, 3mg, x10 - Small unlabeled white pill.
-                Natural sleep aid. Take 1 to sleep somewhere noisy. Groggy after.
-            Peptobismol, x16 - Larger pink circular pill in plastic labeled RH 046.
-                Use for diarrhea or stomach upset. Recommended dose is 2.
-            Pseudoephedrine HCl, 120mg extended release, x2. One per day.
-            Pseudoephedrine Hcl, 30mg - One every 2-4 hours as needed.
-                Use for stuffy nose. Stimulant.
-            Taurine, 500mg, x5 - Medium white gel capsules. See caffine.
-    
-            Razor blade, x1
-            Activated charcoal - Black powder.
-                In case of poisoning, immediately induce vomiting.
-                Then eat activated charcoal.
-            Bentonite clay - Grey powder. Do not use.
-    
-        Vitamins box (in center compartment):
-            Mulivitamin, x20 - Large green pill labeled 1.
-                Take one every other day only if vitamin deficient.
-                Contains enough: Vit A, Vit C, Vit D, Vit E, Vit K, B1, B2,
-                 Magnesium, Zinc, Selenium, Copper, Manganese, Chromium
-                 Bayer One a Day Men's Pro Edge
-            Vit D, 5000 IU, x25 - Small yellow gel beads.
-                Take one every 2-3 days if sick or missing sunlight.
-            Zinc, 50mg, x20 - Medium white unlabeled circular pill.
-                Take half a pill per day to resist getting COVID-19 or for diarrhea
-            Folate, 400mcg, x20 - Small-medium white gel capsule.
-                Take one every other day if missing vegetables in diet.
-            Vitamin C, powder
-                Take small amounts if missing fruit from diet to prevent scurvy.
-    
-            For diarrhea, oral rehydration solution. If not available, use water.
-              0.5tsp salt               6tsp sugar
-              0.25tsp potassium salt    1L/quart water
-            Potassium chloride, powder - ORS
-            Iodized table salt, powder - ORS or dehydration.
-    
-            Atorvastatin, 40mg, x50 - Medium white oblong pill labeled ATV40.
-                Prescription: Take one pill daily to reduce cholesterol.
+```
+Contents:
 
-[1]: https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050139562-crop-scaled.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050159341-crop-scaled.jpg
-[3]: https://blog.za3k.com/wp-content/uploads/2023/04/PXL_20221014_050204922.MP-crop.jpg
+First-aid kit contents, 1x large red bag
+Left pocket, survival:
+Compass, Small Magnetic
+String
+Magnesium rod (under compartment) - Use with knife if lighters run out
+Misc fasteners and bags (in bag)
+Water purification kit. Good for about 3 person-years.
+Work gloves
+
+Right pocket, convenience:
+    Baby Powder - Prevents chafing. Also consider moleskin.
+    Earplugs
+    Floss
+    Face mask - For smoke or disease.
+    Glasses, spare, for Zachary
+    Lighter
+    Nail clippers
+    Petroleum Jelly - Chapped lips, protect wounds, help light tinder.
+    Razor
+    Sleeping mask
+    Toothbrush
+    Toothpaste
+
+Center compartment:
+    (right) Band-aids/plasters, various sizes - Use to cover small cuts
+    (right) Gauze and medicine directions
+    (bottom pocket) Grill lighter
+    (back) covid-19 test
+
+    Thermometer, mouth
+    Tweezers
+
+    Alocane-brand Lidocaine burn relief gel
+    Triple Antibiotic Ointment (may not work) - contains bacitracin,
+        neomycin, polymyxin. Prefer washing using sanitation bag.
+    Hydrocorozone cream - treats itch and rash
+
+    Cotton swabs (in bag) - Clean wound
+    Gauze (in moleskin) - Wrap to stop bleeding, or use to clean a wound
+    Gauze (loose)
+    Moleskin - Patch blisters or prevent them from forming
+    Liquid Skin - Superglue. Disinfect small cuts, then brush on to close.
+    Q-tips - Clean wound
+
+    Sanitation bag (see below)
+    Medicine box (see back)
+    Vitamins box (see back)
+
+    Sanitation bag (in center compartment):
+        Water - Clean wounds. Slightly soapy. Refill and add campsuds and
+            povodone iodine to replenish.
+        Campsuds - Concentrated soap.
+        Povidone iodine - Use with water to create a sterile cleaning fluid.
+            Doesn't work to sanitize water (need 15min+80 drops/gal)
+-------------------------
+    Medicine box (in center compartment):
+        Acetaminophen, 500mg, x20 - Longer white pill labeled 5500.
+            Non-NSAID pain medication. Does not reduce fever, only reduces pain
+            Use for people on certain medications or for headache.
+        Caffine, 200mg, x10 - Medium ycircular yellow pill labeled 44 226.
+            Take half with taurine to stay awake. Caffine impairs judgement
+        Calcium carbonate, 0.5g, x5 - Pastel colored large circular pills.
+            Antacid. Use for heartburn.
+        Ibuprofen, 200mg, x30 - Small circular red pill labeled I-2.
+            NSAID anti-inflammatory. Use to reduce fever or inflammation.
+            Low fevers fight diseases, don't remove them.
+        Loratadine, 10mg, x30 - Small oval white pill labeled L612.
+            Used to minor allergic reactions.
+        Melatonin, 3mg, x10 - Small unlabeled white pill.
+            Natural sleep aid. Take 1 to sleep somewhere noisy. Groggy after.
+        Peptobismol, x16 - Larger pink circular pill in plastic labeled RH 046.
+            Use for diarrhea or stomach upset. Recommended dose is 2.
+        Pseudoephedrine HCl, 120mg extended release, x2. One per day.
+        Pseudoephedrine Hcl, 30mg - One every 2-4 hours as needed.
+            Use for stuffy nose. Stimulant.
+        Taurine, 500mg, x5 - Medium white gel capsules. See caffine.
+
+        Razor blade, x1
+        Activated charcoal - Black powder.
+            In case of poisoning, immediately induce vomiting.
+            Then eat activated charcoal.
+        Bentonite clay - Grey powder. Do not use.
+
+    Vitamins box (in center compartment):
+        Mulivitamin, x20 - Large green pill labeled 1.
+            Take one every other day only if vitamin deficient.
+            Contains enough: Vit A, Vit C, Vit D, Vit E, Vit K, B1, B2,
+             Magnesium, Zinc, Selenium, Copper, Manganese, Chromium
+             Bayer One a Day Men's Pro Edge
+        Vit D, 5000 IU, x25 - Small yellow gel beads.
+            Take one every 2-3 days if sick or missing sunlight.
+        Zinc, 50mg, x20 - Medium white unlabeled circular pill.
+            Take half a pill per day to resist getting COVID-19 or for diarrhea
+        Folate, 400mcg, x20 - Small-medium white gel capsule.
+            Take one every other day if missing vegetables in diet.
+        Vitamin C, powder
+            Take small amounts if missing fruit from diet to prevent scurvy.
+
+        For diarrhea, oral rehydration solution. If not available, use water.
+          0.5tsp salt               6tsp sugar
+          0.25tsp potassium salt    1L/quart water
+        Potassium chloride, powder - ORS
+        Iodized table salt, powder - ORS or dehydration.
+
+        Atorvastatin, 40mg, x50 - Medium white oblong pill labeled ATV40.
+            Prescription: Take one pill daily to reduce cholesterol.
+```
index b3e859b44b832d0adffa7d48135eb5cc5b737dfd..686641570d0dbdd4573567453dc3f144d8d7b6cc 100644 (file)
@@ -15,11 +15,11 @@ updated: 2024-01-01 11:55:32-07:00
 wordpress_id: 1271
 wordpress_slug: flash-media-longevity-testing-4-years-later
 ---
--   [Year 0][1] – I filled 10 32-GB Kingston flash drives with random data.
--   [Year 1][2] – Tested drive 1, zero bit rot. Re-wrote drive 1 with the same data.
--   [Year 2][3] – Tested drive 2, zero bit rot. Re-tested drive 1, zero bit rot. Re-wrote drives 1-2 with the same data.
--   [Year 3][4] – Tested drive 3, zero bit rot. Re-tested drives 1-2, zero bit rot. Re-wrote drives 1-3 with the same data.
--   [Year 4][5] – Tested drive 4, zero bit rot. Re-tested drives 1-3, zero bit rot. Re-wrote drives 1-4 with the same data.
+-   [Year 0](https://www.reddit.com/r/DataHoarder/comments/e3nb2r/longterm_reliability_testing/) – I filled 10 32-GB Kingston flash drives with random data.
+-   [Year 1](https://www.reddit.com/r/DataHoarder/comments/lwgsdr/research_flash_media_longevity_testing_1_year/) – Tested drive 1, zero bit rot. Re-wrote drive 1 with the same data.
+-   [Year 2](https://www.reddit.com/r/DataHoarder/comments/tb26cy/flash_media_longevity_testing_2_years_later/) – Tested drive 2, zero bit rot. Re-tested drive 1, zero bit rot. Re-wrote drives 1-2 with the same data.
+-   [Year 3](https://www.reddit.com/r/DataHoarder/comments/102razr/flash_media_longevity_testing_3_years_later/) – Tested drive 3, zero bit rot. Re-tested drives 1-2, zero bit rot. Re-wrote drives 1-3 with the same data.
+-   [Year 4](https://www.reddit.com/r/DataHoarder/comments/18w3bxw/flash_media_longevity_testing_4_years_later/) – Tested drive 4, zero bit rot. Re-tested drives 1-3, zero bit rot. Re-wrote drives 1-4 with the same data.
 
 Will report back in **2 more years** when I test the fifth. Since flash drives are likely to last more than 10 years, the plan has never been “test one new one each year”.
 
@@ -27,42 +27,36 @@ The years where I’ll first touch a new drive (assuming no errors) are: **1, 2
 
 The full test plan:
 
-    YEAR 1: read+write  1                           [1s]
-    YEAR 2: read+write  1, 2                        [1s]
-    YEAR 3: read+write  1, 2, 3                     [1s]
-    YEAR 4: read+write  1, 2, 3, 4                  [2s] (every 2nd year)
-    year 5: read+write  1, 2, 3,
-    YEAR 6: read+write  1, 2, 3, 4  5               [2s]
-    year 7: read+write  1, 2, 3,
-    YEAR 8: read+write  1, 2, 3, 4, 5, 6            [2s]
-    year 9: read+write  1, 2, 3,
-    year 10: read+write 1, 2, 3, 4, 5, 6
-    YEAR 11: read+write 1, 2, 3,         7          [4s]
-    year 12: read+write 1, 2, 3, 4, 5, 6
-    year 13: read+write 1, 2, 3
-    year 14: read+write 1, 2, 3, 4, 5, 6
-    YEAR 15: read+write 1, 2, 3,         7, 8       [4s]
-    year 16: read+write 1, 2, 3, 4, 5, 6
-    year 17: read+write 1, 2, 3
-    year 18: read+write 1, 2, 3, 4, 5, 6
-    year 19: read+write 1, 2, 3,         7, 8
-    YEAR 20: read+write 1, 2, 3, 4, 5, 6       9    [8s]
-    year 21: read+write 1, 2, 3
-    year 22: read+write 1, 2, 3, 4, 5, 6
-    read 23: read+write 1, 2, 3          7, 8
-    year 24: read+write 1, 2, 3, 4, 5, 6
-    year 25: read+write 1, 2, 3
-    year 26: read+write 1, 2, 3, 4, 5, 6
-    YEAR 27: read+write 1, 2, 3          7, 8,   10 [8s]
-    year 28: read+write 1, 2, 3, 4, 5, 6       9
-    year 29+: repeat years 21-28
-    
+```
+YEAR 1: read+write  1                           [1s]
+YEAR 2: read+write  1, 2                        [1s]
+YEAR 3: read+write  1, 2, 3                     [1s]
+YEAR 4: read+write  1, 2, 3, 4                  [2s] (every 2nd year)
+year 5: read+write  1, 2, 3,
+YEAR 6: read+write  1, 2, 3, 4  5               [2s]
+year 7: read+write  1, 2, 3,
+YEAR 8: read+write  1, 2, 3, 4, 5, 6            [2s]
+year 9: read+write  1, 2, 3,
+year 10: read+write 1, 2, 3, 4, 5, 6
+YEAR 11: read+write 1, 2, 3,         7          [4s]
+year 12: read+write 1, 2, 3, 4, 5, 6
+year 13: read+write 1, 2, 3
+year 14: read+write 1, 2, 3, 4, 5, 6
+YEAR 15: read+write 1, 2, 3,         7, 8       [4s]
+year 16: read+write 1, 2, 3, 4, 5, 6
+year 17: read+write 1, 2, 3
+year 18: read+write 1, 2, 3, 4, 5, 6
+year 19: read+write 1, 2, 3,         7, 8
+YEAR 20: read+write 1, 2, 3, 4, 5, 6       9    [8s]
+year 21: read+write 1, 2, 3
+year 22: read+write 1, 2, 3, 4, 5, 6
+read 23: read+write 1, 2, 3          7, 8
+year 24: read+write 1, 2, 3, 4, 5, 6
+year 25: read+write 1, 2, 3
+year 26: read+write 1, 2, 3, 4, 5, 6
+YEAR 27: read+write 1, 2, 3          7, 8,   10 [8s]
+year 28: read+write 1, 2, 3, 4, 5, 6       9
+year 29+: repeat years 21-28
+```
 
-FAQ: [https://blog.za3k.com/usb-flash-longevity-testing-year-2/][6]
-
-[1]: https://www.reddit.com/r/DataHoarder/comments/e3nb2r/longterm_reliability_testing/
-[2]: https://www.reddit.com/r/DataHoarder/comments/lwgsdr/research_flash_media_longevity_testing_1_year/
-[3]: https://www.reddit.com/r/DataHoarder/comments/tb26cy/flash_media_longevity_testing_2_years_later/
-[4]: https://www.reddit.com/r/DataHoarder/comments/102razr/flash_media_longevity_testing_3_years_later/
-[5]: https://www.reddit.com/r/DataHoarder/comments/18w3bxw/flash_media_longevity_testing_4_years_later/
-[6]: https://blog.za3k.com/usb-flash-longevity-testing-year-2/
+FAQ: [https://blog.za3k.com/usb-flash-longevity-testing-year-2/](https://blog.za3k.com/usb-flash-longevity-testing-year-2/)
index d97c20ee46bd1e128b245aff41492a730ccf2194..97d931bfdee35784b23bc6d093a992dc5479a49c 100644 (file)
@@ -15,6 +15,4 @@ updated: 2015-03-15 19:34:16-07:00
 wordpress_id: 142
 wordpress_slug: games-i-like
 ---
-I wrote a list of video games which I’ve enjoyed especially [here][1].
-
-[1]: https://za3k.com/games.md
+I wrote a list of video games which I’ve enjoyed especially [here](https://za3k.com/games.md).
index a1b5364389c56adf0bd76a29304af518364fd0f2..495b808e7e394c05b212ae494d45a1f3cf5cf639 100644 (file)
@@ -11,29 +11,29 @@ updated: 2024-05-01 14:28:24-07:00
 wordpress_id: 1332
 wordpress_slug: garden-signs-on-wall-tiles-pt-2
 ---
-I tested with [one tile][1]. Now I made signs for my whole garden.
+I tested with [one tile](https://blog.za3k.com/garden-signs-on-wall-tiles/). Now I made signs for my whole garden.
 
 To start, I covered each marble tile in painter’s tape.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/001_tape-1024x528.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/001_tape-1024x528.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/001_tape-scaled.jpg)
 
 Then, I used double-stick tape to attach labels.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/002_labels.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/002_labels.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/002_labels.jpg)
 
 I cut out the words using an x-acto knife, and removed the paper and cut-out portion.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/003_cut_out-1024x685.jpg)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/003_cut_out-1024x685.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/003_cut_out-scaled.jpg)
 
 I spray painted them. I chose a higher-contrast color because of my one-tile test.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/basil-colors-226x300.jpg)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/basil-colors-226x300.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/basil-colors.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/004_spray_painted-1024x368.jpg)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/004_spray_painted-1024x368.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/004_spray_painted-scaled.jpg)
 
 I peeled off the tape, and voilà:
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/005_tape_removed-1024x480.jpg)][7]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/005_tape_removed-1024x480.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/005_tape_removed-scaled.jpg)
 
 Lessons learned:
 
@@ -41,11 +41,3 @@ Lessons learned:
 -   It takes almost as much time to peel out the letters as cut it. I was thinking of using a laser cutter to speed things up, but it could at most halve the manual labor.
 -   You should switch x-acto blades more often than you think.
 -   I should have spent even more time on an easy-to-cut font. The “a”, “e”, and “r” are too hard in this font.
-
-[1]: https://blog.za3k.com/garden-signs-on-wall-tiles/
-[2]: https://blog.za3k.com/wp-content/uploads/2024/05/001_tape-scaled.jpg
-[3]: https://blog.za3k.com/wp-content/uploads/2024/05/002_labels.jpg
-[4]: https://blog.za3k.com/wp-content/uploads/2024/05/003_cut_out-scaled.jpg
-[5]: https://blog.za3k.com/wp-content/uploads/2024/05/basil-colors.jpg
-[6]: https://blog.za3k.com/wp-content/uploads/2024/05/004_spray_painted-scaled.jpg
-[7]: https://blog.za3k.com/wp-content/uploads/2024/05/005_tape_removed-scaled.jpg
index c79b824e493e715e76fc0e6dc8a5e1fbd9fd3f7a..e690fe6032e15e4460802b86684c99c233d60783 100644 (file)
@@ -16,33 +16,33 @@ wordpress_slug: garden-signs-on-wall-tiles
 ---
 I’m making labels for my garden sections by painting tiles.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/001_blank-1024x407.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/001_blank-1024x407.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/001_blank.jpg)
 
 This is a blank “subway” style marble tile. It’s 140×45 mm (2×6 inch). One is about $1. Avoid “glazed” or “glossy” tiles, which are too smooth for the paint to stick well.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/002_blue_tape-1024x409.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/002_blue_tape-1024x409.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/002_blue_tape.jpg)
 
 First, we add a layer of tape. I used blue painter’s tape because it’s easy to see. I expect masking tape would work well too.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/003_label-1024x430.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/003_label-1024x430.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/003_label-scaled.jpg)
 
 Attach the sign you want to your tape. I used double-stick tape. It’s better than single-stick around the edges, but that also works in a pinch.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/004_cut_xacto-1024x245.jpg)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/004_cut_xacto-1024x245.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/004_cut_xacto.jpg)
 
 Cut through the letters using an x-acto blade. I used a sans-serif font to make this step faster.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/005_tape_removed-1024x340.jpg)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/005_tape_removed-1024x340.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/005_tape_removed-scaled.jpg)
 
 Remove the paper, as well as the tape. You can use the x-acto blade to peel up the tape. Make sure not to lift up the “holes” in letters like ‘B’ or ‘a’.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/006_spray_painted-1024x295.jpg)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/006_spray_painted-1024x295.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/006_spray_painted-scaled.jpg)
 
-Paint the tile. I used pale/pastel blue acrylic [spray paint][7]. Make sure to either not spray the sides, or cover them in tape too.
+Paint the tile. I used pale/pastel blue acrylic [spray paint](https://ironlak.com/). Make sure to either not spray the sides, or cover them in tape too.
 
 Then I let it sit for 15-20 minutes.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/007_tape_removed-1024x402.jpg)][8]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/007_tape_removed-1024x402.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/007_tape_removed-scaled.jpg)
 
 Peel off the tape. I used gloves, and took out the holes using tweezers.
 
@@ -50,22 +50,10 @@ Peeling the tape while the paint is slightly wet is easier than completely dry.
 
 If you mess up along the way anywhere, acetone took the paint off great for me.
 
-Then I let the paint completely dry. Optionally, you can seal it with a [clear sealant][9] if you want extra waterproofing.
+Then I let the paint completely dry. Optionally, you can seal it with a [clear sealant](https://www.amazon.com/Mod-Podge-1470-Acrylic-Sealer/dp/B003VYD9DM) if you want extra waterproofing.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/008_z_bracket-1-1024x604.jpg)][10]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/008_z_bracket-1-1024x604.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/008_z_bracket-1.jpg)
 
-I attach the tile to my raised beds using [z-brackets][11] sized to fit the tile thickness and a screwdriver. They look fine on the dirt too.
+I attach the tile to my raised beds using [z-brackets](https://www.google.com/search?q=z-bracket&tbm=isch) sized to fit the tile thickness and a screwdriver. They look fine on the dirt too.
 
 Looks nice! Maybe I’ll switch to a higher-contract color paint for white?
-
-[1]: https://blog.za3k.com/wp-content/uploads/2024/04/001_blank.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2024/04/002_blue_tape.jpg
-[3]: https://blog.za3k.com/wp-content/uploads/2024/04/003_label-scaled.jpg
-[4]: https://blog.za3k.com/wp-content/uploads/2024/04/004_cut_xacto.jpg
-[5]: https://blog.za3k.com/wp-content/uploads/2024/04/005_tape_removed-scaled.jpg
-[6]: https://blog.za3k.com/wp-content/uploads/2024/04/006_spray_painted-scaled.jpg
-[7]: https://ironlak.com/
-[8]: https://blog.za3k.com/wp-content/uploads/2024/04/007_tape_removed-scaled.jpg
-[9]: https://www.amazon.com/Mod-Podge-1470-Acrylic-Sealer/dp/B003VYD9DM
-[10]: https://blog.za3k.com/wp-content/uploads/2024/04/008_z_bracket-1.jpg
-[11]: https://www.google.com/search?q=z-bracket&tbm=isch
index d05d25cdb9a92b79b697a0277f395d756e899bb4..380d37d874872f2a87c3801251dc442dcbcefad1 100644 (file)
@@ -30,14 +30,14 @@ The sensical mold-killing strategies I’ve found boil down to “Remove moistur
 *My attempt:* I tried it on my basement (dilute to about 0.15%, then pour or spray, scrub afterwards).  
 *My attempt:* I also added a little to laundry while I washed the couch cushions and my sheets.
 
-**Vinegar (acid)**: I would suspect vinegar is not very effective (several people claim mold can tolerate low pH better than high pH, and [Drew Frye][1] who does a lot of actual testing on boats claims that vinegar acts as food for the mold, helping it come back). OTOH I have anecdotal evidence that it works.  
+**Vinegar (acid)**: I would suspect vinegar is not very effective (several people claim mold can tolerate low pH better than high pH, and [Drew Frye](https://sail-delmarva.blogspot.com/) who does a lot of actual testing on boats claims that vinegar acts as food for the mold, helping it come back). OTOH I have anecdotal evidence that it works.  
 *My attempt*: None.
 
 **Concrobium (a base)**: This is a mix of trisodium phosphate (pH 12), sodium carbonate or “washing soda” (pH 11) and sodium bicarbonate or “baking soda” (pH 9). I suspect it works really well, because there’s a good explanation as to why it should. Store-bought concrobium is also quite expensive, so I’d make your own. I suspect you don’t need all three ingredients, because I think they’re doing the same thing.  
-*My attempt*: I sprayed spray-can concrobium on my couch, which covered maybe 1/6 of the couch with a $13 can. Plan to make some [homemade][2] to finish the job.  
+*My attempt*: I sprayed spray-can concrobium on my couch, which covered maybe 1/6 of the couch with a $13 can. Plan to make some [homemade](https://sail-delmarva.blogspot.com/2016/12/mildew-treatment-for-pennies.html) to finish the job.  
 Edit: Muurkha advises that you can make sodium carbonate by boiling sodium bicarbonate for about an hour.
 
-**Clove oil (anti-microbial)**: Most people who recommend it have a bit of an anti-science attitude, which means they tend to give… silly specific advice. But there’s [published][3] research that it works, I just don’t know the best way to apply it, how long it works, or how it works. It seems possible that clove oil is a bit more species-specific than the other methods.  
+**Clove oil (anti-microbial)**: Most people who recommend it have a bit of an anti-science attitude, which means they tend to give… silly specific advice. But there’s [published](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3763181/) research that it works, I just don’t know the best way to apply it, how long it works, or how it works. It seems possible that clove oil is a bit more species-specific than the other methods.  
 *My attempt*: None.
 
 Mechanisms, as I understand them:
@@ -49,7 +49,3 @@ Mechanisms, as I understand them:
 I do not think high or low temperatures will work to kill molds generally, from my research.
 
 The hardest part of this research is that I *don’t* have a large, visible mold patch. I’m just itchy. So don’t expect a report back about whether this stuff worked, honestly.
-
-[1]: https://sail-delmarva.blogspot.com/
-[2]: https://sail-delmarva.blogspot.com/2016/12/mildew-treatment-for-pennies.html
-[3]: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3763181/
index 662be945d1bb55398156f92c191ef779cec73fc7..2bd6fad22e6f16d8ce5ef9d798915a583f14e2b9 100644 (file)
@@ -20,30 +20,24 @@ wordpress_slug: getting-the-adafruit-pro-trinket-3-3v-to-work-in-arch-linux
 ---
 I’m on Linux, and here’s what I did to get the **Adafruit Pro Trinket** (3.3V version) to work. I think most of this should work for other Adafruit boards as well. I’m on **Arch Linux**, but other distros will be similar, just find the right paths for everything. Your version of udev may vary on older distros especially.
 
-1.  Install the Arduino IDE. If you want to install the [adafruit version][1], be my guest. It should work out of the box, minus the udev rule below. I have multiple microprocessors I want to support, so this wasn’t an option for me.
-2.  Copy the hardware profiles to your Arduino install. `pacman -Ql arduino` shows me that I should be installing to **/usr/share/aduino**.  You can find the files you need at their [source][2] (copy the entire folder) or the same thing is packaged inside of the [IDE installs][3].
+1.  Install the Arduino IDE. If you want to install the [adafruit version](https://learn.adafruit.com/adafruit-arduino-ide-setup/linux-setup), be my guest. It should work out of the box, minus the udev rule below. I have multiple microprocessors I want to support, so this wasn’t an option for me.
+2.  Copy the hardware profiles to your Arduino install. `pacman -Ql arduino` shows me that I should be installing to **/usr/share/aduino**.  You can find the files you need at their [source](https://github.com/adafruit/Adafruit_Arduino_Boards) (copy the entire folder) or the same thing is packaged inside of the [IDE installs](https://learn.adafruit.com/adafruit-arduino-ide-setup/linux-setup).
     
+    ```
     cp adafruit-git /usr/share/arduino/adafruit
+    ```
     
-3.  Re-configure “ATtiny85” to work with *avrdude*. On arch, `pacman -Ql arduino | grep "avrdude.conf` says I should edit **/usr/share/arduino/hardware/tools/avr/etc/avrdude.conf**. Paste [this revised “t85” section][4] into avrdude.conf ([credit][5] to the author)
-4.  Install a [udev][6] rule so you can program the Trinket Pro as yourself (and not as root).
+3.  Re-configure “ATtiny85” to work with *avrdude*. On arch, `pacman -Ql arduino | grep "avrdude.conf` says I should edit **/usr/share/arduino/hardware/tools/avr/etc/avrdude.conf**. Paste [this revised “t85” section](https://gist.github.com/andijcr/f4a660fde4035fb0a3aa) into avrdude.conf ([credit](http://andijcr.github.io/blog/2014/07/31/notes-on-trinket-on-ubuntu-14.04/) to the author)
+4.  Install a [udev](https://wiki.archlinux.org/index.php/udev) rule so you can program the Trinket Pro as yourself (and not as root).
     
-    \# /etc/udev/rules.d/adafruit-usbtiny.rules
+    ```
+    # /etc/udev/rules.d/adafruit-usbtiny.rules
     SUBSYSTEM=="usb", ATTR{product}=="USBtiny", ATTR{idProduct}=="0c9f", ATTRS{idVendor}=="1781", MODE="0660", GROUP="arduino"
+    ```
     
-5.  Add yourself as an *arduino* group user so you can program the device with `usermod -G arduino -a <username>`. [Reload the udev rules][7] and log in again to refresh the groups you’re in. Close and re-open the Arduino IDE if you have it open to refresh the hardware rules.
+5.  Add yourself as an *arduino* group user so you can program the device with `usermod -G arduino -a <username>`. [Reload the udev rules](https://wiki.archlinux.org/index.php/udev#Loading_new_rules) and log in again to refresh the groups you’re in. Close and re-open the Arduino IDE if you have it open to refresh the hardware rules.
 6.  You should be good to go! If you’re having trouble, start by making sure you can see the correct hardware, and that *avrdude* can recognize and program your device with simple test programs from the command link. The source links have some good specific suggestions.
 
 Sources:  
-[http://www.bacspc.com/2015/07/28/arch-linux-and-trinket/][8]  
-[http://andijcr.github.io/blog/2014/07/31/notes-on-trinket-on-ubuntu-14.04/][9]
-
-[1]: https://learn.adafruit.com/adafruit-arduino-ide-setup/linux-setup
-[2]: https://github.com/adafruit/Adafruit_Arduino_Boards
-[3]: https://learn.adafruit.com/adafruit-arduino-ide-setup/linux-setup
-[4]: https://gist.github.com/andijcr/f4a660fde4035fb0a3aa
-[5]: http://andijcr.github.io/blog/2014/07/31/notes-on-trinket-on-ubuntu-14.04/
-[6]: https://wiki.archlinux.org/index.php/udev
-[7]: https://wiki.archlinux.org/index.php/udev#Loading_new_rules
-[8]: http://www.bacspc.com/2015/07/28/arch-linux-and-trinket/
-[9]: http://andijcr.github.io/blog/2014/07/31/notes-on-trinket-on-ubuntu-14.04/
+[http://www.bacspc.com/2015/07/28/arch-linux-and-trinket/](http://www.bacspc.com/2015/07/28/arch-linux-and-trinket/)  
+[http://andijcr.github.io/blog/2014/07/31/notes-on-trinket-on-ubuntu-14.04/](http://andijcr.github.io/blog/2014/07/31/notes-on-trinket-on-ubuntu-14.04/)
index bf8e39aafa92560b742fa70f04aab1970bca04c6..7032dcf5706f0c0b925443e0f03d07154bf25729 100644 (file)
@@ -64,7 +64,7 @@ Here’s some information about dotfiles:
     -   ‘Blob’ objects represent file content (just content). Rarely, blobs can store content other than files, like GPG signatures.
     -   ‘Tree’ objects represent directory listings. These are where filenames and permissions are stored.
     -   ‘Commit’ and ‘Tag’ objects are for git commits and tags. Makes sense. I think only annotated tags get stored in the object database.
--   Internally, git both stores diffs (for example, a 1 line file change is represented as close to 1 line of actual disk storage), and compresses the files and diffs. Below, I list a “virtual” size, representing the size of the uncompressed object, and a “disk” size representing the actual size as used by git.For more information on git internals, I recommend the excellent “[Pro Git][1]” (available for free online and as a book), and then if you want compression and bit-packing details the [fine internals documentation][2] has some information about objects, deltas, and packfile formats.
+-   Internally, git both stores diffs (for example, a 1 line file change is represented as close to 1 line of actual disk storage), and compresses the files and diffs. Below, I list a “virtual” size, representing the size of the uncompressed object, and a “disk” size representing the actual size as used by git.For more information on git internals, I recommend the excellent “[Pro Git](https://git-scm.com/book/en/v2/)” (available for free online and as a book), and then if you want compression and bit-packing details the [fine internals documentation](https://github.com/git/git/tree/master/Documentation/technical) has some information about objects, deltas, and packfile formats.
 -   Git object counts and sizes:
     -   Blob
         -   41031250 blobs (401 per repo)
@@ -157,6 +157,3 @@ Let’s try a few compression strategies and see how they fare:
 -   125GB. Same, with ‘git repack -adk’)
 
 Throwing out everything but the objects allows other fun options, but there aren’t any standard tools and I’m out of time. Maybe next time. Ta for now.
-
-[1]: https://git-scm.com/book/en/v2/
-[2]: https://github.com/git/git/tree/master/Documentation/technical
index fc47651fd347fe8041707100de8df2a27e0f56db..06c05c17f85179d1821c94e50ddd1e569ac3f788 100644 (file)
@@ -41,13 +41,13 @@ Assume there’s only one multiplication factor for one kind of work (one kind o
 
 You can measure other peoples’ multiplication factor to figure out when they’ll actually be done with tasks, but I suggest doing it quietly and not mentioning it.
 
-Credit: Folk, but credit to [Joel on Software][1] for the idea of estimating it for each team member
+Credit: Folk, but credit to [Joel on Software](https://www.joelonsoftware.com/2007/10/26/evidence-based-scheduling/) for the idea of estimating it for each team member
 
 ## To estimate a long task, break it up into pieces, and add up the pieces.
 
 Do this if your task takes 2 days or more. Because of the multiplication factor, carefully budget time for added tasks, things you forgot, problems, etc. Or you can skip it. Just consistently pick one.
 
-Credit: [Joel on Software][2], including FogBugz which did this as a statistical method displayed with [Gantt Charts][3].
+Credit: [Joel on Software](https://www.joelonsoftware.com/2007/10/26/evidence-based-scheduling/), including FogBugz which did this as a statistical method displayed with [Gantt Charts](https://en.wikipedia.org/wiki/Gantt_chart).
 
 ## Train your credible intervals.
 
@@ -58,7 +58,3 @@ Train your credible intervals. I trained mine using bug fixing, something which
 I trained on bugfixes using 50%, 90%, and 99% intervals. There are specific mathematical scoring rules, but basically if something is in your 50% interval more than half the time, narrow it; if your interval is correct less than half the time, widen it.
 
 Credit: Eliezer Yudkowsky (personal website, no longer up)
-
-[1]: https://www.joelonsoftware.com/2007/10/26/evidence-based-scheduling/
-[2]: https://www.joelonsoftware.com/2007/10/26/evidence-based-scheduling/
-[3]: https://en.wikipedia.org/wiki/Gantt_chart
index 36650773ef273350b7e758010c086ce9ba788a6c..14e3e4ca1246df78a25052d40492efae3b12b1a7 100644 (file)
@@ -19,14 +19,10 @@ wordpress_slug: hack-a-day-2023-2
 
 Hack-A-Day is challenge to make complete one new project, from scratch, every day in November 2023.
 
-Last year (2022), I set myself the challenge to make a software project every day, and met it. I had a ton of fun, and make a lot of [cool video games and projects][1] I can show off. This year I’m inviting the rest of the world to join me!
+Last year (2022), I set myself the challenge to make a software project every day, and met it. I had a ton of fun, and make a lot of [cool video games and projects](https://za3k.com/hackaday) I can show off. This year I’m inviting the rest of the world to join me!
 
 I’m a programmer, so I’m doing a new computer programming project every day. But you can do any kind of project, whatever you pick is great.
 
-[READ MORE][2]
+[READ MORE](https://za3k.com/hack-a-day-rules)
 
-I encourage you to join. I would guess this takes 2-4 hours a day (similar to NaNoWriMo). But if you don’t have that kind of time, please do still join for as many days as you can! And if you want to collaborate with me, set aside a free day and message me by email. My calendar is at [zachary.youcanbook.me][3]. Feel free to grab any day starting the 4th!
-
-[1]: https://za3k.com/hackaday
-[2]: https://za3k.com/hack-a-day-rules
-[3]: https://zachary.youcanbook.me/
+I encourage you to join. I would guess this takes 2-4 hours a day (similar to NaNoWriMo). But if you don’t have that kind of time, please do still join for as many days as you can! And if you want to collaborate with me, set aside a free day and message me by email. My calendar is at [zachary.youcanbook.me](https://zachary.youcanbook.me/). Feel free to grab any day starting the 4th!
index 93766d63cfea1614d186c02fc1c49960be82936d..f1c702a343bf3c5d2339b5825c3e376b8a864d64 100644 (file)
@@ -14,28 +14,17 @@ wordpress_slug: hack-a-day-2023-is-done
 ---
 Hack-A-Day 2023 is complete. I did 20 projects in 30 days. Pretty good considering I got a new job and moved!
 
-The overview of the month is [here][1] and highly recommended.
+The overview of the month is [here](https://za3k.com/hackaday) and highly recommended.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/12/2023-12-06-154545_1920x1080_scrot-crop-1024x712.png)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/12/2023-12-06-154545_1920x1080_scrot-crop-1024x712.png)](https://za3k.com/hackaday)
 
 I plan to do a little more followup this year than last. Today’s last-minute fixes:
 
--   [Perquackey][3] (01) works on phones, tablets, and with the mouse. There’s an easter egg that displays any words you missed at the end.
--   [Typewriter][4] (10) saves progress, and lets you type more than 1 page of content.
--   [Screensaver][5] (12) works on more screen sizes, including phones.
--   [Synth][6] (14) looks better on a phone-sized display.
--   [Stuff.md][7] (23) has an example from the database
--   [Timelapse][8] (24) has a partial video
--   [Speed Reading][9] (29) works better on a phone. It also saves your progress.
--   [Music of the Spheres][10] (30) works on a phone. It’s also louder.
-
-[1]: https://za3k.com/hackaday
-[2]: https://za3k.com/hackaday
-[3]: https://blog.za3k.com/hack-a-day-day-01-perquackey/
-[4]: https://blog.za3k.com/hack-a-day-day-10-typewriter/
-[5]: https://blog.za3k.com/hack-a-day-day-12-screensavers/
-[6]: https://blog.za3k.com/hack-a-day-day-14-bytebeat-synth/
-[7]: https://blog.za3k.com/hack-a-day-day-23-packing/
-[8]: https://blog.za3k.com/hack-a-day-day-23-packing/
-[9]: https://blog.za3k.com/hack-a-day-day-29-speed-reading/
-[10]: https://blog.za3k.com/hack-a-day-day-30-music-of-the-celestial-spheres/
+-   [Perquackey](https://blog.za3k.com/hack-a-day-day-01-perquackey/) (01) works on phones, tablets, and with the mouse. There’s an easter egg that displays any words you missed at the end.
+-   [Typewriter](https://blog.za3k.com/hack-a-day-day-10-typewriter/) (10) saves progress, and lets you type more than 1 page of content.
+-   [Screensaver](https://blog.za3k.com/hack-a-day-day-12-screensavers/) (12) works on more screen sizes, including phones.
+-   [Synth](https://blog.za3k.com/hack-a-day-day-14-bytebeat-synth/) (14) looks better on a phone-sized display.
+-   [Stuff.md](https://blog.za3k.com/hack-a-day-day-23-packing/) (23) has an example from the database
+-   [Timelapse](https://blog.za3k.com/hack-a-day-day-23-packing/) (24) has a partial video
+-   [Speed Reading](https://blog.za3k.com/hack-a-day-day-29-speed-reading/) (29) works better on a phone. It also saves your progress.
+-   [Music of the Spheres](https://blog.za3k.com/hack-a-day-day-30-music-of-the-celestial-spheres/) (30) works on a phone. It’s also louder.
index 86f0ea778c64a21e6b73e5370dad5873a0b63c0e..8ad8cc272d91f18bb6a9671e5a4e8748629c4c1f 100644 (file)
@@ -22,13 +22,10 @@ wordpress_slug: hack-a-day-2023
 
 Hack-A-Day is challenge to make complete one new project, from scratch, every day in November 2023.
 
-Last year (2022), I set myself the challenge to make a software project every day, and met it. I had a ton of fun, and make a lot of [cool video games and projects][1] I can show off. This year I’m inviting the rest of the world to join me!
+Last year (2022), I set myself the challenge to make a software project every day, and met it. I had a ton of fun, and make a lot of [cool video games and projects](https://za3k.com/hackaday) I can show off. This year I’m inviting the rest of the world to join me!
 
 I’m a programmer, so I’m doing a new computer programming project every day. But you can do any kind of project, whatever you pick is great.
 
-[READ MORE][2]
+[READ MORE](https://za3k.com/hack-a-day-rules)
 
 I will post again nearer to November! Just giving blog readers an advance heads-up.
-
-[1]: https://za3k.com/hackaday
-[2]: https://za3k.com/hack-a-day-rules
index 7404ddc25355bfb497c1f56cea04546bfe741a86..3a0300810261a79a761037938d7474c8d577dd28 100644 (file)
@@ -18,9 +18,6 @@ Today I chose to write a web version of a word game my family has loved for a lo
 
 It is meant to be played multi-player, but you’re welcome to try it out single-player online. Have fun!
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/2023-11-01-192758_1920x1080_scrot-crop-1024x399.png)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/2023-11-01-192758_1920x1080_scrot-crop-1024x399.png)](https://za3k.github.io/ha3k-01-perquackey/)
 
-Source code [here][2]
-
-[1]: https://za3k.github.io/ha3k-01-perquackey/
-[2]: https://github.com/za3k/ha3k-01-perquackey
+Source code [here](https://github.com/za3k/ha3k-01-perquackey)
index bca6f40449b06336c71cc97596b581b5d0908cac..6e59d135f21ce4636c578f924143fc7a0f691ebd 100644 (file)
@@ -17,26 +17,12 @@ wordpress_slug: hack-a-day-day-04-lashed-table
 ---
 Lashed furniture is made using sticks and rope or twine. Today’s project was to make one out of bamboo and brown paracord. The frame is shown–imagine boards or many pieces of bamboo forming a top.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/table-1024x1002.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/table-1024x1002.jpg)](https://blog.za3k.com/wp-content/uploads/2023/11/table.jpg)
 
 Hello to the young lady who decided to pose and join in the photo!
 
 We found this little $5 tool to be incredibly good for cutting bamboo. It’s designed for almost the same thing, cutting metal pipes.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/pipe-cutter-300x300.webp)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/pipe-cutter-300x300.webp)](https://blog.za3k.com/wp-content/uploads/2023/11/pipe-cutter.webp)
 
 It wasn’t bad for a first try. That said, we decided the top wasn’t flat enough to give a good finish, so the whole thing is going to be burned at the next bonfire.
-
-1.  ![](https://secure.gravatar.com/avatar/eb8e07689c4f342e5ae296cab95f609e?s=40&d=mm&r=g)Carin says:
-    
-    [November 6, 2023 at 8:44 am][3]
-    
-    Cool!
-    
-    [Reply][4]
-    
-
-[1]: https://blog.za3k.com/wp-content/uploads/2023/11/table.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2023/11/pipe-cutter.webp
-[3]: https://blog.za3k.com/hack-a-day-day-04-lashed-table/#comment-10633
-[4]: https://blog.za3k.com/hack-a-day-day-04-lashed-table/?replytocom=10633#respond
index 85d179d5d30397537714cfabd45bcad5fbeaed70..b787bdb4547534f487da8773168bf8f187e2b0a6 100644 (file)
@@ -15,22 +15,16 @@ updated: 2023-11-11 11:38:50-07:00
 wordpress_id: 1164
 wordpress_slug: hack-a-day-day-06-doodlemoji-alchemy
 ---
-I made a small game called Doodlemoji Alchemy, together with my friend Jennifer, as part of [Hack-A-Day][1].
+I made a small game called Doodlemoji Alchemy, together with my friend Jennifer, as part of [Hack-A-Day](https://za3k.com/hackaday).
 
-You can play it [here][2].
+You can play it [here](https://za3k.github.io/ha3k-07-doodle-alchemy/).
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/equation.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/equation.png)](https://za3k.github.io/ha3k-07-doodle-alchemy/)
 
 You combine elements to make something new. Sometimes you get an old element:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/choice.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/choice.png)](https://za3k.github.io/ha3k-07-doodle-alchemy/)
 
 Sometimes you discover a new one!
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/main.png)][5]
-
-[1]: https://za3k.com/hackaday
-[2]: https://za3k.github.io/ha3k-07-doodle-alchemy/
-[3]: https://za3k.github.io/ha3k-07-doodle-alchemy/
-[4]: https://za3k.github.io/ha3k-07-doodle-alchemy/
-[5]: https://za3k.github.io/ha3k-07-doodle-alchemy/
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/main.png)](https://za3k.github.io/ha3k-07-doodle-alchemy/)
index 7efc8b2259f34def50098a73ed41b905aa87dc6f..cec7b441fa704d740edf02c9bd448c0c96bec7e1 100644 (file)
@@ -14,13 +14,13 @@ updated: 2023-11-11 11:39:03-07:00
 wordpress_id: 1152
 wordpress_slug: hack-a-day-day-06
 ---
-Today’s update is a short one. I ported my raytracer from [day 02][1], to the Nvidia GPU: [ha3k-06-raytracer][2]
+Today’s update is a short one. I ported my raytracer from [day 02](https://blog.za3k.com/hack-a-day-day-2-raytracing/), to the Nvidia GPU: [ha3k-06-raytracer](https://github.com/za3k/ha3k-06-raytracer)
 
 The visuals are pretty much the same. Incidentally I discovered the striations on the ground disappear if we increase the floating point precision.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/v15b-300x225.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/v15b-300x225.png)](https://blog.za3k.com/wp-content/uploads/2023/11/v15b.png)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/v16-300x225.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/v16-300x225.png)](https://blog.za3k.com/wp-content/uploads/2023/11/v16.png)
 
 Render on the GPU is 30x faster (0.05 fps -> 3 fps). That’s still not very fast.
 
@@ -28,7 +28,4 @@ I didn’t get video working yesterday, or anything else visually new. I will ca
 
 Here’s a working video!
 
-[1]: https://blog.za3k.com/hack-a-day-day-2-raytracing/
-[2]: https://github.com/za3k/ha3k-06-raytracer
-[3]: https://blog.za3k.com/wp-content/uploads/2023/11/v15b.png
-[4]: https://blog.za3k.com/wp-content/uploads/2023/11/v16.png
+<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/y4TcrxRg4aw?si=ca7wFptQ99gffghI" title="YouTube video player" width="560"></iframe>
index 91680ccbec46a2bbf554a51f7166cabb5141a9a0..b5c8aabee9cff305f182e32cf93e3d9e40762bf0 100644 (file)
@@ -19,6 +19,4 @@ I’ve wanted to make a receipt-printer zine for a while. Here’s the next best
 
 Click the image for a silly little zine.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/zine.png)][1]
-
-[1]: https://za3k.github.io/ha3k-08-receipt/
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/zine.png)](https://za3k.github.io/ha3k-08-receipt/)
index 6d6b9d6aa81c25ecb9c2ba9a6c4dd9313294523f..1917564b58046eb4c2dae687774d84373789071e 100644 (file)
@@ -13,10 +13,6 @@ updated: 2023-11-11 11:39:10-07:00
 wordpress_id: 1173
 wordpress_slug: hack-a-day-day-10-typewriter
 ---
-Try it out [here][1]. Code is on [github][2].
+Try it out [here](https://za3k.github.io/ha3k-10-typewriter/). Code is on [github](https://github.com/za3k/ha3k-10-typewriter).
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-1024x459.png)][3]
-
-[1]: https://za3k.github.io/ha3k-10-typewriter/
-[2]: https://github.com/za3k/ha3k-10-typewriter
-[3]: https://za3k.github.io/ha3k-10-typewriter/
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-1024x459.png)](https://za3k.github.io/ha3k-10-typewriter/)
index 6a320417ccb7cea2733fcb56772b35cb5267d141..8241b8aaa7eb9ca015d1f1433efe84d18e41f9c5 100644 (file)
@@ -16,6 +16,6 @@ updated: 2023-11-11 23:23:47-07:00
 wordpress_id: 1184
 wordpress_slug: hack-a-day-day-11-raytraced-rain
 ---
-A simple screensaver made in my raytracer. Code is [on github][1].
+A simple screensaver made in my raytracer. Code is [on github](https://github.com/za3k/ha3k-11-raytracer-rain).
 
-[1]: https://github.com/za3k/ha3k-11-raytracer-rain
+<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/FewtsNn8dg0?si=tcTHe0v4WhGp_lkW" title="YouTube video player" width="560"></iframe>
index 83f66006746e7e4be52b4630863654ee28f647db..a5e1f7a16d342955d4db66367433f0c55c7ac6f4 100644 (file)
@@ -13,10 +13,6 @@ updated: 2023-11-12 11:15:26-07:00
 wordpress_id: 1186
 wordpress_slug: hack-a-day-day-12-screensavers
 ---
-A “silly screensaver”. Demo is [here][1]. Source code is [on github][2].
+A “silly screensaver”. Demo is [here](https://za3k.github.io/ha3k-12-screensaver/). Source code is [on github](https://github.com/za3k/ha3k-12-screensaver).
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-1.png)][3]
-
-[1]: https://za3k.github.io/ha3k-12-screensaver/
-[2]: https://github.com/za3k/ha3k-12-screensaver
-[3]: https://za3k.github.io/ha3k-12-screensaver/
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-1.png)](https://za3k.github.io/ha3k-12-screensaver/)
index 0247b37382d92f769ac058109a43907a0e1d7e37..f9dd04559885df0e751d95f9e427550c1d0ed5f5 100644 (file)
@@ -16,9 +16,9 @@ wordpress_slug: hack-a-day-day-13-blueprint-maker
 ---
 Hack-A-Day is a challenge to try and finish 30 projects in 30 days in November.
 
-Today I tried to write a tool to make a floorplan. You can try it [here][1]. As usual the source code is [on github][2].
+Today I tried to write a tool to make a floorplan. You can try it [here](https://za3k.github.io/ha3k-13-blueprint/). As usual the source code is [on github](https://github.com/za3k/ha3k-13-blueprint).
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-3.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-3.png)](https://za3k.github.io/ha3k-13-blueprint/)
 
 This was an ambitious project for one day, and I didn’t finish everything I wanted. My original goal was to support
 
@@ -31,7 +31,3 @@ This was an ambitious project for one day, and I didn’t finish everything I wa
 -   sharing finished projects (stretch goal, not done)
 
 What I did do was pleasantly high-quality, and I made pretty good progress.
-
-[1]: https://za3k.github.io/ha3k-13-blueprint/
-[2]: https://github.com/za3k/ha3k-13-blueprint
-[3]: https://za3k.github.io/ha3k-13-blueprint/
index 068526fafb56c8fe310f42bf9e2bfc5b8c94acef..ebea33fa259414529ebc9cd310870f1f8df6a15f 100644 (file)
@@ -15,10 +15,6 @@ updated: 2023-11-14 15:18:55-07:00
 wordpress_id: 1193
 wordpress_slug: hack-a-day-day-14-bytebeat-synth
 ---
-My friend Kragen and I wrote a little bytebeat synth tool. You can mess around and have fun. Demo [here][1], code is [on github][2].
+My friend Kragen and I wrote a little bytebeat synth tool. You can mess around and have fun. Demo [here](https://za3k.github.io/ha3k-14-synth/), code is [on github](https://github.com/za3k/ha3k-14-synth).
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-4.png)][3]
-
-[1]: https://za3k.github.io/ha3k-14-synth/
-[2]: https://github.com/za3k/ha3k-14-synth
-[3]: https://za3k.github.io/ha3k-14-synth/
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-4.png)](https://za3k.github.io/ha3k-14-synth/)
index 1f32b01b56d04ef6249fcc2e8ebe985cd73834c4..90f62184d46702a89de5cddf6e4d158d8877ebc2 100644 (file)
@@ -16,6 +16,4 @@ updated: 2023-11-18 09:33:42-07:00
 wordpress_id: 1197
 wordpress_slug: hack-a-day-day-17-tower-of-choices
 ---
-Today’s hack-a-day project was a pencil-and-paper RPG. Based on feedback from people reading the rules, it’s *notably bad* and I don’t recommend it. Rules [here][1].
-
-[1]: https://za3k.com/games/tower_of_choices
+Today’s hack-a-day project was a pencil-and-paper RPG. Based on feedback from people reading the rules, it’s *notably bad* and I don’t recommend it. Rules [here](https://za3k.com/games/tower_of_choices).
index b42a2368dce88b8efb117f1037731ab2fde924b0..ccc763ece3955590e88eac4998a9ae86ed4377aa 100644 (file)
@@ -13,7 +13,7 @@ updated: 2023-11-20 10:10:28-07:00
 wordpress_id: 1199
 wordpress_slug: hack-a-day-day-18-a-i-grab-bag
 ---
-Today I got a variety of modern A.I. tools to work in [a python library][1]. This one is mostly install instructions, but it was useful for me, at least.
+Today I got a variety of modern A.I. tools to work in [a python library](https://github.com/za3k/ha3k-18-ai-grabbag). This one is mostly install instructions, but it was useful for me, at least.
 
 I took a day off after.
 
@@ -24,5 +24,3 @@ My conclusions were:
 -   Generating chat at 0.05x – 0.5x realtime (3-30 wpm) on GPU.
 
 I didn’t get image generation working on my allotted time.
-
-[1]: https://github.com/za3k/ha3k-18-ai-grabbag
index 9e8e5d9b083587ef852cde8ffa472b4c979687ea..bacfb9c75358e58a40e3b807418261a7f72ee639 100644 (file)
@@ -16,20 +16,15 @@ wordpress_slug: hack-a-day-day-2-raytracing
 ---
 Today I wrote a simple raytracer. A raytracer is a very simple way to draw excellent graphics. For each pixel, it follows an imaginary “line” out from the viewer through that pixel into the computer world. Then it colors the pixel based on what the line hits. Unfortunately, it also takes a lot of computing power.
 
-Mine is based on the explanation (and code) from “[Ray Tracing in One Weekend][1]“, and the code from “[My Very First Raytracer][2]“.
+Mine is based on the explanation (and code) from “[Ray Tracing in One Weekend](https://raytracing.github.io/books/RayTracingInOneWeekend.html)“, and the code from “[My Very First Raytracer](http://canonical.org/~kragen/sw/aspmisc/my-very-first-raytracer.html)“.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/v11b.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/v11b.png)](https://github.com/za3k/ha3k-02)
 
 Matte spheres in different shades of grey. The blue in the spheres is reflected from the sky.
 
 The motivation for this project was to learn how to make things run faster on a graphics card. I quickly realized (before I wrote a line of code) that I’d need the basic raytracer to be its own project. Having it run faster will have to be a job for another day!
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/v15c.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/v15c.png)](https://github.com/za3k/ha3k-02)
 
 A final demo scene, showing off reflectivity and metal surfaces.  
 Note the pincushion distortion of the overall render, and striations on the ground.
-
-[1]: https://raytracing.github.io/books/RayTracingInOneWeekend.html
-[2]: http://canonical.org/~kragen/sw/aspmisc/my-very-first-raytracer.html
-[3]: https://github.com/za3k/ha3k-02
-[4]: https://github.com/za3k/ha3k-02
index 61bc1a5214e8b57e8cd268415479d6796f1d91c8..87f4029aefb9a4f9c3e0c918ea42894d7b4e24d0 100644 (file)
@@ -18,24 +18,18 @@ updated: 2023-12-31 16:24:44-07:00
 wordpress_id: 1203
 wordpress_slug: hack-a-day-day-20-hillsfar-lockpicking-spritesheet
 ---
-For today’s hack-a-day, I meant to clone the [Hillsfar][1] lockpicking minigame. Instead, I spent all day just extracting the sprites. But I had a nice chill time, so it was great.
+For today’s hack-a-day, I meant to clone the [Hillsfar](https://en.wikipedia.org/wiki/Hillsfar) lockpicking minigame. Instead, I spent all day just extracting the sprites. But I had a nice chill time, so it was great.
 
-Edit: See the [updated post][2] for the finished game.
+Edit: See the [updated post](https://blog.za3k.com/hillsfar-lockpicking-20-complete/) for the finished game.
 
 Here’s the original minigame:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/2023-11-20-223209_640x400_scrot.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/2023-11-20-223209_640x400_scrot.png)](https://blog.za3k.com/wp-content/uploads/2023/11/2023-11-20-223209_640x400_scrot.png)
 
 Here’s my spritesheet:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/out-1024x597.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/out-1024x597.png)](https://blog.za3k.com/wp-content/uploads/2023/11/out.png)
 
 I made it by splitting up screenshots:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/hillsfar-lockpick-parts.png)][5]
-
-[1]: https://en.wikipedia.org/wiki/Hillsfar
-[2]: https://blog.za3k.com/hillsfar-lockpicking-20-complete/
-[3]: https://blog.za3k.com/wp-content/uploads/2023/11/2023-11-20-223209_640x400_scrot.png
-[4]: https://blog.za3k.com/wp-content/uploads/2023/11/out.png
-[5]: https://blog.za3k.com/wp-content/uploads/2023/11/hillsfar-lockpick-parts.png
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/hillsfar-lockpick-parts.png)](https://blog.za3k.com/wp-content/uploads/2023/11/hillsfar-lockpick-parts.png)
index 1c5cc52edb779f4fb981c729d713cd2f38ae1e08..c54922f9f219e8b863b0c5c3f1b76c8f48e635e0 100644 (file)
@@ -17,65 +17,50 @@ wordpress_slug: hack-a-day-day-22-homemade-pcbs
 ---
 Today I learned how to make PCBs. I didn’t invent anything here, this is all pretty well known by the PCB-making community, but it’s not well-known to *me*. So I taught myself a bit!
 
-The first part was the design an electronic circuit. I decided I was short on time, so I grabbed an [existing schematic][1].
+The first part was the design an electronic circuit. I decided I was short on time, so I grabbed an [existing schematic](https://www.circuits-diy.com/simple-continuity-tester-circuit-using-555-timer-ic/).
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/continuity_tester-300x204.png)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/continuity_tester-300x204.png)](https://blog.za3k.com/wp-content/uploads/2023/11/continuity_tester.png)
 
-Next, I downloaded KiCAD, and recreated the circuit there. I found [this video tutorial][3] very helpful to learn kicad.
+Next, I downloaded KiCAD, and recreated the circuit there. I found [this video tutorial](https://www.youtube.com/watch?v=zK3rDhJqMu0&ab_channel=WindsorSchmidt) very helpful to learn kicad.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/kicad_schematic.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/kicad_schematic.png)](https://blog.za3k.com/wp-content/uploads/2023/11/kicad_schematic.png)
 
 Next, I made the actual PCB layout.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/kicad-pcb.png)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/kicad-pcb.png)](https://blog.za3k.com/wp-content/uploads/2023/11/kicad-pcb.png)
 
 To my surprise, after a little jiggling I got it down to a one-layer design.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/kicad-pcb2.png)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/kicad-pcb2.png)](https://blog.za3k.com/wp-content/uploads/2023/11/kicad-pcb2.png)
 
 That means home-printing would be much easier. No having to line up the two sides carefully.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/printable.png)][7]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/printable.png)](https://blog.za3k.com/wp-content/uploads/2023/11/printable.png)
 
 I printed out the image on paper (backwards) on my toner printer, and taped it to the copper-clad PCBs.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_024251429-crop-260x300.jpg)][8]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_024251429-crop-260x300.jpg)](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_024251429-crop.jpg)
 
 First, I tried laminating it. Almost no ink transferred, and the paper came off easily. Then I tried ironing it, but the paper stick to the iron and not to the PCB. The tape melted on the iron. For both, I dunked them in water after, which is supposed to help loosen the paper.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/image-169x300.png)][9]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/image-169x300.png)](https://blog.za3k.com/wp-content/uploads/2023/11/image.png)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/image-2-169x300.png)][10]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/image-2-169x300.png)](https://blog.za3k.com/wp-content/uploads/2023/11/image-2.png)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/image-4-169x300.png)][11]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/image-4-169x300.png)](https://blog.za3k.com/wp-content/uploads/2023/11/image-4.png)
 
 Next, I tried the standard advice–sand the PCBs (I used 320 grit) and use glossy paper. This time, both pieces of paper stuck very well. I was wary about the iron coming off again, so I just left it on place on the highest heat–this worked fine for adhesion, but I had to iron out wrinkles at the end. The laminated piece had lose edges, while the ironed piece was on there totally flat.
 
 I tried peeling off the laminated paper–oops! It peeled back and most of the ink stayed on the paper. I think if I took it off more carefully, it would have worked.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/image-5-edited.png)][12]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/image-5-edited.png)](https://blog.za3k.com/wp-content/uploads/2023/11/image-5.png)
 
 I picked at the ironed paper a bit, but it didn’t budge. I let it sit in dish soap for a while so the paper would fall apart. The first hour didn’t do anything.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_041248880-crop-1024x719.jpg)][13]
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_041248880-crop-1024x719.jpg)](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_041248880-crop.jpg)
 
 Meanwhile, I made an order at PCBWay. It’s still under review.
 
 Edit: after some advice from a friend, I peeled off this paper more aggressively, and scrubbed it off. The ink was fine. It doesn’t look great, but I think this is mostly the wrinkles during transfer. It’s a little blurry, I’ll have to do a third attempt before I try etching.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_044211359-crop-875x1024.jpg)][14]
-
-[1]: https://www.circuits-diy.com/simple-continuity-tester-circuit-using-555-timer-ic/
-[2]: https://blog.za3k.com/wp-content/uploads/2023/11/continuity_tester.png
-[3]: https://www.youtube.com/watch?v=zK3rDhJqMu0&ab_channel=WindsorSchmidt
-[4]: https://blog.za3k.com/wp-content/uploads/2023/11/kicad_schematic.png
-[5]: https://blog.za3k.com/wp-content/uploads/2023/11/kicad-pcb.png
-[6]: https://blog.za3k.com/wp-content/uploads/2023/11/kicad-pcb2.png
-[7]: https://blog.za3k.com/wp-content/uploads/2023/11/printable.png
-[8]: https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_024251429-crop.jpg
-[9]: https://blog.za3k.com/wp-content/uploads/2023/11/image.png
-[10]: https://blog.za3k.com/wp-content/uploads/2023/11/image-2.png
-[11]: https://blog.za3k.com/wp-content/uploads/2023/11/image-4.png
-[12]: https://blog.za3k.com/wp-content/uploads/2023/11/image-5.png
-[13]: https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_041248880-crop.jpg
-[14]: https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_044211359-crop.jpg
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_044211359-crop-875x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2023/11/PXL_20231123_044211359-crop.jpg)
index 65dc42ff4b5d8505eaeac975129baa1b835c7835..3c6ece8d46271ea2a1ddb0afa173fb41aa10da2e 100644 (file)
@@ -17,43 +17,42 @@ I’m moving, so I have to pack. I thought I’d make it fun with two projects.
 
 First, I entered everything I was packing into a text file, **stuff.md**. That way, I can find stuff later. I have two friends who have done something like this, so I’m curious how it will go for me. Here is a sample:
 
->     Box 01 - banker
->     ======
->     - USB Receipt Printer - in trapezoid box
->     - Thinkpad 460 Charger (x2) - cardboard box (x2)
->     - Cardboard box "eink"
->         - eink communications converter for 7.5" eink display
->         - Piece of fiberglass sized for 7.5" eink display
->         - 1.54" eink display 152z152px never used, with notes on yellow paper
->     - Airtec electric duster (AC) - cardboard box
->     - Tiny UPS for Raspberry Pi - cardboard box
->     - Wireless receipt printer - cardboard box
->     - Playstation Eye (x2) - cardboard box
->     - Mini-router (2 eth, 1 usb), unconfigured - in cardboard box
->     - Pipe-sealing tape for vacuum - loose
->     - Multimeter, Kaiweets brand - in cloth case
->     - $1 in pennies, and penny sleeves - plastic bag
->     - Engraving pen - loose metal case
->     - LED Light bulbs (one white, one red) - cardboard box
->     
->     Box 02 - banker
->     ======
->     - HDD Copier - cardboard box
->     - HDD Dock (x2) - cardboard box (x2)
->     - Butane soldering iron - metal box
->     - Doxie Go adapters - loose plastic bag
->     - "Faces" M5Stack development. Stacking keyboard and screen, etc. - plastic case
->     + Magnetic metal parts tray
->     + Neodynium magnets, two disc sizes - Loose box
->     + Receipt paper roll - loose
->     
->     Box 03 - banker
->     ======
->     - empty
->     
+> ```
+> Box 01 - banker
+> ======
+> - USB Receipt Printer - in trapezoid box
+> - Thinkpad 460 Charger (x2) - cardboard box (x2)
+> - Cardboard box "eink"
+>     - eink communications converter for 7.5" eink display
+>     - Piece of fiberglass sized for 7.5" eink display
+>     - 1.54" eink display 152z152px never used, with notes on yellow paper
+> - Airtec electric duster (AC) - cardboard box
+> - Tiny UPS for Raspberry Pi - cardboard box
+> - Wireless receipt printer - cardboard box
+> - Playstation Eye (x2) - cardboard box
+> - Mini-router (2 eth, 1 usb), unconfigured - in cardboard box
+> - Pipe-sealing tape for vacuum - loose
+> - Multimeter, Kaiweets brand - in cloth case
+> - $1 in pennies, and penny sleeves - plastic bag
+> - Engraving pen - loose metal case
+> - LED Light bulbs (one white, one red) - cardboard box
+> 
+> Box 02 - banker
+> ======
+> - HDD Copier - cardboard box
+> - HDD Dock (x2) - cardboard box (x2)
+> - Butane soldering iron - metal box
+> - Doxie Go adapters - loose plastic bag
+> - "Faces" M5Stack development. Stacking keyboard and screen, etc. - plastic case
+> + Magnetic metal parts tray
+> + Neodynium magnets, two disc sizes - Loose box
+> + Receipt paper roll - loose
+> 
+> Box 03 - banker
+> ======
+> - empty
+> ```
 
-Second, I took a time lapse video of packing. I wish I had time-lapsed moving in at my current place, but I just wasn’t set up for it. Sadly, my camera battery died after 90 minutes, so I only have a very short video. Next time I’ll plug in a power cable. Here is a [short example video][1].
+Second, I took a time lapse video of packing. I wish I had time-lapsed moving in at my current place, but I just wasn’t set up for it. Sadly, my camera battery died after 90 minutes, so I only have a very short video. Next time I’ll plug in a power cable. Here is a [short example video](https://www.youtube.com/watch?v=hEYZWD2gQsQ).
 
 Both are much too personal for me to post on the web in full.
-
-[1]: https://www.youtube.com/watch?v=hEYZWD2gQsQ
index 18d92a642bdef482db31dafd02370dfab69bc60d..4e58e35bf004766d677e614ec42363a21b49a9cd 100644 (file)
@@ -17,9 +17,8 @@ wordpress_slug: hack-a-day-day-28-90s-sitcom
 ---
 Two friends and I wrote the intro to “Pint-Sized”, a 90s sitcom that never existed.
 
-We used DALL-E and stable diffusion for images, [Photopea][1] to add captions, and Google’s [AI Test Kitchen][2] for the backing music. Cheers were added with audacity. The video was edited together with ffmpeg.
+<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/6sW5rQTj1cE?si=VrMohP8qPSYOnt9-" title="YouTube video player" width="560"></iframe>
 
-Credits: za3k, stetson blake, jeremy mcintyre
+We used DALL-E and stable diffusion for images, [Photopea](https://www.photopea.com/) to add captions, and Google’s [AI Test Kitchen](https://aitestkitchen.withgoogle.com/experiments/music-lm) for the backing music. Cheers were added with audacity. The video was edited together with ffmpeg.
 
-[1]: https://www.photopea.com/
-[2]: https://aitestkitchen.withgoogle.com/experiments/music-lm
+Credits: za3k, stetson blake, jeremy mcintyre
index 5e1f8a490bedac75aa76ec2a2120c396533b06ac..3e189c42ebbc3128a79179d1d57ca1afa85a173b 100644 (file)
@@ -12,7 +12,4 @@ updated: 2023-11-30 18:21:35-07:00
 wordpress_id: 1232
 wordpress_slug: hack-a-day-day-29-speed-reading
 ---
-Yesterday’s project was [Speed Reading][1]. Experience what it’s like to read *Don Quixote* faster than you’re comfortable with. Source is [on github][2] as usual.
-
-[1]: https://za3k.github.io/ha3k-29-speedread/
-[2]: https://github.com/za3k/ha3k-29-speedread
+Yesterday’s project was [Speed Reading](https://za3k.github.io/ha3k-29-speedread/). Experience what it’s like to read *Don Quixote* faster than you’re comfortable with. Source is [on github](https://github.com/za3k/ha3k-29-speedread) as usual.
index bc82816af94d37da73fb0fbd47974e7d34951745..8a5460aef369ea132885ebd6a012e21358319165 100644 (file)
@@ -15,10 +15,6 @@ wordpress_slug: hack-a-day-day-30-music-of-the-celestial-spheres
 ---
 Hack-a-Day is a challenge to complete ~30 fun new projects in 30 days. In my case, I aimed for 20, because I knew I was getting a job and moving. I just barely made it with this last entry, a collaboration with nsh.
 
-Music of the Spheres lets you hear songs on different tonal scales. Listen to the warped melodies. Watch the pretty planets orbit. Surely their sizes and orbits are significant and connected to the tonal scales? Go mad with afterimages of… okay, well it’s kinda fun, anyway. Demo is [here][1], code is [on github][2].
+Music of the Spheres lets you hear songs on different tonal scales. Listen to the warped melodies. Watch the pretty planets orbit. Surely their sizes and orbits are significant and connected to the tonal scales? Go mad with afterimages of… okay, well it’s kinda fun, anyway. Demo is [here](https://za3k.github.io/ha3k-30-musicofspheres/), code is [on github](https://github.com/za3k/ha3k-30-musicofspheres).
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-5.png)][3]
-
-[1]: https://za3k.github.io/ha3k-30-musicofspheres/
-[2]: https://github.com/za3k/ha3k-30-musicofspheres
-[3]: https://za3k.github.io/ha3k-30-musicofspheres/
+[![](https://blog.za3k.com/wp-content/uploads/2023/11/screenshot-5.png)](https://za3k.github.io/ha3k-30-musicofspheres/)
index 4be3c6125b1224eb80230253344b2a6b9e81b8b8..c07eff1dc273ce93c6f5cf3db2c099edb6614221 100644 (file)
@@ -21,9 +21,9 @@ wordpress_slug: hack-a-day-hack-a-battle
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Yesterday’s project was [Hack-A-Battle][1] ([demo][2], [source][3]). It’s two dueling music visualizers (sound warning!). Red vs blue. As each hits the other with bullets, they lose heath. As a band takes damage, it gets dimmer and quieter. Eventually one band will win out and be the only one playing.
+Yesterday’s project was [Hack-A-Battle](https://tilde.za3k.com/hackaday/battle/) ([demo](https://tilde.za3k.com/hackaday/battle/), [source](https://github.com/za3k/day21_battle)). It’s two dueling music visualizers (sound warning!). Red vs blue. As each hits the other with bullets, they lose heath. As a band takes damage, it gets dimmer and quieter. Eventually one band will win out and be the only one playing.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-18-1024x222.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-18-1024x222.png)](https://tilde.za3k.com/hackaday/battle/)
 
 I thought this was a cool idea, but I’m not really happy with the implementation
 
@@ -34,8 +34,3 @@ I thought this was a cool idea, but I’m not really happy with the implementati
 -   It requires a fairly big display, and beefy computer/phone. It doesn’t work well on a small screen at all.
 -   I wasn’t super pleased with the code. It was so-so
 -   I wanted you to be able to upload your own songs and duel a friend
-
-[1]: https://tilde.za3k.com/hackaday/battle/
-[2]: https://tilde.za3k.com/hackaday/battle/
-[3]: https://github.com/za3k/day21_battle
-[4]: https://tilde.za3k.com/hackaday/battle/
index fc2db8bdd34ea8af8192bf02971deda019f34b81..56f5a1922298ba846adb755d3313d5837570fba7 100644 (file)
@@ -18,13 +18,8 @@ wordpress_slug: hack-a-day-hack-a-blog
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is the [Hack-A-Blog][1]. ([demo][2], [source][3]).
+Today’s project is the [Hack-A-Blog](https://tilde.za3k.com/hackaday/blog/). ([demo](https://tilde.za3k.com/hackaday/blog/), [source](https://github.com/za3k/day03_blog)).
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-1024x675.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-1024x675.png)](https://tilde.za3k.com/hackaday/blog/)
 
 Check out the link above to try out the live demo. I’m proud of getting this one done in time. I think the next days will be easier, as I figured some things out already.
-
-[1]: https://tilde.za3k.com/hackaday/blog/
-[2]: https://tilde.za3k.com/hackaday/blog/
-[3]: https://github.com/za3k/day03_blog
-[4]: https://tilde.za3k.com/hackaday/blog/
index 24b9fd0326a67215b85b0031836f673b77087352..99c5cdc07214b19d6949fae1bb4f4cb46dff7a76 100644 (file)
@@ -15,11 +15,6 @@ updated: 2022-12-05 21:15:50-07:00
 wordpress_id: 958
 wordpress_slug: hack-a-day-hack-a-bug
 ---
-I’m continuing Hack-A-Day, I think. Today’s project is [Hack-A-Bug][1] ([demo][2], [source][3]). It’s a bug reporter I can add with one line to any of my projects.
+I’m continuing Hack-A-Day, I think. Today’s project is [Hack-A-Bug](https://tilde.za3k.com/hackaday/bug/) ([demo](https://tilde.za3k.com/hackaday/bug/), [source](https://github.com/za3k/day31_bug)). It’s a bug reporter I can add with one line to any of my projects.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/12/screenshot.png)][4]
-
-[1]: https://tilde.za3k.com/hackaday/bug/
-[2]: https://tilde.za3k.com/hackaday/bug/
-[3]: https://github.com/za3k/day31_bug
-[4]: https://tilde.za3k.com/hackaday/bug/
+[![](https://blog.za3k.com/wp-content/uploads/2022/12/screenshot.png)](https://tilde.za3k.com/hackaday/bug/)
index dd8962243a3ea4f8401af90eec5b780169d304c1..d0d4cb066d0c6dc72867e207e94b6f365c73d692 100644 (file)
@@ -18,15 +18,10 @@ wordpress_slug: hack-a-day-hack-a-chat
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Chat][1]. ([demo][2], [source][3]). It’s a free web chat for anyone that goes to the website.
+Today’s project is [Hack-A-Chat](https://tilde.za3k.com/hackaday/chat/). ([demo](https://tilde.za3k.com/hackaday/chat/), [source](https://github.com/za3k/day04_chat)). It’s a free web chat for anyone that goes to the website.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/2022-11-04-201210_1920x1080_scrot-crop-1024x553.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/2022-11-04-201210_1920x1080_scrot-crop-1024x553.png)](https://tilde.za3k.com/hackaday/chat/)
 
 Check out the link above to try out the live demo.
 
 So far, not much easier. Another 8-hour day. I was hoping to do something with WebRTC today, but I didn’t get to it.
-
-[1]: https://tilde.za3k.com/hackaday/chat/
-[2]: https://tilde.za3k.com/hackaday/chat/
-[3]: https://github.com/za3k/day04_chat
-[4]: https://tilde.za3k.com/hackaday/chat/
index ec06ad19196b4713317f04dffdaa84fe16b83660..eaaa3c9c2804455e23cb33ced719ec3bde53d989 100644 (file)
@@ -16,16 +16,10 @@ updated: 2022-11-25 21:08:03-07:00
 wordpress_id: 934
 wordpress_slug: hack-a-day-hack-a-clock
 ---
-Thursday’s project was [Hack-A-Clock][1] ([demo][2], [source][3]). It is a decimal time clock, displaying the time in revolutionary french time (minus their weird calendar).
+Thursday’s project was [Hack-A-Clock](https://tilde.za3k.com/hackaday/clock/) ([demo](https://tilde.za3k.com/hackaday/clock/), [source](https://github.com/za3k/day24_clock)). It is a decimal time clock, displaying the time in revolutionary french time (minus their weird calendar).
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-21.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-21.png)](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-21.png)
 
-[https://tilde.za3k.com/hackaday/clock/][5]
+[https://tilde.za3k.com/hackaday/clock/](https://tilde.za3k.com/hackaday/clock/)
 
 This is another “phone it in” project but I think it would have been okay with more accompanying explanation and better styling.
-
-[1]: https://tilde.za3k.com/hackaday/clock/
-[2]: https://tilde.za3k.com/hackaday/clock/
-[3]: https://github.com/za3k/day24_clock
-[4]: https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-21.png
-[5]: https://tilde.za3k.com/hackaday/clock/
index b438ef4bed464f4c3fcaa440540ace02c5ebfbe0..e0671085fffe0e5289430bfbe74696879d78fdd9 100644 (file)
@@ -19,16 +19,10 @@ wordpress_slug: hack-a-day-hack-a-crop
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Crop][1] ([demo][2], [source][3]). It crops an image to a fixed size.
+Today’s project is [Hack-A-Crop](https://tilde.za3k.com/hackaday/crop/) ([demo](https://tilde.za3k.com/hackaday/crop/), [source](https://github.com/za3k/day18_crop)). It crops an image to a fixed size.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-16.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-16.png)](https://tilde.za3k.com/hackaday/crop/)
 
-I got help from several people on the CSS, thanks to instantly sharing my work via [ngrok][5] from my laptop. Thanks people! Thanks ngrok!
+I got help from several people on the CSS, thanks to instantly sharing my work via [ngrok](https://ngrok.com/) from my laptop. Thanks people! Thanks ngrok!
 
 Today’s project was in anticipation of showing off what I did at the end of the month. I want a small thumbnail for each project.
-
-[1]: https://tilde.za3k.com/hackaday/crop/
-[2]: https://tilde.za3k.com/hackaday/crop/
-[3]: https://github.com/za3k/day18_crop
-[4]: https://tilde.za3k.com/hackaday/crop/
-[5]: https://ngrok.com/
index 0ee9fbc1a499dd2a9293b11f76dbc36f27467437..d34f710a29d92a95cd4ae376c53b81414c6768c3 100644 (file)
@@ -20,13 +20,8 @@ wordpress_slug: hack-a-day-hack-a-dictionary
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Dictionary][1] ([demo][2], [source][3]). It looks up words.
+Today’s project is [Hack-A-Dictionary](https://tilde.za3k.com/hackaday/dictionary/) ([demo](https://tilde.za3k.com/hackaday/dictionary/), [source](https://github.com/za3k/day08_dictionary)). It looks up words.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-7.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-7.png)](https://tilde.za3k.com/hackaday/dictionary/)
 
 OK, I’ll be honest. I’m phoning this one in. I needed a break.
-
-[1]: https://tilde.za3k.com/hackaday/dictionary/
-[2]: https://tilde.za3k.com/hackaday/dictionary/
-[3]: https://github.com/za3k/day08_dictionary
-[4]: https://tilde.za3k.com/hackaday/dictionary/
index af9a1a6193862e190b764efe5bee90e07ab503c2..e0352a5c49d98ed6bcd22385cdbf8a14e408b7ad 100644 (file)
@@ -19,17 +19,12 @@ wordpress_slug: hack-a-day-hack-a-farm
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Farm][1] ([demo][2], [source][3]). It’s a simple tile-based RPG. You can walk around as a chicken, admire your house, and plant and harvest two types of crops.
+Today’s project is [Hack-A-Farm](https://tilde.za3k.com/hackaday/farm/) ([demo](https://tilde.za3k.com/hackaday/farm/), [source](https://github.com/za3k/day27_farm)). It’s a simple tile-based RPG. You can walk around as a chicken, admire your house, and plant and harvest two types of crops.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-25.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-25.png)](https://tilde.za3k.com/hackaday/farm/)
 
 My main goal with this project was to work with spritesheets or animation before, which I had never done. Showing off the individual tiles is deliberate. Also, the game should respond well to smaller and larger screens, I hope.
 
 I had a good time with this one, and I’m happy with how much I got done in a day. I originally planned to do more fluid walking (it was called Hack-A-Walk), but it was more fun to add crops instead.
 
 I re-used some of the logic from Hack-A-Minigame and Hack-A-Snake. I’ve been finding d3 to be mildly useful, if a little annoying.
-
-[1]: https://tilde.za3k.com/hackaday/farm/
-[2]: https://tilde.za3k.com/hackaday/farm/
-[3]: https://github.com/za3k/day27_farm
-[4]: https://tilde.za3k.com/hackaday/farm/
index 24307b2c96c4672b14e1ab0efd39ce027ba77bc8..f4a93e5df442f5ebf771aba6329742a3de032ac6 100644 (file)
@@ -21,17 +21,12 @@ wordpress_slug: hack-a-day-hack-a-hang
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Hang][1] ([demo][2], [source][3]). It’s a place to hang out. It has text chat, video, and audio.
+Today’s project is [Hack-A-Hang](https://tilde.za3k.com/hackaday/hang/) ([demo](https://tilde.za3k.com/hackaday/hang/), [source](https://github.com/za3k/day19_hang)). It’s a place to hang out. It has text chat, video, and audio.
 
 **Hack-A-Hang is NOT WORKING.**
 
 Unfortunately while everything works great on my machine, there’s a bad problem in production, and I ran out of time on this one. I’ll try to get it fixed before the end of the month if it’s easy.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-17.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-17.png)](https://tilde.za3k.com/hackaday/hang/)
 
 Hoo boy, this was one of the technically hardest ones so far. WebRTC is no joke. And not hard in a way where you have to think, hard in a way where the debugging tools are terrible. (Drag and drop was another tough one)
-
-[1]: https://tilde.za3k.com/hackaday/hang/
-[2]: https://tilde.za3k.com/hackaday/hang/
-[3]: https://github.com/za3k/day19_hang
-[4]: https://tilde.za3k.com/hackaday/hang/
index 30185350920c4c3a2892f14c9a21ff24321fc666..fd6af540414abe576831da0612dd41d224d23604 100644 (file)
@@ -19,15 +19,10 @@ wordpress_slug: hack-a-day-hack-a-hell
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Hell][1] ([demo][2], [source][3]). It’s a bullet hell game combined with a music visualizer.
+Today’s project is [Hack-A-Hell](https://tilde.za3k.com/hackaday/hell/) ([demo](https://tilde.za3k.com/hackaday/hell/), [source](https://github.com/za3k/day22_hell)). It’s a bullet hell game combined with a music visualizer.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-19-1024x317.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-19-1024x317.png)](https://tilde.za3k.com/hackaday/hell/)
 
 I’m happy with this one, although it took way too long given yesterday’s project! I keep thinking I’ll be able to modify or re-use things quickly, and it’s not true.
 
 P.S. Taking the next day or two off for thanksgiving
-
-[1]: https://tilde.za3k.com/hackaday/hell/
-[2]: https://tilde.za3k.com/hackaday/hell/
-[3]: https://github.com/za3k/day22_hell
-[4]: https://tilde.za3k.com/hackaday/hell/
index c032477cf3692f24c48fb739f5d4b3370d91d2c3..ecaee04f9cb0451b9bec696da27681e5d0dbbd63 100644 (file)
@@ -18,16 +18,10 @@ wordpress_slug: hack-a-day-hack-a-homepage
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s (catch-up) project is [Hack-A-Homepage][1] ([demo][2], [source][3]). You can enter various information about yourself, such as links to your social media, and make your own little homepage.
+Today’s (catch-up) project is [Hack-A-Homepage](https://tilde.za3k.com/hackaday/homepage/v/zachary) ([demo](https://tilde.za3k.com/hackaday/homepage/v/zachary), [source](https://github.com/za3k/day01_homepage)). You can enter various information about yourself, such as links to your social media, and make your own little homepage.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-5.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-5.png)](https://tilde.za3k.com/hackaday/homepage/v/zachary)
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-4.png)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-4.png)](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-4.png)
 
 This one took about another hour. I think it’s okay, but today was definitely a “do the numbers” game to catch up. Tomorrow I want to do something more fun and new.
-
-[1]: https://tilde.za3k.com/hackaday/homepage/v/zachary
-[2]: https://tilde.za3k.com/hackaday/homepage/v/zachary
-[3]: https://github.com/za3k/day01_homepage
-[4]: https://tilde.za3k.com/hackaday/homepage/v/zachary
-[5]: https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-4.png
index fd43067f3285d8c7f656628dfe1ad16241f1bbbf..96f7665d8882e7d86bc155776a47ea0982655d6e 100644 (file)
@@ -20,15 +20,10 @@ wordpress_slug: hack-a-day-hack-a-line
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Line][1] ([demo][2], [source][3]). Hack-A-Line is a 5-in-a-row game for two players. You play online against each other by sharing a link.
+Today’s project is [Hack-A-Line](https://tilde.za3k.com/hackaday/line/) ([demo](https://tilde.za3k.com/hackaday/line/), [source](https://github.com/za3k/day13_line)). Hack-A-Line is a 5-in-a-row game for two players. You play online against each other by sharing a link.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-11.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-11.png)](https://tilde.za3k.com/hackaday/line/)
 
 I’m okay with this one, except that there’s one really bad display bug that kind of ruins it. I’m starting to develop a list of projects where I might want to go back and fix something after this month.
 
 I skipped yesterday because I needed a break.
-
-[1]: https://tilde.za3k.com/hackaday/line/
-[2]: https://tilde.za3k.com/hackaday/line/
-[3]: https://github.com/za3k/day13_line
-[4]: https://tilde.za3k.com/hackaday/line/
index db32f1fd40f6d430dbc960a293e90205b42299be..8e9123b3b5282c74ce4607c18b147325d4d0df2a 100644 (file)
@@ -17,13 +17,8 @@ wordpress_slug: hack-a-day-hack-a-link-2
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Wednesday’s project was [Hack-A-Link 2][1] ([demo][2], [source][3]). It’s an open link directory.
+Wednesday’s project was [Hack-A-Link 2](https://tilde.za3k.com/hackaday/link/) ([demo](https://tilde.za3k.com/hackaday/link/), [source](https://github.com/za3k/day02_link)). It’s an open link directory.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-20.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-20.png)](https://tilde.za3k.com/hackaday/link/)
 
 This was very much a “phone it in” project. I do think it could have been better if I had added descriptions, too.
-
-[1]: https://tilde.za3k.com/hackaday/link/
-[2]: https://tilde.za3k.com/hackaday/link/
-[3]: https://github.com/za3k/day02_link
-[4]: https://tilde.za3k.com/hackaday/link/
index c9eb1aaf95edd742ae9a60b5803ed647999e5852..2f688ecffbfe7939cb8512bbec19c90346c1f859 100644 (file)
@@ -18,13 +18,8 @@ wordpress_slug: hack-a-day-hack-a-link
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s (catch-up) project is [Hack-A-Link][1] ([demo][2], [source][3]). You can enter a long link, and it will be shortened.
+Today’s (catch-up) project is [Hack-A-Link](https://tilde.za3k.com/hackaday/link) ([demo](https://tilde.za3k.com/hackaday/link), [source](https://github.com/za3k/day02_link)). You can enter a long link, and it will be shortened.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-3.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-3.png)](https://tilde.za3k.com/hackaday/link)
 
 This one was also pretty easy. About an hour.
-
-[1]: https://tilde.za3k.com/hackaday/link
-[2]: https://tilde.za3k.com/hackaday/link
-[3]: https://github.com/za3k/day02_link
-[4]: https://tilde.za3k.com/hackaday/link
index 0530b91afe9571fbe1a1cc3e13232cbe6a0fb63d..0e504a9541ebf40022814a50222797cda60a71eb 100644 (file)
@@ -20,11 +20,11 @@ wordpress_slug: hack-a-day-hack-a-machine
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Machine][1] ([demo][2], [source][3]). It’s a whimsical VM you can play around with.
+Today’s project is [Hack-A-Machine](https://tilde.za3k.com/hackaday/machine/) ([demo](https://tilde.za3k.com/hackaday/machine/), [source](https://github.com/za3k/day10_machine)). It’s a whimsical VM you can play around with.
 
 I liked this one, but it really didn’t fit into a day too well.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-9.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-9.png)](https://tilde.za3k.com/hackaday/machine/)
 
 Features include:
 
@@ -46,8 +46,3 @@ Sadly not in the “one day” category are
 -   syntax highlighting
 -   the entire machine 100% working (I tested a little!)
 -   fixing all the bugs (there’s a particularly nasty one where you have to save before you run)
-
-[1]: https://tilde.za3k.com/hackaday/machine/
-[2]: https://tilde.za3k.com/hackaday/machine/
-[3]: https://github.com/za3k/day10_machine
-[4]: https://tilde.za3k.com/hackaday/machine/
index 92f463fa1d06c36250fdfe73102a815fc26f4cbf..336be53e49d7e8636c1de78cff12e842eb08a839 100644 (file)
@@ -18,11 +18,6 @@ wordpress_slug: hack-a-day-hack-a-mandelbrot
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Mandelbrot][1] ([demo][2], [source][3]). Interactively explore the fractal world of the Mandelbrot set.
+Today’s project is [Hack-A-Mandelbrot](https://tilde.za3k.com/hackaday/mandelbrot/) ([demo](https://tilde.za3k.com/hackaday/mandelbrot/), [source](https://github.com/za3k/day09_mandelbrot)). Interactively explore the fractal world of the Mandelbrot set.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-8.png)][4]
-
-[1]: https://tilde.za3k.com/hackaday/mandelbrot/
-[2]: https://tilde.za3k.com/hackaday/mandelbrot/
-[3]: https://github.com/za3k/day09_mandelbrot
-[4]: https://tilde.za3k.com/hackaday/mandelbrot/
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-8.png)](https://tilde.za3k.com/hackaday/mandelbrot/)
index b4455120860b62ffed5aff6554c21e88e5e609ac..2c62a07dbd2d7bdd6812d3c5a78378af57865ade 100644 (file)
@@ -20,14 +20,8 @@ wordpress_slug: hack-a-day-hack-a-minigame
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Minigame][1] ([demo][2], [source][3]). It’s the classic Snake, but the twist is you can only save and load the game. Rather than controlling the snake, it moves at random under AI control. You have to repeatedly save and load to make progress.
+Today’s project is [Hack-A-Minigame](https://tilde.za3k.com/hackaday/mini/) ([demo](https://tilde.za3k.com/hackaday/mini/), [source](https://github.com/za3k/day26_mini)). It’s the classic Snake, but the twist is you can only save and load the game. Rather than controlling the snake, it moves at random under AI control. You have to repeatedly save and load to make progress.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-23.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-23.png)](https://tilde.za3k.com/hackaday/mini/)
 
-Credit to Jeff Lait’s “[Save Scummer][5]” 7-day roguelike for inspiration. Although actually, this whole minigame is mostly for a future project!
-
-[1]: https://tilde.za3k.com/hackaday/mini/
-[2]: https://tilde.za3k.com/hackaday/mini/
-[3]: https://github.com/za3k/day26_mini
-[4]: https://tilde.za3k.com/hackaday/mini/
-[5]: http://www.zincland.com/7drl/savescummer/
+Credit to Jeff Lait’s “[Save Scummer](http://www.zincland.com/7drl/savescummer/)” 7-day roguelike for inspiration. Although actually, this whole minigame is mostly for a future project!
index 654d04c0c1be895fcf723e74a3bc8fbebef5b375..685b66a80c220d65c87a42549ebe248aa07aae44 100644 (file)
@@ -18,13 +18,8 @@ wordpress_slug: hack-a-day-hack-a-paste
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Paste][1] ([demo][2], [source][3]). You can upload text and share it with others.
+Today’s project is [Hack-A-Paste](https://tilde.za3k.com/hackaday/paste) ([demo](https://tilde.za3k.com/hackaday/paste), [source](https://github.com/za3k/day05_paste)). You can upload text and share it with others.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-1.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-1.png)](https://tilde.za3k.com/hackaday/paste)
 
 Today’s project was an easy one, because I was busy. Took an hour or two.
-
-[1]: https://tilde.za3k.com/hackaday/paste
-[2]: https://tilde.za3k.com/hackaday/paste
-[3]: https://github.com/za3k/day05_paste
-[4]: https://tilde.za3k.com/hackaday/paste
index 6ce088f03c500da5780118f2b3804675dfbb604f..a4f9625a4e3da15f7158145ba77c085c4a4e51b6 100644 (file)
@@ -19,12 +19,6 @@ wordpress_slug: hack-a-day-hack-a-snake
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Snake][1] ([demo][2], [source][3]). Yesterday I wrote a [game where an AI plays snake][4]. Today I thought, hey, I should release that with keyboard controls so people can just play Snake.
+Today’s project is [Hack-A-Snake](https://tilde.za3k.com/hackaday/snake/) ([demo](https://tilde.za3k.com/hackaday/snake/), [source](https://github.com/za3k/day12_snake)). Yesterday I wrote a [game where an AI plays snake](https://blog.za3k.com/hack-a-day-hack-a-minigame/). Today I thought, hey, I should release that with keyboard controls so people can just play Snake.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-24.png)][5]
-
-[1]: https://tilde.za3k.com/hackaday/snake/
-[2]: https://tilde.za3k.com/hackaday/snake/
-[3]: https://github.com/za3k/day12_snake
-[4]: https://blog.za3k.com/hack-a-day-hack-a-minigame/
-[5]: https://tilde.za3k.com/hackaday/snake/
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-24.png)](https://tilde.za3k.com/hackaday/snake/)
index 2c4ddfcd16cb688d1d19dea1c2a7c7f349bb7330..ce6ac8953439ae7699890da759468bc0b1c0c848 100644 (file)
@@ -18,11 +18,6 @@ wordpress_slug: hack-a-day-hack-a-song
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Song][1] ([demo][2], [source][3]). It plays greensleeves, and you can edit the music to play something else, too.
+Today’s project is [Hack-A-Song](https://tilde.za3k.com/hackaday/song/) ([demo](https://tilde.za3k.com/hackaday/song/), [source](https://github.com/za3k/day16_song)). It plays greensleeves, and you can edit the music to play something else, too.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-14.png)][4]
-
-[1]: https://tilde.za3k.com/hackaday/song/
-[2]: https://tilde.za3k.com/hackaday/song/
-[3]: https://github.com/za3k/day16_song
-[4]: https://tilde.za3k.com/hackaday/song/
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-14.png)](https://tilde.za3k.com/hackaday/song/)
index 6b4a295ae3ac334065d284ceb3486c385613b51c..a82cdd2f7855ed5dace62ff4f3168990c2d5f231 100644 (file)
@@ -20,7 +20,7 @@ wordpress_slug: hack-a-day-hack-a-sound
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Sound][1] ([demo][2], [source][3]). It’s a small soundboard.
+Today’s project is [Hack-A-Sound](https://tilde.za3k.com/hackaday/sound/) ([demo](https://tilde.za3k.com/hackaday/sound/), [source](https://github.com/za3k/day15_sound)). It’s a small soundboard.
 
 You can:
 
@@ -32,11 +32,6 @@ You can:
 -   Use a keyboard or mouse
 -   (Mobile not supported)
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-13.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-13.png)](https://tilde.za3k.com/hackaday/sound/)
 
 Have fun. I think this was a pretty good toy.
-
-[1]: https://tilde.za3k.com/hackaday/sound/
-[2]: https://tilde.za3k.com/hackaday/sound/
-[3]: https://github.com/za3k/day15_sound
-[4]: https://tilde.za3k.com/hackaday/sound/
index f3f6e6c230fe16943a10b52425ee7ec465b697e0..6eedb48d2948f6bfdde62d4161ebf110699b6926 100644 (file)
@@ -18,13 +18,8 @@ wordpress_slug: hack-a-day-hack-a-stats
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Stats][1] ([demo][2], [source][3]). It displays web traffic statistics about Hack-A-Day.
+Today’s project is [Hack-A-Stats](https://tilde.za3k.com/hackaday/stats/) ([demo](https://tilde.za3k.com/hackaday/stats/), [source](https://github.com/za3k/day14_stats)). It displays web traffic statistics about Hack-A-Day.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-12.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-12.png)](https://tilde.za3k.com/hackaday/stats/)
 
 The original point of the project was to show some nice graphs in d3, as an effort to teach myself d3. But halfway through I got unbearably bored by “show a bunch of stats” as a project, so no d3. Whoops! You win some you lose some.
-
-[1]: https://tilde.za3k.com/hackaday/stats/
-[2]: https://tilde.za3k.com/hackaday/stats/
-[3]: https://github.com/za3k/day14_stats
-[4]: https://tilde.za3k.com/hackaday/stats/
index d8fcab42bc745028c9cd788d443c08c110349a92..5a8c284b4b00929577203ea2f50ea1af5edd9ffb 100644 (file)
@@ -19,11 +19,6 @@ wordpress_slug: hack-a-day-hack-a-tank
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Tank][1] ([demo][2], [source][3]). It’s a relaxing fishtank toy. Enjoy.
+Today’s project is [Hack-A-Tank](https://tilde.za3k.com/hackaday/tank/) ([demo](https://tilde.za3k.com/hackaday/tank/), [source](https://github.com/za3k/day17_tank)). It’s a relaxing fishtank toy. Enjoy.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-15.png)][4]
-
-[1]: https://tilde.za3k.com/hackaday/tank/
-[2]: https://tilde.za3k.com/hackaday/tank/
-[3]: https://github.com/za3k/day17_tank
-[4]: https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-15.png
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-15.png)](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-15.png)
index b7e0cb5c514496d73827c1c93ecbe5946968e57d..306d1c120aecbd84f4dc87ad9080aa7ad75ff5de 100644 (file)
@@ -20,11 +20,11 @@ wordpress_slug: hack-a-day-hack-a-tile
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-A-Tile][1] ([demo][2], [source][3]). It’s a tile-matching game like dominos.
+Today’s project is [Hack-A-Tile](https://tilde.za3k.com/hackaday/tile/) ([demo](https://tilde.za3k.com/hackaday/tile/), [source](https://github.com/za3k/day11_tile)). It’s a tile-matching game like dominos.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-10.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-10.png)](https://tilde.za3k.com/hackaday/tile/)
 
-Hack-A-Tile is based on mathematical [Wang tiles][5]. It was very tempting to call it Hack-A-Wang.
+Hack-A-Tile is based on mathematical [Wang tiles](https://en.wikipedia.org/wiki/Wang_tile). It was very tempting to call it Hack-A-Wang.
 
 If I update it, I would
 
@@ -32,9 +32,3 @@ If I update it, I would
 -   Animate shifting over. Right now adding tiles on the top or left is visually confusing.
 -   Change the tiles. These are fun mathematically, but not ideal for a game
 -   Either add a maximum size, or some constraint to stop you just making one long line.
-
-[1]: https://tilde.za3k.com/hackaday/tile/
-[2]: https://tilde.za3k.com/hackaday/tile/
-[3]: https://github.com/za3k/day11_tile
-[4]: https://tilde.za3k.com/hackaday/tile/
-[5]: https://en.wikipedia.org/wiki/Wang_tile
index ada27882913c2c3d5f291861360b7a5c75b9c0f4..7359b07e96d17d260fd01f65b7f6c9116cbc7d76 100644 (file)
@@ -19,15 +19,8 @@ wordpress_slug: hack-a-day-hack-a-tv-guide
 ---
 It’s no longer november, but I’m still doing a project a day. It’s an all-month hack-a-thon!
 
-Yesterday’s project was [Hack-A-TV-Guide][1] ([demo][2], [source][3]). It’s a TV Guide generated from [Wikipedia][4]. I got the idea from having written [isrickandmortyout.com][5]. Why not do the same thing, but for every show?
+Yesterday’s project was [Hack-A-TV-Guide](https://tilde.za3k.com/hackaday/tvguide/) ([demo](https://tilde.za3k.com/hackaday/tvguide/), [source](https://github.com/za3k/day33_tvguide)). It’s a TV Guide generated from [Wikipedia](https://en.wikipedia.org/wiki/Main_Page). I got the idea from having written [isrickandmortyout.com](http://isrickandmortyout.com/). Why not do the same thing, but for every show?
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/12/screenshot-1.png)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2022/12/screenshot-1.png)](https://tilde.za3k.com/hackaday/tvguide/)
 
 I’m going to call this one a flop. There’s a good version of this project, but I ran out of time. Basically all it does is display info about a show, which is not very useful.
-
-[1]: https://tilde.za3k.com/hackaday/tvguide/
-[2]: https://tilde.za3k.com/hackaday/tvguide/
-[3]: https://github.com/za3k/day33_tvguide
-[4]: https://en.wikipedia.org/wiki/Main_Page
-[5]: http://isrickandmortyout.com/
-[6]: https://tilde.za3k.com/hackaday/tvguide/
index 6daeaec10cf47368d06b52b6c52da4dd6c8c2e48..07299ebc4bdcf1fa4ae1c24dfddb2500da4a0f7c 100644 (file)
@@ -19,11 +19,6 @@ wordpress_slug: hack-a-day-hack-an-adventure
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-An-Adventure][1] ([demo][2], [source][3]). It’s a coloring book. It’s designed to be relaxing.
+Today’s project is [Hack-An-Adventure](https://tilde.za3k.com/hackaday/adventure/) ([demo](https://tilde.za3k.com/hackaday/adventure/), [source](https://github.com/za3k/day29_adventure)). It’s a coloring book. It’s designed to be relaxing.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot.gif)][4]
-
-[1]: https://tilde.za3k.com/hackaday/adventure/
-[2]: https://tilde.za3k.com/hackaday/adventure/
-[3]: https://github.com/za3k/day29_adventure
-[4]: https://tilde.za3k.com/hackaday/adventure/
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot.gif)](https://tilde.za3k.com/hackaday/adventure/)
index 905cc89bbb62461da00a61928d55b7f242d10d25..9bcb96d7c89c772b4706336c6e01064ea79d32f6 100644 (file)
@@ -19,13 +19,8 @@ wordpress_slug: hack-a-day-hack-an-asteroid
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-An-Asteroid][1] ([demo][2], [source][3]). It’s an asteroids clone with four levels.
+Today’s project is [Hack-An-Asteroid](https://tilde.za3k.com/hackaday/asteroid/) ([demo](https://tilde.za3k.com/hackaday/asteroid/), [source](https://github.com/za3k/day07_asteroid)). It’s an asteroids clone with four levels.
 
 I’m pretty happy with this as my first “visual” game. I made it in Unity3D.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-1024x700.jpg)][4]
-
-[1]: https://tilde.za3k.com/hackaday/asteroid/
-[2]: https://tilde.za3k.com/hackaday/asteroid/
-[3]: https://github.com/za3k/day07_asteroid
-[4]: https://tilde.za3k.com/hackaday/asteroid/
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-1024x700.jpg)](https://tilde.za3k.com/hackaday/asteroid/)
index 6c655dd7474dc87e1aacb0576c1e81d847dd9ccc..cb8256df23ae7fd4f2a41592d76036a39e76df7b 100644 (file)
@@ -17,13 +17,8 @@ wordpress_slug: hack-a-day-hack-an-experiment
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project was [Hack-An-Experiment][1] ([demo][2], [source][3]). It’s designed to present the basics of experimental algorithmics, while also getting me acquainted with d3.
+Today’s project was [Hack-An-Experiment](https://tilde.za3k.com/hackaday/experiment/) ([demo](https://tilde.za3k.com/hackaday/experiment/), [source](https://github.com/za3k/day25_experiment)). It’s designed to present the basics of experimental algorithmics, while also getting me acquainted with d3.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-22-1024x640.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-22-1024x640.png)](https://tilde.za3k.com/hackaday/experiment/)
 
 I have to say, I keep seeing d3 sold as a “graphing” library. And it’s definitely not. Maybe you could write one on top of it.
-
-[1]: https://tilde.za3k.com/hackaday/experiment/
-[2]: https://tilde.za3k.com/hackaday/experiment/
-[3]: https://github.com/za3k/day25_experiment
-[4]: https://tilde.za3k.com/hackaday/experiment/
index 21d63e761d7fdcbe4398c44fc55a7d8a40d7836d..810763cf5f6401b284082ba6f486eb69a4ee0061 100644 (file)
@@ -19,20 +19,14 @@ wordpress_slug: hack-a-day-hack-an-icecube-failure
 ---
 It’s november, and I’ve decided this month that I’m going to do 30 projects in 30 days. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-An-Icecube][1] ([demo][2], [source][3]). It’s a failed attempt to make a game in Unity3D, the game engine/framework.
+Today’s project is [Hack-An-Icecube](https://tilde.za3k.com/hackaday/icecube/) ([demo](https://tilde.za3k.com/hackaday/icecube/), [source](https://github.com/za3k/day06_icecube)). It’s a failed attempt to make a game in Unity3D, the game engine/framework.
 
 This is my first failure, which I think is good! I was getting bored only attempting things I could definitely succeed at in one day. That said, running out of time is fun. Wrestling the IDE isn’t. This was mostly wrestling the IDE, setting configs, and installing software.
 
 I won’t continue this tomorrow, I’d rather do a new project each day (It’s called Hack-A-**DAY**)! But I might do another Unity3D project before the month is out.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-6.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-6.png)](https://tilde.za3k.com/hackaday/icecube/)
 
 The ice cubes load and fall, and that’s it. No controls, no game. I ran out of time.
 
-This is an attempt to recreate [One Hour Jam Cannon][5] by juzek exactly. I ran out of time, but I made some progress getting Unity to work.
-
-[1]: https://tilde.za3k.com/hackaday/icecube/
-[2]: https://tilde.za3k.com/hackaday/icecube/
-[3]: https://github.com/za3k/day06_icecube
-[4]: https://tilde.za3k.com/hackaday/icecube/
-[5]: https://juzek.itch.io/one-hour-jam-cannon
+This is an attempt to recreate [One Hour Jam Cannon](https://juzek.itch.io/one-hour-jam-cannon) by juzek exactly. I ran out of time, but I made some progress getting Unity to work.
index 006bdd04da52d42b8c2062f6f3c6d9b18161a34e..94e922963cb9e3f5a0bd22b66b0eb4abe1cd5ca9 100644 (file)
@@ -21,11 +21,6 @@ It’s november, and I’ve decided this month that I’m going to do 30 project
 
 This is November 30th, so this will be the last project.
 
-Today’s project is [Hack-An-MMO][1] ([demo][2], [source][3]). It’s a small collaborative art RPG. You can draw people, places, and things to populate the tiny world. Have fun!
+Today’s project is [Hack-An-MMO](https://tilde.za3k.com/hackaday/mmo/) ([demo](https://tilde.za3k.com/hackaday/mmo/), [source](https://github.com/za3k/day30_mmo)). It’s a small collaborative art RPG. You can draw people, places, and things to populate the tiny world. Have fun!
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-26.png)][4]
-
-[1]: https://tilde.za3k.com/hackaday/mmo/
-[2]: https://tilde.za3k.com/hackaday/mmo/
-[3]: https://github.com/za3k/day30_mmo
-[4]: https://tilde.za3k.com/hackaday/mmo/
+[![](https://blog.za3k.com/wp-content/uploads/2022/11/screenshot-26.png)](https://tilde.za3k.com/hackaday/mmo/)
index 171fb1aefc81f7c7806e3b39b3115b20b914a473..7326ef3004eb56573a9a613118dc893fa2a3bcc8 100644 (file)
@@ -16,13 +16,8 @@ wordpress_slug: hack-a-day-hack-an-uptime
 ---
 It’s no longer november, but I’m still doing a project a day. It’s an all-month hack-a-thon!
 
-Today’s project is [Hack-An-Uptime][1] ([demo][2], [source][3]). It’s a simple experiment where you press a button every day.
+Today’s project is [Hack-An-Uptime](https://tilde.za3k.com/hackaday/uptime/) ([demo](https://tilde.za3k.com/hackaday/uptime/), [source](https://github.com/za3k/day34_uptime)). It’s a simple experiment where you press a button every day.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/12/screenshot-2.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2022/12/screenshot-2.png)](https://tilde.za3k.com/hackaday/uptime/)
 
 This was a very simple project. I’m curious what will happen with it.
-
-[1]: https://tilde.za3k.com/hackaday/uptime/
-[2]: https://tilde.za3k.com/hackaday/uptime/
-[3]: https://github.com/za3k/day34_uptime
-[4]: https://tilde.za3k.com/hackaday/uptime/
index 111e2f1eaa76bd29c491236d9117014555d26f41..f232a59b8b73add3e9d6799e509cf1929a2e2f19 100644 (file)
@@ -13,9 +13,6 @@ updated: 2022-11-18 21:11:11-07:00
 wordpress_id: 915
 wordpress_slug: hack-a-day-website
 ---
-Hack-A-Day has its own website now: [https://za3k.com/hackaday][1]
+Hack-A-Day has its own website now: [https://za3k.com/hackaday](https://za3k.com/hackaday)
 
-Yes, this is why I wrote [Hack-A-Crop][2].
-
-[1]: https://za3k.com/hackaday
-[2]: https://blog.za3k.com/hack-a-day-hack-a-crop/
+Yes, this is why I wrote [Hack-A-Crop](https://blog.za3k.com/hack-a-day-hack-a-crop/).
index 7ada3b180e31310f18e8d75a49f390e347d9d52e..6a5fa29f67dbbe0d5cbd8d39ac4739b6bf83c590 100644 (file)
@@ -11,6 +11,4 @@ updated: 2023-07-23 14:31:07-07:00
 wordpress_id: 1
 wordpress_slug: hello-world
 ---
-This is my new blog! The old content is [archived][1].
-
-[1]: https://za3k.com/archive/wordpress/
+This is my new blog! The old content is [archived](https://za3k.com/archive/wordpress/).
index dd5c8656757aa3c984726813d062628a0f6fa580..4ab4f47b0eb9f9e0932a3bf56fcf6cbcb8d1742b 100644 (file)
@@ -14,15 +14,10 @@ updated: 2023-12-31 16:25:22-07:00
 wordpress_id: 1263
 wordpress_slug: hillsfar-lockpicking-20-complete
 ---
-The game can be played [here][1]. Source code is [on github][2].
+The game can be played [here](https://za3k.github.io/ha3k-20-lockpick/). Source code is [on github](https://za3k.github.io/ha3k-20-lockpick/).
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/12/screenshot.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/12/screenshot.png)](https://za3k.github.io/ha3k-20-lockpick/)
 
 Info about the original 1989 Hillsfar game is linked from the demo! Enjoy.
 
-See also the [previous blog post][4] about the spritesheet.
-
-[1]: https://za3k.github.io/ha3k-20-lockpick/
-[2]: https://za3k.github.io/ha3k-20-lockpick/
-[3]: https://za3k.github.io/ha3k-20-lockpick/
-[4]: https://blog.za3k.com/hack-a-day-day-20-hillsfar-lockpicking-spritesheet/
+See also the [previous blog post](https://blog.za3k.com/hack-a-day-day-20-hillsfar-lockpicking-spritesheet/) about the spritesheet.
index e1e7cf0528661059213fe80ab3bdfac6da8fdc3c..f17d1f942157e2b5a8f2f45c6a187f46f292c50e 100644 (file)
@@ -14,8 +14,6 @@ wordpress_slug: how-to-retire-for-infinity-years
 ---
 I retired at 31, and get asked about it sometimes. I wrote an article about how the math of retirement, which explains how I retired early (and some some extent, why). And of course, how and why you might want to as well.
 
-I want to edit my finances articles, so this one is on my website instead: [https://za3k.com/finance/retire\_forever][1]
+I want to edit my finances articles, so this one is on my website instead: [https://za3k.com/finance/retire\_forever](https://za3k.com/finance/retire_forever)
 
 There will probably be some more finances articles to come soon.
-
-[1]: https://za3k.com/finance/retire_forever
index 6899f4dbd96edb691ef7aa7b379616f7ef7f666a..625e9a759d57c7935d034cb886977c6d39f00adb 100644 (file)
@@ -15,9 +15,6 @@ updated: 2023-07-21 16:45:06-07:00
 wordpress_id: 1117
 wordpress_slug: html-css-cheatsheet
 ---
-I made an [animated HTML + CSS cheatsheet][1]. This took me about three days. It is not really intended for beginners. It contains stuff I frequently forget myself.
+I made an [animated HTML + CSS cheatsheet](https://za3k.com/html-css-cheatsheet). This took me about three days. It is not really intended for beginners. It contains stuff I frequently forget myself.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/2023-07-21-194333_1920x1080_scrot-crop.png)][2]
-
-[1]: https://za3k.com/html-css-cheatsheet
-[2]: https://za3k.com/html-css-cheatsheet
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/2023-07-21-194333_1920x1080_scrot-crop.png)](https://za3k.com/html-css-cheatsheet)
index d553e6f50e21f05264a13a97e8724ff15abfe454..b3ca81a359184150834cc9f429c7a1920c0d3a91 100644 (file)
@@ -15,47 +15,59 @@ updated: 2015-10-17 19:27:12-07:00
 wordpress_id: 263
 wordpress_slug: installing-canon-imageclass-lbp-6000-on-64-bit-debian
 ---
-(From [Stack Overflow][1])
+(From [Stack Overflow](http://askubuntu.com/questions/463289/cant-get-my-canon-lbp-printer-to-run-under-ubuntu-14-04/464334))
 
 1.  64 bit requirements for pre-made binaries:
     
+    ```
     sudo dpkg --add-architecture i386
     sudo apt-get update
     sudo apt-get install libstdc++6:i386 libxml2:i386 zlib1g:i386 libpopt0:i386
+    ```
     
 2.  Install CUPS
     
+    ```
     sudo apt-get update
     sudo apt-get install cups
+    ```
     
-3.  Download DriverGo to [http://support-au.canon.com.au/contents/AU/EN/0100459602.html][2] and download driver
+3.  Download DriverGo to [http://support-au.canon.com.au/contents/AU/EN/0100459602.html](http://support-au.canon.com.au/contents/AU/EN/0100459602.html) and download driver
     
-    64e2d00f0c8764d4032687d29e88f06727d88825 Linux\_CAPT\_PrinterDriver\_V270\_uk\_EN.tar.gz
+    ```
+    64e2d00f0c8764d4032687d29e88f06727d88825 Linux_CAPT_PrinterDriver_V270_uk_EN.tar.gz
+    ```
     
 4.  Extract and enter extracted folder
     
-    tar xf Linux\_CAPT\_PrinterDriver\_V270\_uk\_EN.tar.gz
-    cd Linux\_CAPT\_PrinterDriver\_V270\_uk\_EN
+    ```
+    tar xf Linux_CAPT_PrinterDriver_V270_uk_EN.tar.gz
+    cd Linux_CAPT_PrinterDriver_V270_uk_EN
+    ```
     
 5.  Install the custom drivers and ccpd
     
-    sudo dpkg -i 64-bit\_Driver/Debian/\*.deb
+    ```
+    sudo dpkg -i 64-bit_Driver/Debian/*.deb
+    ```
     
 6.  Add the printer to CUPS and ccpd
     
-    sudo lpadmin -p CANON\_LBP6000 -m CNCUPSLBP6018CAPTS.ppd -v ccp://localhost:59687
-    sudo lpadmin -p CANON\_LBP6000 -E
+    ```
+    sudo lpadmin -p CANON_LBP6000 -m CNCUPSLBP6018CAPTS.ppd -v ccp://localhost:59687
+    sudo lpadmin -p CANON_LBP6000 -E
     
-    sudo ccpdadmin -p CANON\_LBP6000 -o /dev/usb/lp0
+    sudo ccpdadmin -p CANON_LBP6000 -o /dev/usb/lp0
+    ```
     
 7.  Set the default printer
     
-    sudo lpoptions -d CANON\_LBP6000
+    ```
+    sudo lpoptions -d CANON_LBP6000
+    ```
     
 8.  Set ccpd to start on boot
     
+    ```
     sudo update-rc.d ccpd defaults
-    
-
-[1]: http://askubuntu.com/questions/463289/cant-get-my-canon-lbp-printer-to-run-under-ubuntu-14-04/464334
-[2]: http://support-au.canon.com.au/contents/AU/EN/0100459602.html
+    ```
index 0070fe6b6606fefcafbcef539fadbde45b79fb7a..0f7b644742693b6da2cf3284dfc84a2915f4e2d1 100644 (file)
@@ -33,110 +33,123 @@ On to the install!
 
 1.  Install debian packages
     
-    sudo apt-get install postfix # Postfix \\
-          dovecot-core dovecot-imapd dovecot-lmtpd # Dovecot \\
-          postgresql dovecot-pgsql postfix-pgsql # Postgres \\
+    ```
+    sudo apt-get install postfix # Postfix \
+          dovecot-core dovecot-imapd dovecot-lmtpd # Dovecot \
+          postgresql dovecot-pgsql postfix-pgsql # Postgres \
           opendkim opendkim-tools # DKIM
+    ```
     
-2.  Set up security. smtp.za3k.com cert is at /etc/certs/zak3.com.pem, the key is at /etc/ssl/private/smtp.za3k.com.key. dhparams for postfix are at /etc/postfix/dhparams.pem. (If you need a certificate and don’t know how to get one, you can read [Setting up SSL certificates using StartSSL][1])
+2.  Set up security. smtp.za3k.com cert is at /etc/certs/zak3.com.pem, the key is at /etc/ssl/private/smtp.za3k.com.key. dhparams for postfix are at /etc/postfix/dhparams.pem. (If you need a certificate and don’t know how to get one, you can read [Setting up SSL certificates using StartSSL](https://blog.za3k.com/setting-up-ssl-certificates-using-startssl/ "Setting up SSL certificates using StartSSL"))
 3.  Install Postfix
     
-    \# /etc/postfix/master.cf
+    ```
+    # /etc/postfix/master.cf
     smtp       inet  n       -       -       -       -       smtpd
     submission inet  n       -       -       -       -       smtpd
-      -o syslog\_name=postfix/submission
-      -o smtpd\_tls\_security\_level=encrypt
-      -o smtpd\_sasl\_auth\_enable=yes
-      -o smtpd\_reject\_unlisted\_recipient=no
-      -o milter\_macro\_daemon\_name=ORIGINATING
-    
-    \# /etc/postfix/main.cf additions
+      -o syslog_name=postfix/submission
+      -o smtpd_tls_security_level=encrypt
+      -o smtpd_sasl_auth_enable=yes
+      -o smtpd_reject_unlisted_recipient=no
+      -o milter_macro_daemon_name=ORIGINATING
+    ```
+    
+    ```
+    # /etc/postfix/main.cf additions
     # TLS parameters
-    smtpd\_tls\_cert\_file=/etc/ssl/certs/smtp.za3k.com.pem
-    smtpd\_tls\_key\_file=/etc/ssl/private/smtp.za3k.com.key
-    smtpd\_use\_tls=yes
-    smtpd\_tls\_mandatory\_protocols=!SSLv2,!SSLv3
-    smtp\_tls\_mandatory\_protocols=!SSLv2,!SSLv3
-    smtpd\_tls\_protocols=!SSLv2,!SSLv3
-    smtp\_tls\_protocols=!SSLv2,!SSLv3
-    smtpd\_tls\_exclude\_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA
+    smtpd_tls_cert_file=/etc/ssl/certs/smtp.za3k.com.pem
+    smtpd_tls_key_file=/etc/ssl/private/smtp.za3k.com.key
+    smtpd_use_tls=yes
+    smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
+    smtp_tls_mandatory_protocols=!SSLv2,!SSLv3
+    smtpd_tls_protocols=!SSLv2,!SSLv3
+    smtp_tls_protocols=!SSLv2,!SSLv3
+    smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA
     
     # Relay and recipient settings
     myhostname = za3k.com
     myorigin = /etc/mailname
     mydestination = za3k.com, smtp.za3k.com, localhost.com, localhost
     relayhost =
-    mynetworks\_style = host
-    mailbox\_size\_limit = 0
-    inet\_interfaces = all
-    smtpd\_relay\_restrictions = permit\_mynetworks,
-      permit\_sasl\_authenticated,
-      reject\_unauth\_destination
-    
-    alias\_maps = hash:/etc/aliases
-    local\_recipient\_maps = $alias\_maps
-    mailbox\_transport = lmtp:unix:private/dovecot-lmtp
+    mynetworks_style = host
+    mailbox_size_limit = 0
+    inet_interfaces = all
+    smtpd_relay_restrictions = permit_mynetworks,
+      permit_sasl_authenticated,
+      reject_unauth_destination
+    
+    alias_maps = hash:/etc/aliases
+    local_recipient_maps = $alias_maps
+    mailbox_transport = lmtp:unix:private/dovecot-lmtp
+    ```
     
 4.  Install Dovecot
     
-    \# /etc/dovecot/dovecot.cf
-    mail\_privileged\_group = mail # Local mail
-    disable\_plaintext\_auth = no
+    ```
+    # /etc/dovecot/dovecot.cf
+    mail_privileged_group = mail # Local mail
+    disable_plaintext_auth = no
     
     protocols = imap
     
     ssl=required
-    ssl\_cert = </etc/ssl/certs/imap.za3k.com.pem
-    ssl\_key = </etc/ssl/private/imap.za3k.com.key
+    ssl_cert = </etc/ssl/certs/imap.za3k.com.pem
+    ssl_key = </etc/ssl/private/imap.za3k.com.key
     
     # IMAP Folders
     namespace {
      inbox = yes
      mailbox Trash {
      auto = create
-     special\_use = \\Trash
+     special_use = \Trash
      }
      mailbox Drafts {
      auto = no
-     special\_use = \\Drafts
+     special_use = \Drafts
      }
      mailbox Sent {
      auto = subscribe
-     special\_use = \\Sent
+     special_use = \Sent
      }
      mailbox Spam {
      auto = subscribe
-     special\_use = \\Junk
+     special_use = \Junk
      }
     }
     
-    # Expunging / deleting mail should FAIL, use the lazy\_expunge plugin for this
+    # Expunging / deleting mail should FAIL, use the lazy_expunge plugin for this
     namespace {
      prefix = .EXPUNGED/
      hidden = yes
      list = no
      location = maildir:~/expunged
     }
-    mail\_plugins = $mail\_plugins lazy\_expunge
+    mail_plugins = $mail_plugins lazy_expunge
     plugin {
-     lazy\_expunge = .EXPUNGED/
+     lazy_expunge = .EXPUNGED/
     }
+    ```
     
-    \# /etc/postfix/main.cf
+    ```
+    # /etc/postfix/main.cf
     # SASL authentication is done through Dovecot to let users relay mail
-    smtpd\_sasl\_type = dovecot
-    smtpd\_sasl\_path = private/auth
+    smtpd_sasl_type = dovecot
+    smtpd_sasl_path = private/auth
+    ```
     
 5.  Set up the database and virtual users. Commands
     
-    \# Create the user vmail for storing virtual mail
+    ```
+    # Create the user vmail for storing virtual mail
     # vmail:x:5000:5000::/var/mail/vmail:/usr/bin/nologin
     groupadd -g 5000 vmail
     mkdir /var/mail/vmail
     useradd -M -d /var/mail/vmail --shell=/usr/bin/nologin -u 5000 -g vmail vmail
     chown vmail:vmail /var/mail/vmail
     chmod 700 /var/mail/vmail
+    ```
     
+    ```
     psql -U postgres
     ; Set up the users
     CREATE USER 'postfix' PASSWORD 'XXX';
@@ -144,7 +157,7 @@ On to the install!
     
     ; Create the database
     CREATE DATABASE email;
-    \\connect email
+    \connect email
     
     ; Set up the schema 
     
@@ -167,10 +180,12 @@ On to the install!
     REVOKE ALL ON TABLE users FROM PUBLIC;
     GRANT ALL ON TABLE users TO dovecot;
     GRANT ALL ON TABLE users TO postfix;
+    ```
     
-    \# /etc/dovecot/dovecot.conf
+    ```
+    # /etc/dovecot/dovecot.conf
     # Since we're giving each virtual user their own directory under /var/mail/vmail, just use that directly and not a subdirectory
-    mail\_location = maildir:~/
+    mail_location = maildir:~/
     
     # /etc/dovecot/dovecot-sql.conf defines the DB queries used for authorization
     passdb {
@@ -184,56 +199,68 @@ On to the install!
       driver = sql
       args = /etc/dovecot/dovecot-sql.conf
     }
+    ```
     
-    \# /etc/postfix/main.cf
+    ```
+    # /etc/postfix/main.cf
     pgsql:/etc/postfix/pgsql-virtual-aliases.cf
-    local\_recipient\_maps = pgsql:/etc/postfix/pgsql-virtual-mailbox.cf 
+    local_recipient_maps = pgsql:/etc/postfix/pgsql-virtual-mailbox.cf 
+    ```
     
-    \# /etc/postfix/pgsql-virtual-aliases.cf
+    ```
+    # /etc/postfix/pgsql-virtual-aliases.cf
     # hosts = localhost
     user = postfix
     password = XXXXXX
     dbname = email
     
     query = SELECT email FROM aliases WHERE alias='%s'
+    ```
     
-    \# /etc/postfix/pgsql-virtual-mailbox.cf
+    ```
+    # /etc/postfix/pgsql-virtual-mailbox.cf
     # hosts = localhost
     user = postfix
     password = XXXXXX
     dbname = email
     
     query = SELECT concat(username,'@',domain,'/') as email FROM users WHERE username='%s'
+    ```
     
-    \# /etc/dovecot/dovecot-sql.conf
+    ```
+    # /etc/dovecot/dovecot-sql.conf
     driver = pgsql
     connect = host=localhost dbname=email user=dovecot password=XXXXXX
-    default\_pass\_scheme = SHA512
-    password\_query = SELECT \\
-      CONCAT(username,'@',domain) as user, \\
-      password, \\
-      'vmail' AS userdb\_uid, \\
-      'vmail' AS userdb\_gid, \\
-      '/var/mail/vmail/%u' as userdb\_home \\
-      FROM users \\
+    default_pass_scheme = SHA512
+    password_query = SELECT \
+      CONCAT(username,'@',domain) as user, \
+      password, \
+      'vmail' AS userdb_uid, \
+      'vmail' AS userdb_gid, \
+      '/var/mail/vmail/%u' as userdb_home \
+      FROM users \
       WHERE concat(username,'@',domain) = '%u';
     
-    user\_query = SELECT username, \\
-      CONCAT('maildir:/var/mail/vmail/',username,'@',domain) as mail, \\
-      '/var/mail/vmail/%u' as home, \\
-      'vmail' as uid, \\
-      'vmail' as gid \\
-      FROM users \\
+    user_query = SELECT username, \
+      CONCAT('maildir:/var/mail/vmail/',username,'@',domain) as mail, \
+      '/var/mail/vmail/%u' as home, \
+      'vmail' as uid, \
+      'vmail' as gid \
+      FROM users \
       WHERE concat(username,'@',domain) = '%u';
+    ```
     
 6.  Set up users. Example user creation:
     
-    \# Generate a password
+    ```
+    # Generate a password
     $ doveadm pw -s sha512 -r 100
     Enter new password: ...
     Retype new password: ...
     {SHA512}.............................................................==
+    ```
     
+    ```
     psql -U dovecot -d email
     ; Create a user za3k@za3k.com
     mail=# INSERT INTO users (
@@ -245,94 +272,119 @@ On to the install!
         'za3k.com'
         '{SHA512}.............................................................==',
     );
+    ```
     
 7.  Set up aliases/redirects. Example redirect creation:
     
+    ```
     psql -U dovecot -d email
     ; Redirect mail from foo@example.com to bar@example.net
     mail=# INSERT INTO users ( email, alias ) VALUES (
         'bar@example.net',
         'foo@example.com'
     );
+    ```
     
-8.  Test setup locally by hand. Try using [TELNET][2]. Test remote setup using STARTSSL. This is similar to the previous step, but to start the connection use:
+8.  Test setup locally by hand. Try using [TELNET](https://www.port25.com/how-to-check-an-smtp-connection-with-a-manual-telnet-session-2/). Test remote setup using STARTSSL. This is similar to the previous step, but to start the connection use:
     
-    openssl s\_client -connect smtp.za3k.com:587 -starttls smtp
+    ```
+    openssl s_client -connect smtp.za3k.com:587 -starttls smtp
+    ```
     
     Make sure to test email to addresses at your domain or that you’ve set up (final destination), and emails you’re trying to send somewhere else (relay email)
     
-    A small [digression][3]: port 25 is used for unencrypted email and support STARTTLS, 587 is used for STARTTLS only, and 465 (obsolete) is used for TLS. My ISP, Comcast, blocks access to port 25 on outgoing traffic.
+    A small [digression](https://www.fastmail.com/help/technical/ssltlsstarttls.html): port 25 is used for unencrypted email and support STARTTLS, 587 is used for STARTTLS only, and 465 (obsolete) is used for TLS. My ISP, Comcast, blocks access to port 25 on outgoing traffic.
     
-9.  Make sure you’re not running an open relay at [http://mxtoolbox.com/diagnostic.aspx][4]
-10.  Set your DNS so that the [MX][5] record points at your new mailserver. You’ll probably want a [store and forward][6] backup mail server (mine is provided by my registrar). Email should arrive at your mail server from now on. This is the absolute minimum setup. Everything from here on is to help the community combat spam (and you not to get blacklisted).
-11.  Set up [DKIM][7] (DomainKeys Identified Mail). DKIM signs outgoing mail to show that it’s from your server, which helps you not get flagged as spam.  
+9.  Make sure you’re not running an open relay at [http://mxtoolbox.com/diagnostic.aspx](http://mxtoolbox.com/diagnostic.aspx)
+10.  Set your DNS so that the [MX](https://en.wikipedia.org/wiki/MX_record) record points at your new mailserver. You’ll probably want a [store and forward](https://en.wikipedia.org/wiki/Store_and_forward) backup mail server (mine is provided by my registrar). Email should arrive at your mail server from now on. This is the absolute minimum setup. Everything from here on is to help the community combat spam (and you not to get blacklisted).
+11.  Set up [DKIM](https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail) (DomainKeys Identified Mail). DKIM signs outgoing mail to show that it’s from your server, which helps you not get flagged as spam.  
     None of these files or folders exist to begin with in debian.
     
-    \# Add to /etc/opendkim.conf
+    ```
+    # Add to /etc/opendkim.conf
     KeyTable                /etc/opendkim/KeyTable
     SigningTable            /etc/opendkim/SigningTable
     ExternalIgnoreList      /etc/opendkim/TrustedHosts
     InternalHosts           /etc/opendkim/TrustedHosts
     LogWhy yes
+    ```
     
-    \# /etc/opendkim/TrustedHosts
+    ```
+    # /etc/opendkim/TrustedHosts
     127.0.0.1
-    \[::1\]
+    [::1]
     localhost
     za3k.com
     smtp.za3k.com
+    ```
     
+    ```
     mkdir -p /etc/opendkim/keys/za3k.com
     cd /etc/opendkim/keys/za3k.com
     opendkim-genkey -s default -d za3k.com
     chown opendkim:opendkim default.private
+    ```
     
-    \# /etc/opendkim/KeyTable
-    default.\_domainkey.za3k.com za3k.com:default:/etc/opendkim/keys/za3k.com/default.private
+    ```
+    # /etc/opendkim/KeyTable
+    default._domainkey.za3k.com za3k.com:default:/etc/opendkim/keys/za3k.com/default.private
+    ```
     
-    \# /etc/opendkim/SigningTable
-    za3k.com default.\_domainkey.za3k.com
+    ```
+    # /etc/opendkim/SigningTable
+    za3k.com default._domainkey.za3k.com
+    ```
     
-    Display the DNS public key to set in a [TXT][8] record with:
+    Display the DNS public key to set in a [TXT](https://en.wikipedia.org/wiki/TXT_Record) record with:
     
-    \# sudo cat /etc/opendkim/keys/za3k.com/default.txt
-    default.\_domainkey      IN      TXT     ( "v=DKIM1; k=rsa; "
+    ```
+    # sudo cat /etc/opendkim/keys/za3k.com/default.txt
+    default._domainkey      IN      TXT     ( "v=DKIM1; k=rsa; "
               "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCggdv3OtQMek/fnu+hRrHYZTUcpUFcSGL/+Sbq+GffR98RCgabx/jjPJo3HmqsB8czaXf7yjO2UiSN/a8Ae6/yu23d7hyTPUDacatEM+2Xc4/zG+eAlAMQOLRJeo3z53sNiq0SmJET6R6yH4HCv9VkuS0TQczkvME5hApft+ZedwIDAQAB" )  ; ----- DKIM
     
     # My registrar doesn't support this syntax so it ends up looking like: 
-    $ dig txt default.\_domainkey.za3k.com txt
-    default.\_domainkey.za3k.com. 10800 IN   TXT     "v=DKIM1\\; k=rsa\\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCggdv3OtQMek/fnu+hRrHYZTUcpUFcSGL/+Sbq+GffR98RCgabx/jjPJo3HmqsB8czaXf7yjO2UiSN/a8Ae6/yu23d7hyTPUDacatEM+2Xc4/zG+eAlAMQOLRJeo3z53sNiq0SmJET6R6yH4HCv9VkuS0TQczkvME5hApft+ZedwIDAQAB"
+    $ dig txt default._domainkey.za3k.com txt
+    default._domainkey.za3k.com. 10800 IN   TXT     "v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCggdv3OtQMek/fnu+hRrHYZTUcpUFcSGL/+Sbq+GffR98RCgabx/jjPJo3HmqsB8czaXf7yjO2UiSN/a8Ae6/yu23d7hyTPUDacatEM+2Xc4/zG+eAlAMQOLRJeo3z53sNiq0SmJET6R6yH4HCv9VkuS0TQczkvME5hApft+ZedwIDAQAB"
+    ```
     
-    \# Uncomment in /etc/default/opendkim
+    ```
+    # Uncomment in /etc/default/opendkim
     SOCKET="inet:12345@localhost" # listen on loopback on port 12345
+    ```
     
-    \# /etc/postfix/main.cf
+    ```
+    # /etc/postfix/main.cf
     # DKIM
-    milter\_default\_action = accept
-    milter\_protocol = 6
-    smtpd\_milters = inet:localhost:12345
-    non\_smtpd\_milters = inet:localhost:12345
+    milter_default_action = accept
+    milter_protocol = 6
+    smtpd_milters = inet:localhost:12345
+    non_smtpd_milters = inet:localhost:12345
+    ```
     
-12.  Set up [SPF][9] (Sender Policy Framework). SPF explains to other services which IPs can send email on your behalf. You can set up whatever policy you like. A guide to the syntax is at: [http://www.openspf.org/SPF\_Record\_Syntax][10].  Mine is
+12.  Set up [SPF](https://en.wikipedia.org/wiki/Sender_Policy_Framework) (Sender Policy Framework). SPF explains to other services which IPs can send email on your behalf. You can set up whatever policy you like. A guide to the syntax is at: [http://www.openspf.org/SPF\_Record\_Syntax](http://www.openspf.org/SPF_Record_Syntax).  Mine is
     
+    ```
     @ 10800 IN TXT "v=spf1 +a:za3k.com +mx:za3k.com ~all"
+    ```
     
     You should also be verifying this on your end as part of combating spam, but as far as outgoing mail all you need to do is add a TXT record to your DNS record.
     
-13.  Set your [rDNS][11] (reverse DNS) if it’s not already. This should point at the same hostname reported by Postfix during SMTP. This will be handled by whoever assigns your IP address (in my case, my hosting provider).
-14.  Test your spam reputability using [https://www.mail-tester.com][12] or [https://www.port25.com/support/authentication-center/email-verification][13]. You can monitor if you’re on any blacklists at [http://mxtoolbox.com/blacklists.aspx][14].
-15.  Set up [DMARC][15]. DMARC declares your policy around DKIM being mandatory. You can set up whatever policy you like.  Mine is
+13.  Set your [rDNS](https://en.wikipedia.org/wiki/Reverse_DNS_lookup) (reverse DNS) if it’s not already. This should point at the same hostname reported by Postfix during SMTP. This will be handled by whoever assigns your IP address (in my case, my hosting provider).
+14.  Test your spam reputability using [https://www.mail-tester.com](https://www.mail-tester.com/) or [https://www.port25.com/support/authentication-center/email-verification](https://www.port25.com/support/authentication-center/email-verification/). You can monitor if you’re on any blacklists at [http://mxtoolbox.com/blacklists.aspx](http://mxtoolbox.com/blacklists.aspx).
+15.  Set up [DMARC](https://dmarc.org/overview/). DMARC declares your policy around DKIM being mandatory. You can set up whatever policy you like.  Mine is
     
-    \_dmarc 10800 IN TXT "v=DMARC1;p=reject;aspf=s;adkim=s;pct=100;rua=mailto:postmaster@za3k.com"
+    ```
+    _dmarc 10800 IN TXT "v=DMARC1;p=reject;aspf=s;adkim=s;pct=100;rua=mailto:postmaster@za3k.com"
+    ```
     
 
 My sources writing this:
 
--   [https://wiki.archlinux.org/index.php/Postfix][16] and [http://www.postfix.org/postconf.5.html][17] on Postfix
--   [https://wiki.archlinux.org/index.php/Dovecot][18] on Dovecot
--   [https://help.ubuntu.com/community/PostfixVirtualMailBoxClamSmtpHowto][19] on SASL auth integration between Dovecot and Postfix
--   [https://www.digitalocean.com/community/tutorials/how-to-set-up-a-postfix-email-server-with-dovecot-dynamic-maildirs-and-lmtp][20] and [https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin][21] on SQL integration in Dovecot
--   [https://scaron.info/blog/debian-mail-spf-dkim.html][22] for setting up SPF, DKIM, and rDNS
+-   [https://wiki.archlinux.org/index.php/Postfix](https://wiki.archlinux.org/index.php/Postfix) and [http://www.postfix.org/postconf.5.html](http://www.postfix.org/postconf.5.html) on Postfix
+-   [https://wiki.archlinux.org/index.php/Dovecot](https://wiki.archlinux.org/index.php/Dovecot%20) on Dovecot
+-   [https://help.ubuntu.com/community/PostfixVirtualMailBoxClamSmtpHowto](https://help.ubuntu.com/community/PostfixVirtualMailBoxClamSmtpHowto) on SASL auth integration between Dovecot and Postfix
+-   [https://www.digitalocean.com/community/tutorials/how-to-set-up-a-postfix-email-server-with-dovecot-dynamic-maildirs-and-lmtp](https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin) and [https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin](https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin) on SQL integration in Dovecot
+-   [https://scaron.info/blog/debian-mail-spf-dkim.html](https://scaron.info/blog/debian-mail-spf-dkim.html) for setting up SPF, DKIM, and rDNS
 
 Takeaways
 
@@ -341,132 +393,3 @@ Takeaways
 -   Email was REALLY not designed to do authentication, which is why proving you’re not a spammer is so difficult. This would all be trivial with decent crypto baked in (or really, almost any backwards-incompatible change)
 -   The option to specify a SQL query as a configuration file option is wonderful. Thanks, Dovecot.
 -   Overall, although it was a lot of work, I do feel like it was worth it to run my own email server.
-
-1.  Pingback: [Mail filtering with Dovecot - Optimal Prime][23]
-    
-2.  ![](https://secure.gravatar.com/avatar/3a4733166894a30fe613838ecaaa1e95?s=40&d=mm&r=g)eduardz says:
-    
-    [November 23, 2016 at 12:18 am][24]
-    
-    Hello,
-    
-    Can you implement quota support from postgressql?
-    
-    [Reply][25]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [April 5, 2017 at 7:05 pm][26]
-        
-        Not sure if this is “will you do” or “is it possible”. I will not do anything to set up quota–I have one user (me) so it doesn’t make sense. I encourage you to link if you do.
-        
-        [Reply][27]
-        
-3.  ![](https://secure.gravatar.com/avatar/04f9049f74277e447eee4569ac61563c?s=40&d=mm&r=g)Tudor says:
-    
-    [February 23, 2017 at 2:45 am][28]
-    
-    In the “useradd -d -M -d /var/mail/vmail –shell=/usr/bin/nologin -u 5000 -g vmail vmail“ I think the first “-d“ shouldn’t be there
-    
-    Thanks for the post
-    
-    [Reply][29]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [April 5, 2017 at 7:06 pm][30]
-        
-        Thanks for the corrections, glad you found it useful.
-        
-        [Reply][31]
-        
-4.  ![](https://secure.gravatar.com/avatar/04f9049f74277e447eee4569ac61563c?s=40&d=mm&r=g)Tudor says:
-    
-    [February 23, 2017 at 2:54 am][32]
-    
-    Also, for Postgresql the correct commands to create users are:  
-    CREATE USER postfix PASSWORD ‘XXX’;  
-    CREATE USER dovecot PASSWORD ‘XXX’;
-    
-    [Reply][33]
-    
-5.  ![](https://secure.gravatar.com/avatar/04f9049f74277e447eee4569ac61563c?s=40&d=mm&r=g)Tudor says:
-    
-    [February 23, 2017 at 3:22 am][34]
-    
-    Also, there shouldn’t be any comma after the VALUES (  
-    ‘za3k’,  
-    ‘za3k.com’,  
-    ‘{SHA512}…………………………………………………….==’ part
-    
-    [Reply][35]
-    
-6.  ![](https://secure.gravatar.com/avatar/9fe7e715cb7615380e65ebecc7c703b6?s=40&d=mm&r=g)S says:
-    
-    [May 12, 2018 at 9:36 am][36]
-    
-    A little sloppy – you should have simply shown the entire contents of each file one by one, with descriptions in comments or whatever, instead of breaking them up into snippets – and there are a few errors and omissions (I can’t recall which ones now)  
-    However, using this guide and some googling, I was able to get a mailserver working – which is more than I can say for any other guide; so, thanks.
-    
-    [Reply][37]
-    
-7.  ![](https://secure.gravatar.com/avatar/0f57bc0e6352458280cb89f50df560eb?s=40&d=mm&r=g)Korilius says:
-    
-    [July 17, 2021 at 3:56 pm][38]
-    
-    A guide that could have been great but tripped at the finish line. A lot of errors in SQL and elsewhere along with step reorganization.
-    
-    [Reply][39]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [July 17, 2021 at 4:52 pm][40]
-        
-        If you have any specific errors you can mention, I’d be happy to fix stuff.
-        
-        But yeah, that’s the problem with writing a guide after you do something instead of during/before.
-        
-        [Reply][41]
-        
-
-[1]: https://blog.za3k.com/setting-up-ssl-certificates-using-startssl/ "Setting up SSL certificates using StartSSL"
-[2]: https://www.port25.com/how-to-check-an-smtp-connection-with-a-manual-telnet-session-2/
-[3]: https://www.fastmail.com/help/technical/ssltlsstarttls.html
-[4]: http://mxtoolbox.com/diagnostic.aspx
-[5]: https://en.wikipedia.org/wiki/MX_record
-[6]: https://en.wikipedia.org/wiki/Store_and_forward
-[7]: https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail
-[8]: https://en.wikipedia.org/wiki/TXT_Record
-[9]: https://en.wikipedia.org/wiki/Sender_Policy_Framework
-[10]: http://www.openspf.org/SPF_Record_Syntax
-[11]: https://en.wikipedia.org/wiki/Reverse_DNS_lookup
-[12]: https://www.mail-tester.com/
-[13]: https://www.port25.com/support/authentication-center/email-verification/
-[14]: http://mxtoolbox.com/blacklists.aspx
-[15]: https://dmarc.org/overview/
-[16]: https://wiki.archlinux.org/index.php/Postfix
-[17]: http://www.postfix.org/postconf.5.html
-[18]: https://wiki.archlinux.org/index.php/Dovecot%20
-[19]: https://help.ubuntu.com/community/PostfixVirtualMailBoxClamSmtpHowto
-[20]: https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin
-[21]: https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin
-[22]: https://scaron.info/blog/debian-mail-spf-dkim.html
-[23]: https://blog.za3k.com/mail-filtering-with-dovecot/
-[24]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-2842
-[25]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=2842#respond
-[26]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-2873
-[27]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=2873#respond
-[28]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-2852
-[29]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=2852#respond
-[30]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-2874
-[31]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=2874#respond
-[32]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-2853
-[33]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=2853#respond
-[34]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-2854
-[35]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=2854#respond
-[36]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-3135
-[37]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=3135#respond
-[38]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-4730
-[39]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=4730#respond
-[40]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/#comment-4731
-[41]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/?replytocom=4731#respond
index 8320abcb2cf8fc87b9c5b05ad7d7bcda1b52784b..b9a8f84a6dd52036bacac6d5ea6dae1fb53e30ea 100644 (file)
@@ -15,73 +15,26 @@ updated: 2023-06-07 17:00:00-07:00
 wordpress_id: 1043
 wordpress_slug: introducing-the-zorchpad-display-demo
 ---
-A friend of mine, [Kragen Javier Sitaker][1] has been designing something he calls the zorzpad (see link below). I can never remember the name, so as a joke my version became the “zorch pad”. We live on opposite sides of the globe, but we’ve picked up the same or similar hardware, and have been having fun developing the hardware and software together.
+A friend of mine, [Kragen Javier Sitaker](http://canonical.org/~kragen/) has been designing something he calls the zorzpad (see link below). I can never remember the name, so as a joke my version became the “zorch pad”. We live on opposite sides of the globe, but we’ve picked up the same or similar hardware, and have been having fun developing the hardware and software together.
 
-The basic idea of the Zorchpad is to have one computer, indefinitely. It should keep working until you die. That means no battery that runs out, and no parts that go bad (and of course, no requirements to “phone home” for the latest update via wifi!). This is not your standard computer, and we’ve been trying a lot of experimental things. One of the main requirements is that everything be very low-power. He picked out the excellent [apollo3][2] processor, which theoretically runs at around 1mW. In general, the zorchpad is made of closed-source hardware.
+The basic idea of the Zorchpad is to have one computer, indefinitely. It should keep working until you die. That means no battery that runs out, and no parts that go bad (and of course, no requirements to “phone home” for the latest update via wifi!). This is not your standard computer, and we’ve been trying a lot of experimental things. One of the main requirements is that everything be very low-power. He picked out the excellent [apollo3](https://www.sparkfun.com/categories/tags/apollo3) processor, which theoretically runs at around 1mW. In general, the zorchpad is made of closed-source hardware.
 
 Since I’ve realized this will be a long project, I’m going to post it piece-by-piece as I make progress. Below is a demo of the display.
 
+<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="456" src="https://www.youtube.com/embed/CXOpiH0CqLo?feature=oembed" title="Zorchpad Graphics Demo (pre-alpha)" width="810"></iframe>
+
 The graphics demo shows, in order:
 
 -   a title screen
 -   a flashing screen (to show graphics-mode framerate)
--   a demo of font rendering. we’re using the fixed-width font [tamsyn][3].
--   a [munching squares][4] animation
+-   a demo of font rendering. we’re using the fixed-width font [tamsyn](http://www.fial.com/~scott/tamsyn-font/).
+-   a [munching squares](https://en.wikipedia.org/wiki/Munching_square) animation
 -   a demo of how fast “text-mode” updates would be
 
-We’re using a [memory-in-pixel LCD][5]. The only manufacturer is Sharp LCD. You have have seen these before in things like the Pebble watch–they’ve very low-power except when you’re updating. This particular screen is quite tiny–240x400px display (which is fine with me), but only 1.39×2.31 inches (35x59mm). The only bigger screen available in this technology is 67x89mm, a bit lower resolution, and out of stock. As soon as it’s in stock I plan to switch to it.
+We’re using a [memory-in-pixel LCD](https://www.sharpsde.com/products/displays/model/ls027b7dh01/#productview). The only manufacturer is Sharp LCD. You have have seen these before in things like the Pebble watch–they’ve very low-power except when you’re updating. This particular screen is quite tiny–240x400px display (which is fine with me), but only 1.39×2.31 inches (35x59mm). The only bigger screen available in this technology is 67x89mm, a bit lower resolution, and out of stock. As soon as it’s in stock I plan to switch to it.
 
 According to the datasheet, the screen consumes 0.05-0.25mW without an update, and perhaps 0.175-0.35mW updating once per second. We haven’t yet measured the real power consumption for any of the components.
 
 The most obvious alternative is e-ink. E-ink has a muuuch slower refresh rate (maybe 1Hz if you hack it), and uses no power when not updating. Unfortunately it uses orders of magnitude more power for an update. Also, you can get much larger e-ink screens. The final zorchpad might have one, both or something else entirely! We’re in an experimentation phase.
 
-Datasheets, a bill of materials, and all source code can be found in my [zorchpad][6] repo. Also check out Kragen’s [zorzpad][7] repo.
-
-1.  ![](https://secure.gravatar.com/avatar/a1e9d69b1d8b0a1fd3a90f03a40de162?s=40&d=mm&r=g)JenniferRM says:
-    
-    [April 20, 2024 at 9:52 am][8]
-    
-    Very cool idea. I was imagining form factors, and was thinking briefly about somehow having a sort of laptop arrangement where an e-ink screen is visible through glass when it is closed and in some kind of “protective storage mode”, and then visible directly from “the proper side of the e-ink screen” after it opens up. This is probably impossible using default hardware options, but searching around to confirm this lead to some interesting links and unusual design demos.
-    
-    Here’s ~12 year old thread from someone who wants a computer to use in an off grid cabin.  
-    [https://forums.tomshardware.com/threads/ultra-low-power-pc-to-run-off-solar-power.1375469/][9]
-    
-    Here is a 2023 video about the revived product “GVUIDO” (pronounced Guido) optimized for musicians where part of the UI involves covering a light sensor.  
-    [https://www.youtube.com/watch?v=wTIf9wjm0y8][10]
-    
-    One thing that struck me is that a lot of people might want a Xorchpad to stick INSIDE a larger system (out in nature? as part of a science package?) that might install a rugged solar panel and battery. Then a small USB-C cord might provide a Xorchpad inside the unit with power, and want some intelligence to come out of the same cord, in exchange?
-    
-    I’m not sure if a USB-C is consistent with the vision, however. Maybe the “minimum power” for that is far above the “maximim power” that would not blow the Sourcepad’s circuits?
-    
-    [Reply][11]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [April 20, 2024 at 10:24 am][12]
-        
-        Try using numbers, instead of words! It works better for comparing power usage.
-        
-        The “low-power computer” someone wants from 12 years ago should be 3W. The Zorchpad is designed to run at 0.001W.
-        
-        I’m not sure what GVUIDO has to do with anything, was there a reason you linked that?
-        
-        The Zorchpad could easily be powered by any standard cable, yes. But if you need a larger system to power it, you’re missing the point.
-        
-        “Blowing circuits” is not a correct intuition for designing low-power electronics. Go learn about Ohm’s Law!
-        
-        [Reply][13]
-        
-
-[1]: http://canonical.org/~kragen/
-[2]: https://www.sparkfun.com/categories/tags/apollo3
-[3]: http://www.fial.com/~scott/tamsyn-font/
-[4]: https://en.wikipedia.org/wiki/Munching_square
-[5]: https://www.sharpsde.com/products/displays/model/ls027b7dh01/#productview
-[6]: https://github.com/za3k/zorchpad
-[7]: http://canonical.org/~kragen/sw/zorzpad/
-[8]: https://blog.za3k.com/introducing-the-zorchpad-display-demo/#comment-11338
-[9]: https://forums.tomshardware.com/threads/ultra-low-power-pc-to-run-off-solar-power.1375469/
-[10]: https://www.youtube.com/watch?v=wTIf9wjm0y8
-[11]: https://blog.za3k.com/introducing-the-zorchpad-display-demo/?replytocom=11338#respond
-[12]: https://blog.za3k.com/introducing-the-zorchpad-display-demo/#comment-11339
-[13]: https://blog.za3k.com/introducing-the-zorchpad-display-demo/?replytocom=11339#respond
+Datasheets, a bill of materials, and all source code can be found in my [zorchpad](https://github.com/za3k/zorchpad) repo. Also check out Kragen’s [zorzpad](http://canonical.org/~kragen/sw/zorzpad/) repo.
index 142b326d506d0bb040d73f5dacb0bb0927cf4e30..3599d8ec9f8a26d042d63bccb6de1fb99c4c845d 100644 (file)
@@ -16,20 +16,11 @@ updated: 2015-06-28 02:24:09-07:00
 wordpress_id: 225
 wordpress_slug: irc
 ---
-[![2015-06-28-021223_683x381](https://blog.za3k.com/wp-content/uploads/2015/06/2015-06-28-021223_683x381.jpg)][1]I added an IRC server to my growing list of services. You can access it at:
+[![2015-06-28-021223_683x381](https://blog.za3k.com/wp-content/uploads/2015/06/2015-06-28-021223_683x381.jpg)](https://blog.za3k.com/wp-content/uploads/2015/06/2015-06-28-021223_683x381.jpg)I added an IRC server to my growing list of services. You can access it at:
 
 -   irc.za3k.com
 -   Port 6667
 
-Or via the [webchat][2], which I recommend.
+Or via the [webchat](https://irc.za3k.com/?channels=forum), which I recommend.
 
-I’ve also recently updated my [home page][3] to look much prettier, in imitation of a [Computer Craft cheatsheet][4] I’ve been working on.
-
-1.  Pingback: [Year in Review | Optimal Prime][5]
-    
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/06/2015-06-28-021223_683x381.jpg
-[2]: https://irc.za3k.com/?channels=forum
-[3]: https://za3k.com/
-[4]: https://za3k.com/computercraft_reference.html
-[5]: https://blog.za3k.com/year-in-review/
+I’ve also recently updated my [home page](https://za3k.com/) to look much prettier, in imitation of a [Computer Craft cheatsheet](https://za3k.com/computercraft_reference.html) I’ve been working on.
index 9cef97cda7962fc98a6a3c25d8af6f31c88e5e05..338fa4123a819b6a932808a52ce5e13d7c9da168 100644 (file)
@@ -16,10 +16,8 @@ wordpress_slug: ircpuzzles-2024
 ---
 I’m one of the designers for the yearly April Fools Puzzle Contest on IRC.
 
-Please feel free to join at [https://blog.ircpuzzles.org/][1]. The idea is that you solve puzzles in a chatroom, and get the password to the next chatroom, and so on. If you’re not familiar with IRC, don’t worry–a link is provided to connect in your browser, too.
+Please feel free to join at [https://blog.ircpuzzles.org/](https://blog.ircpuzzles.org/). The idea is that you solve puzzles in a chatroom, and get the password to the next chatroom, and so on. If you’re not familiar with IRC, don’t worry–a link is provided to connect in your browser, too.
 
 It’s a lot of fun, and I hope you enjoy!
 
 P.S. The contest should be up for a while, so don’t worry about being late to the party!
-
-[1]: https://blog.ircpuzzles.org/
index 76a6ec682055f8d8c380f5c2e9b6bc4de33a5a6b..c9a5e6d15dec70210c8c06a5a1ddef26ab7733ff 100644 (file)
@@ -14,6 +14,4 @@ updated: 2021-06-05 15:41:58-07:00
 wordpress_id: 591
 wordpress_slug: is-rick-and-morty-out-season-5
 ---
-I made a site for your constant refresh needs: [http://isrickandmortyout.com/][1]
-
-[1]: http://isrickandmortyout.com/
+I made a site for your constant refresh needs: [http://isrickandmortyout.com/](http://isrickandmortyout.com/)
index 119450f344c33f418f2204b3d9d080abaf41b691..ae7fe46001450e21a81c1906e97153b2356a3c8a 100644 (file)
@@ -14,6 +14,4 @@ updated: 2022-08-11 23:11:09-07:00
 wordpress_id: 778
 wordpress_slug: is-rick-and-morty-out-season-6
 ---
-I made a site for your constant refresh needs: [http://isrickandmortyout.com/][1]
-
-[1]: http://isrickandmortyout.com/
+I made a site for your constant refresh needs: [http://isrickandmortyout.com/](http://isrickandmortyout.com/)
index 6b3f6d4cd7c4442038bf34ac7a90407c20a8bade..0f7243494d01f788635341837e8eb335759ba867 100644 (file)
@@ -38,33 +38,18 @@ I keep a written (pen and paper) time log which I normally just call my “log b
 
 Today’s page starts like this (italics are censorship or words added for clarity):
 
-Date: 2019-12-17, Tue  
-
-12:02pm
-
-Woke up on my own slightly before alarm. Dream about \[…\]. (7h12m *sleep*)
-
-\[100ml *yellow* rockstar recovery. *(33mg caffein, 400mg taurine–from front material)*\]
-
-Morning data log *(see below)*
-
-Brushed teeth
-
-12:55pm
-
-Cancelled torrent verification–I already know this will fail
-
-Responded to *gnu coreutils* ‘date’ thread
-
-*health stuff*
-
-2:02pm
-
-Trying qutebrowser. Feels very productive.
-
-2:04pm
-
-\[Coke Zero Vanilla*, 1 can*\]
+|     |     |
+| --- | --- |
+| Date: 2019-12-17, Tue |     |
+| 12:02pm | Woke up on my own slightly before alarm. Dream about \[…\]. (7h12m *sleep*) |
+|     | \[100ml *yellow* rockstar recovery. *(33mg caffein, 400mg taurine–from front material)*\] |
+|     | Morning data log *(see below)* |
+|     | Brushed teeth |
+| 12:55pm | Cancelled torrent verification–I already know this will fail |
+|     | Responded to *gnu coreutils* ‘date’ thread |
+|     | *health stuff* |
+| 2:02pm | Trying qutebrowser. Feels very productive. |
+| 2:04pm | \[Coke Zero Vanilla*, 1 can*\] |
 
 I’m not fastidious about what the time represents. The questions I most often ask are “when did this happen roughly” and “do I have any big portions of my day I’m not time-logging”. I’m less concerned with exactly how long I spent doing each particular activity.
 
@@ -97,7 +82,7 @@ One a week, I type up my time log up to the last page. I’m working on my backl
 
 Fun fact: b-oo-kk-ee-ping is the only word in the English language with three consecutive double letters. Bookkeeping is keeping a record of what you earn and spend, or what you buy and sell.
 
-For the most part, I pay for everything using a credit or debit card, which I’ve been doing since 16 so that I have a financial record for my own benefit. Most banks offer an easy export. I get paper copies, then once I download the PDFs from my bank, throw out the originals (I’ve checked one or two match the PDFs by hand). I use [mint.com][1] for the purpose of having a CSV export from my bak statements. I used to put this export [online][2] (currently broken, check back soon).
+For the most part, I pay for everything using a credit or debit card, which I’ve been doing since 16 so that I have a financial record for my own benefit. Most banks offer an easy export. I get paper copies, then once I download the PDFs from my bank, throw out the originals (I’ve checked one or two match the PDFs by hand). I use [mint.com](https://www.mint.com/) for the purpose of having a CSV export from my bak statements. I used to put this export [online](https://za3k.com/money.html) (currently broken, check back soon).
 
 Starting a few months ago, I started keeping a weekly record by hand. Every time I spend money, I’ll put a `$` symbol in my time log,
 
@@ -178,7 +163,7 @@ I put all my computer logs in a single combined format, and sync them to a singl
 
 ### Sleep Log (2019-) / Keystoke Activity Log (2013-)
 
-I log which hours I was asleep. I live alone and tend to fall asleep first thing after closing my laptop in bed, or at least with a video playing in the background, which makes this relatively easy. I keep a computer log of whether I’m using my keyboard (I almost never do anything with just the mouse) for each minute using a [custom-built keylogger][3] (it records activity but not passwords).
+I log which hours I was asleep. I live alone and tend to fall asleep first thing after closing my laptop in bed, or at least with a video playing in the background, which makes this relatively easy. I keep a computer log of whether I’m using my keyboard (I almost never do anything with just the mouse) for each minute using a [custom-built keylogger](https://github.com/za3k/keystroked) (it records activity but not passwords).
 
 Then I run it through a custom script (included in link) which says which broad periods I was active. The biggest inactive period in a day is when I was asleep.
 
@@ -192,13 +177,13 @@ If you don’t fall asleep at a computer, I have some ideas around using a motio
 
 ### Chromium History Log (2013-)
 
-I use Chromium as my only web browser. I export the [history][4] and [bookmarks][5] every time I do a backup, and put it all in a standard log format (basically time + URL). Currently I only record each history entry once.
+I use Chromium as my only web browser. I export the [history](https://github.com/za3k/rip-chrome-history) and [bookmarks](https://github.com/za3k/export-chrome-bookmarks) every time I do a backup, and put it all in a standard log format (basically time + URL). Currently I only record each history entry once.
 
 For futureproofing, I archive every webpage I go to on an irregular basis (about once a year). Archiving pages doesn’t work super well but it’s better than nothing.
 
 ### Video/TV Log (2019-)
 
-I watch my movies using [noice][6], either directly on my television, or streamed from my media server to my laptop. When I start watching something, it automatically gets logged (including what the movie is, the path, how long it is etc). Same for when I stop, so I know if I quit early.
+I watch my movies using [noice](https://github.com/za3k/noice), either directly on my television, or streamed from my media server to my laptop. When I start watching something, it automatically gets logged (including what the movie is, the path, how long it is etc). Same for when I stop, so I know if I quit early.
 
 Youtube is included in my chromium history (see above). Sadly I’m not sure I can get ‘how much of this video did I watch’ from my format–only that I visited the video.
 
@@ -206,37 +191,21 @@ For futureproofing, I automatically archive every youtube video I watch.
 
 ### Bash History (2011-)
 
-This one is pretty simple. My Linux shell history (everything I run from the command line, which is basically everything I do outside a browser) is saved, [forever][7]. This one goes back to 2011 for my laptops.
+This one is pretty simple. My Linux shell history (everything I run from the command line, which is basically everything I do outside a browser) is saved, [forever](https://debian-administration.org/article/543/Bash_eternal_history). This one goes back to 2011 for my laptops.
 
 ## Scanning (2014-)
 
 I scan all documents I write, mail I get, etc. and generally throw out the originals. I organize everything by hand, and keep everything as image files.
 
-I use a flat folder structure, which is to say I have a “scans” folder and then a bunch of folders in it like “taxes – 2019”. No nesting. This was my main takeaway from [GTD for Hackers][8] and I use flat folders for most digital organization.
+I use a flat folder structure, which is to say I have a “scans” folder and then a bunch of folders in it like “taxes – 2019”. No nesting. This was my main takeaway from [GTD for Hackers](https://gtdfh.branchable.com/) and I use flat folders for most digital organization.
 
-I use the [Doxie Go][9] feed-through scanner (doesn’t need a computer, writes directly to SD which I love). I recently got a [Canon Lide 400][10] flatbed scanner (works on linux) which I use to scan bound books like my time log.
+I use the [Doxie Go](https://www.getdoxie.com/product/doxie-go-original/) feed-through scanner (doesn’t need a computer, writes directly to SD which I love). I recently got a [Canon Lide 400](https://www.amazon.com/gp/product/B07G5YBS1W) flatbed scanner (works on linux) which I use to scan bound books like my time log.
 
 ## Who else does this stuff?
 
 As far as I know I came up with this stuff independently. I’ve read plenty of time-management resources (which tend to be good) and experimental journaling resources (which tend to be… scarce?).
 
--   [Lion Kimbro][11]: “Make a complete map of every thought you think”. General journaling. [Inteview][12].
--   [Fenn Lipowitz][13] (my roommate): Time log, with an emphasis on being completely machine-readable. Being machine-readable means click for pretty graphs. I took inspiration from how machine-parsable this was recently, but I want to keep my freehand sections too.
--   [Bryan Bishop][14] (acquaintance): meetlog, a system for recording conversations and topics of conversation. Overall I didn’t find this useful because I don’t know hundreds of people. The format is so-so, largely because the author can type very fast, including real-time transcripts. I got the inspiration to write topics of conversation while talking from this. I do something similar if I spend a long time thinking or researching, too.
--   [Bullet Journaling][15]: I dunno, if you’re super lost and don’t know how to write a journal/TODO list, some guy figured it out for you! It’s just the basics that you’d figure out on your own, but it may save time. The site is better than the book. I independently invented most of their notation for TODO lists, I don’t find it too useful for a journal. Other peoples’ bullet journal pages are also useful, not just the original author’s.
-
-[1]: https://www.mint.com/
-[2]: https://za3k.com/money.html
-[3]: https://github.com/za3k/keystroked
-[4]: https://github.com/za3k/rip-chrome-history
-[5]: https://github.com/za3k/export-chrome-bookmarks
-[6]: https://github.com/za3k/noice
-[7]: https://debian-administration.org/article/543/Bash_eternal_history
-[8]: https://gtdfh.branchable.com/
-[9]: https://www.getdoxie.com/product/doxie-go-original/
-[10]: https://www.amazon.com/gp/product/B07G5YBS1W
-[11]: https://users.speakeasy.net/~lion/nb/
-[12]: https://gilest.org/lion-kimbro.html
-[13]: http://www.fennetic.net/sleep/
-[14]: https://quantifiedself.com/blog/bryan-bishop-on-meetlog/
-[15]: https://bulletjournal.com/pages/learn
+-   [Lion Kimbro](https://users.speakeasy.net/~lion/nb/): “Make a complete map of every thought you think”. General journaling. [Inteview](https://gilest.org/lion-kimbro.html).
+-   [Fenn Lipowitz](http://www.fennetic.net/sleep/) (my roommate): Time log, with an emphasis on being completely machine-readable. Being machine-readable means click for pretty graphs. I took inspiration from how machine-parsable this was recently, but I want to keep my freehand sections too.
+-   [Bryan Bishop](https://quantifiedself.com/blog/bryan-bishop-on-meetlog/) (acquaintance): meetlog, a system for recording conversations and topics of conversation. Overall I didn’t find this useful because I don’t know hundreds of people. The format is so-so, largely because the author can type very fast, including real-time transcripts. I got the inspiration to write topics of conversation while talking from this. I do something similar if I spend a long time thinking or researching, too.
+-   [Bullet Journaling](https://bulletjournal.com/pages/learn): I dunno, if you’re super lost and don’t know how to write a journal/TODO list, some guy figured it out for you! It’s just the basics that you’d figure out on your own, but it may save time. The site is better than the book. I independently invented most of their notation for TODO lists, I don’t find it too useful for a journal. Other peoples’ bullet journal pages are also useful, not just the original author’s.
index 32e7c10df1b750e0e088da6a2b1eee00dd19f74d..f21ad53aa337f09375b92df8e595e07a5fab57e4 100644 (file)
@@ -24,7 +24,9 @@ I have a computer physically connected to the printer. Let’s call it ‘prints
 
 Suppose I downloaded cutecats.pdf and I want to print it. Then I run:
 
+```
 scp cutecats.pdf printserver:/printme
+```
 
 And voila, the cute cats get printed.
 
@@ -36,12 +38,16 @@ Here’s the setup for the server:
 2.  Make a directory /printme. Add any missing users, add a new group called ‘print’ and add everyone who needs to print to that, etc.
 3.  Set up /printme to be a tmpfs with the sticky bit set. (So we don’t fill up the hard drive)
     
+    ```
     /etc/fstab
     tmpfs           /printme        tmpfs   rw,nodev,nosuid,noexec,uid=nobody,gid=print,mode=1770,size=1G  0       0
+    ```
     
 4.  Install incron and add this to the incrontab (of user ‘print’ or ‘sudo’):
     
-    \# incrontab -l
-    /printme IN\_CLOSE\_WRITE,IN\_MOVED\_TO lp $@/$#
+    ```
+    # incrontab -l
+    /printme IN_CLOSE_WRITE,IN_MOVED_TO lp $@/$#
+    ```
     
     Note that this will preserve files after they’re printed, because my server is low-volume enough I don’t need to care.
index f1e9bd52e32c90064ca037c9885bf1ca5fa8358f..3768d5b9b093b0c97d1172630aa15aa834f1ffe1 100644 (file)
@@ -17,97 +17,120 @@ updated: 2015-11-29 22:33:56-07:00
 wordpress_id: 370
 wordpress_slug: mail-filtering-with-dovecot
 ---
-This expands on my previous post about [how to set up an email server][1].
+This expands on my previous post about [how to set up an email server](https://blog.za3k.com/installing-email-with-postfix-and-dovecot/ "Installing email with Postfix and Dovecot (with Postgres)").
 
 We’re going to set up a few spam filters in Dovecot under Debian. We’re going to use Sieve, which lets the user set up whichever filters they want. However, we’re going to run a couple pre-baked spam filters regardless of what the user sets up.
 
 1.  Install Sieve.
     
+    ```
     sudo apt-get install dovecot-sieve dovecot-managesieved
+    ```
     
 2.  Add Sieve to Dovecot
     
-    \# /etc/dovecot/dovecot.conf
+    ```
+    # /etc/dovecot/dovecot.conf
     # Sieve and ManageSieve
     protocols = $protocols sieve
     protocol lmtp {
-     mail\_plugins = $mail\_plugins sieve
+     mail_plugins = $mail_plugins sieve
     }
     service managesieve-login {
-     inet\_listener sieve {
+     inet_listener sieve {
      port = 4190
      }
     }
     protocol sieve {
-     managesieve\_logout\_format = bytes ( in=%i : out=%o )
+     managesieve_logout_format = bytes ( in=%i : out=%o )
     }
     plugin {
      # Settings for the Sieve and ManageSieve plugin
      sieve = file:~/sieve;active=~/.dovecot.sieve
-     sieve\_before = /etc/dovecot/sieve.d/
-     sieve\_dir = ~/sieve # For old version of ManageSieve
-     #sieve\_extensions = +vnd.dovecot.filter
-     #sieve\_plugins = sieve\_extprograms
+     sieve_before = /etc/dovecot/sieve.d/
+     sieve_dir = ~/sieve # For old version of ManageSieve
+     #sieve_extensions = +vnd.dovecot.filter
+     #sieve_plugins = sieve_extprograms
     }
+    ```
     
 3.  Install and update SpamAssassin, a heuristic perl script for spam filtering.
     
+    ```
     sudo apt-get install spamasssassin
     sudo sa-update
+    ```
     
-    \# /etc/default/spamassassin
+    ```
+    # /etc/default/spamassassin
     ENABLED=1
     #CRON=1 # Update automatically
+    ```
     
-    \# /etc/spamassassin/local.cf
-    report\_safe 0 # Don't modify headers
+    ```
+    # /etc/spamassassin/local.cf
+    report_safe 0 # Don't modify headers
+    ```
     
+    ```
     sudo service spamassassin start
+    ```
     
 4.  There’s a lot of custom configuration and training you should do to get SpamAssassin to accurately categorize what you consider spam. I’m including a minimal amount here. The following will train SpamAssassin system-wide based on what users sort into spam folders.
     
+    ```
     #!/bin/sh
     # /etc/cron.daily/spamassassin-train
-    all\_folders() {
-            find /var/mail/vmail -type d -regextype posix-extended -regex '.\*/cur|new$'
+    all_folders() {
+            find /var/mail/vmail -type d -regextype posix-extended -regex '.*/cur|new$'
     }
     
-    all\_folders | grep "Spam" | sa-learn --spam -f - >/dev/null 2>/dev/null
-    all\_folders | grep -v "Spam" | sa-learn --ham -f - >/dev/null 2>/dev/null
+    all_folders | grep "Spam" | sa-learn --spam -f - >/dev/null 2>/dev/null
+    all_folders | grep -v "Spam" | sa-learn --ham -f - >/dev/null 2>/dev/null
+    ```
     
 5.  Make Postfix run SpamAssassin as a filter, so that it can add headers as mail comes in.
     
-    \# /etc/postfix/master.cf
+    ```
+    # /etc/postfix/master.cf
     smtp inet n - - - - smtpd
-     -o content\_filter=spamassassin
+     -o content_filter=spamassassin
     # ...
     spamassassin unix - n n - - pipe user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
+    ```
     
+    ```
     sudo service postfix restart
+    ```
     
 6.  Add SpamAssassin to Sieve. Dovecot (via Sieve) will now move messages with spam headers from SpamAssassin to your spam folder. Make sure you have a “Spam” folder and that it’s set to autosubscribe.
     
-    \# /etc/dovecot/sieve.d/spam-assassin.sieve
-    require \["fileinto"\];
+    ```
+    # /etc/dovecot/sieve.d/spam-assassin.sieve
+    require ["fileinto"];
     # Move spam to spam folder
     if header :contains "X-Spam-Flag" "YES" {
      fileinto "Spam";
      # Stop here - if there are other rules, ignore them for spam messages
      stop;
     }
+    ```
     
+    ```
     cd /etc/dovecot/sieve.d
     sudo sievec spam-assassin.sieve
+    ```
     
 7.  Restart Dovecot
     
+    ```
     sudo service dovecot restart
+    ```
     
-8.  Test spam. The [GTUBE][2] is designed to definitely get rejected. Set the content of your email to this:
+8.  Test spam. The [GTUBE](https://spamassassin.apache.org/gtube/) is designed to definitely get rejected. Set the content of your email to this:
     
-    XJS\*C4JDBQADN1.NSBN3\*2IDNEN\*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL\*C.34X
+    ```
+    XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
+    ```
     
 9.  You should also be able to create user-defined filters in Sieve, via the ManageSieve protocol. I tested this using a Sieve thunderbird extension. You’re on your own here.
-
-[1]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/ "Installing email with Postfix and Dovecot (with Postgres)"
-[2]: https://spamassassin.apache.org/gtube/
index 69412088d491c7b7ead8cd6e23ce6e72e6ba3d85..132c213c471590d324e28342691fb0e15e4dcbe8 100644 (file)
@@ -14,68 +14,29 @@ updated: 2021-06-06 17:28:29-07:00
 wordpress_id: 598
 wordpress_slug: making-a-hardware-random-number-generator
 ---
-If you want a really good source of random numbers, you should get a hardware generator. But there’s not a lot of great options out there, and most people looking into this get (understandably) paranoid about backdoors. But, there’s a nice trick: if you combine multiple random sources together with [xor][1], it doesn’t matter if one is backdoored, as long as they aren’t all backdoored. There are some exceptions–if the backdoor is actively looking at the output, it can still break your system. But as long as you’re just generating some random pads, instead of making a kernel entropy pool, you’re fine with this trick.
+If you want a really good source of random numbers, you should get a hardware generator. But there’s not a lot of great options out there, and most people looking into this get (understandably) paranoid about backdoors. But, there’s a nice trick: if you combine multiple random sources together with [xor](https://github.com/za3k/short-programs#xor), it doesn’t matter if one is backdoored, as long as they aren’t all backdoored. There are some exceptions–if the backdoor is actively looking at the output, it can still break your system. But as long as you’re just generating some random pads, instead of making a kernel entropy pool, you’re fine with this trick.
 
 So! We just need a bunch of sources of randomness. Here’s the options I’ve tried:
 
--   /dev/urandom (40,000KB/s) – this is nearly a pseudo-random number generator, so it’s not that good. But it’s good to throw in just in case. \[[Learn][2] about /dev/random vs /dev/urandom if you haven’t. Then [unlearn][3] it again.\]
--   [random-stream][4] (1,000 KB/s), an implementation of the merenne twister pseudo-random-number generator. A worse version of /dev/urandom, use that unless you don’t trust the Linux kernel for some reason.
--   [infnoise][5] (20-23 KB/s), a USB hardware random number generator. Optionally whitens using [keccak][6]. Mine is unfortunately broken (probably?) and outputs “USB read error” after a while
--   [OneRNG][7] (55 KiB/s), a USB hardware random number generator. I use a [custom script][8] which outputs raw data instead of the provided scripts (although they look totally innocuous, do recommend
--   /dev/hwrng (123 KB/s), which accesses the hardware random number generator built into the raspberry pi. this device is provided by the [raspbian][9] package [rng-tools][10]. I learned about this option [here][11]
--   [rdrand-gen][12] (5,800 KB/s), a command-line tool to output random numbers from the Intel hardware generator instruction, [RDRAND][13].
+-   /dev/urandom (40,000KB/s) – this is nearly a pseudo-random number generator, so it’s not that good. But it’s good to throw in just in case. \[[Learn](https://stackoverflow.com/questions/23712581/differences-between-random-and-urandom) about /dev/random vs /dev/urandom if you haven’t. Then [unlearn](https://www.2uo.de/myths-about-urandom/) it again.\]
+-   [random-stream](https://github.com/za3k/short-programs#prng) (1,000 KB/s), an implementation of the merenne twister pseudo-random-number generator. A worse version of /dev/urandom, use that unless you don’t trust the Linux kernel for some reason.
+-   [infnoise](https://github.com/waywardgeek/infnoise) (20-23 KB/s), a USB hardware random number generator. Optionally whitens using [keccak](https://en.wikipedia.org/wiki/SHA-3). Mine is unfortunately broken (probably?) and outputs “USB read error” after a while
+-   [OneRNG](https://onerng.info/) (55 KiB/s), a USB hardware random number generator. I use a [custom script](https://gist.github.com/za3k/64faa4aa0a9ecb338a8af8b0569fccb6) which outputs raw data instead of the provided scripts (although they look totally innocuous, do recommend
+-   /dev/hwrng (123 KB/s), which accesses the hardware random number generator built into the raspberry pi. this device is provided by the [raspbian](https://packages.debian.org/buster/rng-tools-debian) package [rng-tools](https://github.com/nhorman/rng-tools). I learned about this option [here](https://scruss.com/blog/2013/06/07/well-that-was-unexpected-the-raspberry-pis-hardware-random-number-generator/)
+-   [rdrand-gen](https://github.com/jtulak/RdRand) (5,800 KB/s), a command-line tool to output random numbers from the Intel hardware generator instruction, [RDRAND](https://en.wikipedia.org/wiki/RDRAND).
 
-At the end, you can use my [xor][14] program to combine the streams/files. Make sure to use limit the output size if using files–by default it does not stop outputting data until EVERY file ends. The speed of the combined stream is at most going to be the slowest component (plus a little slowdown to xor everything). Here’s my final command line:
+At the end, you can use my [xor](https://github.com/za3k/short-programs#xor) program to combine the streams/files. Make sure to use limit the output size if using files–by default it does not stop outputting data until EVERY file ends. The speed of the combined stream is at most going to be the slowest component (plus a little slowdown to xor everything). Here’s my final command line:
 
-    #!/bin/bash
-    # Fill up the folder with 1 GB one-time pads. Requires 'rng-tools' and a raspberry pi. Run as sudo to access /dev/hwrng.
-    while true; do
-      sh onerng.sh | dd bs=1K count=1000000 of=tmp-onerng.pad 2>/dev/null
-      infnoise --raw | dd bs=1K count=1000000 of=tmp-infnoise.pad 2>/dev/null
-      xor tmp-onerng.pad tmp-infnoise.pad /dev/urandom /dev/hwrng | dd bs=1K count=1000000 of=/home/pi/pads/1GB-`\date +%Y-%m-%d-%H%M%S`.pad 2>/dev/null;
-    done
+```
+#!/bin/bash
+# Fill up the folder with 1 GB one-time pads. Requires 'rng-tools' and a raspberry pi. Run as sudo to access /dev/hwrng.
+while true; do
+  sh onerng.sh | dd bs=1K count=1000000 of=tmp-onerng.pad 2>/dev/null
+  infnoise --raw | dd bs=1K count=1000000 of=tmp-infnoise.pad 2>/dev/null
+  xor tmp-onerng.pad tmp-infnoise.pad /dev/urandom /dev/hwrng | dd bs=1K count=1000000 of=/home/pi/pads/1GB-`\date +%Y-%m-%d-%H%M%S`.pad 2>/dev/null;
+done
+```
 
-Great, now you have a good one-time-pad and can join [ok-mixnet][15] 🙂
+Great, now you have a good one-time-pad and can join [ok-mixnet](https://za3k.com/ok-mixnet.md) 🙂
 
 P.S. If you *really* know what you’re doing and like shooting yourself in the foot, you could try combining and whitening entropy sources with a randomness sponge like keccak instead.
-
-1.  ![](https://secure.gravatar.com/avatar/477bf018c52601e86d3a8aa07c6f9392?s=40&d=mm&r=g)jiacheng hao says:
-    
-    [March 3, 2024 at 9:04 pm][16]
-    
-    Hello, I think you are truely right about the TRNG. I am a researcher who specializes in designing TRNG. And now I have a TRNG chip with PCB support USB2.0. And the speed can be up to 30Mbps. It can pass NIST 800-22 and 800-90B. Are you interested in that? Looking forward to your reply!!
-    
-    [Reply][17]
-    
-2.  ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-    
-    [March 3, 2024 at 11:36 pm][18]
-    
-    Interested in what way?
-    
-    Is your TRNG open-source?
-    
-    Where do you research?
-    
-    [Reply][19]
-    
-
-[1]: https://github.com/za3k/short-programs#xor
-[2]: https://stackoverflow.com/questions/23712581/differences-between-random-and-urandom
-[3]: https://www.2uo.de/myths-about-urandom/
-[4]: https://github.com/za3k/short-programs#prng
-[5]: https://github.com/waywardgeek/infnoise
-[6]: https://en.wikipedia.org/wiki/SHA-3
-[7]: https://onerng.info/
-[8]: https://gist.github.com/za3k/64faa4aa0a9ecb338a8af8b0569fccb6
-[9]: https://packages.debian.org/buster/rng-tools-debian
-[10]: https://github.com/nhorman/rng-tools
-[11]: https://scruss.com/blog/2013/06/07/well-that-was-unexpected-the-raspberry-pis-hardware-random-number-generator/
-[12]: https://github.com/jtulak/RdRand
-[13]: https://en.wikipedia.org/wiki/RDRAND
-[14]: https://github.com/za3k/short-programs#xor
-[15]: https://za3k.com/ok-mixnet.md
-[16]: https://blog.za3k.com/making-a-hardware-random-number-generator/#comment-11135
-[17]: https://blog.za3k.com/making-a-hardware-random-number-generator/?replytocom=11135#respond
-[18]: https://blog.za3k.com/making-a-hardware-random-number-generator/#comment-11136
-[19]: https://blog.za3k.com/making-a-hardware-random-number-generator/?replytocom=11136#respond
index 9886368f6b8b64fb3a184bc6ffc8c86b300fc5cb..bef87bd6671cef044edee7ca9455e4435f0f613a 100644 (file)
@@ -13,29 +13,6 @@ updated: 2014-10-30 10:24:42-07:00
 wordpress_id: 18
 wordpress_slug: making-my-finances-public
 ---
-I decided to post all of my purchases/income. This isn’t something I was totally comfortable with, but I couldn’t think of good reasons not to, and my default position is to release information. I think this is especially interesting since it’s not something I’ve seen made available before. Link: [http://za3k.com/money.html][1]
+I decided to post all of my purchases/income. This isn’t something I was totally comfortable with, but I couldn’t think of good reasons not to, and my default position is to release information. I think this is especially interesting since it’s not something I’ve seen made available before. Link: [http://za3k.com/money.html](http://za3k.com/money.html)
 
 I think the analysis may be useful to other hackers, as people tend to be insane and cost-insensitive around money. I think having another persons’s finances to look at for comparison is something I’ve wanted for various reasons at various times, and it’s not commonly available. My selfish motivations are to get other people to tell me how I should be saving lots of money, and to feel like my financial decisions are under scrutiny (which is good and bad).
-
-1.  ![](https://secure.gravatar.com/avatar/35cf1c8d20becce42e768c4bade3a1dc?s=40&d=mm&r=g)anon says:
-    
-    [February 7, 2019 at 6:19 am][2]
-    
-    is offline
-    
-    [Reply][3]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [December 17, 2019 at 7:41 pm][4]
-        
-        Yeah, my export broke a while back. This should be fixed indefinitely, but covers 2011-2016 only now.
-        
-        [Reply][5]
-        
-
-[1]: http://za3k.com/money.html
-[2]: https://blog.za3k.com/making-my-finances-public/#comment-3253
-[3]: https://blog.za3k.com/making-my-finances-public/?replytocom=3253#respond
-[4]: https://blog.za3k.com/making-my-finances-public/#comment-3882
-[5]: https://blog.za3k.com/making-my-finances-public/?replytocom=3882#respond
index c20ebafb482aa45f8813896d3c295818dead0fc2..f6a2ac4d9fcb86cad2f81d6a685fc5ff2151411e 100644 (file)
@@ -15,21 +15,21 @@ wordpress_slug: making-signs-on-wall-tiles
 ---
 I recently made an art project as a birthday gift for a young friend of mine.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/rachel_tile-1024x499.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/rachel_tile-1024x499.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/rachel_tile-scaled.jpg)
 
 I hadn’t seen the exact technique I invented to make stencils posted anywhere, so I figured I’d share it. I don’t think this is a good method, but maybe it will inspire someone to do something better.
 
 I started with a blank tile. On top, I put down a layer of painter’s tape (basically masking tape, but a little less stretchy).
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/blue_stencil-crop-300x154.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/blue_stencil-crop-300x154.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/blue_stencil-crop.jpg)
 
-I printed and taped a piece of paper on top (made using [this online tool][3] with the font [BreeSerif][4]):
+I printed and taped a piece of paper on top (made using [this online tool](https://online.rapidresizer.com/make-name-patterns.php) with the font [BreeSerif](https://fonts.google.com/specimen/Bree+Serif)):
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/image-1024x250.png)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/image-1024x250.png)](https://blog.za3k.com/wp-content/uploads/2024/04/image.png)
 
 I used an x-acto knife to cut through both the top paper and paper, then removed the paper. Then I peeled the letters out of the painter’s tape.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/blue_stencil-crop-1-1024x606.jpg)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/blue_stencil-crop-1-1024x606.jpg)](https://blog.za3k.com/wp-content/uploads/2024/04/blue_stencil-crop-1.jpg)
 
 I painted the letters with acrylic, let them dry, and removed the tape. In retrospect, it probably would have been easier to remove the tape wet, because acrylic paint is a little stretchy and I went over the lines.
 
@@ -37,14 +37,6 @@ The letters happily lifted *right* off the glazed tile, which hadn’t been sand
 
 Finally, I used a masonry bit to drill screw holes in the tile, so it could be attached to a door.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/04/rachel_with_tile-226x300.jpeg)][7]
+[![](https://blog.za3k.com/wp-content/uploads/2024/04/rachel_with_tile-226x300.jpeg)](https://blog.za3k.com/wp-content/uploads/2024/04/rachel_with_tile.jpeg)
 
 She seemed to like it :). But now she wants to make one too. I’ll have to see if I can invent an easier way.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2024/04/rachel_tile-scaled.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2024/04/blue_stencil-crop.jpg
-[3]: https://online.rapidresizer.com/make-name-patterns.php
-[4]: https://fonts.google.com/specimen/Bree+Serif
-[5]: https://blog.za3k.com/wp-content/uploads/2024/04/image.png
-[6]: https://blog.za3k.com/wp-content/uploads/2024/04/blue_stencil-crop-1.jpg
-[7]: https://blog.za3k.com/wp-content/uploads/2024/04/rachel_with_tile.jpeg
index 8d930f1d1ff6173c39c38243e243f2fa81783144..5660a7f95ca94d088641106c3e454075f2cba9c9 100644 (file)
@@ -17,21 +17,16 @@ wordpress_slug: markdown-support
 ---
 Today I added support for development of za3k.com using git:
 
-\# !/bin/sh
+```
+# !/bin/sh
 # /git/bare-repos/za3k.com/hooks/post-update
-cd ~za3k/public\_html
+cd ~za3k/public_html
 env -i git pull
 echo "Deployed za3k.com"
+```
 
-and markdown support, via a [cgi markdown wrapper][1] someone wrote for apache (yes, I’m still using Apache).
+and markdown support, via a [cgi markdown wrapper](https://github.com/alue/markdown-handler/blob/master/README.md) someone wrote for apache (yes, I’m still using Apache).
 
-Edit: I ended up wanting support for tables in markdown, so I used [Ruby][2]‘s [redcarpet][3] markdown gem (the same thing [Github][4] uses, supports [this style of tables][5] as well as code blocks).
+Edit: I ended up wanting support for tables in markdown, so I used [Ruby](https://www.ruby-lang.org/)‘s [redcarpet](https://github.com/vmg/redcarpet) markdown gem (the same thing [Github](https://github.com/) uses, supports [this style of tables](http://www.tablesgenerator.com/markdown_tables) as well as code blocks).
 
-CGI support via [http://blog.tonns.org/2013/10/enabling-markdown-on-your-apache.html][6]
-
-[1]: https://github.com/alue/markdown-handler/blob/master/README.md
-[2]: https://www.ruby-lang.org/
-[3]: https://github.com/vmg/redcarpet
-[4]: https://github.com/
-[5]: http://www.tablesgenerator.com/markdown_tables
-[6]: http://blog.tonns.org/2013/10/enabling-markdown-on-your-apache.html
+CGI support via [http://blog.tonns.org/2013/10/enabling-markdown-on-your-apache.html](http://blog.tonns.org/2013/10/enabling-markdown-on-your-apache.html)
index acae9882f3db06d89302717eba929fe3cb81db6e..b6d6cdd8f237ca4dac397891614a5f10b64bf7bf 100644 (file)
@@ -17,15 +17,12 @@ I play D&D. There are a thousand initiative trackers out there. Here’s one I i
 
 First, each player picks a Meeple to be their character’s mini.
 
-[![Four meeples on an index card, representing a wagon.](https://blog.za3k.com/wp-content/uploads/2023/07/board-crop-1024x387.jpg)][1]
+[![Four meeples on an index card, representing a wagon.](https://blog.za3k.com/wp-content/uploads/2023/07/board-crop-1024x387.jpg)](https://blog.za3k.com/wp-content/uploads/2023/07/board-crop.jpg)
 
 Four PCs on a wagon move over swampy terrain.
 
 Quick, roll initiative! The players all roll, and so do the enemies. We grab a second meeple for each player, as well as second token for each enemy. This becomes the initiative tracker.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/initiative-crop-1-1024x341.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/initiative-crop-1-1024x341.jpg)](https://blog.za3k.com/wp-content/uploads/2023/07/initiative-crop-1.jpg)
 
 This is the initiative order. It’s currently the red meeple hero’s turn. Next up will be the blue meeple hero, then the black cube enemy, and so on.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2023/07/board-crop.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2023/07/initiative-crop-1.jpg
index 64e76ae06e923957c163a8c9fc23d7209c896018..dddce395d345c26aa2e42dcb1a925a7f6f11432f 100644 (file)
@@ -16,14 +16,14 @@ wordpress_slug: migrating-an-existing-debian-installation-to-encrypted-root
 ---
 In this article, I migrate an existing debian 10 buster release, from an unencrypted root drive, to an encrypted root. I used a second hard drive because it’s safer–this is NOT an in-place migration guide. We will be encrypting / (root) only, not /boot. My computer uses UEFI. This guide **is specific to debian**–I happen to know these steps would be different on Arch Linux, for example. They probably work great on a different debian version, and might even work on something debian-based like Ubuntu.
 
-In [part 2][1], I add an optional extra where root decrypts using a special USB stick rather than a keyboard passphrase, for unattended boot.
+In [part 2](https://blog.za3k.com/encrypted-root-on-debian-part-2-unattended-boot/), I add an optional extra where root decrypts using a special USB stick rather than a keyboard passphrase, for unattended boot.
 
 Apologies if I forget any steps–I wrote this after I did the migration, and not during, so it’s not copy-paste.
 
 Q: Why aren’t we encrypting /boot too?
 
-1.  Encrypting /boot doesn’t add much security. Anyone can guess what’s on my /boot–it’s the same as on everyone debian distro. And encrypting /boot doesn’t prevent tampering–someone can easily replace my encrypted partition by an unencrypted one without my noticing. Something like [Secure Boot][2] would resist tampering, but still doesn’t require an encrypted /boot.
-2.  I pull a special trick in [part 2][3]. Grub2’s has new built-in encryption support, which is what would allow encrypting /boot. But grub2 can’t handle keyfiles or keyscripts as of writing, which I use.
+1.  Encrypting /boot doesn’t add much security. Anyone can guess what’s on my /boot–it’s the same as on everyone debian distro. And encrypting /boot doesn’t prevent tampering–someone can easily replace my encrypted partition by an unencrypted one without my noticing. Something like [Secure Boot](https://www.rodsbooks.com/efi-bootloaders/secureboot.html) would resist tampering, but still doesn’t require an encrypted /boot.
+2.  I pull a special trick in [part 2](https://blog.za3k.com/encrypted-root-on-debian-part-2-unattended-boot/). Grub2’s has new built-in encryption support, which is what would allow encrypting /boot. But grub2 can’t handle keyfiles or keyscripts as of writing, which I use.
 
 **How boot works**
 
@@ -44,18 +44,22 @@ First off, I used TWO hard drives–this is not an in-place migration, and that
 
 Here’s the output of `gdisk -l` on my original disk:
 
-    Number  Start (sector)    End (sector)  Size       Code  Name
-       1            2048         1050623   512.0 MiB   EF00  # EFI, mounted at /boot/efi
-       2         1050624       354803711   168.7 GiB   8300  # ext4, mounted at /
-       3       354803712       488396799   63.7 GiB    8200  # swap
+```
+Number  Start (sector)    End (sector)  Size       Code  Name
+   1            2048         1050623   512.0 MiB   EF00  # EFI, mounted at /boot/efi
+   2         1050624       354803711   168.7 GiB   8300  # ext4, mounted at /
+   3       354803712       488396799   63.7 GiB    8200  # swap
+```
 
 Here will be the final output of `gdisk -l` on the new disk:
 
-    Number  Start (sector)    End (sector)  Size       Code  Name
-       1            2048          526335   256.0 MiB   EF00  efi # EFI, mounted at /boot/efi
-       2         1050624       135268351   64.0 GiB    8200  swap # swap
-       3       135268352       937703054   382.6 GiB   8300  root_cipher # ext4-on-LUKS. ext4 mounted at /
-       4          526336         1050623   256.0 MiB   8300  boot # ext4, mounted at /boot
+```
+Number  Start (sector)    End (sector)  Size       Code  Name
+   1            2048          526335   256.0 MiB   EF00  efi # EFI, mounted at /boot/efi
+   2         1050624       135268351   64.0 GiB    8200  swap # swap
+   3       135268352       937703054   382.6 GiB   8300  root_cipher # ext4-on-LUKS. ext4 mounted at /
+   4          526336         1050623   256.0 MiB   8300  boot # ext4, mounted at /boot
+```
 
 1.  Stop anything else running. We’re going to do a “live” copy from the running system, so at least stop doing anything else. Also most of the commands in this guide need root (`sudo`).
 2.  Format the new disk. I used `gdisk` and you must select a gpt partition table. Basically I just made everything match the original. The one change I need is to add a /boot partition, so grub2 will be able to do the second stage. I also added partition labels with the `c` gdisk command to all partitions: boot, root\_cipher, efi, and swap. I decided I’d like to be able to migrate to a larger disk later without updating a bunch of GUIDs, and filesystem or partition labels are a good method.
@@ -93,7 +97,3 @@ Here will be the final output of `gdisk -l` on the new disk:
 16.  Shut down your computer. Remove your root disk and boot from the new one. It should work now, asking for your password during boot.
 17.  Once you boot successfully and verify everything mounted, you can remove the `nofail` from /etc/fstab if you want.
 18.  (In my case, I also set up the swap partition after successful boot.) Edit: Oh, also don’t use unencrypted swap with encrypted root. That was dumb.
-
-[1]: https://blog.za3k.com/encrypted-root-on-debian-part-2-unattended-boot/
-[2]: https://www.rodsbooks.com/efi-bootloaders/secureboot.html
-[3]: https://blog.za3k.com/encrypted-root-on-debian-part-2-unattended-boot/
index 4dc796f1fff712d979eb33f685f42bc65bd12b7b..27c568e9e48d3314e84fbe13380f0efe354b8033 100644 (file)
@@ -15,24 +15,24 @@ updated: 2020-05-20 15:56:19-07:00
 wordpress_id: 539
 wordpress_slug: mon8
 ---
-I had previously hand-rolled a status monitor, [status.za3k.com][1], which I am in the process of replacing ([new version][2]). I am replacing it with a linux monitoring daemon, [mon][3], which I recommend. It is targeted at working system administrators. ‘mon’ adds many features over my own system, but still has a very bare-bones feeling.
+I had previously hand-rolled a status monitor, [status.za3k.com](http://status.za3k.com/), which I am in the process of replacing ([new version](https://germinate.za3k.com/pub/status/mon.txt)). I am replacing it with a linux monitoring daemon, [mon](https://mirrors.edge.kernel.org/pub/software/admin/mon/html/man/mon.html), which I recommend. It is targeted at working system administrators. ‘mon’ adds many features over my own system, but still has a very bare-bones feeling.
 
-The old service, ‘[simple-status][4]‘ worked as follows:
+The old service, ‘[simple-status](https://github.com/za3k/za3k.com/blob/master/cgi-bin/status-simple)‘ worked as follows:
 
 -   You visited the URL. Then, the status page would (live) kick of about 30 parallel jobs, to check the status of 30 services
 -   The list of services is one-per-file in a the services.d directory.
 -   For each service, it ran a short script, with no command line arguments.
 -   All output is displayed in a simple html table, with the name of the service, the status (with color coding), and a short output line.
 -   The script could return with a success (0) or non-success status code. If it returned success, that status line would display in green for success. If it failed, the line would be highlighted red for failure.
--   Scripts can be anything, but I wrote several utility functions to be called from scripts. For example, “[ping?][5]” checks whether a host is pingable.
--   Each script was wrapped in [timeout][6]. If the script took too long to run, it would be highlighted yellow.
+-   Scripts can be anything, but I wrote several utility functions to be called from scripts. For example, “[ping?](https://github.com/za3k/za3k.com/blob/master/cgi-bin/ping%3F)” checks whether a host is pingable.
+-   Each script was wrapped in [timeout](https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html#timeout-invocation). If the script took too long to run, it would be highlighted yellow.
 -   The reason all scripts ran every time, is to prevent a failure mode where the information could ever be stale without me noticing.
 
 Mon works as follows
 
 -   The list of 30 services is defined in /etc/mon/con.cf.
 -   For each service, it runs a single-line command (monitor) with arguments. The hostname(s) are added to the command line automatically.
--   All output can be displayed in a simple html table, with the name of the service, the status (with color coding), the time of last and next run, and a short output line. Or, I use ‘[monshow][7]‘, which is similar but in a text format.
+-   All output can be displayed in a simple html table, with the name of the service, the status (with color coding), the time of last and next run, and a short output line. Or, I use ‘[monshow](https://mirrors.edge.kernel.org/pub/software/admin/mon/html/man/monshow.html)‘, which is similar but in a text format.
 -   Monitors can be anything, but several useful ones are provided in /usr/lib/mon/mon.d (on debian). For example the monitor “ping” checks whether a host is pingable.
 -   The script could return with a success (0) or non-success status code. If it returned success, the status line would display in green for success (on the web interface), or red for failure.
 -   All scripts run periodically. A script have many states, not just “success” or “failure”. For example “untested” (not yet run) or “dependency failing” (I assume, not yet seen).
@@ -59,11 +59,3 @@ As you can see, the two have a very similar approach to the component scripts, w
 Overall I think that ‘mon’ is much more complex, but only to add features, and it doesn’t have a lot of features I wouldn’t use. It still is pretty simple with a simple interface. I recommend it as both good, and overall better than my system.
 
 My only complaint is that it’s basically impossible to Google, which is why I’m writing a recommendation for it here.
-
-[1]: http://status.za3k.com/
-[2]: https://germinate.za3k.com/pub/status/mon.txt
-[3]: https://mirrors.edge.kernel.org/pub/software/admin/mon/html/man/mon.html
-[4]: https://github.com/za3k/za3k.com/blob/master/cgi-bin/status-simple
-[5]: https://github.com/za3k/za3k.com/blob/master/cgi-bin/ping%3F
-[6]: https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html#timeout-invocation
-[7]: https://mirrors.edge.kernel.org/pub/software/admin/mon/html/man/monshow.html
index 737dd32bc0767a31426bfa9df7c5b2124997d835..3347ab0c5f5afd5f6af08e78f113c5debceb18ad 100644 (file)
@@ -13,7 +13,7 @@ updated: 2014-12-02 13:51:00-07:00
 wordpress_id: 84
 wordpress_slug: money-orders
 ---
-[![A postal money order](https://blog.za3k.com/wp-content/uploads/2014/12/Figure6-300x237.jpg)][1]
+[![A postal money order](https://blog.za3k.com/wp-content/uploads/2014/12/Figure6-300x237.jpg)](https://blog.za3k.com/wp-content/uploads/2014/12/Figure6.jpg)
 
 A postal money order
 
@@ -24,5 +24,3 @@ I was tired of checks bouncing. I can’t be bothered to make sure my account re
 I went down to the bank and got out $2750, and headed to the post office. I asked for 9 money orders, each for $303. The postal worker really only made a couple funny faces about me being weird, although my friend said she was pretty loud about my walking out with that much cash-equivalent, it went pretty well. And I immediately endorsed all the money orders so now they can lie around the hose safely.
 
 Also, they come with attachable receipts (shown in the picture) in case you lose the check and need a replacement, so that’s nice.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2014/12/Figure6.jpg
index 265e6b6805e275c88c045a46d4e4b8f862700455..40d2db94219edfaba4ef3b932cc1265a4e949b29 100644 (file)
@@ -16,15 +16,15 @@ updated: 2015-01-22 21:17:18-07:00
 wordpress_id: 104
 wordpress_slug: moreorcs-com
 ---
-[![orc](https://blog.za3k.com/wp-content/uploads/2015/01/orc-300x300.jpg)][1]
+[![orc](https://blog.za3k.com/wp-content/uploads/2015/01/orc-300x300.jpg)](http://moreorcs.com)
 
-My newest site: [http://moreorcs.com/][2]
+My newest site: [http://moreorcs.com/](http://moreorcs.com/)
 
-The site generates orc-themed emails for you, which you can get emailed at (completely insecurely, it’s just a web address at [mailinator][3] to see the content). Please check out mailinator’s site, it’s a really neat project.
+The site generates orc-themed emails for you, which you can get emailed at (completely insecurely, it’s just a web address at [mailinator](https://mailinator.com) to see the content). Please check out mailinator’s site, it’s a really neat project.
 
 Some samples:
 
--   the last small poop orc ([thelastsmallpooporc@moreorcs.com][4])
+-   the last small poop orc ([thelastsmallpooporc@moreorcs.com](mailto:thelastsmallpooporc@moreorcs.com))
 -   poop gross green blood thirsty orc
 -   49 cross-eyed slightly intimidating poop dumb orcs
 -   the last slightly intimidating orc
@@ -33,8 +33,3 @@ Some samples:
 -   smelly orc
 -   a few orcs
 -   lots and lots and lots and lots and lots and lots of orcs
-
-[1]: http://moreorcs.com
-[2]: http://moreorcs.com/
-[3]: https://mailinator.com
-[4]: mailto:thelastsmallpooporc@moreorcs.com
index 5c3b403f86c91ab9bde90d25057d3bba4e2460d3..112c541538a855b409b0387de37e9d0865019fca 100644 (file)
@@ -14,7 +14,7 @@ updated: 2015-04-30 03:28:05-07:00
 wordpress_id: 210
 wordpress_slug: multi-universe-rpg-toy
 ---
-[https://www.rpgsolo.com/][1] has a table for resolving yes/no questions, in turn taken from [FU RPG][2]. Roll a die:
+[https://www.rpgsolo.com/](https://www.rpgsolo.com/) has a table for resolving yes/no questions, in turn taken from [FU RPG](http://perilplanet.com/fu/). Roll a die:
 
 -   Yes, and…
 -   Yes…
@@ -23,7 +23,7 @@ wordpress_slug: multi-universe-rpg-toy
 -   No…
 -   No, and…
 
-[![cube](https://blog.za3k.com/wp-content/uploads/2015/04/cube-300x298.jpg)][3]
+[![cube](https://blog.za3k.com/wp-content/uploads/2015/04/cube-300x298.jpg)](https://blog.za3k.com/wp-content/uploads/2015/04/cube.jpg)
 
 Their example:
 
@@ -47,7 +47,3 @@ So we’ve gotten a base system for telling stories. We then added the following
 2.  (addendum) Actually, roll two dice: only split the universe if the second die comes up “1” or “2”. Otherwise, answer the question normally. This speeds things up a bit.
 
 It was pretty fun in practice. I recommend using a text file over paper, since you’re going to do a lot of copy-paste. We had more fun with no GM than with a GM. No firm result yet on sandbox-worldbuilding vs players in scenarios; both seemed all right.
-
-[1]: https://www.rpgsolo.com/
-[2]: http://perilplanet.com/fu/
-[3]: https://blog.za3k.com/wp-content/uploads/2015/04/cube.jpg
index fca6fe8830964caefeb116fc90acd4fae9f98e84..17b9dfc26021712a5c77fa96fe79989675ae0e54 100644 (file)
@@ -18,9 +18,9 @@ I’ve had a couple people ask how my TODO list works, so here’s what I’ve b
 
 The calendar has anything that needs to be done on a specific day. Birthday reminders, doctor’s appointments, and weekly activities like board game night or trash day. You’ve seen calendars. This is nothing interesting.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/weekly-crop-246x300.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/weekly-crop-246x300.jpg)](https://blog.za3k.com/wp-content/uploads/2023/07/weekly-crop.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/cal-crop-300x255.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/cal-crop-300x255.jpg)](https://blog.za3k.com/wp-content/uploads/2023/07/cal-crop.jpg)
 
 **A yearly goals list**
 
@@ -34,13 +34,13 @@ You can ignore this one.
 
 A daily TODO list, written on paper. I throw it out at the end of each day, without copying anything off it. (I actually scan it, but I never look at the scans). This one I find very helpful.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/todo-daily-crop-748x1024.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/todo-daily-crop-748x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2023/07/todo-daily-crop.jpg)
 
 **Master TODO list**
 
 A “master” TODO list, consisting of everything I want to get done long term. I store this as a text file.
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/07/todo-crop-894x1024.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/07/todo-crop-894x1024.png)](https://blog.za3k.com/wp-content/uploads/2023/07/todo-crop.png)
 
 Each task is a one-line description.
 
@@ -71,8 +71,3 @@ In addition, I have a few special categories:
 I try to minimize subtasks, in general. If I have a big task (clean the house), I’ll try to list it as “clean the bedroom”, etc as seperate tasks. If I have to, I’ll have a big task that references separate small tasks, but it’s the exception, and usually in the “more than a week” category.
 
 And that’s about all I have to say.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2023/07/weekly-crop.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2023/07/cal-crop.jpg
-[3]: https://blog.za3k.com/wp-content/uploads/2023/07/todo-daily-crop.jpg
-[4]: https://blog.za3k.com/wp-content/uploads/2023/07/todo-crop.png
index 8eb80393f6571b8b78ebdfec8ca04e8094a1fba9..38eff2521bdf95a587754fa9c5f9a9d2040dddab 100644 (file)
@@ -14,7 +14,4 @@ updated: 2021-10-22 14:41:32-07:00
 wordpress_id: 715
 wordpress_slug: ogs2021-27-million-go-games
 ---
-I downloaded all 27 million Go games from online-go.com, aka OGS, with permission. They are available [on Internet Archive][1] or [here][2] as SGF files or JSON. You can use them for whatever you like.
-
-[1]: https://archive.org/details/ogs2021
-[2]: https://za3k.com/ogs/
+I downloaded all 27 million Go games from online-go.com, aka OGS, with permission. They are available [on Internet Archive](https://archive.org/details/ogs2021) or [here](https://za3k.com/ogs/) as SGF files or JSON. You can use them for whatever you like.
index 8f0eb673f92ed9e57897c7336f10e33bb614f033..c1eec201a4240fd031f57f5ee99c41a05eb963d3 100644 (file)
@@ -16,11 +16,8 @@ wordpress_slug: ok-mixnet
 ---
 I made a new cryptosystem called OK-Mixnet. It has “perfect” security, as opposed to the usual pretty-good security. (Of course, it’s not magic–if your computer is hacked, the cryptosystem isn’t gonna protect your data). Despite the name, it’s not really a mixnet per se, it just similarly defends against SIGINT.
 
-A writeup is here: [https://za3k.com/ok-mixnet.md][1]
+A writeup is here: [https://za3k.com/ok-mixnet.md](https://za3k.com/ok-mixnet.md)
 
-The alpha codebase is here: [https://github.com/za3k/ok-mixnet][2]
+The alpha codebase is here: [https://github.com/za3k/ok-mixnet](https://github.com/za3k/ok-mixnet)
 
 Let me know if you’d like to join the open alpha. Email me your username and IP (you’ll need to forward a port).
-
-[1]: https://za3k.com/ok-mixnet.md
-[2]: https://github.com/za3k/ok-mixnet
index 6d8abe3321310bc852d4122d3529732760acdd5f..7258117b0785c224258f81610261cb6712237406 100644 (file)
@@ -15,15 +15,12 @@ updated: 2023-02-03 13:37:16-07:00
 wordpress_id: 994
 wordpress_slug: old-wikipedia-urdu
 ---
-Pakistan has blocked access to Wikipedia. Old Wikipedia is now available [in urdu][1], and has the same content.
+Pakistan has blocked access to Wikipedia. Old Wikipedia is now available [in urdu](https://ur.oldwikipedia.org/), and has the same content.
 
 We are working on more clearly communicating the Old Wikipedia is not Wikipedia in Urdu like we do in English–translation help would be welcome!
 
-[https://ur.oldwikipedia.org][2]
+[https://ur.oldwikipedia.org](https://ur.oldwikipedia.org/)
 
 پاکستان نے ویکیپیڈیا کی رسائی روک دی ہے۔ پرانا ویکیپیڈیا اب بزبان اردو میں دستیاب ہے، اور اس میں پہلے جیسی مواد ہے۔
 
 ہم انگریزی میں جیسے، ہم پرانے ویکیپیڈیا کو ویکیپیڈیا کے بطور بزبان اردو مذکور نہیں کہنے کی سعی کر رہے ہیں- ترجمہ کی مدد خوشبو دائی جائے گی!
-
-[1]: https://ur.oldwikipedia.org/
-[2]: https://ur.oldwikipedia.org/
index f8fc4239835624ac66fa2eb021f389027d6d64fb..e409b988d30b28d418d31b4be44625c987d80a80 100644 (file)
@@ -14,11 +14,8 @@ updated: 2023-02-02 12:47:39-07:00
 wordpress_id: 985
 wordpress_slug: old-wikipedia
 ---
-Prefer the old layout of Wikipedia? A couple friends and I made [oldwikipedia.org][1]
+Prefer the old layout of Wikipedia? A couple friends and I made [oldwikipedia.org](https://oldwikipedia.org/)
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/02/2023-02-02-144514_1920x1080_scrot-crop-1024x357.png)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/02/2023-02-02-144514_1920x1080_scrot-crop-1024x357.png)](https://blog.za3k.com/wp-content/uploads/2023/02/2023-02-02-144514_1920x1080_scrot-crop.png)
 
 Hope you enjoy.
-
-[1]: https://oldwikipedia.org/
-[2]: https://blog.za3k.com/wp-content/uploads/2023/02/2023-02-02-144514_1920x1080_scrot-crop.png
index 6a67da518ab42355f81fb97bc398e8929c5750ce..81da125b8f6bfb8e0ac8e50abebd095694a14898 100644 (file)
@@ -15,12 +15,8 @@ wordpress_slug: one-page-rpgs
 ---
 I’ve written a few simple storytelling games or RPGs lately. They’re all under two pages of rules, and currently they’re all untested (first test is Monday!).
 
--   [Ultimate Archwizards vs the Dark Lord][1] Game for 3-6 players including one GM. Guessing 2-4 hours. Imagine the final episode of a fight anime–everyone is mega-level powered. Relatively goofy. Suitable for beginner players, would work with a beginner GM too. Designed with zero prep in mind.
--   [No, this cannot be! I AM INVINCIBLE!][2] Game for 2-8 players, no GM. More fun with 4+. Guessing 30 minutes. Heroes want to kill Villains, Villains also want to be killed. Villains therefore send wave after slightly harder wave of enemies at the Heroes to level them up. Designed to be comfortable for complete beginners, while letting expert storytellers play in the same group. About half storytelling, half stats. Some gameplay is probably similar to Munchkin, but I haven’t really played Munchkin. There’s a little prep at the start for Villains (5 minutes), almost none for Heroes. The only one of the three that needs playtesting to balance.
--   [Ninjas Ninjas Ninjas!][3] Game for 3 players exactly, no GM. Not for beginners. Guessing 5-30 minutes once you learn the rules (up to you). Frantically fast storytelling, challenges are 30-60 seconds each. There are several roles including the main “narrator”, which players swap often. The main goal is to show how cool your ninja team is, but you do also complete your mission. Can be played with nothing, not even paper. Could be expanded to work with 4 or 5 players, but would need more work.
+-   [Ultimate Archwizards vs the Dark Lord](https://za3k.com/archive/ultimate_archwizard.md) Game for 3-6 players including one GM. Guessing 2-4 hours. Imagine the final episode of a fight anime–everyone is mega-level powered. Relatively goofy. Suitable for beginner players, would work with a beginner GM too. Designed with zero prep in mind.
+-   [No, this cannot be! I AM INVINCIBLE!](https://za3k.com/archive/invincible.md) Game for 2-8 players, no GM. More fun with 4+. Guessing 30 minutes. Heroes want to kill Villains, Villains also want to be killed. Villains therefore send wave after slightly harder wave of enemies at the Heroes to level them up. Designed to be comfortable for complete beginners, while letting expert storytellers play in the same group. About half storytelling, half stats. Some gameplay is probably similar to Munchkin, but I haven’t really played Munchkin. There’s a little prep at the start for Villains (5 minutes), almost none for Heroes. The only one of the three that needs playtesting to balance.
+-   [Ninjas Ninjas Ninjas!](https://za3k.com/archive/ninjas.md) Game for 3 players exactly, no GM. Not for beginners. Guessing 5-30 minutes once you learn the rules (up to you). Frantically fast storytelling, challenges are 30-60 seconds each. There are several roles including the main “narrator”, which players swap often. The main goal is to show how cool your ninja team is, but you do also complete your mission. Can be played with nothing, not even paper. Could be expanded to work with 4 or 5 players, but would need more work.
 
 Will post my two spy games in a bit once I type them up!
-
-[1]: https://za3k.com/archive/ultimate_archwizard.md
-[2]: https://za3k.com/archive/invincible.md
-[3]: https://za3k.com/archive/ninjas.md
index 3b4ef641ed35708ca156c92ad36544fe4770f196..f21f04f38c86d4bb4086cdc8c88dd2acfbb44b8c 100644 (file)
@@ -21,29 +21,33 @@ I’ll go over my exact setup below in case anyone is interested in doing the sa
 
 **/bin/screenlog**
 
-GPG\_KEY=Zachary
+```
+GPG_KEY=Zachary
 TEMPLATE=/var/screenlog/%Y-%m-%d/%Y-%m-%d.%H:%M:%S.jpg
 export DISPLAY=:0
 export XAUTHORITY=/tmp/XAuthority
 
-IMG=$(\\date +$TEMPLATE)
+IMG=$(\date +$TEMPLATE)
 mkdir -p $(dirname "$IMG")
 scrot "$IMG"
-gpg --encrypt -r "$GPG\_KEY" "$IMG"
+gpg --encrypt -r "$GPG_KEY" "$IMG"
 shred -zu "$IMG"
+```
 
 The script
 
 -   Prints everything to stderr if you run it manually
 -   Makes a per-day directory. We store everything in /var/screenlog/2022-07-10/ for the day
 -   Takes a screenshot. By default, crontab doesn’t have X Windows (graphics) access. To allow it, the XAuthority file which allows access needs to be somewhere my crontab can reliably access. I picked `/tmp/XAuthority`. It doesn’t need any unusual permissions, but the default location has some random characters in it.
--   [GPG][1]\-encrypts the screenshot with a public key and deletes the original. This is extra protection in case my backups somehow get shared, so I don’t literally leak all my habits, passwords, etc. I just use my standard key so I don’t lose it. It’s [public-key crypto][2], so put the public key on your laptop. Put the private key on neither, one, or both, depending on which you want to be able to read the photos.
+-   [GPG](https://www.gnupg.org/)\-encrypts the screenshot with a public key and deletes the original. This is extra protection in case my backups somehow get shared, so I don’t literally leak all my habits, passwords, etc. I just use my standard key so I don’t lose it. It’s [public-key crypto](https://en.wikipedia.org/wiki/Public-key_cryptography), so put the public key on your laptop. Put the private key on neither, one, or both, depending on which you want to be able to read the photos.
 
 **/etc/cron.d/screenlog**
 
-\* \* \* \* \* zachary  /bin/screenlog
-20  \* \* \* \* zachary  rsync --remove-source-files -r /var/screenlog/ backup-machine:/data/screenlog/laptop
-30  \* \* \* \* zachary  rmdir /var/screenlog/\*
+```
+* * * * * zachary  /bin/screenlog
+20  * * * * zachary  rsync --remove-source-files -r /var/screenlog/ backup-machine:/data/screenlog/laptop
+30  * * * * zachary  rmdir /var/screenlog/*
+```
 
 That’s
 
@@ -53,9 +57,8 @@ That’s
 
 **~/.profile**
 
+```
 export XAUTHORITY=/tmp/XAuthority
+```
 
 I mentioned /bin/screenlog needs to know where XAuthority is. In Arch Linux this is all I need to do.
-
-[1]: https://www.gnupg.org/
-[2]: https://en.wikipedia.org/wiki/Public-key_cryptography
index 07049dac3d52d8c60eb720cf2dba7044439cbe5e..e34189bed025667d116e003978e64313d7cd5d8e 100644 (file)
@@ -16,7 +16,7 @@ wordpress_slug: open-nntp-server
 ---
 I’m opening the NNTP server at nttp.za3k.com (TLS or unencrypted) to the public. These are the newsgroups currently on it. It is virtually zero-traffic (no users, but also users post little).
 
-If you don’t have a news reader, Thunderbird can do the job, or take a look at the list [here][1].
+If you don’t have a news reader, Thunderbird can do the job, or take a look at the list [here](https://en.wikipedia.org/wiki/List_of_Usenet_newsreaders).
 
 art.agency.applied  
 art.autonomy  
@@ -42,5 +42,3 @@ talk.science
 talk.writing  
 talk.writing.collaborative  
 test.posts
-
-[1]: https://en.wikipedia.org/wiki/List_of_Usenet_newsreaders
index 54fd78258ea9a6c147efddff8751e57adde64786..725f868438bcb135d810f18556d8d0a97fcbc7b1 100644 (file)
@@ -13,23 +13,18 @@ updated: 2023-02-02 14:41:07-07:00
 wordpress_id: 988
 wordpress_slug: painting
 ---
-[![](https://blog.za3k.com/wp-content/uploads/2023/02/waves-1014x1024.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2023/02/waves-1014x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2023/02/waves.jpg)
 
 Waves, Z Vance 2023
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/02/small-977x1024.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2023/02/small-977x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2023/02/small.jpg)
 
 Bouquet, Z Vance 2023
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/02/art1-crop-448x1024.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2023/02/art1-crop-448x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2023/02/art1-crop.jpg)
 
 Worm Statue, Z Vance 2023
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/02/statue1-crop-635x1024.jpg)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2023/02/statue1-crop-635x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2023/02/statue1-crop.jpg)
 
 Model
-
-[1]: https://blog.za3k.com/wp-content/uploads/2023/02/waves.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2023/02/small.jpg
-[3]: https://blog.za3k.com/wp-content/uploads/2023/02/art1-crop.jpg
-[4]: https://blog.za3k.com/wp-content/uploads/2023/02/statue1-crop.jpg
index 7f6cb58c796da5d545a80651ec66aac0aef4e7cc..db29a744c44822ef42a03419be874eda87f88fe4 100644 (file)
@@ -13,7 +13,4 @@ updated: 2014-12-07 23:32:05-07:00
 wordpress_id: 93
 wordpress_slug: pandora-songs
 ---
-I copied the list of [songs I favorited][1] from [Pandora][2].
-
-[1]: http://za3k.com/pandora.txt
-[2]: https://www.pandora.com
+I copied the list of [songs I favorited](http://za3k.com/pandora.txt) from [Pandora](https://www.pandora.com).
index 471cfa431e6d604a0a3447fe596bc65183592d67..6e8b26f3470cab0fdbe1726a26db0db1c00b30ea 100644 (file)
@@ -19,47 +19,35 @@ wordpress_slug: paper-archival
 ---
 Previous work:
 
--   [Optar][1] (OPTical ARchive), a 2-D barcode format ([github][2])
--   [Paperback][3]
+-   [Optar](http://ronja.twibright.com/optar) (OPTical ARchive), a 2-D barcode format ([github](https://github.com/colindean/optar))
+-   [Paperback](http://ollydbg.de/Paperbak/index.html)
 
-I wanted (for fun) to see if I could get data stored in paper formats. I’d read the previous work, and people put a lot of thought into density, but not a lot of thought into ease of retreival. First off, [acid-free][4] paper lasts 500 years or so, which is plenty long enough compared to any environmental stresses (moisture, etc) I expect on any paper I have.
+I wanted (for fun) to see if I could get data stored in paper formats. I’d read the previous work, and people put a lot of thought into density, but not a lot of thought into ease of retreival. First off, [acid-free](http://en.wikipedia.org/wiki/Acid-free_paper) paper lasts 500 years or so, which is plenty long enough compared to any environmental stresses (moisture, etc) I expect on any paper I have.
 
-Optar gets a density of 200kB / A4 page. By default, it requires a 600dpi printer, and a 600+dpi scanner. It has 3-of-12 bit redundancy using [Golay][5] codes, and spaces out the bits in an okay fashion.
+Optar gets a density of 200kB / A4 page. By default, it requires a 600dpi printer, and a 600+dpi scanner. It has 3-of-12 bit redundancy using [Golay](http://en.wikipedia.org/wiki/Binary_Golay_code) codes, and spaces out the bits in an okay fashion.
 
-Paperback gets a (theoretical) density of 500kB / A4 page. It needs a 600dpi printer, and a ~900dpi scanner.  It has configurable redundancy using [Reed-Solomon][6] codes. It looks completely unusable in practice (alignment issues, aside from being Windows-only).
+Paperback gets a (theoretical) density of 500kB / A4 page. It needs a 600dpi printer, and a ~900dpi scanner.  It has configurable redundancy using [Reed-Solomon](http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction) codes. It looks completely unusable in practice (alignment issues, aside from being Windows-only).
 
 Okay, so I think these are all stupid, because you need some custom software to decode them, which in any case where you’re decoding data stored on paper you probably don’t have that. I want to use standard barcodes, even if they’re going to be lower density. Let’s look at our options. I’m going to skip linear barcodes (low-density) and color barcodes (printing in color is expensive).  Since we need space between symbols, we want to pick the biggest versions of each code we can. For one, whitespace around codes is going to dominate actual code density for layout efficiency, and larger symbols are usually more dense. For another thing, we want to scan as few symbols as possible if we’re doing them one at a time.
 
-[Aztec][7] From 15×15 to 151×151 square pixels. 1914 bytes maximum. Configurable Reed-Solomon error correction.
+[Aztec](http://en.wikipedia.org/wiki/Aztec_Code) From 15×15 to 151×151 square pixels. 1914 bytes maximum. Configurable Reed-Solomon error correction.
 
 Density: 11.9 pixels per byte
 
-[Data Matrix][8] From 10×10 to 144×144 square pixels. 1555 bytes maximum. Large, non-configurable error correction.
+[Data Matrix](http://en.wikipedia.org/wiki/Data_Matrix) From 10×10 to 144×144 square pixels. 1555 bytes maximum. Large, non-configurable error correction.
 
 Density: 13.3 pixels per byte
 
-[QR Code][9] From 21×21 to 177×177 square pixels. 2,953 bytes maximum. Somewhat configurable Reed-Solomon error correction.
+[QR Code](http://en.wikipedia.org/wiki/QR_code) From 21×21 to 177×177 square pixels. 2,953 bytes maximum. Somewhat configurable Reed-Solomon error correction.
 
 Density: 10.6 pixels per byte
 
-[PDF417][10] 17 height by 90-583 width.  1100 bytes maximum. Configurable Reed-Solomon error correction. PDF417 is a stacked linear barcode, and can be scanned by much simpler scanners instead of cameras. It also has built in cross-symbol linking (MacroPDF417), meaning you can scan a sequence of codes before getting output–handy for getting software to automatically link all the codes on a page.
+[PDF417](http://en.wikipedia.org/wiki/PDF417) 17 height by 90-583 width.  1100 bytes maximum. Configurable Reed-Solomon error correction. PDF417 is a stacked linear barcode, and can be scanned by much simpler scanners instead of cameras. It also has built in cross-symbol linking (MacroPDF417), meaning you can scan a sequence of codes before getting output–handy for getting software to automatically link all the codes on a page.
 
 Density: 9.01 pixels per byte
 
-QR codes and PDF417 look like our contenders. PDF417 turns out to not scan well (at all, but especially at large symbol sizes), so despite some nice features let’s pick QR codes. Back when I worked on a [digital library][11] I made a component to generate QR codes on the fly, and I know how to scan them on my phone and webcam already from that, so it would be pretty easy to use them.
+QR codes and PDF417 look like our contenders. PDF417 turns out to not scan well (at all, but especially at large symbol sizes), so despite some nice features let’s pick QR codes. Back when I worked on a [digital library](https://blog.za3k.com/the-double-lives-of-books/ "The Double Lives of Books") I made a component to generate QR codes on the fly, and I know how to scan them on my phone and webcam already from that, so it would be pretty easy to use them.
 
 What density can we get on a sheet of A4 paper (8.25 in × 11.00 in, or 7.75in x 10.50in with half-inch margins)? I trust optar’s estimate (600 dpi = 200 pixels per inch) for printed/scanned pages since they seemed to test things. A max-size QR code is 144×144 pixels, or 0.72 x 0.72 inches at maximum density. We can fit 10 x 14 = 140 QR codes with maximum density on the page, less if we want decent spacing. That’s 140 QR codes x (2,953 bytes per QR code) = 413420 bytes = 413K per page before error correction.
 
 That’s totally comparable to the other approaches above, and you can read the results with off-the-shelf software.  Bam.
-
-[1]: http://ronja.twibright.com/optar
-[2]: https://github.com/colindean/optar
-[3]: http://ollydbg.de/Paperbak/index.html
-[4]: http://en.wikipedia.org/wiki/Acid-free_paper
-[5]: http://en.wikipedia.org/wiki/Binary_Golay_code
-[6]: http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction
-[7]: http://en.wikipedia.org/wiki/Aztec_Code
-[8]: http://en.wikipedia.org/wiki/Data_Matrix
-[9]: http://en.wikipedia.org/wiki/QR_code
-[10]: http://en.wikipedia.org/wiki/PDF417
-[11]: https://blog.za3k.com/the-double-lives-of-books/ "The Double Lives of Books"
index e9de4339c661a6c38a00d8c1e30b115eb4cb8b5e..7890a6dbb2ad800b8f2ece02497491ddefd87b4a 100644 (file)
@@ -15,6 +15,4 @@ updated: 2015-10-22 17:07:34-07:00
 wordpress_id: 334
 wordpress_slug: pixel-alphabet
 ---
-[![Alphabetx16](https://blog.za3k.com/wp-content/uploads/2015/10/Alphabetx16-e1445558843487.png)][1]A small font I designed. I’m pretty proud of it.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/10/Alphabetx16.png
+[![Alphabetx16](https://blog.za3k.com/wp-content/uploads/2015/10/Alphabetx16-e1445558843487.png)](https://blog.za3k.com/wp-content/uploads/2015/10/Alphabetx16.png)A small font I designed. I’m pretty proud of it.
index 69c7a239d021d24fef41987f232b48a203be52b6..8ea05469d4d982084a541b490a707f7d2d38de1e 100644 (file)
@@ -12,6 +12,4 @@ updated: 2015-02-17 11:53:54-07:00
 wordpress_id: 112
 wordpress_slug: pixel-art-a-cool-cat
 ---
-[![A Cool Cat](https://blog.za3k.com/wp-content/uploads/2015/02/Screen-Shot-2015-02-03-at-9.16.08-PM-300x177.png)][1]
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/02/Screen-Shot-2015-02-03-at-9.16.08-PM.png
+[![A Cool Cat](https://blog.za3k.com/wp-content/uploads/2015/02/Screen-Shot-2015-02-03-at-9.16.08-PM-300x177.png)](https://blog.za3k.com/wp-content/uploads/2015/02/Screen-Shot-2015-02-03-at-9.16.08-PM.png)
index 828ff21aa24570ecca7c239d876335c66b1a9bc6..81dc8a8182859b2299fc37aae5ecf255550bd263 100644 (file)
@@ -16,12 +16,8 @@ wordpress_slug: pompompom
 ---
 I hacked up a little to-do app in an hour. The emphasis is on focus.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/pompompom.png)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/pompompom.png)](https://github.com/za3k/short-programs#pompompom)
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/pompompom2.png)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/pompompom2.png)](https://github.com/za3k/short-programs#pompompom)
 
-It’s linux only. You can find it in my [short-programs][3] repo on github.
-
-[1]: https://github.com/za3k/short-programs#pompompom
-[2]: https://github.com/za3k/short-programs#pompompom
-[3]: https://github.com/za3k/short-programs#pompompom
+It’s linux only. You can find it in my [short-programs](https://github.com/za3k/short-programs#pompompom) repo on github.
index 85f344a08ffc53af925efd49d9c70ebb48ecaaa5..f6049ddc7d9c5ca2b301f780e01190ec9d1d6476 100644 (file)
@@ -12,16 +12,12 @@ updated: 2024-01-19 14:30:16-07:00
 wordpress_id: 1282
 wordpress_slug: printable-todo-list
 ---
-I made a minimal, printable [TODO list][1]. Enjoy!
+I made a minimal, printable [TODO list](https://za3k.com/archive/todo.pdf). Enjoy!
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/01/used-short-crop-1024x338.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/01/used-short-crop-1024x338.jpg)](https://za3k.com/archive/todo.pdf)
 
 Just print it
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/01/laminated-short-crop-1024x445.jpg)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2024/01/laminated-short-crop-1024x445.jpg)](https://za3k.com/archive/todo.pdf)
 
 or get fancy and laminate
-
-[1]: https://za3k.com/archive/todo.pdf
-[2]: https://za3k.com/archive/todo.pdf
-[3]: https://za3k.com/archive/todo.pdf
index 43cdc57c74352e515c1572176f57d694e760ddb5..3d355003ee59f7032d70ca53229c297d246b6e75 100644 (file)
@@ -14,7 +14,7 @@ updated: 2020-12-12 13:29:42-07:00
 wordpress_id: 517
 wordpress_slug: printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi
 ---
-Although the below directions work on Raspberry Pi, they should also work on any other system. The brother-provided driver does not run on arm processors\[1\] like the raspberry pi, so we will instead use the open-source [brlaser][1]\[2\].
+Although the below directions work on Raspberry Pi, they should also work on any other system. The brother-provided driver does not run on arm processors\[1\] like the raspberry pi, so we will instead use the open-source [brlaser](https://github.com/pdewacht/brlaser)\[2\].
 
 Edit: This setup should also work on the following Brother monochrome printers, just substitute the name where needed:
 
@@ -23,7 +23,7 @@ Edit: This setup should also work on the following Brother monochrome printers,
 
 Also, all these steps are command-line based, and you can do the whole setup headless (no monitor or keyboard) using SSH.
 
-1.  Get the latest raspbian image up and running on your pi, with working networking. At the time of writing the latest version is 10 (buster)–once 11+ is released this will be much easier. I have written a [convenience tool][2]\[3\] for this step, but you can also find any number of standard guides. Log into your raspberry pi to run the following steps
+1.  Get the latest raspbian image up and running on your pi, with working networking. At the time of writing the latest version is 10 (buster)–once 11+ is released this will be much easier. I have written a [convenience tool](https://github.com/za3k/rpi-setup)\[3\] for this step, but you can also find any number of standard guides. Log into your raspberry pi to run the following steps
 2.  (Option 1, not recommended) Upgrade to Debian 11 bullseye (current testing release). This is because we need brlaser 6, not brlaser 4 from debian 10 buster (current stable release). Then, install the print system and driver\[2\]:  
     `sudo apt-get update && sudo apt-get install lpr cups ghostscript printer-driver-brlaser`
 3.  (Option 2, recommended) Install ‘brlaser’ from source.
@@ -50,141 +50,10 @@ Also, all these steps are command-line based, and you can do the whole setup hea
     1.  `echo "Hello World" | PRINTER=HL-2270DW lp -o media=letter` (Make sure anything prints)
     2.  `cat <test document> | PRINTER=HL-2270DW lp -o media=letter` (Print an actual test page to test alignment, etc)
     3.  `cat <test document> | PRINTER=HL-2270DW lp -o media=letter -o sides=two-sided-short-edge` (Make sure duplex works if you plan to use that)
-7.  (Optional) Set up an [scp print server][3], so any file you copy to a `/printme` directory gets printed. For the 2270DW, I also have a `/printme.duplex` directory.
+7.  (Optional) Set up an [scp print server](https://blog.za3k.com/linux-print-server/), so any file you copy to a `/printme` directory gets printed. For the 2270DW, I also have a `/printme.duplex` directory.
 
 Links  
-\[1\] brother driver [does not work][4] on arm (also verified myself)  
-\[2\] [brlaser][5], the open-source Brother printer driver  
-\[3\] [rpi-setup][6], my convenience command-line script for headless raspberry pi setup  
-\[4\] [stack overflow answer][7] on how to install one package from testing in debian
-
-1.  ![](https://secure.gravatar.com/avatar/bc00b207944738af582a91c5352ef163?s=40&d=mm&r=g)Joel says:
-    
-    [August 2, 2020 at 12:52 pm][8]
-    
-    There appears to be a typo in step 5A. The page currently reads “lpinfo -m” but I believe should be “lpinfo -v”. Per the man page, the m flag lists drivers and the v flag lists devices.
-    
-    The USB device can be found in the -v output for step 5A but the driver can be found in the -m output for step 5B.
-    
-    [Reply][9]
-    
-2.  ![](https://secure.gravatar.com/avatar/b99febd9d3367d3306947a8e159c6445?s=40&d=mm&r=g)Scott says:
-    
-    [October 19, 2020 at 5:10 pm][10]
-    
-    Thank you so very much for this. Worked like a charm.
-    
-    Any tips on how to print over the network?
-    
-    [Reply][11]
-    
-3.  ![](https://secure.gravatar.com/avatar/dffffda5bcb146c22d8be3ef6b4f6554?s=40&d=mm&r=g)rathesun01 says:
-    
-    [December 8, 2020 at 6:44 pm][12]
-    
-    Awesome post. Joel is supposedly correct. It should have been “lpinfo -v” in the step 5A.
-    
-    [Reply][13]
-    
-4.  ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-    
-    [December 12, 2020 at 1:31 pm][14]
-    
-    Corrected ‘lpinfo -v’, thanks.  
-    No clue how to print over the network, sorry. That’s actually why I set up a raspberry pi to connect to the printer instead–it’s my wifi interface.  
-    
-    [Reply][15]
-    
-5.  ![](https://secure.gravatar.com/avatar/b851d521102349bbfd71e7d7df8bef44?s=40&d=mm&r=g)steve says:
-    
-    [December 30, 2020 at 9:05 am][16]
-    
-    I have the Brother HL-2270DW, and I had to install from source to get it to work. I’m not using USB, but port forwarding across via NAT to another internal network.
-    
-    I just used the cups admin pages to complete setting things up. Before using this package, I picked some other closely related printer. It was printing the page, sucking it back in, then finally printing. Not terrible, but I was annoyed. Now it’s perfect!
-    
-    For printing over the network, I used the socket::9100 setting. No idea the command line knobs or dials, just did it through the cups web page.
-    
-    Another reason for me to do this is now my little rasperry pi zero w shows my printer as an AirPrint printer, so now I can print from my iDevices. Brother has their own app for this printer, but I was annoyed having to install a special app for this. My HL2270DW was made without AirPrint. It’s a fine little machine and don’t want to throw it out.
-    
-    [Reply][17]
-    
-    -   ![](https://secure.gravatar.com/avatar/1edcef9b0ab9150a7e2d22cd18371609?s=40&d=mm&r=g)Jaye Horn says:
-        
-        [February 18, 2021 at 3:19 pm][18]
-        
-        How did you install from source? and how did you do the port forwarding across via NAT to another internal network? I’m new to this so any help would be very much appreciated.
-        
-        Thank you.
-        
-        [Reply][19]
-        
-6.  ![](https://secure.gravatar.com/avatar/173de507afbda1d5933757bb66e863eb?s=40&d=mm&r=g)Job says:
-    
-    [January 20, 2021 at 8:09 pm][20]
-    
-    Would this work for brother hl-l2395dw scanner?
-    
-    [Reply][21]
-    
-7.  ![](https://secure.gravatar.com/avatar/285bae3dce12d6c20103a5ff2a4bcddb?s=40&d=mm&r=g)Adam Trask says:
-    
-    [October 22, 2021 at 5:00 am][22]
-    
-    Thanks so much for posting this. This helped get my HL-L2300D working properly.
-    
-    [Reply][23]
-    
-8.  ![](https://secure.gravatar.com/avatar/76652e498c8089550fa09056625d5899?s=40&d=mm&r=g)Danial Foster says:
-    
-    [December 24, 2021 at 1:39 am][24]
-    
-    \>>> (author’s shameful note: if you’re not looking, I find it  
-    \>>>surprisingly easy to plug USB B into the ethernet jack)  
-    
-    I smiled when I saw this because you are clearly a ding dong; that sounds like a rookie mistake.
-    
-    I couldn’t get your instructions to work, so I tried troubleshooting through Google. Couldn’t figure it out. sudo lpinfo -v | grep usb wasn’t showing jack.
-    
-    It was because I had my USB B plugged into the ethernet jack of my BR-2270DW.
-    
-    Everything works now. Thank you so much.
-    
-    [Reply][25]
-    
-9.  ![](https://secure.gravatar.com/avatar/fe520de38df86000b2d31661c96cd28a?s=40&d=mm&r=g)J Bot says:
-    
-    [January 3, 2023 at 4:03 pm][26]
-    
-    Any steps to do this with a wifi connected HL-2270DW? Thanks!
-    
-    [Reply][27]
-    
-
-[1]: https://github.com/pdewacht/brlaser
-[2]: https://github.com/za3k/rpi-setup
-[3]: https://blog.za3k.com/linux-print-server/
-[4]: https://www.raspberrypi.org/forums/viewtopic.php?t=15526
-[5]: https://github.com/pdewacht/brlaser
-[6]: https://github.com/za3k/rpi-setup
-[7]: https://serverfault.com/questions/22414/how-can-i-run-debian-stable-but-install-some-packages-from-testing
-[8]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-4165
-[9]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=4165#respond
-[10]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-4213
-[11]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=4213#respond
-[12]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-4277
-[13]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=4277#respond
-[14]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-4279
-[15]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=4279#respond
-[16]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-4319
-[17]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=4319#respond
-[18]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-4380
-[19]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=4380#respond
-[20]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-4341
-[21]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=4341#respond
-[22]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-5178
-[23]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=5178#respond
-[24]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-5438
-[25]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=5438#respond
-[26]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/#comment-9429
-[27]: https://blog.za3k.com/printing-on-the-brother-hl-2270dw-printer-using-a-raspberry-pi/?replytocom=9429#respond
+\[1\] brother driver [does not work](https://www.raspberrypi.org/forums/viewtopic.php?t=15526) on arm (also verified myself)  
+\[2\] [brlaser](https://github.com/pdewacht/brlaser), the open-source Brother printer driver  
+\[3\] [rpi-setup](https://github.com/za3k/rpi-setup), my convenience command-line script for headless raspberry pi setup  
+\[4\] [stack overflow answer](https://serverfault.com/questions/22414/how-can-i-run-debian-stable-but-install-some-packages-from-testing) on how to install one package from testing in debian
index 114a04dcf2fe1876fe2f38d5ad8407be7cbaa89e..3a28e49cd903604064f9b1b868c81dc27a42138e 100644 (file)
@@ -17,11 +17,13 @@ wordpress_slug: problem-log-txt
 ---
 One of the more useful things I did was to start logging all my technical problems. Whenever I hit a problem, I write an entry in problem-log.txt. Here’s an example
 
-    2022-08-02
-    Q: Why isn't the printer working? [ SOLVED ]
-    A: sudo cupsenable HL-2270DW
-    
-    // This isn't in the problem log, but the issue is that CUPS will silently disable the printer if it thinks there's an issue. This can happen if you pull a USB cord mid-print.
+```
+2022-08-02
+Q: Why isn't the printer working? [ SOLVED ]
+A: sudo cupsenable HL-2270DW
+
+// This isn't in the problem log, but the issue is that CUPS will silently disable the printer if it thinks there's an issue. This can happen if you pull a USB cord mid-print.
+```
 
 I write the date, the question, and the answer. Later, when I have a tough or annoying problem, I try to grep problem-log.txt. I’ll add a note if I solve a problem using the log, too.
 
@@ -29,7 +31,9 @@ This was an interesting project to look at 5 years later. I didn’t see benefit
 
 Here’s another example:
 
-    2018-10-21
-    Q: How do I connect to the small yellow router?
+```
+2018-10-21
+Q: How do I connect to the small yellow router?
+```
 
 Not every problem gets solved. Oh well.
index fb59e08a8428558170881f941b6219c2abc74bca..e19719ccfa4b28b947b229b408a227b69de78b60 100644 (file)
@@ -18,7 +18,7 @@ wordpress_slug: qr-backup-2
 ---
 qr-backup is a program to back up digital documents to physical paper. Restore is done with a webcam, video camera, or scanner. Someday smart phone cameras will work.
 
-I’ve been making some progress on [qr-backup][1] v1.1. So far I’ve added:
+I’ve been making some progress on [qr-backup](https://github.com/za3k/qr-backup) v1.1. So far I’ve added:
 
 -   `--restore`, which does a one-step restore for you, instead of needing a bash one-line restore process
 -   `--encrypt` provides password-based encryption
@@ -36,5 +36,3 @@ v1.1 will be released when I make qr-backup feature complete:
 -   Improve webcam restore slightly.
 
 v1.2 will focus on adding a GUI and support for Windows, Mac, and Android. Switching off zbar is a requirement to allow multi-platform support, and will likely improve storage density.
-
-[1]: https://github.com/za3k/qr-backup
index 651293ab6e0edfe3f9b56d630399ae40cffdf37d..6bf19392ce9d5ff463d501e30c4febb63d1b96ab 100644 (file)
@@ -14,15 +14,15 @@ updated: 2022-11-05 15:50:36-07:00
 wordpress_id: 792
 wordpress_slug: qr-backup-v1-1
 ---
-[qr-backup][1] v1.1 is released. qr-backup is a **command-line Linux program**. You can use it to back up a file as a series of QR codes. You can restore the QR codes using a webcam or scanner, and get back the original file.
+[qr-backup](https://github.com/za3k/qr-backup) v1.1 is released. qr-backup is a **command-line Linux program**. You can use it to back up a file as a series of QR codes. You can restore the QR codes using a webcam or scanner, and get back the original file.
 
-[![](https://blog.za3k.com/wp-content/uploads/2022/09/image-1024x614.png)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2022/09/image-1024x614.png)](https://blog.za3k.com/wp-content/uploads/2022/09/image.png)
 
 The main features of qr-backup are ease-of-use and futureproofing (restore does not require qr-backup).
 
-Please report any bugs [on github][3]. Once this is stable, I will do the first pip/package manager release. To test the alpha, check out the [latest code][4] using git.
+Please report any bugs [on github](https://github.com/za3k/qr-backup/issues). Once this is stable, I will do the first pip/package manager release. To test the alpha, check out the [latest code](https://github.com/za3k/qr-backup) using git.
 
-See also [USAGE][5] and *extensive* [FAQ][6].
+See also [USAGE](https://github.com/za3k/qr-backup/blob/master/docs/USAGE.md) and *extensive* [FAQ](https://github.com/za3k/qr-backup/blob/master/docs/FAQ.md).
 
 New features in v1.1:
 
@@ -41,14 +41,6 @@ New features in v1.1:
 -   Option to add custom notes and labels to each page
 -   Improved support for using qr-backup in a pipe
 -   Various bugfixes
--   See [CHANGELOG][7] for complete details
+-   See [CHANGELOG](https://github.com/za3k/qr-backup/blob/master/CHANGELOG) for complete details
 
 P.S. As a special request, if anyone is on OS X, let me know if it works for you?
-
-[1]: https://github.com/za3k/qr-backup
-[2]: https://blog.za3k.com/wp-content/uploads/2022/09/image.png
-[3]: https://github.com/za3k/qr-backup/issues
-[4]: https://github.com/za3k/qr-backup
-[5]: https://github.com/za3k/qr-backup/blob/master/docs/USAGE.md
-[6]: https://github.com/za3k/qr-backup/blob/master/docs/FAQ.md
-[7]: https://github.com/za3k/qr-backup/blob/master/CHANGELOG
index 342093bc2d21f5d5de0fef8a8fa139daca0e015e..0205152b446776f4b15c7c6a0f19baecdc4f1fd1 100644 (file)
@@ -15,47 +15,8 @@ updated: 2021-06-05 15:39:22-07:00
 wordpress_id: 587
 wordpress_slug: qr-backup
 ---
-I made a new project called [qr-backup][1]. It’s a command-line program to back up any file to physical paper, using a number of QR codes. You can then restore it, even WITHOUT the qr-backup program, using the provided instructions.
+I made a new project called [qr-backup](https://github.com/za3k/qr-backup). It’s a command-line program to back up any file to physical paper, using a number of QR codes. You can then restore it, even WITHOUT the qr-backup program, using the provided instructions.
 
-[![](https://blog.za3k.com/wp-content/uploads/2021/05/example.png)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2021/05/example.png)](https://blog.za3k.com/wp-content/uploads/2021/05/example.png)
 
 I’m fairly satisfied with its current state (can actually back up my files, makes a PDF). There’s definitely some future features I’m looking forward to adding, though.
-
-1.  ![](https://secure.gravatar.com/avatar/d8731f49a2e6864ba0675c4639ef08be?s=40&d=mm&r=g)[scruss][3] says:
-    
-    [June 9, 2021 at 6:58 am][4]
-    
-    nice! I’ve played with some similar ideas, using tar and QR Code output to a thermal printer. The used to be a thing (Twibright Optar, IIRC: it’s fallen off the web) that made full-page scannable codes that got an almost useful data density. But they weren’t QR Codes, so needed their own decoder.
-    
-    [Reply][5]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [June 9, 2021 at 2:06 pm][6]
-        
-        Actually, I link to it in the [FAQ][7], it’s still on the [web][8]. An even better version was “Paperback”, but it’s 9 years unmaintained–I’m looking into seeing if there is a maintained Linux port. Both do a lot of things right, even if they have a slightly different goal (high data density, over ease-of-use and foolproof restore).
-        
-        [Reply][9]
-        
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [June 9, 2021 at 2:08 pm][10]
-        
-        Also, feel free to recommend me a good, cheap thermal printer. I tried to do a “poloroid” thing (take a picture of yourself with webcam, immediately print to thermal) and found that mine was shit and the heat overexposed unrelated parts. QR codes seem like a reasonable application, although I’d be concerned about the longevity of thermal paper for backups (can easily fade in heat).
-        
-        Edit: If I remember correctly, I wanted to make a thermal-paper typewriter for a zine?
-        
-        [Reply][11]
-        
-
-[1]: https://github.com/za3k/qr-backup
-[2]: https://blog.za3k.com/wp-content/uploads/2021/05/example.png
-[3]: https://scruss.com/blog/
-[4]: https://blog.za3k.com/qr-backup/#comment-4642
-[5]: https://blog.za3k.com/qr-backup/?replytocom=4642#respond
-[6]: https://blog.za3k.com/qr-backup/#comment-4644
-[7]: https://github.com/za3k/qr-backup/blob/master/docs/FAQ.md#what-other-paper-backup-projects-exist
-[8]: http://ronja.twibright.com/optar/
-[9]: https://blog.za3k.com/qr-backup/?replytocom=4644#respond
-[10]: https://blog.za3k.com/qr-backup/#comment-4645
-[11]: https://blog.za3k.com/qr-backup/?replytocom=4645#respond
index c0bdc900f97fc91e8d1d7c09423a414a28dc798a..f583417383e2c7c27bc7f15164a802b71e5fa751 100644 (file)
@@ -14,6 +14,4 @@ updated: 2021-08-07 18:00:05-07:00
 wordpress_id: 709
 wordpress_slug: raspberry-pi-comparison
 ---
-I was looking into building a raspberry pi based supercomputer lately. [Here’s the background research][1] I did comparing pi models. Most of this information is sourced from raspberrypi.org. I was especially interested in which boot methods worked for which models, which is very scattered, as well as prices.
-
-[1]: https://za3k.com/archive/pi
+I was looking into building a raspberry pi based supercomputer lately. [Here’s the background research](https://za3k.com/archive/pi) I did comparing pi models. Most of this information is sourced from raspberrypi.org. I was especially interested in which boot methods worked for which models, which is very scattered, as well as prices.
index 2aa99fadf402bc7ddb2b6cb93fbd4bd50c8b7d01..79069872cdc3463fc7827cc0f3d66b90b0a7441f 100644 (file)
@@ -15,4 +15,6 @@ updated: 2024-05-20 21:09:35-07:00
 wordpress_id: 1368
 wordpress_slug: relay-music
 ---
+<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="456" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/au_MMBIpRec?feature=oembed" title="Music made by switching an electric relay" width="810"></iframe>
+
 My friend Callen tried to help me run a DC motor to roll my curtains up and down. We didn’t make a ton of progress, but we had some fun making a little music.
index 3b3e00e57b51b6ca5927f337aac8127f5d1f8b54..ff06c85979bbe98f8117b45b11955471bdc5e1f7 100644 (file)
@@ -15,23 +15,23 @@ updated: 2024-06-25 13:33:32-07:00
 wordpress_id: 1407
 wordpress_slug: repulsive-dots
 ---
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/geodesic_screenshot-1024x566.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/geodesic_screenshot-1024x566.jpg)](https://blog.za3k.com/wp-content/uploads/2024/06/geodesic_screenshot.jpg)
 
-Lately I’ve been messing about in [Godot][2], a framework for making video games (similar to Unity).
+Lately I’ve been messing about in [Godot](https://godotengine.org/), a framework for making video games (similar to Unity).
 
 I wanted to make a 3D game. In my game, you live in a geodesic dome, and can’t go outside, because *mumble mumble mumble poisonous atmosphere?*.
 
 A geodesic dome, I learned, is related to the *icosahedron*, or d20 from RPGs.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/image-150x150.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/image-150x150.png)](https://blog.za3k.com/wp-content/uploads/2024/06/image.png)
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/image-1-150x150.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/image-1-150x150.png)](https://blog.za3k.com/wp-content/uploads/2024/06/image-1.png)
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/image-3-150x150.png)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/image-3-150x150.png)](https://blog.za3k.com/wp-content/uploads/2024/06/image-3.png)
 
 A simple dome is the top half of the icosahedron. As they get more complex, you divide each triangle into more and more smaller triangles.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/sphere-crop.jpg)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/sphere-crop.jpg)](https://blog.za3k.com/wp-content/uploads/2024/06/sphere-crop.jpg)
 
 Icosahedron getting more and more detailed. Geodesic domes are the top half of each sphere.
 
@@ -39,6 +39,8 @@ So to make a nice geodesic dome, we could find one (I failed), make one in Blend
 
 Now, obviously you could look up the vertices, but I thought of a more fun way. Let’s put 12 points on a sphere, make them all repel each other (think magnetically, I guess), and see where on the sphere they slide to. Maybe they will all be spaced out evenly in the right places. Well, here’s what it looks like:
 
+<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="456" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/kDoWaa-xilA?feature=oembed" title="icosahedron calculator" width="810"></iframe>
+
 So… kinda? It was certainly entertaining.
 
 By the way, the correct coordinates for the vertices of an icosahedron inside a unit sphere are:
@@ -47,10 +49,3 @@ By the way, the correct coordinates for the vertices of an icosahedron inside a
 -   the bottom at (0, -1, 0)
 -   10 equally spaced points around a circle. they alternate going up and down below the center line.  
     (**±**1/√5, sin(angle), cos(angle)) \[projected onto the sphere\]
-
-[1]: https://blog.za3k.com/wp-content/uploads/2024/06/geodesic_screenshot.jpg
-[2]: https://godotengine.org/
-[3]: https://blog.za3k.com/wp-content/uploads/2024/06/image.png
-[4]: https://blog.za3k.com/wp-content/uploads/2024/06/image-1.png
-[5]: https://blog.za3k.com/wp-content/uploads/2024/06/image-3.png
-[6]: https://blog.za3k.com/wp-content/uploads/2024/06/sphere-crop.jpg
index f7c70007cbf63761121446e3157c2dac2d1ece2f..841ad5b5f40d6e4e9835eb9169d8ae94577a6af8 100644 (file)
@@ -12,7 +12,7 @@ updated: 2015-10-27 19:10:59-07:00
 wordpress_id: 341
 wordpress_slug: roasted-chickpeas
 ---
-[![roasted](https://blog.za3k.com/wp-content/uploads/2015/10/roasted-300x264.jpg)][1]Here’s how you make roasted chickpeas (aka garbanzo beans):
+[![roasted](https://blog.za3k.com/wp-content/uploads/2015/10/roasted-300x264.jpg)](https://blog.za3k.com/wp-content/uploads/2015/10/roasted.jpg)Here’s how you make roasted chickpeas (aka garbanzo beans):
 
 1.  Set the oven to 400F.
 2.  Drain and empty a can or so of chickpeas into a collander and wash them
@@ -20,5 +20,3 @@ wordpress_slug: roasted-chickpeas
 4.  Put them in a short pan in the oven and cover them in olive oil. Toss them some with your hands to get them coated.
 5.  Cook for 20-30 minutes, shaking the pan so everything turns every 10 minutes. I like them crispy so I do 30 minutes.
 6.  Take them out and transfer them to a bowl. Add spices. I like salt, garlic powder, and pepper.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/10/roasted.jpg
index fa5d4b91012910bc91cb90aab06c6f34c09cbef9..3018e09d9b5e4150f621415974097742b5ccf749 100644 (file)
@@ -18,115 +18,20 @@ I’m running Minecraft 1.6.4, with the latest version of forge for that, 9.11.1
 
 1.  Locally, download and start the minecraft client for the correct version at least once. Not sure if you’ll need to ‘play online’ or not. If you have the current installer, you need to make a new profile with the correct minecraft version and play that.
 2.  Copy ~/.minecraft/libraries to the headless machine.
-3.  Download forge (the installer version, not the universal) from [http://files.minecraftforge.net/][1]. The non-adly version is the little star for non-interactive use.
+3.  Download forge (the installer version, not the universal) from [http://files.minecraftforge.net/](http://files.minecraftforge.net/). The non-adly version is the little star for non-interactive use.
 4.  Run
     
+    ```
     java -jar forge-1.6.4-9.11.1.965-installer.jar --installServer
+    ```
     
 5.  Delete the installer, you don’t need it any more.
 6.  Install any mods you want to the ‘mods’ directory, edit server.properties, etc. Normal server setup.
 7.  To execute the server, run the file indicated in the installer. In my case, I run
     
+    ```
     java -jar minecraftforge-universal-1.6.4-9.11.1.965-v164-pregradle.jar nogui
+    ```
     
 
 Alternatively, you can install the entire server locally and copy it over.
-
-1.  ![](https://secure.gravatar.com/avatar/eca9fbfd1236b50f30aec8f7b95ef721?s=40&d=mm&r=g)[Susan Tatun][2] says:
-    
-    [July 10, 2015 at 11:31 pm][3]
-    
-    An honest sharing about downloaing and installing Minecraft 1.6.4. I followed what you mentioned and did it sucessfully. Right now, I’m playing with my little son and guiding him what the terrific things are. Anyway, thanks a lot!
-    
-    [Reply][4]
-    
-2.  ![](https://secure.gravatar.com/avatar/f386723170dfc6b4122c5fe2d95ffbbc?s=40&d=mm&r=g)Lynx says:
-    
-    [August 18, 2015 at 1:44 am][5]
-    
-    4am installs of servers is hard, and trying to follow the Forge wiki which is inaccurate at best is hard.  
-    You got me from dead brick to running box in ten minutes. Thank you.
-    
-    [Reply][6]
-    
-3.  ![](https://secure.gravatar.com/avatar/746c2f840c27e88b6bfc135f14f4ce37?s=40&d=mm&r=g)crumpuppet says:
-    
-    [September 7, 2015 at 1:32 pm][7]
-    
-    Thanks so much! I’ve been looking for these steps for a while, and finally found something that works. Would have been first prize if it could be used along with a GUI frontend like mcmyadmin, but oh well 🙂
-    
-    [Reply][8]
-    
-4.  ![](https://secure.gravatar.com/avatar/48ef5c93bf1c483b50dd6b7977b9cbca?s=40&d=mm&r=g)Dave says:
-    
-    [November 9, 2015 at 11:14 am][9]
-    
-    Same here. Searched all over found yours and running in moments. My kids have been hooked on mods and wanted a server. I have VMware and can spin up a linux box up in moments. This was so easy. Thanks.
-    
-    [Reply][10]
-    
-5.  ![](https://secure.gravatar.com/avatar/8cc161f40686089efa4eb9dbc381797a?s=40&d=mm&r=g)[Minecraft Lover][11] says:
-    
-    [February 6, 2019 at 6:40 am][12]
-    
-    Very useful information, Thank you
-    
-    [Reply][13]
-    
-6.  ![](https://secure.gravatar.com/avatar/4589e18b3dc7de6c60e1b99052acfe1d?s=40&d=mm&r=g)Leon says:
-    
-    [September 9, 2019 at 9:12 am][14]
-    
-    Does anyone here have problems with installing the mods. Im donwloading them in the mods directory with the cmd “wget” and nothing works.Am i using the wrong command or what?
-    
-    [Reply][15]
-    
-7.  ![](https://secure.gravatar.com/avatar/b50d1a265153eee6da6b41d6adc0eb06?s=40&d=mm&r=g)[Rajan Chopra][16] says:
-    
-    [March 7, 2020 at 3:45 pm][17]
-    
-    Thanks for sharing Minecraft. Can you also share Roblox Apk?
-    
-    [Reply][18]
-    
-8.  ![](https://secure.gravatar.com/avatar/52ce2f57adc4ccfc3e6274ffa86bf9f5?s=40&d=mm&r=g)Neckbeard Hater says:
-    
-    [January 4, 2021 at 10:22 pm][19]
-    
-    “one of the devs seems actively hostile around providing help to …”
-    
-    this is so typical of the linux community. really. And I am a developer with 20 years experience, I hate the Linux community.
-    
-    [Reply][20]
-    
-9.  ![](https://secure.gravatar.com/avatar/cca172695c7bd7d417748775c1ad3c36?s=40&d=mm&r=g)nat says:
-    
-    [February 14, 2023 at 9:17 am][21]
-    
-    lol this tutorial still works 9 years later thanks tho this helped so much!!
-    
-    [Reply][22]
-    
-
-[1]: http://files.minecraftforge.net/
-[2]: https://2dminecraft.wordpress.com/
-[3]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-511
-[4]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=511#respond
-[5]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-1349
-[6]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=1349#respond
-[7]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-1689
-[8]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=1689#respond
-[9]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-2468
-[10]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=2468#respond
-[11]: https://minecraftapkmod.info/download/
-[12]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-3252
-[13]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=3252#respond
-[14]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-3788
-[15]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=3788#respond
-[16]: https://apkstreet.com/roblox-mod-apk-unlimited-robux/
-[17]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-3991
-[18]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=3991#respond
-[19]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-4324
-[20]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=4324#respond
-[21]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/#comment-9669
-[22]: https://blog.za3k.com/running-a-forge-server-on-headless-linux/?replytocom=9669#respond
index 10ef1c3671b745d5c25b41bd6fc1eeaac2135a56..3f2759915f2f14ed66f50daf13134a95a6d7707a 100644 (file)
@@ -18,97 +18,80 @@ wordpress_slug: scan-organizer
 ---
 I scan each and every piece of paper that passes through my hands. All my old to-do lists, bills people send me in the mail, the manual for my microwave, everything. I have a lot of scans.
 
-**[scan-organizer][1]** is a tool I wrote to help me neatly organize and label everything, and make it searchable. It’s designed for going through a huge backlog by hand over the course of weeks, and then dumping a new set of raw scans in whenever afterwards. I have a specific processing pipeline discussed below. However if you have even a little programming skill, I’ve designed this to be modified to suit your own workflow.
+**[scan-organizer](https://github.com/za3k/scan-organizer)** is a tool I wrote to help me neatly organize and label everything, and make it searchable. It’s designed for going through a huge backlog by hand over the course of weeks, and then dumping a new set of raw scans in whenever afterwards. I have a specific processing pipeline discussed below. However if you have even a little programming skill, I’ve designed this to be modified to suit your own workflow.
 
-## [][2]Input and output
+## [](https://github.com/za3k/scan-organizer#input-and-output)Input and output
 
 The input is some raw scans. They could be handwritten notes, printed computer documents, photos, or whatever.
 
-[![A movie ticket stub](https://github.com/za3k/scan-organizer/raw/master/screenshots/sample_image.jpg)][3]
+[![A movie ticket stub](https://github.com/za3k/scan-organizer/raw/master/screenshots/sample_image.jpg)](https://github.com/za3k/scan-organizer/blob/master/screenshots/sample_image.jpg)
 
 The final product is that for each file like `ticket.jpg`, we end up with `ticket.txt`. This has metadata about the file (tags, category, notes) and a transcription of any text in the image, to make it searchable with `grep` & co.
 
-    ---
-    category: movie tickets
-    filename: seven psychopaths ticket.jpg
-    tags:
-    - cleaned
-    - categorized
-    - named
-    - hand_transcribe
-    - transcribed
-    - verified
-    ---
-    Rialto Cinemas Elmwood
-    SEVEN PSYCHOPAT
-    R
-    Sun Oct 28 1
-    7:15 PM
-    Adult $10.50
-    00504-3102812185308
-    
-    Rialto Cinemas Gift Cards
-    Perfect For Movie Lovers!
-    
+```
+---
+category: movie tickets
+filename: seven psychopaths ticket.jpg
+tags:
+- cleaned
+- categorized
+- named
+- hand_transcribe
+- transcribed
+- verified
+---
+Rialto Cinemas Elmwood
+SEVEN PSYCHOPAT
+R
+Sun Oct 28 1
+7:15 PM
+Adult $10.50
+00504-3102812185308
+
+Rialto Cinemas Gift Cards
+Perfect For Movie Lovers!
+```
 
 Here are some screenshots of the process. Apologizies if they’re a little big! I just took actual screenshots.
 
 At any point I can exit the program, and all progress is saved. I have 6000 photos in the backlog–this isn’t going to be a one-session thing for me! Also, everything has keyboard shortcuts, which I prefer.
 
-### [][4]Phase 1: Rotating and Cropping
+### [](https://github.com/za3k/scan-organizer#phase-1-rotating-and-cropping)Phase 1: Rotating and Cropping
 
-[![Phase 1: Rotating and Cropping](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase1.png)][5]
+[![Phase 1: Rotating and Cropping](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase1.png)](https://github.com/za3k/scan-organizer/blob/master/screenshots/phase1.png)
 
 First, I clean up the images. Crop them, rotate them if they’re not facing the right way. I can rotate images with keyboard shortcuts, although there are also buttons at the bottom. Once I’m done, I press a button, and *scan-organizer* advanced to the next un-cleaned photo.
 
-### [][6]Phase 2: Sorting into folders
+### [](https://github.com/za3k/scan-organizer#phase-2-sorting-into-folders)Phase 2: Sorting into folders
 
-[![Phase 2: Sorting into folders](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase2.png)][7]
+[![Phase 2: Sorting into folders](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase2.png)](https://github.com/za3k/scan-organizer/blob/master/screenshots/phase2.png)
 
 Next, I sort things into folders, or “categories”. As I browse folders, I can preview what’s already in that folder.
 
-### [][8]Phase 3: Renaming Images
+### [](https://github.com/za3k/scan-organizer#phase-3-renaming-images)Phase 3: Renaming Images
 
-[![Phase 3: Renaming images](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase3.png)][9]
+[![Phase 3: Renaming images](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase3.png)](https://github.com/za3k/scan-organizer/blob/master/screenshots/phase3.png)
 
 Renaming images comes next. For convenience, I can browse existing images in the folder, to help name everything in a standard way.
 
-### [][10]Phase 4: Tagging images
+### [](https://github.com/za3k/scan-organizer#phase-4-tagging-images)Phase 4: Tagging images
 
-[![Phase 4: Tagging images](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase4.png)][11]
+[![Phase 4: Tagging images](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase4.png)](https://github.com/za3k/scan-organizer/blob/master/screenshots/phase4.png)
 
 I tag my images with the type of text. They might be handwritten. Or they might be printed computer documents. You can imagine extending the process with other types of tagging for your use case.
 
-### [][12]Not yet done: OCR
+### [](https://github.com/za3k/scan-organizer#not-done-ocr)Not yet done: OCR
 
-Printed documents are run through OCR. This isn’t actually done yet, but it will be easy to plug in. I will probably use [tesseract][13].
+Printed documents are run through OCR. This isn’t actually done yet, but it will be easy to plug in. I will probably use [tesseract](https://github.com/tesseract-ocr/tesseract).
 
-### [][14]Phase 5: Transcribing by hand
+### [](https://github.com/za3k/scan-organizer#phase-5-transcribing-by-hand)Phase 5: Transcribing by hand
 
-[![Phase 5a: Transcribing by Hand](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase5.png)][15]
+[![Phase 5a: Transcribing by Hand](https://github.com/za3k/scan-organizer/raw/master/screenshots/phase5.png)](https://github.com/za3k/scan-organizer/blob/master/screenshots/phase5.png)
 
 I write up all my handwritten documents. I have not found any useful handwriting recognition software. I just do it all by hand.
 
 The point of **scan-organizer** is to filter based on tags. So only images I’ve marked as needing hand transcription are shown in this phase.
 
-### [][16]Phase 6: Verification
-
-[][17] At the end of the whole process, I verify that each image looks good, and is correctly tagged and transcribed.
-
-[1]: https://github.com/za3k/scan-organizer
-[2]: https://github.com/za3k/scan-organizer#input-and-output
-[3]: https://github.com/za3k/scan-organizer/blob/master/screenshots/sample_image.jpg
-[4]: https://github.com/za3k/scan-organizer#phase-1-rotating-and-cropping
-[5]: https://github.com/za3k/scan-organizer/blob/master/screenshots/phase1.png
-[6]: https://github.com/za3k/scan-organizer#phase-2-sorting-into-folders
-[7]: https://github.com/za3k/scan-organizer/blob/master/screenshots/phase2.png
-[8]: https://github.com/za3k/scan-organizer#phase-3-renaming-images
-[9]: https://github.com/za3k/scan-organizer/blob/master/screenshots/phase3.png
-[10]: https://github.com/za3k/scan-organizer#phase-4-tagging-images
-[11]: https://github.com/za3k/scan-organizer/blob/master/screenshots/phase4.png
-[12]: https://github.com/za3k/scan-organizer#not-done-ocr
-[13]: https://github.com/tesseract-ocr/tesseract
-[14]: https://github.com/za3k/scan-organizer#phase-5-transcribing-by-hand
-[15]: https://github.com/za3k/scan-organizer/blob/master/screenshots/phase5.png
-[16]: https://github.com/za3k/scan-organizer#phase-6-verification
-[17]: https://github.com/za3k/scan-organizer/blob/master/screenshots/phase6.png
+### [](https://github.com/za3k/scan-organizer#phase-6-verification)Phase 6: Verification
+
+[](https://github.com/za3k/scan-organizer/blob/master/screenshots/phase6.png) At the end of the whole process, I verify that each image looks good, and is correctly tagged and transcribed.
index ceaf8fd8b91181e013ee69bdadc136f43b2f36d8..17f4b032b537de07945ac94d2aba2daf9bc86502 100644 (file)
@@ -13,6 +13,4 @@ updated: 2023-06-24 09:20:14-07:00
 wordpress_id: 1087
 wordpress_slug: scheme-interpreter
 ---
-I wrote a [small scheme interpreter][1] in C.
-
-[1]: https://github.com/za3k/sscheme
+I wrote a [small scheme interpreter](https://github.com/za3k/sscheme) in C.
index 6631c775b83a8e383a5f602be5f76bdea893dfe6..f424cf6024225ab4a12d5819384f697d76f14ae2 100644 (file)
@@ -22,31 +22,30 @@ I don’t usually like IDEs. They’re hard to switch off of, they do too much.
 
 But we’re programmers, so obviously we’re not going to use a literal checklist. Instead, we’re going to write a little script to auto-start things in a new screen session:
 
+```
 #!/usr/bin/screen -c
-# game\_development.screen.conf
-# Run stand-alone or with screen -c game\_devel.screen.conf
-screen -t "Vim" 2 bash -c "vim -p \*.t"
+# game_development.screen.conf
+# Run stand-alone or with screen -c game_devel.screen.conf
+screen -t "Vim" 2 bash -c "vim -p *.t"
 bind "r" screen -t "Game" 2 bash run.sh
+```
 
 Or if you prefer tmux:
 
-\# game\_development.tmux.conf
-# Run with tmux -f game\_development.tmux.conf attach
-new-session -s game\_development
-new-window -n "Vim" "bash -c 'vim -p \*.t'"
+```
+# game_development.tmux.conf
+# Run with tmux -f game_development.tmux.conf attach
+new-session -s game_development
+new-window -n "Vim" "bash -c 'vim -p *.t'"
 bind r new-window -n "Game" "bash run.sh"
+```
 
 Note the main features being used: a shebang line hack for screen, to let this file be self-contained and executable. Opening files in vim in place of a text editor. Binding keys for unit tests, running the program, restarting the server, etc. Now, a similar approach is to add new key bindings to the text editor, but I feel like text editors should edit text, and I like being able to document all the additions with help menus (which screen and tmux both support).
 
-Note: [ratpoison][1] is similar to screen/tmux so you can do similar things in X.
+Note: [ratpoison](http://www.nongnu.org/ratpoison/) is similar to screen/tmux so you can do similar things in X.
 
 One thing I’d love is if this kind of file was easy to dump from the current state, especially for things like positioning windows, etc. A little assistance is available, but not too much. Ratpoison and tmux let you dump sizing information. Nothing outputs keybindings or a list of running programs with their windows.
 
-There **is** a program called [tmuxinator][2] to let you write the same config in nested [YAML][3] of sessions, panes, and windows, which might appeal to some users.
+There **is** a program called [tmuxinator](https://github.com/tmuxinator/tmuxinator) to let you write the same config in nested [YAML](http://yaml.org/) of sessions, panes, and windows, which might appeal to some users.
 
-Also, check out [dtach][4] if you don’t need panes and windows, and just want a detachable process.
-
-[1]: http://www.nongnu.org/ratpoison/
-[2]: https://github.com/tmuxinator/tmuxinator
-[3]: http://yaml.org/
-[4]: http://dtach.sourceforge.net/
+Also, check out [dtach](http://dtach.sourceforge.net/) if you don’t need panes and windows, and just want a detachable process.
index a5d74f90b921f5140634489cfc92db70d41b8d83..45bcf376f7cad9b688099fded8026c08851c2bb4 100644 (file)
@@ -16,19 +16,12 @@ wordpress_slug: scroll-props
 ---
 Infocom introduced (AFAIK) the concept of feelies:
 
-> \[…\] Imaginative props and extras tied to the game’s theme—provided [copy protection][1] against [copyright infringement][2].[\[45\]][3] Some games were unsolvable without the extra content provided with the boxed game. And because of the cleverness and uniqueness of the feelies, users rarely felt like they were an intrusion or inconvenience, as was the case with most of the other copy-protection schemes of the time.[\[49\]][4] Feelies also provided the player with a physical aspect to the gameplay of their text adventures, giving another dimension of strategy to what would other-wise just be a text parser.
+> \[…\] Imaginative props and extras tied to the game’s theme—provided [copy protection](https://en.wikipedia.org/wiki/Copy_protection) against [copyright infringement](https://en.wikipedia.org/wiki/Copyright_infringement).[\[45\]](https://en.wikipedia.org/wiki/Infocom#cite_note-dyer19840506-45) Some games were unsolvable without the extra content provided with the boxed game. And because of the cleverness and uniqueness of the feelies, users rarely felt like they were an intrusion or inconvenience, as was the case with most of the other copy-protection schemes of the time.[\[49\]](https://en.wikipedia.org/wiki/Infocom#cite_note-49) Feelies also provided the player with a physical aspect to the gameplay of their text adventures, giving another dimension of strategy to what would other-wise just be a text parser.
 > 
 > – Wikipedia (Infocom)
 
 I love to give out feelies for my D&D campaigns. Here are some lil handout props I made:
 
-[![](https://blog.za3k.com/wp-content/uploads/2023/06/scroll-crop-835x1024.jpg)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2023/06/scroll-crop-835x1024.jpg)](https://blog.za3k.com/wp-content/uploads/2023/06/scroll-crop.jpg)
 
-I used a receipt printer, q-tips, tape, and [orthodontic rubber bands][6].
-
-[1]: https://en.wikipedia.org/wiki/Copy_protection
-[2]: https://en.wikipedia.org/wiki/Copyright_infringement
-[3]: https://en.wikipedia.org/wiki/Infocom#cite_note-dyer19840506-45
-[4]: https://en.wikipedia.org/wiki/Infocom#cite_note-49
-[5]: https://blog.za3k.com/wp-content/uploads/2023/06/scroll-crop.jpg
-[6]: https://www.amazon.com/Orthodontic-Elastic-Rubberbands-Dreadlocks-Horse/dp/B00OSR1RBM
+I used a receipt printer, q-tips, tape, and [orthodontic rubber bands](https://www.amazon.com/Orthodontic-Elastic-Rubberbands-Dreadlocks-Horse/dp/B00OSR1RBM).
index 950c977b19ba0072c3b145754714569c9a06a617..a5173b204bbf13e61280cb257b06937a6b8a04d4 100644 (file)
@@ -17,32 +17,34 @@ wordpress_slug: setting-up-ssl-certificates-using-startssl
 ---
 1.  Generate an SSL/TLS key, which will be used to actually encrypt traffic.
     
+    ```
     DOMAIN=nntp.za3k.com
     openssl genrsa -out ${DOMAIN}.key 4096
     chmod 700 ${DOMAIN}.key
+    ```
     
 2.  Generate a Certificate Signing Request, which is sent to your authentication provider. The details here will have to match the details they have on file (for StartSSL, just the domain name).
     
-    \# -subj "/C=US/ST=/L=/O=/CN=${DOMAIN}" can be omitted to fill in custom identification details
+    ```
+    # -subj "/C=US/ST=/L=/O=/CN=${DOMAIN}" can be omitted to fill in custom identification details
     # -sha512 is the hash of your key used for identification. This was the reasonable option in Oct 2014. It isn't supported by IE6
     openssl req -new -key ${DOMAIN}.key -out ${DOMAIN}.csr -subj "/C=US/ST=/L=/O=/CN=${DOMAIN}" -sha512
+    ```
     
 3.  Submit your Certificate Signing Request to your authentication provider. Assuming the signing request details match whatever they know about you, they’ll return you a certificate. You should also make sure to grab any intermediate and root certificates here.
     
+    ```
     echo "Saved certificate" > ${DOMAIN}.crt
     wget https://www.startssl.com/certs/sca.server1.crt https://www.startssl.com/certs/ca.crt # Intermediate and root certificate for StartSSL
+    ```
     
 4.  Combine the chain of trust (key, CSR, certificate, intermediate certificates(s), root certificate) into a single file with concatenation. Leaving out the key will give you a combined certificate of trust for the key, which you may need for other applications.
     
+    ```
     cat ${DOMAIN}.crt sca.server1.crt >${DOMAIN}.pem # Main cert
     cat ${DOMAIN}.key ${DOMAIN}.crt sca.server1.crt ca.crt >${DOMAIN}.full.pem
     chmod 700 ${DOMAIN}.full.pem
+    ```
     
 
-See also: [https://github.com/Gordin/StartSSL\_API][1]
-
-1.  Pingback: [Installing email with Postfix and Dovecot (with Postgres) - Optimal Prime][2]
-    
-
-[1]: https://github.com/Gordin/StartSSL_API
-[2]: https://blog.za3k.com/installing-email-with-postfix-and-dovecot/
+See also: [https://github.com/Gordin/StartSSL\_API](https://github.com/Gordin/StartSSL_API)
index 53bd4478a24b349f69791f108ea0182ba4644e78..90f9408a10a99b72b9af0ee55ed23424481524fd 100644 (file)
@@ -12,9 +12,6 @@ updated: 2021-06-06 00:28:01-07:00
 wordpress_id: 596
 wordpress_slug: software-section
 ---
-I added a [software section][1] to my website. It lists all the software I’ve made over the years (well not all of it, but what I think is most useful to others).
+I added a [software section](https://za3k.com/software.md) to my website. It lists all the software I’ve made over the years (well not all of it, but what I think is most useful to others).
 
-I updated the [archive][2] page as well, mostly to remove the software that was there. As usual, I try to make sure all links to my website are good forever.
-
-[1]: https://za3k.com/software.md
-[2]: https://za3k.com/archived.html
+I updated the [archive](https://za3k.com/archived.html) page as well, mostly to remove the software that was there. As usual, I try to make sure all links to my website are good forever.
index 253c8fd4dc79621299c2a048c5d74114b6aed558..5a9b5d0d6e28dba65cfc962bf895891abd1106a8 100644 (file)
@@ -15,37 +15,41 @@ updated: 2015-10-17 19:28:02-07:00
 wordpress_id: 243
 wordpress_slug: sql-views
 ---
-I decided I wanted to show (restricted) data views on the web in table form. Specifically, ‘stylish.db’ is a database provided by a chrome plugin. Here’s an example script, [stylish.view][1], which displays the contents of that. It contains a comment saying which database it’s a query on, together with the query.
+I decided I wanted to show (restricted) data views on the web in table form. Specifically, ‘stylish.db’ is a database provided by a chrome plugin. Here’s an example script, [stylish.view](https://za3k.com/stylish.view), which displays the contents of that. It contains a comment saying which database it’s a query on, together with the query.
 
-\-- stylish.db
-SELECT style, code, GROUP\_CONCAT(section\_meta.value) as 'website(s)' FROM
+```
+-- stylish.db
+SELECT style, code, GROUP_CONCAT(section_meta.value) as 'website(s)' FROM
  (SELECT styles.name AS style,
- sections.code AS code,sections.id AS sections\_id
- FROM styles INNER JOIN sections ON sections.style\_id = styles.id)
-LEFT JOIN section\_meta
- ON section\_meta.section\_id = sections\_id
+ sections.code AS code,sections.id AS sections_id
+ FROM styles INNER JOIN sections ON sections.style_id = styles.id)
+LEFT JOIN section_meta
+ ON section_meta.section_id = sections_id
 GROUP BY style;
+```
 
 The cool part here is that none of this was specific to stylish. I can quickly throw together a .view file for any database and put it on the web.
 
 I add put any databases in cgi-bin/db, and add view.cgi to cgi-bin:
 
+```
 #!/bin/bash
 # view.cgi
 echo "Content-type: text/html"
 echo
 
-QUERY\_FILE="${PATH\_TRANSLATED}"
-DB\_NAME=$(head -n1 "${QUERY\_FILE}" | sed -e 's/--\\s\*//')
-DB="/home/za3k/cgi-bin/db/${DB\_NAME}"
+QUERY_FILE="${PATH_TRANSLATED}"
+DB_NAME=$(head -n1 "${QUERY_FILE}" | sed -e 's/--\s*//')
+DB="/home/za3k/cgi-bin/db/${DB_NAME}"
 
-echo "<html><head><title>Query on #{DB\_NAME}</title><link rel="stylesheet" type="text/css" href="db.css"></head><body><table id=\\"${DB\_NAME}\\">"
-sqlite3 "$DB" -html -header <"${QUERY\_FILE}"
+echo "<html><head><title>Query on #{DB_NAME}</title><link rel="stylesheet" type="text/css" href="db.css"></head><body><table id=\"${DB_NAME}\">"
+sqlite3 "$DB" -html -header <"${QUERY_FILE}"
 echo "</table></body></html>"
+```
 
 I add this to apache’s \`.htaccess\`:
 
+```
 Action view /cgi-bin/view.cgi
 AddHandler view .view
-
-[1]: https://za3k.com/stylish.view
+```
index eb017b8492fbb5cfc9970984ed15dd9b2c7d5795..d451c7821ac0a91489d4e566da17b736a35c91f2 100644 (file)
@@ -14,8 +14,8 @@ updated: 2015-10-03 18:17:30-07:00
 wordpress_id: 193
 wordpress_slug: steak-tartare-3
 ---
-[![steak tartare](https://blog.za3k.com/wp-content/uploads/2015/04/steak-tartare.jpg)][1]  
-Recipe is mostly from [Tricia][2].
+[![steak tartare](https://blog.za3k.com/wp-content/uploads/2015/04/steak-tartare.jpg)](https://blog.za3k.com/wp-content/uploads/2015/04/steak-tartare.jpg)  
+Recipe is mostly from [Tricia](http://triciaroxanne.wordpress.com).
 
 Ingredients:
 
@@ -32,18 +32,3 @@ Ingredients:
 3.  Separate whites and yolks (carefully removing all the white since we’re using raw yolks). Pour one egg yolk into each divot.
 
 Read about raw beef and egg safety first to be well informed.
-
-1.  ![](https://secure.gravatar.com/avatar/aa5d8a139b96dc7b082a50ca2446deff?s=40&d=mm&r=g)[Tricia][3] says:
-    
-    [May 21, 2015 at 8:14 pm][4]
-    
-    So tasty! Enjoyed our month of obsessing over the recipe ^u^
-    
-    [Reply][5]
-    
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/04/steak-tartare.jpg
-[2]: http://triciaroxanne.wordpress.com
-[3]: http://sometimesicook.net
-[4]: https://blog.za3k.com/steak-tartare-3/#comment-255
-[5]: https://blog.za3k.com/steak-tartare-3/?replytocom=255#respond
index 7afa9d56999c4f66658d4e72d3ca3e27e5048bcd..9340f37f314cc034ca412522896e281fcc508265 100644 (file)
@@ -16,12 +16,7 @@ wordpress_slug: storage-prices-2019-07
 ---
 I did a survey of the cost of buying hard drives (of all sorts), CDs, DVDs, Blue-rays, and tape media (for tape drives).
 
-Here are the 2019-07 results: [https://za3k.com/archive/storage-2019-07.sc.txt][1]  
-2018-10: [https://za3k.com/archive/storage-2018-10.sc.txt][2]  
-2018-06: [https://za3k.com/archive/storage-2017-06.sc.txt][3]  
-2018-01: [https://za3k.com/archive/storage-2017-01.sc.txt][4]
-
-[1]: https://za3k.com/archive/storage-2019-07.sc.txt
-[2]: https://za3k.com/archive/storage-2018-10.sc.txt
-[3]: https://za3k.com/archive/storage-2017-06.sc.txt
-[4]: https://za3k.com/archive/storage-2017-01.sc.txt
+Here are the 2019-07 results: [https://za3k.com/archive/storage-2019-07.sc.txt](https://za3k.com/archive/storage-2019-07.sc.txt)  
+2018-10: [https://za3k.com/archive/storage-2018-10.sc.txt](https://za3k.com/archive/storage-2018-10.sc.txt)  
+2018-06: [https://za3k.com/archive/storage-2017-06.sc.txt](https://za3k.com/archive/storage-2017-06.sc.txt)  
+2018-01: [https://za3k.com/archive/storage-2017-01.sc.txt](https://za3k.com/archive/storage-2017-01.sc.txt)
index 61abc973308c9cac8e35cedc9411ad2d18594ac4..805937169894c9df32803fdf78fb50b2f96fc4e5 100644 (file)
@@ -16,11 +16,11 @@ wordpress_slug: storage-prices-2020-01
 ---
 I did a survey of the cost of buying hard drives (of all sorts), CDs, DVDs, Blue-rays, and tape media (for tape drives).
 
-Here are the **2020-01 results**: [https://za3k.com/archive/storage-2020-01.sc.txt][1]  
-2019-07: [https://za3k.com/archive/storage-2019-07.sc.txt][2]  
-2018-10: [https://za3k.com/archive/storage-2018-10.sc.txt][3]  
-2018-06: [https://za3k.com/archive/storage-2017-06.sc.txt][4]  
-2018-01: [https://za3k.com/archive/storage-2017-01.sc.txt][5]
+Here are the **2020-01 results**: [https://za3k.com/archive/storage-2020-01.sc.txt](https://za3k.com/archive/storage-2020-01.sc.txt)  
+2019-07: [https://za3k.com/archive/storage-2019-07.sc.txt](https://za3k.com/archive/storage-2019-07.sc.txt)  
+2018-10: [https://za3k.com/archive/storage-2018-10.sc.txt](https://za3k.com/archive/storage-2018-10.sc.txt)  
+2018-06: [https://za3k.com/archive/storage-2017-06.sc.txt](https://za3k.com/archive/storage-2017-06.sc.txt)  
+2018-01: [https://za3k.com/archive/storage-2017-01.sc.txt](https://za3k.com/archive/storage-2017-01.sc.txt)
 
 Changes this year
 
@@ -35,9 +35,3 @@ Some conclusions that are useful to know
 -   The cheapest option is tape media, but tape reader/writers for LTO 6, 7, and 8 are very expensive.
 -   The second-cheapest option is to buy external hard drives, and then open the cases and take out the hard drives. This gives you reliable drives with no warrantee.
 -   Blu-ray and DVD are more expensive than buying hard drives
-
-[1]: https://za3k.com/archive/storage-2020-01.sc.txt
-[2]: https://za3k.com/archive/storage-2019-07.sc.txt
-[3]: https://za3k.com/archive/storage-2018-10.sc.txt
-[4]: https://za3k.com/archive/storage-2017-06.sc.txt
-[5]: https://za3k.com/archive/storage-2017-01.sc.txt
index cbacd7cde51e37bc4165eef8340a48ae8980ba5d..71f2798cbe11365ab52b2c50c80242adcdf22175 100644 (file)
@@ -16,13 +16,13 @@ wordpress_slug: storage-prices-2022-07
 ---
 I did a survey of the cost of buying hard drives (of all sorts), microsd/sd, USB sticks, CDs, DVDs, Blu-rays, and tape media (for tape drives).
 
-Here are the **2022-07 results**: [https://za3k.com/archive/storage-2022-07.sc.txt][1]
+Here are the **2022-07 results**: [https://za3k.com/archive/storage-2022-07.sc.txt](https://za3k.com/archive/storage-2022-07.sc.txt)
 
-2020-01: [https://za3k.com/archive/storage-2020-01.sc.txt][2]  
-2019-07: [https://za3k.com/archive/storage-2019-07.sc.txt][3]  
-2018-10: [https://za3k.com/archive/storage-2018-10.sc.txt][4]  
-2018-06: [https://za3k.com/archive/storage-2017-06.sc.txt][5]  
-2018-01: [https://za3k.com/archive/storage-2017-01.sc.txt][6]
+2020-01: [https://za3k.com/archive/storage-2020-01.sc.txt](https://za3k.com/archive/storage-2020-01.sc.txt)  
+2019-07: [https://za3k.com/archive/storage-2019-07.sc.txt](https://za3k.com/archive/storage-2019-07.sc.txt)  
+2018-10: [https://za3k.com/archive/storage-2018-10.sc.txt](https://za3k.com/archive/storage-2018-10.sc.txt)  
+2018-06: [https://za3k.com/archive/storage-2017-06.sc.txt](https://za3k.com/archive/storage-2017-06.sc.txt)  
+2018-01: [https://za3k.com/archive/storage-2017-01.sc.txt](https://za3k.com/archive/storage-2017-01.sc.txt)
 
 Useful conclusions:
 
@@ -56,10 +56,3 @@ Changes since the last survey 2 years ago:
 -   **Tape**: LTO-9 is available.
 -   **Tape**: The cost of LTO-8 tape dropped 50%, which makes it the cheapest option.
 -   **Tape:** This is not new, but there is still only one tape drive manufacturer (HP) since around the introduction of LTO-8.
-
-[1]: https://za3k.com/archive/storage-2022-07.sc.txt
-[2]: https://za3k.com/archive/storage-2020-01.sc.txt
-[3]: https://za3k.com/archive/storage-2019-07.sc.txt
-[4]: https://za3k.com/archive/storage-2018-10.sc.txt
-[5]: https://za3k.com/archive/storage-2017-06.sc.txt
-[6]: https://za3k.com/archive/storage-2017-01.sc.txt
index 6d943b5d5e8143773e2d4760a46abbca42941c9c..f0c9f572b729117a72ff1a8b28016845e0254b12 100644 (file)
@@ -18,14 +18,14 @@ I did a survey of the cost of buying hard drives (of all sorts), microsd/sd, USB
 
 I excluded used/refurbished options. Multi-packs (5 USB sticks) were excluded, except for optical media like CD-ROMs. Seagate drives were excluded because Seagate has a poor reputation.
 
-Here are the **2023-01 results**: [https://za3k.com/archive/storage-2023-01.sc.txt][1]
+Here are the **2023-01 results**: [https://za3k.com/archive/storage-2023-01.sc.txt](https://za3k.com/archive/storage-2023-01.sc.txt)
 
-2022-07: [https://za3k.com/archive/storage-2022-07.sc.txt][2]  
-2020-01: [https://za3k.com/archive/storage-2020-01.sc.txt][3]  
-2019-07: [https://za3k.com/archive/storage-2019-07.sc.txt][4]  
-2018-10: [https://za3k.com/archive/storage-2018-10.sc.txt][5]  
-2018-06: [https://za3k.com/archive/storage-2017-06.sc.txt][6]  
-2018-01: [https://za3k.com/archive/storage-2017-01.sc.txt][7]
+2022-07: [https://za3k.com/archive/storage-2022-07.sc.txt](https://za3k.com/archive/storage-2022-07.sc.txt)  
+2020-01: [https://za3k.com/archive/storage-2020-01.sc.txt](https://za3k.com/archive/storage-2020-01.sc.txt)  
+2019-07: [https://za3k.com/archive/storage-2019-07.sc.txt](https://za3k.com/archive/storage-2019-07.sc.txt)  
+2018-10: [https://za3k.com/archive/storage-2018-10.sc.txt](https://za3k.com/archive/storage-2018-10.sc.txt)  
+2018-06: [https://za3k.com/archive/storage-2017-06.sc.txt](https://za3k.com/archive/storage-2017-06.sc.txt)  
+2018-01: [https://za3k.com/archive/storage-2017-01.sc.txt](https://za3k.com/archive/storage-2017-01.sc.txt)
 
 Per TB, the options are (from cheapest to most expensive):
 
@@ -49,11 +49,3 @@ Changes since the last survey (4 months ago):
 -   **Optical**: The cheapest option (25GB blu-ray) dropped 30%.
 -   **Optical**: I stopped gathering data on the cost of BR-RE
 -   **Tape**: LTO-7 tape drives are now available used, halving the break-even point on tape.
-
-[1]: https://za3k.com/archive/storage-2023-01.sc.txt
-[2]: https://za3k.com/archive/storage-2022-07.sc.txt
-[3]: https://za3k.com/archive/storage-2020-01.sc.txt
-[4]: https://za3k.com/archive/storage-2019-07.sc.txt
-[5]: https://za3k.com/archive/storage-2018-10.sc.txt
-[6]: https://za3k.com/archive/storage-2017-06.sc.txt
-[7]: https://za3k.com/archive/storage-2017-01.sc.txt
index 18b9306808f3b3f27524ad854e0573cffc067748..c5a97e44ede68d9e5f3c1e6d9de7602e7d269c4d 100644 (file)
@@ -21,45 +21,51 @@ I stopped using OBS a while ago for a couple reasons–the main one was that it
 I’m prefer less layers, so I’m still on ALSA. My setup is:
 
 -   I have one computer, running linux. It runs what I’m streaming (typically minecraft), and captures everything, encodes everything, and sends it to twitch
--   Video is captured using [libxcb][1] (captures X11 desktop)
--   Audio is captured using [ALSA][2]. My mic is captured directly, while the rest of my desktop audio is sent to a loopback device which acts as a second mic.
--   Everything is encoded together into one video stream. The video is a [Flash video][3] container with [x264][4] video and [AAC][5] audio, because that’s what twitch wants. Hopefully we’ll all switch to [AV1][6] soon.
--   That stream is sent to [twitch][7] by ffmpeg
+-   Video is captured using [libxcb](https://xcb.freedesktop.org/) (captures X11 desktop)
+-   Audio is captured using [ALSA](https://en.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture). My mic is captured directly, while the rest of my desktop audio is sent to a loopback device which acts as a second mic.
+-   Everything is encoded together into one video stream. The video is a [Flash video](https://en.wikipedia.org/wiki/Flash_Video) container with [x264](https://en.wikipedia.org/wiki/X264) video and [AAC](https://en.wikipedia.org/wiki/Advanced_Audio_Coding) audio, because that’s what twitch wants. Hopefully we’ll all switch to [AV1](https://en.wikipedia.org/wiki/AV1) soon.
+-   That stream is sent to [twitch](https://www.twitch.tv/) by ffmpeg
 -   There is no way to pause the stream, do scenes, adjust audio, see audio levels, etc while the stream is going. I just have to adjust program volumes independently.
 
 Here’s my .asoundrc:
 
-    # sudo modprobe snd-aloop is required to set up hw:Loopback
-    pcm.!default {
-      type plug
-      slave.pcm {
-        type dmix
-        ipc_key 99
-        slave {
-          pcm "hw:Loopback,0"
-          rate 48000
-          channels 2
-          period_size 1024
-        }
-      }
+```
+# sudo modprobe snd-aloop is required to set up hw:Loopback
+pcm.!default {
+  type plug
+  slave.pcm {
+    type dmix
+    ipc_key 99
+    slave {
+      pcm "hw:Loopback,0"
+      rate 48000
+      channels 2
+      period_size 1024
     }
+  }
+}
+```
 
 My ffmpeg build line:
 
-    ./configure --enable-libfdk-aac --enable-nonfree --enable-libxcb --enable-indev=alsa --enable-outdev=alsa --prefix=/usr/local --extra-version='za3k' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-libaom --enable-libass --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopus --enable-libpulse --enable-libvorbis --enable-libvpx --enable-libx265 --enable-opengl --enable-libdrm --enable-libx264 --enable-shared --enable-librtmp && make -j 4 && sudo make install
+```
+./configure --enable-libfdk-aac --enable-nonfree --enable-libxcb --enable-indev=alsa --enable-outdev=alsa --prefix=/usr/local --extra-version='za3k' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-libaom --enable-libass --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopus --enable-libpulse --enable-libvorbis --enable-libvpx --enable-libx265 --enable-opengl --enable-libdrm --enable-libx264 --enable-shared --enable-librtmp && make -j 4 && sudo make install
+```
 
 And most imporantly, my ffmpeg command:
 
-    ffmpeg 
-      -video_size 1280x720 -framerate 30 -f x11grab -s 1280x720 -r 30 -i :0.0 
-      -f alsa -ac 1 -ar 48000 -i hw:1,0 
-      -f alsa -ac 2 -ar 48000 -i hw:Loopback,1
-      -filter_complex '[1:a][1:a]amerge=inputs=2[stereo1] ; [2:a][stereo1]amerge=inputs=2[a]' -ac 2 
-      -map '[a]' -map 0:v 
-      -f flv -ac 2 -ar 48000 
-      -vcodec libx264 -g 60 -keyint_min 30 -b:v 3000k -minrate 3000k -maxrate 3000k -pix_fmt yuv420p -s 1280x720 -preset ultrafast -tune film 
-      -c:a libfdk_aac -b:a 160k -strict normal -bufsize 3000k 
-      rtmp://live-sjc.twitch.tv/app/${TWITCH_KEY}
+```
+ffmpeg 
+  -video_size 1280x720 -framerate 30 -f x11grab -s 1280x720 -r 30 -i :0.0 
+  -f alsa -ac 1 -ar 48000 -i hw:1,0 
+  -f alsa -ac 2 -ar 48000 -i hw:Loopback,1
+  -filter_complex '[1:a][1:a]amerge=inputs=2[stereo1] ; [2:a][stereo1]amerge=inputs=2[a]' -ac 2 
+  -map '[a]' -map 0:v 
+  -f flv -ac 2 -ar 48000 
+  -vcodec libx264 -g 60 -keyint_min 30 -b:v 3000k -minrate 3000k -maxrate 3000k -pix_fmt yuv420p -s 1280x720 -preset ultrafast -tune film 
+  -c:a libfdk_aac -b:a 160k -strict normal -bufsize 3000k 
+  rtmp://live-sjc.twitch.tv/app/${TWITCH_KEY}
+```
 
 Let’s break that monster down a bit. `ffmpeg` structures its command line into input streams, transformations, and output streams.
 
@@ -90,10 +96,10 @@ By default, ffmpeg just keeps all the streams around, so we now have one mono, a
 We want the output format to be Flash video (`-f flv`) with stereo audio (`-ac 2`) at 48000Hz (`-ar 48000`). Why do we want that? Because we’re streaming to Twitch and that’s what Twitch says they want–that’s basically why everything in the output format.
 
 `-vcodec libx264 -g 60 -keyint_min 30 -b:v3000k -minrate 3000k -maxrate 3000k -pix_fmt yuv420p -s 1280x720 -preset ultrafast -tune film`:  
-Ah, the magic. Now we do x264 encoding (`-vcodec libx264`), a modern wonder. A lot of the options here are just [what Twitch requests][8]. They want keyframes every 2 seconds (`-g 60 -keyint_min 30`, where 60=30\*2=FPS\*2, 30=FPS). They want a constant bitrate (`-b:v3000k -minrate 3000k -maxrate 3000k`) between 1K-6K/s at the time of writing–I picked 3K because it’s appropriate for 720p video, but you could go with 6K for 1080p. Here are [Twitch’s recommendations][9]. The pixel format is standard (`-pix_gmt yub720p`) and we still don’t want to change the resolution (`-s 1280x720`). Finally the options you might want to change. You want to set the preset as high as it will go with your computer keeping up–mine sucks (`-preset ultrafast`, where the options go ultrafast,superfast,veryfast,faster,fast,medium, with a [2-10X jump in CPU power needed][10] for each step). And I’m broadcasting minecraft, which in terms of encoders is close to film (`-tune film`)–lots of panning, relatively complicated stuff on screen. If you want to re-encode cartoons you want something else.
+Ah, the magic. Now we do x264 encoding (`-vcodec libx264`), a modern wonder. A lot of the options here are just [what Twitch requests](https://help.twitch.tv/s/article/broadcast-requirements?language=en_US). They want keyframes every 2 seconds (`-g 60 -keyint_min 30`, where 60=30\*2=FPS\*2, 30=FPS). They want a constant bitrate (`-b:v3000k -minrate 3000k -maxrate 3000k`) between 1K-6K/s at the time of writing–I picked 3K because it’s appropriate for 720p video, but you could go with 6K for 1080p. Here are [Twitch’s recommendations](https://stream.twitch.tv/encoding/). The pixel format is standard (`-pix_gmt yub720p`) and we still don’t want to change the resolution (`-s 1280x720`). Finally the options you might want to change. You want to set the preset as high as it will go with your computer keeping up–mine sucks (`-preset ultrafast`, where the options go ultrafast,superfast,veryfast,faster,fast,medium, with a [2-10X jump in CPU power needed](https://trac.ffmpeg.org/wiki/Encode/H.264) for each step). And I’m broadcasting minecraft, which in terms of encoders is close to film (`-tune film`)–lots of panning, relatively complicated stuff on screen. If you want to re-encode cartoons you want something else.
 
 `-c:a libfdk_aac -b:a 160k`:  
-We use AAC (`-c:a libfdk_aac`). Note that libfdk is many times faster than the default implementation, but it’s not available by default in debian’s ffmpeg for ([dumb][11]) license reasons. We use 160k bitrate (`-b:a 160k` ) audio since I’ve found that’s good, and 96K-160K is Twitch’s allowable range. \`-strict normal\`
+We use AAC (`-c:a libfdk_aac`). Note that libfdk is many times faster than the default implementation, but it’s not available by default in debian’s ffmpeg for ([dumb](https://www.gnu.org/licenses/license-list.html#fdk)) license reasons. We use 160k bitrate (`-b:a 160k` ) audio since I’ve found that’s good, and 96K-160K is Twitch’s allowable range. \`-strict normal\`
 
 `-strict normal`: Just an ffmpeg option. Not interesting.  
 `-bufsize 3000k`: One second of buffer with CBR video
@@ -107,28 +113,4 @@ Sources:
 -   ffmpeg wiki and docs (pretty good)
 -   ALSA docs (not that good)
 -   Twitch documentation, which is pretty good once you can find it
--   [mark hills][12] on how to set up snd-aloop
-
-1.  ![](https://secure.gravatar.com/avatar/47e66dd3a830fdd2a6191a4100425b43?s=40&d=mm&r=g)Mario Enriquez says:
-    
-    [January 22, 2021 at 7:31 pm][13]
-    
-    Thanks for your post.
-    
-    [Reply][14]
-    
-
-[1]: https://xcb.freedesktop.org/
-[2]: https://en.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture
-[3]: https://en.wikipedia.org/wiki/Flash_Video
-[4]: https://en.wikipedia.org/wiki/X264
-[5]: https://en.wikipedia.org/wiki/Advanced_Audio_Coding
-[6]: https://en.wikipedia.org/wiki/AV1
-[7]: https://www.twitch.tv/
-[8]: https://help.twitch.tv/s/article/broadcast-requirements?language=en_US
-[9]: https://stream.twitch.tv/encoding/
-[10]: https://trac.ffmpeg.org/wiki/Encode/H.264
-[11]: https://www.gnu.org/licenses/license-list.html#fdk
-[12]: http://www.pogo.org.uk/~mark/trx/streaming-desktop-audio.html
-[13]: https://blog.za3k.com/streaming-linux-twitch-using-ffmpeg-and-alsa/#comment-4344
-[14]: https://blog.za3k.com/streaming-linux-twitch-using-ffmpeg-and-alsa/?replytocom=4344#respond
+-   [mark hills](http://www.pogo.org.uk/~mark/trx/streaming-desktop-audio.html) on how to set up snd-aloop
index 6072d858fb97ba67f2f5943c9590f5c502809970..074676bdf13c74dbeef01f686b5f7b2f33e22a0d 100644 (file)
@@ -16,6 +16,4 @@ updated: 2015-03-28 04:04:55-07:00
 wordpress_id: 145
 wordpress_slug: stylish
 ---
-Just a quick shout-out to Chrome extension [Stylish][1], which lets you add custom stylesheets to any web page. I’m using it with “display: none” and “visibility: hidden” exclusively, to hide annoying page elements.
-
-[1]: https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl=en
+Just a quick shout-out to Chrome extension [Stylish](https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl=en), which lets you add custom stylesheets to any web page. I’m using it with “display: none” and “visibility: hidden” exclusively, to hide annoying page elements.
index a7431a3999d96c1657dd51f6ff00fac0228d0df4..ffe98d49be45de7b6abb3c559e9b2d45d939aac9 100644 (file)
@@ -25,7 +25,7 @@ New terminal goal technique:
 3.  Periodically re-evaluate to make sure it’s the best goal and you’re gathering information.
 
 Original Technique: [Murphy-jitsu  
-][1]
+](https://docs.google.com/document/d/1oEyvXQXdPDzu72Wv2j5bRfJbB7hV3zrjLMVR_T428oc/edit)
 
 1.  Come up with a plan to achieve your goal.
 2.  Use pre-hindsight to ask “How did this go wrong?”.
@@ -63,21 +63,4 @@ Technique: Do the Obvious Thing
 4.  Decide whether or not to do it.
 5.  If you don’t want to, contradiction. Debug steps 1,2,3,4 and see where you went wrong until they’re in accord.
 
-Theory on how to avoid lost purposes (mostly from Eliezer): Use [Litany of Tarski][2] a lot until you get the magic effect where you don’t start rationalizing to begin with (and generally don’t flinch away from learning about things/mistakes). Then, develop an aversion to lost purposes. The naive failure mode is to avoid noticing lost purposes if you have an aversion. (The simpler technique is [Alien in a Body][3])
-
-1.  ![](https://secure.gravatar.com/avatar/111a7d8b594d7707bc1f5e3085c069ef?s=40&d=mm&r=g)JSevilla says:
-    
-    [July 18, 2015 at 9:42 pm][4]
-    
-    Cool stuff. I liked exactboxing and DTOT.  
-    Murphy jitsu has potential.  
-    The modified goal factor has a suspicious component of leaving things to future me that I don’t like a bit though.
-    
-    [Reply][5]
-    
-
-[1]: https://docs.google.com/document/d/1oEyvXQXdPDzu72Wv2j5bRfJbB7hV3zrjLMVR_T428oc/edit
-[2]: http://wiki.lesswrong.com/wiki/Litany_of_Tarski
-[3]: http://lesswrong.com/lw/5x8/teachable_rationality_skills/49d7
-[4]: https://blog.za3k.com/terminal-goal-rationality-techniques/#comment-631
-[5]: https://blog.za3k.com/terminal-goal-rationality-techniques/?replytocom=631#respond
+Theory on how to avoid lost purposes (mostly from Eliezer): Use [Litany of Tarski](http://wiki.lesswrong.com/wiki/Litany_of_Tarski) a lot until you get the magic effect where you don’t start rationalizing to begin with (and generally don’t flinch away from learning about things/mistakes). Then, develop an aversion to lost purposes. The naive failure mode is to avoid noticing lost purposes if you have an aversion. (The simpler technique is [Alien in a Body](http://lesswrong.com/lw/5x8/teachable_rationality_skills/49d7))
index a0b2f0ee2992036d54b78e9f601120e48a46eca4..5117d7ef78940fc14b99bc5017a661200ba6d0c8 100644 (file)
@@ -18,35 +18,37 @@ Recently I wrote a scraper. First, I downloaded all the HTML files. Next, I want
 
 To make testing faster, I added a scaffold. Whenever my parser hit an error, it would print the filename (for me, the tester) and record the filename to an error log. Then, it would immediately exit. When I re-ran the parser, it would test all the files where it had hit a problem **first**. That way, I didn’t have to wait 20 minutes until it got to the failure case.
 
-    if __name__ == "__main__":
-        if os.path.exists("failures.log"):
-            # Quicker failures 
-            with open("failures.log", "r") as f:
-                failures = set([x.strip() for x in f])
-            for path in tqdm.tqdm(failures, desc="re-checking known tricky files"):
+```
+if __name__ == "__main__":
+    if os.path.exists("failures.log"):
+        # Quicker failures 
+        with open("failures.log", "r") as f:
+            failures = set([x.strip() for x in f])
+        for path in tqdm.tqdm(failures, desc="re-checking known tricky files"):
+            try:
+                with open(path) as input:
+                    parse_file(input)
+            except Exception:
+                print(path, "failed again (already failed once")
+                raise
+
+    paths = []
+    for root, dirs, files in os.walk("html"):
+        for file in sorted(files):
+            path = os.path.join(root, file)
+            paths.append(path)
+    paths.sort()
+
+    with open("output.json", "w") as out:
+        for path in tqdm.tqdm(paths, desc="parse files"): # tqdm is just a progress bar. you can also use 'for path in paths:
+            with open(input, "r") as input:
                 try:
-                    with open(path) as input:
-                        parse_file(input)
+                    result = parse_file(input)
                 except Exception:
-                    print(path, "failed again (already failed once")
+                    print(path, "failed, adding to quick-fail test list")
+                    with open("failures.log", "a") as fatal:
+                        print(path, file=fatal)
                     raise
-    
-        paths = []
-        for root, dirs, files in os.walk("html"):
-            for file in sorted(files):
-                path = os.path.join(root, file)
-                paths.append(path)
-        paths.sort()
-    
-        with open("output.json", "w") as out:
-            for path in tqdm.tqdm(paths, desc="parse files"): # tqdm is just a progress bar. you can also use 'for path in paths:
-                with open(input, "r") as input:
-                    try:
-                        result = parse_file(input)
-                    except Exception:
-                        print(path, "failed, adding to quick-fail test list")
-                        with open("failures.log", "a") as fatal:
-                            print(path, file=fatal)
-                        raise
-                    json.dump(result, out, sort_keys=True) # my desired output is one JSON dict per line
-                    out.write("\n")
+                json.dump(result, out, sort_keys=True) # my desired output is one JSON dict per line
+                out.write("\n")
+```
index 1ad07fd7ddccd89ef52acf08448e6e68d0a5510c..4612e33b34fc70f73d7ac548855bb2abadb035e6 100644 (file)
@@ -14,13 +14,13 @@ updated: 2014-12-01 09:09:56-07:00
 wordpress_id: 79
 wordpress_slug: the-bible-translated-to-the-new-latin
 ---
-> [Abbot][1]: I will perform the opening prayer in the New Latin. Oh ordlay, ivethgay usway ouryay essingsblay. Amen-ay!
+> [Abbot](http://www.imdb.com/name/nm0887694/?ref_=tt_trv_qu): I will perform the opening prayer in the New Latin. Oh ordlay, ivethgay usway ouryay essingsblay. Amen-ay!
 > 
 > Crowd: AMEN-AY!
 > 
-> –[Robin Hood: Men In Tights][2]
+> –[Robin Hood: Men In Tights](http://www.imdb.com/title/tt0107977/quotes?item=qt0327154)
 
-In honor of National Novel [Writing][3]/[Generating][4] Month and Christmas spirit, I translated the [King James Bible][5] into the “New Latin” (aka [Pig Latin][6]).
+In honor of National Novel [Writing](http://nanowrimo.za3k.com/)/[Generating](https://github.com/dariusk/NaNoGenMo-2014/issues/148) Month and Christmas spirit, I translated the [King James Bible](http://www.gutenberg.org/ebooks/10) into the “New Latin” (aka [Pig Latin](http://en.wikipedia.org/wiki/Pig_Latin)).
 
 > 1:1 Inway ethay eginningbay Odgay eatedcray ethay eavenhay andway ethay earthway.
 > 
@@ -28,16 +28,6 @@ In honor of National Novel [Writing][3]/[Generating][4] Month and Christmas spi
 > ethay acefay ofway ethay eepday. Andway ethay Iritspay ofway Odgay ovedmay uponway ethay acefay ofway ethay
 > atersway.
 > 
-> -[Ethay Iblebay][7]
+> -[Ethay Iblebay](http://za3k.com/new%20latin%20bible.txt)
 
-The full bible translation is [here][8]. Source code is [here][9].
-
-[1]: http://www.imdb.com/name/nm0887694/?ref_=tt_trv_qu
-[2]: http://www.imdb.com/title/tt0107977/quotes?item=qt0327154
-[3]: http://nanowrimo.za3k.com/
-[4]: https://github.com/dariusk/NaNoGenMo-2014/issues/148
-[5]: http://www.gutenberg.org/ebooks/10
-[6]: http://en.wikipedia.org/wiki/Pig_Latin
-[7]: http://za3k.com/new%20latin%20bible.txt
-[8]: http://za3k.com/new%20latin%20bible.txt
-[9]: https://github.com/vanceza/newlatinbible
+The full bible translation is [here](http://za3k.com/new%20latin%20bible.txt). Source code is [here](https://github.com/vanceza/newlatinbible).
index 45ee54fab2fc4b498d80d579d4b2b5b923348645..51555f5782b379aae22f82c4bd1f3d7ad92f0ff1 100644 (file)
@@ -18,19 +18,19 @@ So that’s where we start. Here’s where I went.
 
 I thought, if these books are just a local convenience for an online version, it’s more artistically satisfying to have some representation of that. So I printed up a card catalog of all my books, both the ones I have digital copies of and not:
 
-[![An example catalog card](https://blog.za3k.com/wp-content/uploads/2014/11/sample_card-300x186.png)][1]
+[![An example catalog card](https://blog.za3k.com/wp-content/uploads/2014/11/sample_card-300x186.png)](https://blog.za3k.com/wp-content/uploads/2014/11/sample_card.png)
 
 An example catalog card
 
-That’s what a card looks like. There’s information about the book up top, and a link in the form of a [QR code][2] in the middle. The link downloads a PDF version of that book. Obviously being a programmer, the cards all all automatically generated.
+That’s what a card looks like. There’s information about the book up top, and a link in the form of a [QR code](http://en.wikipedia.org/wiki/QR_code "QR code") in the middle. The link downloads a PDF version of that book. Obviously being a programmer, the cards all all automatically generated.
 
-[![Book with a card inside](https://blog.za3k.com/wp-content/uploads/2014/11/book-186x300.jpg)][3]
+[![Book with a card inside](https://blog.za3k.com/wp-content/uploads/2014/11/book-186x300.jpg)](https://blog.za3k.com/wp-content/uploads/2014/11/book.jpg)
 
 Book with a card inside
 
-For the books where I have a physical copy, I put the card in the book, and it feels like I’m touching the digital copy. My friends can pirate their own personal version of the book (saving me the sadness of lost lent-out books I’m sure we’ve all felt at times). And I just thing it looks darn neat. Some physical books I don’t have a digital version of, since the world is not yet perfect. But at least I can identify them at a glance (and consider sending them off to a service like [http://1dollarscan.com/][4])
+For the books where I have a physical copy, I put the card in the book, and it feels like I’m touching the digital copy. My friends can pirate their own personal version of the book (saving me the sadness of lost lent-out books I’m sure we’ve all felt at times). And I just thing it looks darn neat. Some physical books I don’t have a digital version of, since the world is not yet perfect. But at least I can identify them at a glance (and consider sending them off to a service like [http://1dollarscan.com/](http://1dollarscan.com/))
 
-[![Card catalog of digital books](https://blog.za3k.com/wp-content/uploads/2014/11/catalog-225x300.jpg)][5]
+[![Card catalog of digital books](https://blog.za3k.com/wp-content/uploads/2014/11/catalog-225x300.jpg)](https://blog.za3k.com/wp-content/uploads/2014/11/catalog.jpg)
 
 Card catalog of digital books
 
@@ -44,22 +44,6 @@ Interesting technical problems encountered during this project (you can stop rea
 
 -   Making sure each card gets printed exactly once, in the face of printer failures and updating digital collections. This was hard and took up most of my time, but it’s also insanely boring so I’ll say no more.
 -   Command-line QR code generation, especially without generating intermediate files. I used rqrcode\_png in ruby. I can now hotlink link qr.png?text=Hello%20World and see any text I want, it’s great.
--   Printing the cards. This is actually really difficult to automate–I generate the cards in HTML and it’s pretty difficult to print HTML, CSS, and included images. I ended up using the ‘[wkhtmltoimage][6]‘ project, which as far as I can tell, renders the image somewhere internally using [webkit][7] and screenshots it. There’s also a wkhtmltopdf available, which worked well but I couldn’t get to cooperate with index-card sized paper. Nothing else really seems to handle CSS, etc properly and as horrifying as the fundamental approach is, it’s both correct and well-executed. (They solved a number of problems with upstream patches to Qt for example, the sort of thing I love to hear)
--   The [zbarcam][8] software (for scanning QR codes among other digital codes) is just absolute quality work and I can’t say enough good things about it. Scanning cards back into the computer was one of the most pleasant parts of this whole project. It has an intuitive command UI using all the format options I want, and camera feedback to show it’s scanned QR codes (which it does very quickly).
--   [Future-proofed][9] links to pirated books–the sort of link that usually goes down. I opted to use a [SHA256 hash][10] (the mysterious numbers at the bottom which form a unique signature generated from the content of the book) and provide a small page on my website which gives you a download based on that. This is what the QR code links to. I was hoping there was some way to provide that without involving me, but I’m unaware of any service available. [Alice Monday][11] suggested just typing the SHA hash into Google, which sounded like the sort of clever idea which might work. It doesn’t.
-
-1.  Pingback: [Paper archival | Optimal Prime][12]
-    
-
-[1]: https://blog.za3k.com/wp-content/uploads/2014/11/sample_card.png
-[2]: http://en.wikipedia.org/wiki/QR_code "QR code"
-[3]: https://blog.za3k.com/wp-content/uploads/2014/11/book.jpg
-[4]: http://1dollarscan.com/
-[5]: https://blog.za3k.com/wp-content/uploads/2014/11/catalog.jpg
-[6]: http://wkhtmltopdf.org/ "wkhtmltoimage"
-[7]: http://en.wikipedia.org/wiki/WebKit "webkit"
-[8]: http://zbar.sourceforge.net/ "zbarcam"
-[9]: http://en.wikipedia.org/wiki/Future_proof "Future-proofed"
-[10]: http://en.wikipedia.org/wiki/SHA-2 "SHA256 hash"
-[11]: https://twitter.com/ali0mt "Alice Monday"
-[12]: https://blog.za3k.com/paper-archival/
+-   Printing the cards. This is actually really difficult to automate–I generate the cards in HTML and it’s pretty difficult to print HTML, CSS, and included images. I ended up using the ‘[wkhtmltoimage](http://wkhtmltopdf.org/ "wkhtmltoimage")‘ project, which as far as I can tell, renders the image somewhere internally using [webkit](http://en.wikipedia.org/wiki/WebKit "webkit") and screenshots it. There’s also a wkhtmltopdf available, which worked well but I couldn’t get to cooperate with index-card sized paper. Nothing else really seems to handle CSS, etc properly and as horrifying as the fundamental approach is, it’s both correct and well-executed. (They solved a number of problems with upstream patches to Qt for example, the sort of thing I love to hear)
+-   The [zbarcam](http://zbar.sourceforge.net/ "zbarcam") software (for scanning QR codes among other digital codes) is just absolute quality work and I can’t say enough good things about it. Scanning cards back into the computer was one of the most pleasant parts of this whole project. It has an intuitive command UI using all the format options I want, and camera feedback to show it’s scanned QR codes (which it does very quickly).
+-   [Future-proofed](http://en.wikipedia.org/wiki/Future_proof "Future-proofed") links to pirated books–the sort of link that usually goes down. I opted to use a [SHA256 hash](http://en.wikipedia.org/wiki/SHA-2 "SHA256 hash") (the mysterious numbers at the bottom which form a unique signature generated from the content of the book) and provide a small page on my website which gives you a download based on that. This is what the QR code links to. I was hoping there was some way to provide that without involving me, but I’m unaware of any service available. [Alice Monday](https://twitter.com/ali0mt "Alice Monday") suggested just typing the SHA hash into Google, which sounded like the sort of clever idea which might work. It doesn’t.
index 0134d1b2bc46f7ff8dafdba2fc79e975f1ec82d6..d62a2521a29a7b5c19e0e5acda24cd7d6c4ae5e4 100644 (file)
@@ -12,7 +12,7 @@ updated: 2021-06-05 15:38:04-07:00
 wordpress_id: 545
 wordpress_slug: time-log-transcribed
 ---
-I [write down everything I do.][1]
+I [write down everything I do.](https://blog.za3k.com/life-logging-in-2019/)
 
 I transcribed my journals by hand. That is, I typed them up myself, instead of trying to use handwriting recognition or outsourcing to Mechanical Turk.
 
@@ -22,5 +22,3 @@ I transcribed my journals by hand. That is, I typed them up myself, instead of t
 -   That’s 1779 pages total (small ones, these are pocket journals). It’s also 32,000 lines, and 164K words. The text is 1.1MB, the scanned PNG files are 12GB (12000 MB).
 -   In general, it takes me 1 hour to transcribe the last week of notes. Going farther back is harder, partly because my handwriting gets more readable as time progresses (due at least as much to my choice of pen, as my neatness), and partly because I have a harder time guessing at poor handwriting without memory to fill it in, and partly because I didn’t use standard formats back then.
 -   I do have exact numbers I could check, but a lower bound based on this rate is that was overall 90 hours of work. It probably didn’t take more than twice that.
-
-[1]: https://blog.za3k.com/life-logging-in-2019/
index 77106c548fdd0622bf7ee5cea6717fb97e9f1cb2..a6d1821ea7b24c739dc50f6e0836e79135ffd6ef 100644 (file)
@@ -47,16 +47,3 @@ Failure modes:
 
 -   Bad at goals: Minimization deals with recurring activities, but can fail to offer any positive motivation for one-time end goals
 -   Negative mindset: Heavy focus on mistakes and resource use
-
-1.  ![](https://secure.gravatar.com/avatar/aa5d8a139b96dc7b082a50ca2446deff?s=40&d=mm&r=g)[Tricia][1] says:
-    
-    [November 5, 2015 at 9:13 pm][2]
-    
-    Very nice! I often find myself automatically optimizing – the easiest place to see this is in Animal Crossing where I’ll keep a large cash of items for when villagers might ask for one. The idea is to always be prepared (I blame girl scouts). I suppose the negative to this behavior is that it could lead to hording if left unchecked.
-    
-    [Reply][3]
-    
-
-[1]: http://sometimesicook.net
-[2]: https://blog.za3k.com/time-management-optimizers-satisficers-minimizers/#comment-2451
-[3]: https://blog.za3k.com/time-management-optimizers-satisficers-minimizers/?replytocom=2451#respond
index 6d3a0d02d0a76f9e4c1ab91c728ce86ce19051e2..d9aa01dd28ae280cefa2767389ba3188daf605a4 100644 (file)
@@ -14,9 +14,9 @@ updated: 2022-09-23 15:07:32-07:00
 wordpress_id: 796
 wordpress_slug: timelog-analysis
 ---
-I [write down][1] everything I do. Yesterday, I wrote a quick-and-dirty analysis program to get some stats on common habits.
+I [write down](https://blog.za3k.com/life-logging-in-2019/) everything I do. Yesterday, I wrote a quick-and-dirty analysis program to get some stats on common habits.
 
-The full results are here: [d][2][r][3][ive][4] [floss][5] [food][6] [read][7] [sleep][8] [teeth][9] [tv][10] [wake][11] [walk][12] [youtube][13]. Of course, what I write down doesn’t perfectly match what I do, so most of the absolute stats are vastly wrong. Comparative ones are still interesting.
+The full results are here: [d](https://za3k.com/archive/timelog-analysis/drive.txt)[r](https://za3k.com/archive/timelog-analysis/drive.txt)[ive](https://za3k.com/archive/timelog-analysis/drive.txt) [floss](https://za3k.com/archive/timelog-analysis/floss.txt) [food](https://za3k.com/archive/timelog-analysis/food.txt) [read](https://za3k.com/archive/timelog-analysis/read.txt) [sleep](https://za3k.com/archive/timelog-analysis/sleep.txt) [teeth](https://za3k.com/archive/timelog-analysis/teeth.txt) [tv](https://za3k.com/archive/timelog-analysis/tv.txt) [wake](https://za3k.com/archive/timelog-analysis/wake.txt) [walk](https://za3k.com/archive/timelog-analysis/walk.txt) [youtube](https://za3k.com/archive/timelog-analysis/youtube.txt). Of course, what I write down doesn’t perfectly match what I do, so most of the absolute stats are vastly wrong. Comparative ones are still interesting.
 
 Here’s some results:
 
@@ -28,74 +28,62 @@ Here’s some results:
 
 I’ll leave you with this poor man’s graph of driving frequency over time. See the pandemic hit?
 
-    {'2018-01': 'x',
-     '2018-02': '',
-     '2018-03': 'x',
-     '2018-04': 'xxx',
-     '2018-05': '',
-     '2018-06': '',
-     '2018-07': 'x',
-     '2018-08': '',
-     '2018-09': '',
-     '2018-10': 'x',
-     '2018-11': 'xx',
-     '2018-12': 'xx',
-     '2019-01': 'x',
-     '2019-02': '',
-     '2019-03': 'xxxxxxx',
-     '2019-04': 'x',
-     '2019-05': '',
-     '2019-06': 'x',
-     '2019-07': 'x',
-     '2019-08': 'xx',
-     '2019-09': '',
-     '2019-10': 'xxxxx',
-     '2019-11': 'xxxxxxxxx',
-     '2019-12': 'xxxxxx',
-     '2020-01': 'xxxxxxxxx',
-     '2020-02': 'xxxxxxxxxxx',
-     '2020-03': 'xxxxxxx',
-     '2020-04': 'xxxxx',
-     '2020-05': 'xx',
-     '2020-06': '',
-     '2020-07': '',
-     '2020-08': '',
-     '2020-09': '',
-     '2020-10': 'x',
-     '2020-11': 'xxxxxx',
-     '2020-12': 'x',
-     '2021-01': 'xx',
-     '2021-02': 'xxx',
-     '2021-03': 'xxxxxxxxx',
-     '2021-04': '',
-     '2021-05': 'xxxxxxxx',
-     '2021-06': 'xxxxxxxxxxxxxxx',
-     '2021-07': 'xxxxxxxxxxxxxxxxx',
-     '2021-08': 'xxxxx',
-     '2021-09': 'xxxxxxx',
-     '2021-10': 'xxxx',
-     '2021-11': 'xxxxxx',
-     '2021-12': 'xxxxxxxx',
-     '2022-01': 'xxxxxxxxx',
-     '2022-02': 'xxxxxxxxxx',
-     '2022-03': 'xxxxxxxxxxxx',
-     '2022-04': 'xxxxxxxxxxxxxxxxxxxxxxx',
-     '2022-05': 'xxxxxxxxxxxxxxxxxxxxxxx',
-     '2022-06': 'xxxxxxxxxxxxxxxxx',
-     '2022-07': 'xxxxxxxxxxxxxxxxxxxxxxx',
-     '2022-08': 'xxxxxxxxxxxxxxxxxxxxxxx',
-     '2022-09': 'xxxxxxx'}
-
-[1]: https://blog.za3k.com/life-logging-in-2019/
-[2]: https://za3k.com/archive/timelog-analysis/drive.txt
-[3]: https://za3k.com/archive/timelog-analysis/drive.txt
-[4]: https://za3k.com/archive/timelog-analysis/drive.txt
-[5]: https://za3k.com/archive/timelog-analysis/floss.txt
-[6]: https://za3k.com/archive/timelog-analysis/food.txt
-[7]: https://za3k.com/archive/timelog-analysis/read.txt
-[8]: https://za3k.com/archive/timelog-analysis/sleep.txt
-[9]: https://za3k.com/archive/timelog-analysis/teeth.txt
-[10]: https://za3k.com/archive/timelog-analysis/tv.txt
-[11]: https://za3k.com/archive/timelog-analysis/wake.txt
-[12]: https://za3k.com/archive/timelog-analysis/walk.txt
-[13]: https://za3k.com/archive/timelog-analysis/youtube.txt
+```
+{'2018-01': 'x',
+ '2018-02': '',
+ '2018-03': 'x',
+ '2018-04': 'xxx',
+ '2018-05': '',
+ '2018-06': '',
+ '2018-07': 'x',
+ '2018-08': '',
+ '2018-09': '',
+ '2018-10': 'x',
+ '2018-11': 'xx',
+ '2018-12': 'xx',
+ '2019-01': 'x',
+ '2019-02': '',
+ '2019-03': 'xxxxxxx',
+ '2019-04': 'x',
+ '2019-05': '',
+ '2019-06': 'x',
+ '2019-07': 'x',
+ '2019-08': 'xx',
+ '2019-09': '',
+ '2019-10': 'xxxxx',
+ '2019-11': 'xxxxxxxxx',
+ '2019-12': 'xxxxxx',
+ '2020-01': 'xxxxxxxxx',
+ '2020-02': 'xxxxxxxxxxx',
+ '2020-03': 'xxxxxxx',
+ '2020-04': 'xxxxx',
+ '2020-05': 'xx',
+ '2020-06': '',
+ '2020-07': '',
+ '2020-08': '',
+ '2020-09': '',
+ '2020-10': 'x',
+ '2020-11': 'xxxxxx',
+ '2020-12': 'x',
+ '2021-01': 'xx',
+ '2021-02': 'xxx',
+ '2021-03': 'xxxxxxxxx',
+ '2021-04': '',
+ '2021-05': 'xxxxxxxx',
+ '2021-06': 'xxxxxxxxxxxxxxx',
+ '2021-07': 'xxxxxxxxxxxxxxxxx',
+ '2021-08': 'xxxxx',
+ '2021-09': 'xxxxxxx',
+ '2021-10': 'xxxx',
+ '2021-11': 'xxxxxx',
+ '2021-12': 'xxxxxxxx',
+ '2022-01': 'xxxxxxxxx',
+ '2022-02': 'xxxxxxxxxx',
+ '2022-03': 'xxxxxxxxxxxx',
+ '2022-04': 'xxxxxxxxxxxxxxxxxxxxxxx',
+ '2022-05': 'xxxxxxxxxxxxxxxxxxxxxxx',
+ '2022-06': 'xxxxxxxxxxxxxxxxx',
+ '2022-07': 'xxxxxxxxxxxxxxxxxxxxxxx',
+ '2022-08': 'xxxxxxxxxxxxxxxxxxxxxxx',
+ '2022-09': 'xxxxxxx'}
+```
index 0bf6d62f465a99e6f46ef5ce590427c556154700..3eb62cbe31d7c35a5a940ed6e80021f85db07a64 100644 (file)
@@ -16,22 +16,6 @@ updated: 2015-10-17 19:15:20-07:00
 wordpress_id: 279
 wordpress_slug: tiny-cute-vampire-bat
 ---
-[![vampire bat x16](https://blog.za3k.com/wp-content/uploads/2015/10/vampire-bat-x16.png)][1]
+[![vampire bat x16](https://blog.za3k.com/wp-content/uploads/2015/10/vampire-bat-x16.png)](https://blog.za3k.com/wp-content/uploads/2015/10/vampire-bat-x16.png)
 
-Made using [Piskell][2]
-
-1.  ![](https://secure.gravatar.com/avatar/aa5d8a139b96dc7b082a50ca2446deff?s=40&d=mm&r=g)[Tricia][3] says:
-    
-    [October 14, 2015 at 10:03 am][4]
-    
-    Hola! Just wanted to let you know I nominated you for the Versatile Blogger Award, for more info check out my post here: [http://sometimesicook.net/2015/10/14/the-versatile-blogger-award/][5] 😀
-    
-    [Reply][6]
-    
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/10/vampire-bat-x16.png
-[2]: http://www.piskelapp.com/
-[3]: http://sometimesicook.net
-[4]: https://blog.za3k.com/tiny-cute-vampire-bat/#comment-2426
-[5]: http://sometimesicook.net/2015/10/14/the-versatile-blogger-award/
-[6]: https://blog.za3k.com/tiny-cute-vampire-bat/?replytocom=2426#respond
+Made using [Piskell](http://www.piskelapp.com/)
index a6f931420ea2b37b396aad7c4082f69aa8f1899e..c4c0416d1572c500762ee682fe45f9ffb1fa6759 100644 (file)
@@ -14,12 +14,8 @@ updated: 2022-08-18 20:14:49-07:00
 wordpress_id: 789
 wordpress_slug: tty-audit-logs
 ---
-I recently wrote a program that records all tty activity. That means bash sessions, ssh, raw tty access, screen and tmux sessions, the lot. I used [script][1]. The latest version of my software can be found [on github][2].
+I recently wrote a program that records all tty activity. That means bash sessions, ssh, raw tty access, screen and tmux sessions, the lot. I used [script](https://en.wikipedia.org/wiki/Script_\(Unix\)). The latest version of my software can be found [on github](https://github.com/za3k/short-programs#record-shell).
 
 Note that it’s been tested only with bash so far, and there’s no encryption built in.
 
-To just record all shell commands typed, use the standard eternal history tricks ([bash][3]).
-
-[1]: https://en.wikipedia.org/wiki/Script_(Unix)
-[2]: https://github.com/za3k/short-programs#record-shell
-[3]: https://github.com/za3k/dotfiles/blob/master/.bashrc
+To just record all shell commands typed, use the standard eternal history tricks ([bash](https://github.com/za3k/dotfiles/blob/master/.bashrc)).
index ba8081c7120a156db403b843ba16300153fad5ce..dee4dc0d2e6670cd1dcbdc48f79f78aa9e85b2eb 100644 (file)
@@ -26,145 +26,32 @@ Let’s work a few examples and look at the format in close detail. For all thes
 I recommend checking out the linked resources below for a deeper conceptual overview if you want to learn more. That said, these are the only worked examples of gzip and/or DEFLATE of which I’m aware, so they’re a great companion to one another. In particular, you may want to learn what a prefix code is ahead of time.
 
 References:  
-\[1\] [RFC 1951][1], DEFLATE standard, by Peter Deutsch  
-\[2\] [RFC 1952][2], gzip standard, by Peter Deutsch  
-\[3\] [infgen][3], by Mark Adler (one of the zlib/gzip/DEFLATE authors), a tool for dis-assembling and printing a gzip or DEFLATE stream. I found this useful in figuring out the endian-ness of bitfields, and somewhat in understanding the dynamic huffman decoding process. Documentation is [here][4].  
-\[4\] [An explanation of the ‘deflate’ algorithm][5] by Antaeus Feldspar. A great conceptual overview of LZ77 and Huffman coding. **I recommend reading this *before* reading my DEFLATE explanation.**  
-\[5\] [LZ77][6] compression, Wikipedia.  
-\[6\] [Prefix-free codes][7] generally and [Huffman][8]‘s algorithm specifically  
-\[7\] After writing this, I learned about [puff.c][9], a reference (simple) implementation of a DEFLATE decompressor by Mark Adler.
+\[1\] [RFC 1951](https://www.rfc-editor.org/rfc/rfc1951.txt), DEFLATE standard, by Peter Deutsch  
+\[2\] [RFC 1952](https://www.rfc-editor.org/rfc/rfc1952.txt), gzip standard, by Peter Deutsch  
+\[3\] [infgen](https://github.com/madler/infgen), by Mark Adler (one of the zlib/gzip/DEFLATE authors), a tool for dis-assembling and printing a gzip or DEFLATE stream. I found this useful in figuring out the endian-ness of bitfields, and somewhat in understanding the dynamic huffman decoding process. Documentation is [here](https://github.com/madler/infgen/blob/master/infgen.c).  
+\[4\] [An explanation of the ‘deflate’ algorithm](https://zlib.net/feldspar.html) by Antaeus Feldspar. A great conceptual overview of LZ77 and Huffman coding. **I recommend reading this *before* reading my DEFLATE explanation.**  
+\[5\] [LZ77](https://en.wikipedia.org/wiki/LZ77_and_LZ78) compression, Wikipedia.  
+\[6\] [Prefix-free codes](https://en.wikipedia.org/wiki/Prefix_code) generally and [Huffman](https://en.wikipedia.org/wiki/Huffman_coding)‘s algorithm specifically  
+\[7\] After writing this, I learned about [puff.c](https://github.com/madler/zlib/blob/master/contrib/puff/puff.c), a reference (simple) implementation of a DEFLATE decompressor by Mark Adler.
 
 ## Gzip format: Basics and compressing a stream
 
 Let’s take a look at our first example. If you’re on Linux, feel free to run the examples I use as we go.
 
-    echo "hello hello hello hello" | gzip
+```
+echo "hello hello hello hello" | gzip
+```
 
 The bytes gzip outputs are below. You can use *xxd* or any other hex dump tool to view binary files. Notice that the original is 24 bytes, while the compressed version is 29 bytes–gzip is not really intended for data this short, so all of the examples in this article actually get bigger.
 
-Byte
-
-**0**
-
-**1**
-
-**2**
-
-**3**
-
-**4**
-
-**5**
-
-**6**
-
-**7**
-
-**8**
-
-**9**
-
-10
-
-11
-
-12
-
-13
-
-14
-
-15
-
-16
-
-17
-
-18
-
-19
-
-20
-
-**21**
-
-**22**
-
-**23**
-
-**24**
-
-**25**
-
-**26**
-
-**27**
-
-**28**
-
-Hex
-
-**1f**
-
-**8b**
-
-**08**
-
-**00**
-
-**00**
-
-**00**
-
-**00**
-
-**00**
-
-**00**
-
-**03**
-
-cb
-
-48
-
-cd
-
-c9
-
-c9
-
-57
-
-c8
-
-40
-
-27
-
-b9
-
-00
-
-**00**
-
-**88**
-
-**59**
-
-**0b**
-
-**18**
-
-**00**
-
-**00**
-
-**00**
+|     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| Byte | **0** | **1** | **2** | **3** | **4** | **5** | **6** | **7** | **8** | **9** | 10  | 11  | 12  | 13  | 14  | 15  | 16  | 17  | 18  | 19  | 20  | **21** | **22** | **23** | **24** | **25** | **26** | **27** | **28** |
+| Hex | **1f** | **8b** | **08** | **00** | **00** | **00** | **00** | **00** | **00** | **03** | cb  | 48  | cd  | c9  | c9  | 57  | c8  | 40  | 27  | b9  | 00  | **00** | **88** | **59** | **0b** | **18** | **00** | **00** | **00** |
 
 hello (1) – gzip contents
 
-The beginning and end in bold are the gzip header and footer. I learned the details of the format by reading [RFC 1952: gzip][10]
+The beginning and end in bold are the gzip header and footer. I learned the details of the format by reading [RFC 1952: gzip](https://www.rfc-editor.org/rfc/rfc1952.txt)
 
 -   Byte 0+1 (1f8b): Two fixed bytes that indicate “this is a gzip file”. These file-type indicators are also called “magic bytes”.
 -   Byte 2 (08): Indicates “the compression format is DEFLATE”. DEFLATE is the only format supported by gzip.
@@ -182,107 +69,18 @@ The beginning and end in bold are the gzip header and footer. I learned the deta
 -   Byte 21-24 (0088590b): CRC32 of the uncompressed data, “hello hello hello hello\\n”. I assume this is correct. It’s worth noting, there are multiple things called “CRC32”.
 -   Byte 25-28 (18000000): Size of the uncompressed data. This is little-endian byte order, 0x00000018 = 16\*1+1\*8 = 24. The uncompressed text is 24 bytes, so this is correct.
 
-Byte
-
-10
-
-11
-
-12
-
-13
-
-14
-
-15
-
-16
-
-17
-
-18
-
-19
-
-20
-
-Hex
-
-cb
-
-48
-
-cd
-
-c9
-
-c9
-
-57
-
-c8
-
-40
-
-27
-
-b9
-
-00
-
-Binary
-
-11001011
-
-01001000
-
-11001101
-
-11001001
-
-11001001
-
-01010111
-
-11001000
-
-01000000
-
-00100111
-
-10111001
-
-00000000
-
-R. Bin.
-
-11010011
-
-00010010
-
-10110011
-
-10010011
-
-10010011
-
-11101010
-
-00010011
-
-00000010
-
-11100100
-
-10011101
-
-00000000
+|     |     |     |     |     |     |     |     |     |     |     |     |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| Byte | 10  | 11  | 12  | 13  | 14  | 15  | 16  | 17  | 18  | 19  | 20  |
+| Hex | cb  | 48  | cd  | c9  | c9  | 57  | c8  | 40  | 27  | b9  | 00  |
+| Binary | 11001011 | 01001000 | 11001101 | 11001001 | 11001001 | 01010111 | 11001000 | 01000000 | 00100111 | 10111001 | 00000000 |
+| R. Bin. | 11010011 | 00010010 | 10110011 | 10010011 | 10010011 | 11101010 | 00010011 | 00000010 | 11100100 | 10011101 | 00000000 |
 
 hello (1) – DEFLATE contents
 
 ## DEFLATE format: Basics and fixed huffman coding
 
-DEFLATE is the actual compression format used inside gzip. The format is detailed in [RFC 1951: DEFLATE][11]. DEFLATE is a dense format which uses bits instead of bytes, so we need to take a look at the binary, not the hex, and things will not be byte-aligned. The endian-ness is a little confusing in gzip, so we’ll usually be looking at the “reversed binary” row.
+DEFLATE is the actual compression format used inside gzip. The format is detailed in [RFC 1951: DEFLATE](https://www.rfc-editor.org/rfc/rfc1951.txt). DEFLATE is a dense format which uses bits instead of bytes, so we need to take a look at the binary, not the hex, and things will not be byte-aligned. The endian-ness is a little confusing in gzip, so we’ll usually be looking at the “reversed binary” row.
 
 -   As a hint, whenever we read bits, we use the “reverse” binary order. For Huffman codes, we keep the bit order in reverse. For fixed-length fields like integers, we reverse again into “normal” binary order. I’ll call out the order for each field.
 -   Byte 10: **1** 1010011. Is it the last block? Yes.
@@ -296,130 +94,38 @@ DEFLATE is the actual compression format used inside gzip. The format is detaile
     -   11: Not allowed (error)
 -   So we’re using “fixed” huffman coding. That means there’s a static, fixed encoding scheme being used, defined by the DEFLATE standard. The scheme is given by the tables below. Note that Length/Distance codes are special–after you read one, you may read some extra bits according to the length/distance lookup tables.
 
-Binary
-
-Bits
-
-Extra bits
-
-Type
-
-Code
-
-00110000-10111111
-
-8
-
-0
-
-Literal byte
-
-0-143
-
-110010000-111111111
-
-9
-
-0
-
-Literal byte
-
-144-255
-
-0000000
-
-7
-
-0
-
-End of block
-
-256
-
-0000001-0010111
-
-7
-
-varies
-
-Length
-
-257-279
-
-11000000-11000111
-
-8
-
-varies
-
-Length
-
-280-285
+| Binary | Bits | Extra bits | Type | Code |
+| --- | --- | --- | --- | --- |
+| 00110000-10111111 | 8   | 0   | Literal byte | 0-143 |
+| 110010000-111111111 | 9   | 0   | Literal byte | 144-255 |
+| 0000000 | 7   | 0   | End of block | 256 |
+| 0000001-0010111 | 7   | varies | Length | 257-279 |
+| 11000000-11000111 | 8   | varies | Length | 280-285 |
 
 Literal/End of Block/Length Huffman codes
 
-Binary Code
-
-Bits
-
-Extra bits
-
-Type
-
-Value
-
-00000-111111
-
-5
-
-varies
-
-Distance
-
-0-31
+| Binary Code | Bits | Extra bits | Type | Value |
+| --- | --- | --- | --- | --- |
+| 00000-111111 | 5   | varies | Distance | 0-31 |
 
 Distance Huffman codes
 
-Code
-
-Binary
-
-Meaning
-
-Extra bits
-
-267
-
-0001011
-
-Length 15-16
-
-1
+| Code | Binary | Meaning | Extra bits |
+| --- | --- | --- | --- |
+| 267 | 0001011 | Length 15-16 | 1   |
 
 Length lookup (abridged)
 
-Code
-
-Binary
-
-Meaning
-
-Extra bits
-
-4
-
-00100
-
-Distance 5-6
-
-1
+| Code | Binary | Meaning | Extra bits |
+| --- | --- | --- | --- |
+| 4   | 00100 | Distance 5-6 | 1   |
 
 Distance lookup (abridged)
 
 -   Now we read a series of codes. Each code might be
     -   a literal (one binary byte), which is directly copied to the output
     -   “end of block”. either another block is read, or if this was the last block, DEFLATE stops.
-    -   a length-distance pair. first code is a length, then a distance is read. then some of the output is copied–this reduces the size of repetitive content. the compressor/decompressor can look up to 32KB backwards for duplicate content. This copying scheme is called [LZ77][12].
+    -   a length-distance pair. first code is a length, then a distance is read. then some of the output is copied–this reduces the size of repetitive content. the compressor/decompressor can look up to 32KB backwards for duplicate content. This copying scheme is called [LZ77](https://en.wikipedia.org/wiki/LZ77_and_LZ78).
 -   Huffman codes are a “prefix-free code” (confusingly also called a “prefix code”). What that means is that, even though the code words are different lengths from one another, you can always unambigously tell which binary *codeword* is next. For example, suppose the bits you’re reading starts with: 0101. Is the next binary codeword 0, 01, 010, or 0101? In a prefix-free code, only one of those is a valid codeword, so it’s easy to tell. You don’t need any special separator to tell you the codeword is over. The space savings from not having a separator is really important for good compression. The “huffman” codes used by DEFLATE are prefix-free codes, but they’re not really optimal Huffman codes–it’s a common misnomer.
 -   Byte 10-11: 110 **10011000** 10010: A literal. 10011000 (152) minus 00110000 (48) is 104. 104 in ASCII is ‘h’.
 -   Byte 11-12: 000 **10010101** 10011: A literal. 10010101 (149) minus 00110000 (48) is 101. 101 in ASCII is ‘e’.
@@ -443,126 +149,17 @@ Our final output is “hello hello hello hello\\n”, which is exactly what we e
 
 Let’s generate a second example using a file.
 
-    echo -en "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8\xf7\xf6\xf5\xf4\xf3\xf2\xf1" >test.bin
-    gzip test.bin
+```
+echo -en "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8\xf7\xf6\xf5\xf4\xf3\xf2\xf1" >test.bin
+gzip test.bin
+```
 
 This input file is pretty weird. In fact, it’s so weird that gzip compression will fail to reduce its size at all. We’ll take a look at what happens when compression fails in the next DEFLATE section below. But first, let’s see how gzip changes with a file instead of a stdin stream.
 
-Byte
-
-0
-
-1
-
-2
-
-3
-
-4
-
-5
-
-6
-
-7
-
-8
-
-9
-
-10
-
-11
-
-12
-
-13
-
-14
-
-15
-
-16
-
-17
-
-18
-
-19-38
-
-39
-
-40
-
-41
-
-42
-
-43
-
-44
-
-45
-
-46
-
-Hex
-
-1f
-
-8b
-
-08
-
-08
-
-9f
-
-08
-
-ea
-
-60
-
-00
-
-03
-
-74
-
-65
-
-73
-
-74
-
-2e
-
-62
-
-69
-
-6e
-
-00
-
-see below
-
-c6
-
-d3
-
-15
-
-7e
-
-0f
-
-00
-
-00
-
-00
+|     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| Byte | 0   | 1   | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   | 10  | 11  | 12  | 13  | 14  | 15  | 16  | 17  | 18  | 19-38 | 39  | 40  | 41  | 42  | 43  | 44  | 45  | 46  |
+| Hex | 1f  | 8b  | 08  | 08  | 9f  | 08  | ea  | 60  | 00  | 03  | 74  | 65  | 73  | 74  | 2e  | 62  | 69  | 6e  | 00  | see below | c6  | d3  | 15  | 7e  | 0f  | 00  | 00  | 00  |
 
 binary garbage (2) – abridged gzip contents
 
@@ -589,61 +186,12 @@ Okay, let’s take a look at how the header and footer changed.
 
 Uncompressed data is fairly rare in the wild from what I’ve seen, but for the sake of completeness we’ll cover it.
 
-Byte
-
-19
-
-20
-
-21
-
-22
-
-23
-
-24-38
-
-Hex
-
-01
-
-0f
-
-00
-
-f0
-
-ff
-
-ff fe fd fc fa f9 f8 f7 f6 f5 f4 f3 f2 f1
-
-Binary
-
-00000001
-
-00001111
-
-00000000
-
-11110000
-
-11111111
-
-omitted
-
-R. Binary
-
-10000000
-
-11110000
-
-00000000
-
-00001111
-
-11111111
-
-omitted
+|     |     |     |     |     |     |     |
+| --- | --- | --- | --- | --- | --- | --- |
+| Byte | 19  | 20  | 21  | 22  | 23  | 24-38 |
+| Hex | 01  | 0f  | 00  | f0  | ff  | ff fe fd fc fa f9 f8 f7 f6 f5 f4 f3 f2 f1 |
+| Binary | 00000001 | 00001111 | 00000000 | 11110000 | 11111111 | omitted |
+| R. Binary | 10000000 | 11110000 | 00000000 | 00001111 | 11111111 | omitted |
 
 binary garbage (2) – DEFLATE contents
 
@@ -664,7 +212,9 @@ binary garbage (2) – DEFLATE contents
 
 Dynamic huffman coding is by far the most complicated part of the DEFLATE and gzip specs. It also shows up a lot in practice, so we need to learn this too. Let’s take a look with a third and final example.
 
-    echo -n "abaabbbabaababbaababaaaabaaabbbbbaa" | gzip
+```
+echo -n "abaabbbabaababbaababaaaabaaabbbbbaa" | gzip
+```
 
 The bytes we get are:
 
@@ -674,197 +224,12 @@ The bytes we get are:
 
 We’ve already seen everything interesting in the gzip format, so we’ll skip the header and footer, and move straight to looking at DEFLATE this time.
 
-Byte
-
-10
-
-11
-
-12
-
-13
-
-14
-
-15
-
-16
-
-17
-
-18
-
-19
-
-20
-
-21
-
-22
-
-23
-
-24
-
-25
-
-26
-
-27
-
-28
-
-29
-
-30
-
-31
-
-32
-
-Hex
-
-1d
-
-c6
-
-49
-
-01
-
-00
-
-00
-
-10
-
-40
-
-c0
-
-ac
-
-a3
-
-7f
-
-88
-
-3d
-
-3c
-
-20
-
-2a
-
-97
-
-9d
-
-37
-
-5e
-
-1d
-
-0c
-
-Binary
-
-00011101
-
-11000110
-
-01001001
-
-00000001
-
-00000000
-
-00000000
-
-00010000
-
-01000000
-
-11000000
-
-10101100
-
-10100011
-
-01111111
-
-10001000
-
-00111101
-
-00111100
-
-00100000
-
-00101010
-
-10010111
-
-10011101
-
-00110111
-
-01011110
-
-00011101
-
-00001100
-
-R. Binary
-
-10111000
-
-01100011
-
-10010010
-
-10000000
-
-00000000
-
-00000000
-
-10000000
-
-00000010
-
-00000011
-
-00110101
-
-11000101
-
-11111110
-
-00010001
-
-10111100
-
-00111100
-
-00000100
-
-01010100
-
-11101001
-
-10111001
-
-11101100
-
-01111010
-
-10111000
-
-00110000
+|     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| Byte | 10  | 11  | 12  | 13  | 14  | 15  | 16  | 17  | 18  | 19  | 20  | 21  | 22  | 23  | 24  | 25  | 26  | 27  | 28  | 29  | 30  | 31  | 32  |
+| Hex | 1d  | c6  | 49  | 01  | 00  | 00  | 10  | 40  | c0  | ac  | a3  | 7f  | 88  | 3d  | 3c  | 20  | 2a  | 97  | 9d  | 37  | 5e  | 1d  | 0c  |
+| Binary | 00011101 | 11000110 | 01001001 | 00000001 | 00000000 | 00000000 | 00010000 | 01000000 | 11000000 | 10101100 | 10100011 | 01111111 | 10001000 | 00111101 | 00111100 | 00100000 | 00101010 | 10010111 | 10011101 | 00110111 | 01011110 | 00011101 | 00001100 |
+| R. Binary | 10111000 | 01100011 | 10010010 | 10000000 | 00000000 | 00000000 | 10000000 | 00000010 | 00000011 | 00110101 | 11000101 | 11111110 | 00010001 | 10111100 | 00111100 | 00000100 | 01010100 | 11101001 | 10111001 | 11101100 | 01111010 | 10111000 | 00110000 |
 
 abaa stream – DEFLATE contents
 
@@ -911,45 +276,13 @@ Finally, we need to make them correspond to symbols, so we actually store
 
 What’s a “code length”? It’s yet another hardcoded lookup table, which explains how to compress the dynamic huffman code tree itself. We’ll get to it in a second–the important thing about it for now is that there are 19 rows in the table. The binary column (not yet filled in) is what we’re about to decode.
 
-Binary
-
-Code
-
-What it means
-
-Extra bits
-
-?
-
-0-15
-
-Code length 0-15
-
-0
-
-?
-
-16
-
-Copy the previous code length 3-6 times
-
-2
-
-?
-
-17
-
-Copy “0” code length 3-10 times
-
-3
-
-?
-
-18
-
-Copy “0” code length 11-138 times
-
-7
+|     |     |     |     |
+| --- | --- | --- | --- |
+| Binary | Code | What it means | Extra bits |
+| ?   | 0-15 | Code length 0-15 | 0   |
+| ?   | 16  | Copy the previous code length 3-6 times | 2   |
+| ?   | 17  | Copy “0” code length 3-10 times | 3   |
+| ?   | 18  | Copy “0” code length 11-138 times | 7   |
 
 Code Lengths (static)
 
@@ -966,61 +299,14 @@ Code Lengths (static)
     1:1100,2:0,4:1101,16:1110,17:1111,18:10
 -   Finally, let’s take a look at the whole table again.
 
-Binary
-
-Code
-
-What it means
-
-Extra bits
-
-1100
-
-1
-
-Code length 1
-
-0
-
-0
-
-2
-
-Code length 2
-
-0
-
-1101
-
-4
-
-Code length 4
-
-0
-
-1110
-
-16
-
-Copy the previous code length 3-6 times
-
-2
-
-1111
-
-17
-
-Copy “0” code length 3-10 times
-
-3
-
-10
-
-18
-
-Copy “0” code length 11-138 times
-
-7
+| Binary | Code | What it means | Extra bits |
+| --- | --- | --- | --- |
+| 1100 | 1   | Code length 1 | 0   |
+| 0   | 2   | Code length 2 | 0   |
+| 1101 | 4   | Code length 4 | 0   |
+| 1110 | 16  | Copy the previous code length 3-6 times | 2   |
+| 1111 | 17  | Copy “0” code length 3-10 times | 3   |
+| 10  | 18  | Copy “0” code length 11-138 times | 7   |
 
 Code Lengths
 
@@ -1039,75 +325,14 @@ Code Lengths
 -   Byte 23-24: 101 **1110** **00** 0111100. Copy previous code 3-6 times. 0b00=0, plus 3 is 3. “Literals” 257-259 (all lengths) have codewords of length 4.
 -   We read 260 numbers, that’s the whole literal/end-of-block/length table. Assign the “standard” binary codewords based on the lengths to generate the following table:
 
-Literal Code
-
-Code Length
-
-Binary
-
-Meaning
-
-Extra bits
-
-97
-
-1
-
-0
-
-Literal ‘a’
-
-0
-
-98
-
-2
-
-10
-
-Literal ‘b’
-
-0
-
-256
-
-4
-
-1100
-
-End-of-block
-
-0
-
-257
-
-4
-
-1101
-
-Length 3
-
-0
-
-258
-
-4
-
-1110
-
-Length 4
-
-0
-
-259
-
-4
-
-1111
-
-Length 5
-
-0
+| Literal Code | Code Length | Binary | Meaning | Extra bits |
+| --- | --- | --- | --- | --- |
+| 97  | 1   | 0   | Literal ‘a’ | 0   |
+| 98  | 2   | 10  | Literal ‘b’ | 0   |
+| 256 | 4   | 1100 | End-of-block | 0   |
+| 257 | 4   | 1101 | Length 3 | 0   |
+| 258 | 4   | 1110 | Length 4 | 0   |
+| 259 | 4   | 1111 | Length 5 | 0   |
 
 abaa dynamic literal/end-of-block/length Huffman codes
 
@@ -1117,55 +342,12 @@ abaa dynamic literal/end-of-block/length Huffman codes
 -   Byte 25: 0 **0 0 0** 0100: Distances 4-6 have length 2.
 -   We read 7 numbers, that’s the whole distances table. Assign the “standard” binary codewords to generate the following table:
 
-Code
-
-Bits
-
-Binary
-
-Meaning
-
-Extra Bits
-
-0
-
-2
-
-00
-
-Distance 1
-
-0
-
-4
-
-2
-
-01
-
-Distance 5-6
-
-1
-
-5
-
-2
-
-10
-
-Distance 7-8
-
-1
-
-6
-
-2
-
-11
-
-Distance 9-12
-
-2
+| Code | Bits | Binary | Meaning | Extra Bits |
+| --- | --- | --- | --- | --- |
+| 0   | 2   | 00  | Distance 1 | 0   |
+| 4   | 2   | 01  | Distance 5-6 | 1   |
+| 5   | 2   | 10  | Distance 7-8 | 1   |
+| 6   | 2   | 11  | Distance 9-12 | 2   |
 
 abaa dynamic literal/end-of-block/length Huffman codes
 
@@ -1185,520 +367,3 @@ abaa dynamic literal/end-of-block/length Huffman codes
 -   Byte 32: **0 0** 110000: Literal ‘a’, ‘a’.
 -   Byte 32: 00 **1100** **00**: End-of block. Since this is the final block it’s also the end of the stream. This didn’t come up in the first example, but we zero-pad until the end of the byte when the block ends.
 -   The final output is a b a a b b b a baab abb aabab a a a abaaa b bbbb a a (spaces added for clarity), which is exactly what we expected.
-
-1.  ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-    
-    [July 23, 2021 at 1:47 pm][13]
-    
-    “Now we assign a binary codewords of length N, to each length N in the list.  
-    1:1100,2:0,4:1101,16:1110,17:1111,18:10”  
-    
-    There’s no explanation as to where you pulled these bits from, I understand the number of bits comes from the aforementioned 414442 pulled out prior to this but I’ve seen nothing that explains how you pulled out the bit values for each of these code words
-    
-    [Reply][14]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [July 23, 2021 at 2:04 pm][15]
-        
-        This is what “Aside: Storing Prefix-Free Codewords as a List of Lengths” is about. The algorithm is given in full in RFC 1952 if you’re interested. Basically, the code words are assigned starting from 0 (or 00, 000, etc) and counting up. As each code is assigned, anything with that code as a prefix becomes unavailable. They are assigned first from shortest to longest, and in the case of ties from leftmost in the list to rightmost in the list.
-        
-        So first we assign 0 to the length-1 codeword (0 is lower than 1), then we assign the length-2 codeword 10 (the lowest length-2 code that doesn’t have a prefix 0), and finally we assign the length-4 codewords from left to right (1100, 1101, 1110, 1111 don’t have a prefix of 0 or 10 — they are the lowest and only codewords without one of those prefixes).
-        
-        Thanks for the comment, it makes me happy to know anyone is reading this, and it’s very helpful to know what’s unclear in my writeup. I’d love to make it as good as possible.
-        
-        [Reply][16]
-        
-        -   ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-            
-            [July 23, 2021 at 3:23 pm][17]
-            
-            I think I get it now, as soon as I resolve some compile errors I’m gonna try this:
-            
-            “\`  
-            while ( cur\_leng < max\_leng )  
-            {  
-            for ( uint j = 0; j leng > cur\_leng )  
-            continue;  
-              
-              
-              
-            
-            word->code = code;
-            
-            code++;  
-            }  
-            
-            while ( !(code >> cur\_leng) )  
-            ++code;  
-            
-            ++cur\_leng;  
-            }  
-            “\`  
-              
-            
-            [Reply][18]
-            
-2.  ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-    
-    [July 25, 2021 at 12:06 pm][19]
-    
-    Took me a while to understand that I was supposed to be building the tree at this point (although this method compared to what I though of and implemented prior to this is inefficient both in space and speed, also terribly um-intuitive). I’m having trouble understanding exactly how to extract some literals you’ve mentioned:
-    
-    “Byte 18-19: 0000001 10 0110101. Copy “0” code length 11-138 times  
-    0b1010110=86, plus 11 is 97. Literals 0-96 are not present.  
-    Byte 20: 1100 0101: Literal 1. Literal 97 (‘a’) has a codeword of length 1.  
-    Byte 20: 1100 0 101: Literal 2. Number 98 (‘b’) has a codeword of length 2.”  
-      
-      
-    
-    At first I though to get the literals I was supposed to add the code list position to the copy count but then I saw this after:
-    
-    “Byte 20-21: 11000 10 1111111 10. Copy “0” code length 11-138 times. 0b1111111=127, plus 11 is 138. Literals 99-236 are not present.  
-    Byte 21-22: 111111 10 0001000 1. Copy “0” code length 11-138 times. 0b0001000=8, plus 11 is 19. Literals 237-255 are not present”
-    
-    Which doesn’t follow that pattern, how do you determine the literals range?
-    
-    [Reply][20]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [July 25, 2021 at 12:27 pm][21]
-        
-        I’m glad this was helpful, but you should really go read RFC 1951 if you’re going to build a decoder. This isn’t meant to be a stand-alone guide.
-        
-        I’m pretty lost trying to follow this comment, sorry. To clarify, for the “dynamic” compression, you first extract the CODING TABLE for the literals (the step you’re talking about). Then, you use the coding table to decompress the actual stream of content. It’s a two-step process, which is why it’s so complex.
-        
-        The key point I suspect you’re missed was: “Let’s read 267 numbers: the lengths of the codeword for each row.” These numbers are the length of the code for each literal in order (all of them, not just some of them). A length of 0 means “not present”.
-        
-        [Reply][22]
-        
-        -   ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-            
-            [July 25, 2021 at 1:41 pm][23]
-            
-            Was gonna say I already had the code table but when it printed it seems the codes got corrupted, I’ll have to get back to you after fixing it. Anyways I find “guides” that don’t use real examples as this one does to be confusing sometimes, usually where it matters, that’s why I was consulting you who provided those key examples, I got a heck of a lot further with your guide than any other I’ve tried following which didn’t give the byte by byte, bit by bit example.
-            
-            [Reply][24]
-            
-            -   ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-                
-                [July 25, 2021 at 1:50 pm][25]
-                
-                Turned out I was just printing the wrong value, here’s my current output:
-                
-                \`  
-                ./a.out aba.gz  
-                path = ‘aba.gz’  
-                PrintStreamDetails( 0x7ffd2cf70d80 ): ptr = 0x556653fbc480, pos = 0, num = 0, max = 328, fed = 0  
-                PrintBytes( 0x556653fbc480, 41, 16 )  
-                1F 8B 0 0 0 0 0 0 0 3 1D C6 49 1 0 0  
-                40 C0 AC A3 7F 88 3D 3C 20 2A 97 9D 37 5E 1D C  
-                29 34 94 23 0 0 0  
-                PrintStreamDetails( 0x7ffd2cf70d80 ): ptr = 0x556653fbc480, pos = 136, num = 80, max = 328, fed = 56  
-                gzip.magic = 1F8B, gzip.format = 0, gzip.flags = 0, gzip.mtime = 0, zlib.xflags = 0, zlib.system = 3  
-                gzip.flag\_TEXT = false, gzip.flag\_HCRC = false, gzip.flag\_MORE = false, gzip.flag\_NAME = false, gzip.flag\_NOTE = false, gzip.flag\_RESERVED = 0  
-                PrintStreamDetails( 0x7ffd2cf70d80 ): ptr = 0x556653fbc480, pos = 136, num = 80, max = 328, fed = 56  
-                last = true, type = 2  
-                lengc = 260, distc = 7, codec = 18, left = 60  
-                pos = 212, max = 328, count = 267  
-                left = 61, byte = 18, bit = 7  
-                Code Table:  
-                \_list\[ 0\]: from = 1, more = 0, leng = 4, copy = 0, code = 1100  
-                \_list\[ 1\]: from = 2, more = 0, leng = 1, copy = 0, code = 0  
-                \_list\[ 2\]: from = 4, more = 0, leng = 4, copy = 0, code = 1101  
-                \_list\[ 3\]: from = 16, more = 2, leng = 4, copy = 3, code = 1110  
-                \_list\[ 4\]: from = 17, more = 3, leng = 4, copy = 3, code = 1111  
-                \_list\[ 5\]: from = 18, more = 7, leng = 2, copy = 11, code = 10  
-                i = 0010 j = 5, from = 18, copy = 97  
-                Expecting character ‘a’  
-                Expecting character ‘b’  
-                i = 0010 j = 5, from = 18, copy = 138  
-                i = 0010 j = 5, from = 18, copy = 19  
-                Expecting character ”  
-                i = 1110 j = 3, from = 16, copy = 3  
-                Expecting character ”  
-                i = 1111 j = 4, from = 17, copy = 3  
-                Expecting character ”  
-                Expecting character ”  
-                Expecting character ”  
-                PrintBytes( 0x556653fbf4a0, 0, 16 )  
-                \`
-                
-                And here’s the currently unfixed loop producing the bottom part of the output (also where the interpretation ends atm)
-                
-                \`  
-                /\* Should be building a tree here. \*/  
-                while ( num < count && stream.num < stream.max )  
-                {  
-                CODEWORD \*word = NULL;  
-                uint j = 0;
-                
-                for ( cur\_leng = 1; cur\_leng <= max\_leng; ++cur\_leng )  
-                {  
-                i = RevBits( CopyStreamBits( &stream, cur\_leng, false ), cur\_leng );
-                
-                for ( j = 0; j leng == cur\_leng && word->code == i )  
-                {  
-                IncStreamCount( &stream, cur\_leng );  
-                break;  
-                }  
-                }
-                
-                if ( j max\_leng )  
-                {  
-                printf  
-                (  
-                “i = %u, j = %u, list.used = %u, cur\_leng = %u\\n”,  
-                i, j, list.used, cur\_leng  
-                );  
-                return Return( ret, EINVAL );  
-                }
-                
-                size = CopyStreamBits( &stream, word->more, true );
-                
-                if ( word->from >= 16 )  
-                {  
-                printf( “i = ” );  
-                SeeBits( &i, max\_leng );  
-                printf  
-                (  
-                ” j = %u, from = %2u, copy = %u\\n”,  
-                j, word->from, (uint)(size + word->copy)  
-                );  
-                num += min\_literal\_code = size + word->copy;  
-                }  
-                else  
-                {  
-                int c = (int)(min\_literal\_code + j);  
-                printf( “Expecting character ‘%c’\\n”, c );  
-                symbol = symbols + num;  
-                symbol->sym = (char)c;  
-                symbol->len = j;  
-                ++num;  
-                }  
-                }  
-                \`
-                
-                [Reply][26]
-                
-                -   ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-                    
-                    [July 25, 2021 at 3:32 pm][27]
-                    
-                    Never min, I think I know where the literals are coming from now, I did this:
-                    
-                    `    printf( "Expecting character '%c', ", c );   printf( "num as a character = '%c'\n", num );    `
-                    
-                    To see if num lined up, since it did I’m guessing those ranges where all the wasted leaves/branches of the huffman tree.
-                    
-3.  ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-    
-    [July 26, 2021 at 7:46 am][28]
-    
-    I think I still misunderstood something somewhere, I’ve done a detailed post on the section I think I’ve mis-interpreted here:
-    
-    [https://cboard.cprogramming.com/c-programming/180462-increment-gone-wrong.html#post1302477][29]
-    
-    The forum there is better able to handle pre-formatted code than this comment system so please take a look and tell me if you think I’ve mis-interpreted something also, and if so what you think is being mis-interpreted, in mean time I’m going to try and clean up my code so I can upload to gitlab so that you can a clearer idea of where I’m at and perhaps help me get to the last part, converting huffman codes to original values
-    
-    [Reply][30]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [July 26, 2021 at 8:54 am][31]
-        
-        Sorry, I don’t really want to help someone else debug code or output. I’d suggest following the links at the start of the blog article. Check out ‘infgen’ in particular.
-        
-        [Reply][32]
-        
-        -   ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-            
-            [July 26, 2021 at 9:34 am][33]
-            
-            I originally gave up on infgen due to an access rights error when I tried installing via the package manager, the server refused to let me download it, then after your last comment I though to look for it’s github page, that one worked out fine, judging by it’s output the only thing I’ve got wrong are the length values for the distance symbols/codes/whatever you want to call them, where do you get that 2 from? same applies to the bit code along side them, where does that come from, is it just an iterated number for each valid symbol?
-            
-            [Reply][34]
-            
-            -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-                
-                [July 26, 2021 at 10:56 am][35]
-                
-                You read 267=260+7 codeword-lengths (the numbers 260 and 7 are given by bytes 10-12 in this example).
-                
-                The first 260 codeword-lengths are used for one huffman table: 256 literals (always 256), then 1 “end of block” (always 2), then the remaining 3 are lengths.
-                
-                The next 7 codeword-lengths are used to generate a second huffman table, for distances. The code generation works exactly the same as for the first table.
-                
-                [Reply][36]
-                
-                -   ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-                    
-                    [July 26, 2021 at 11:50 am][37]
-                    
-                    Even if I use the same method of code generation as before I stiil would need to know where you got those “2”s from in the table immediately following this:
-                    
-                    “We read 7 numbers, that’s the whole distances table. Assign the “standard” binary codewords to generate the following table:”
-                    
-                    Because the previous method used that to determine what symbols to ignore until the code length increases, more specifically I had a “while ( cur\_leng < max\_leng )" loop and a sub loop that went looking for symbols expecting cur\_leng codes and assigning them that way before using those same codes in another sub loop to decide if the next code should be increased further. Without knowing where those code lengths for the distance came from I can't progress.
-                    
-                    Thinking about it now I don't even have the codes for the length symbols, I just have the symbols. If it was supposed to be auto generated then I could understand the codes for the length symbols but I then don't understand the codes for the distance codes as they don't follow the huffman principle of no codes that can be misinterpreted.
-                    
-                -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-                    
-                    [July 26, 2021 at 12:23 pm][38]
-                    
-                    Re-read above the table. The “bits” column is from bytes 24-25.
-                    
-4.  ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-    
-    [July 26, 2021 at 12:43 pm][39]
-    
-    No option to reply so I’ll do it here instead, I still don’t see where the 2 came from, is that a minimum length or from another hard code table? So far I can only see the bits given as a set/unset symbol & code flag, there’s no clear source for the length & extra bits values
-    
-    [Reply][40]
-    
-    -   ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-        
-        [July 26, 2021 at 5:54 pm][41]
-        
-        Finally found where you got the 2 from:
-        
-        [https://www.w3.org/Graphics/PNG/RFC-1951][42]
-        
-        ” HDIST + 1 code lengths for the distance alphabet,
-        
-        encoded using the code length Huffman code  
-        ”
-        
-        That was far too easily over looked, now I at least can generate the codes, though I think I will add a specialised handler and object to minimize code now that it’s getting more complicated than need be.
-        
-        [Reply][43]
-        
-5.  ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-    
-    [July 31, 2021 at 11:29 am][44]
-    
-    I’ve clearly misunderstood something somewhere, could you take a look at the code I outlined in the below post please and see if you can spot what I’m misunderstanding, up until the point I have to lookup previously deflated values I’ve read the bits correctly but I’ve obviously not understood all the implied information correctly, I would post the code here but as you’ve seen these comments don’t support maintaining the code formatting resulting in a more confusing than necessary code.
-    
-    [https://cboard.cprogramming.com/c-programming/180462-increment-gone-wrong-post1302541.html#post1302541][45]
-    
-    [Reply][46]
-    
-    -   ![](https://secure.gravatar.com/avatar/a82f569a804e9883d4fc220ed42386f9?s=40&d=mm&r=g)Lee says:
-        
-        [August 2, 2021 at 5:36 pm][47]
-        
-        You’ll be glad to know I finally got the algorithm right, have not looked at any source code from zlib or other projects so I’m free to slap MIT License on it the whole way through once I convert it to a cleaner version of itself. The unclean version is here for anyone’s reference.
-        
-        [https://gitlab.com/awsdert/uc-evidence/-/tree/9441a73e59834456c41c1049036fc60925b705a0][48]
-        
-        [Reply][49]
-        
-6.  ![](https://secure.gravatar.com/avatar/7872694d27b3b6fd8d71297a4799a82b?s=40&d=mm&r=g)neubert says:
-    
-    [December 21, 2021 at 1:00 am][50]
-    
-    From the Fixed huffman coding section:
-    
-    “Byte 10-11: 110 10011000 10010: A literal. 10011000 (152) minus 00110000 (48) is 104. 104 in ASCII is ‘h’.”
-    
-    Why are you subtracting 48?
-    
-    [Reply][51]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [December 21, 2021 at 1:11 am][52]
-        
-        The binary range (given above) is 00110000-10111111. Rather than decoding the binary value, we decode the offset within that range.
-        
-        [Reply][53]
-        
-7.  ![](https://secure.gravatar.com/avatar/7872694d27b3b6fd8d71297a4799a82b?s=40&d=mm&r=g)neubert says:
-    
-    [December 22, 2021 at 7:27 am][54]
-    
-    “Now we assign a binary codewords of length N, to each length N in the list.  
-    1:1100,2:0,4:1101,16:1110,17:1111,18:10”
-    
-    Could you elaborate on this? I thought I could get the same thing by using huffman encoding, using the code length as the frequency, but when I do that I get this:
-    
-    1:111,2:1100,4:00,16:10,17:01,18:1101
-    
-    Thanks!
-    
-    [Reply][55]
-    
-    -   ![](https://secure.gravatar.com/avatar/7872694d27b3b6fd8d71297a4799a82b?s=40&d=mm&r=g)neubert says:
-        
-        [December 22, 2021 at 10:49 pm][56]
-        
-        I figured it out. It’s this bit from RFC1951:
-        
-        `   1) Count the number of codes for each code length. Let   bl_count[N] be the number of codes of length N, N >= 1.`
-        
-        2) Find the numerical value of the smallest code for each  
-        code length:
-        
-        code = 0;  
-        bl\_count\[0\] = 0;  
-        for (bits = 1; bits <= MAX\_BITS; bits++) {  
-        code = (code + bl\_count\[bits-1\]) << 1;  
-        next\_code\[bits\] = code;  
-        }
-        
-        3) Assign numerical values to all codes, using consecutive  
-        values for all codes of the same length with the base  
-        values determined at step 2. Codes that are never used  
-        (which have a bit length of zero) must not be assigned a  
-        value.
-        
-        for (n = 0; n <= max\_code; n++) {  
-        len = tree\[n\].Len;  
-        if (len != 0) {  
-        tree\[n\].Code = next\_code\[len\];  
-        next\_code\[len\]++;  
-        }  
-        
-        [Reply][57]
-        
-8.  ![](https://secure.gravatar.com/avatar/7872694d27b3b6fd8d71297a4799a82b?s=40&d=mm&r=g)neubert says:
-    
-    [December 24, 2021 at 10:38 pm][58]
-    
-    ““Literals” 257-259 (all lengths) have codewords of length 4” Is this a hard and fast rule that’s always true regardless of the data or is this true \_just\_ for the compressed string in this example?
-    
-    [Reply][59]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [December 25, 2021 at 2:25 pm][60]
-        
-        Just for the example. If it was always true, we wouldn’t have to encode it.
-        
-        [Reply][61]
-        
-9.  ![](https://secure.gravatar.com/avatar/7872694d27b3b6fd8d71297a4799a82b?s=40&d=mm&r=g)neubert says:
-    
-    [December 27, 2021 at 12:54 am][62]
-    
-    “Byte 27: 1110 10 0 1. Length 4. Whenever we read a length, we read a distance. The distance is a range, 7-8. The extra bit we read is 0b0=0, plus 7 is Distance 7. So we look back 7 bytes and copy 4. The new output is: baabbbabaab”
-    
-    I think there should be an extra a before the baabbbabaab
-    
-    [Reply][63]
-    
-10.  ![](https://secure.gravatar.com/avatar/83113fa84f7bb884648d75b769d23a6c?s=40&d=mm&r=g)inco says:
-    
-    [June 22, 2022 at 1:56 pm][64]
-    
-    I’ve been reading quite a bit on DEFLATE in png files and I think this is the exact level of depth i needed to crack this whole mess. Thanks so much for writing this, sources like RFC1951 talk more about abstraction and general rules but to have a few examples lined out here its EXTREMELY useful. Thanks again
-    
-    [Reply][65]
-    
-    -   ![](https://secure.gravatar.com/avatar/83113fa84f7bb884648d75b769d23a6c?s=40&d=mm&r=g)inco says:
-        
-        [June 22, 2022 at 3:38 pm][66]
-        
-        Small question about reading bits: for Huffman codes of the code itself defines a length range and then the extra bits are reversed so that they can be interpreted. But should I reverse the distance or the distance extra bits as well?
-        
-        [Reply][67]
-        
-11.  ![](https://secure.gravatar.com/avatar/7b25d5e576e752e12d04d663247f0989?s=40&d=mm&r=g)Ricardo says:
-    
-    [May 31, 2024 at 4:32 am][68]
-    
-    Byte 31: 10 111000: Literal ‘b’  
-    Byte 31: 10 1110 00: Length 4, Distance 1. We look back 1 byte and copy 4. The new output is: bbbbb
-    
-    How can I understand the distance 1 and copy 4 symbols?  
-    Should I repeat the ‘b’ four times?
-    
-    What if the distance was 2 and copying 4 symbols?
-    
-    [Reply][69]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [May 31, 2024 at 5:23 pm][70]
-        
-        Distance is how far back you start. Copy is how many symbols you copy.  
-        You just blindly copy characters starting DISTANCE back, but since you’re appending to the string, you never run out of symbols to copy.
-        
-        If your string so far was “Wow, copying is really neat”, with distance 3 and copy 10 you would add: eateateate
-        
-        [Reply][71]
-        
-
-[1]: https://www.rfc-editor.org/rfc/rfc1951.txt
-[2]: https://www.rfc-editor.org/rfc/rfc1952.txt
-[3]: https://github.com/madler/infgen
-[4]: https://github.com/madler/infgen/blob/master/infgen.c
-[5]: https://zlib.net/feldspar.html
-[6]: https://en.wikipedia.org/wiki/LZ77_and_LZ78
-[7]: https://en.wikipedia.org/wiki/Prefix_code
-[8]: https://en.wikipedia.org/wiki/Huffman_coding
-[9]: https://github.com/madler/zlib/blob/master/contrib/puff/puff.c
-[10]: https://www.rfc-editor.org/rfc/rfc1952.txt
-[11]: https://www.rfc-editor.org/rfc/rfc1951.txt
-[12]: https://en.wikipedia.org/wiki/LZ77_and_LZ78
-[13]: https://blog.za3k.com/understanding-gzip-2/#comment-4739
-[14]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4739#respond
-[15]: https://blog.za3k.com/understanding-gzip-2/#comment-4740
-[16]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4740#respond
-[17]: https://blog.za3k.com/understanding-gzip-2/#comment-4741
-[18]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4741#respond
-[19]: https://blog.za3k.com/understanding-gzip-2/#comment-4742
-[20]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4742#respond
-[21]: https://blog.za3k.com/understanding-gzip-2/#comment-4743
-[22]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4743#respond
-[23]: https://blog.za3k.com/understanding-gzip-2/#comment-4744
-[24]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4744#respond
-[25]: https://blog.za3k.com/understanding-gzip-2/#comment-4745
-[26]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4745#respond
-[27]: https://blog.za3k.com/understanding-gzip-2/#comment-4747
-[28]: https://blog.za3k.com/understanding-gzip-2/#comment-4756
-[29]: https://cboard.cprogramming.com/c-programming/180462-increment-gone-wrong.html#post1302477
-[30]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4756#respond
-[31]: https://blog.za3k.com/understanding-gzip-2/#comment-4757
-[32]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4757#respond
-[33]: https://blog.za3k.com/understanding-gzip-2/#comment-4758
-[34]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4758#respond
-[35]: https://blog.za3k.com/understanding-gzip-2/#comment-4759
-[36]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4759#respond
-[37]: https://blog.za3k.com/understanding-gzip-2/#comment-4760
-[38]: https://blog.za3k.com/understanding-gzip-2/#comment-4762
-[39]: https://blog.za3k.com/understanding-gzip-2/#comment-4763
-[40]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4763#respond
-[41]: https://blog.za3k.com/understanding-gzip-2/#comment-4764
-[42]: https://www.w3.org/Graphics/PNG/RFC-1951
-[43]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4764#respond
-[44]: https://blog.za3k.com/understanding-gzip-2/#comment-4773
-[45]: https://cboard.cprogramming.com/c-programming/180462-increment-gone-wrong-post1302541.html#post1302541
-[46]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4773#respond
-[47]: https://blog.za3k.com/understanding-gzip-2/#comment-4786
-[48]: https://gitlab.com/awsdert/uc-evidence/-/tree/9441a73e59834456c41c1049036fc60925b705a0
-[49]: https://blog.za3k.com/understanding-gzip-2/?replytocom=4786#respond
-[50]: https://blog.za3k.com/understanding-gzip-2/#comment-5413
-[51]: https://blog.za3k.com/understanding-gzip-2/?replytocom=5413#respond
-[52]: https://blog.za3k.com/understanding-gzip-2/#comment-5414
-[53]: https://blog.za3k.com/understanding-gzip-2/?replytocom=5414#respond
-[54]: https://blog.za3k.com/understanding-gzip-2/#comment-5432
-[55]: https://blog.za3k.com/understanding-gzip-2/?replytocom=5432#respond
-[56]: https://blog.za3k.com/understanding-gzip-2/#comment-5435
-[57]: https://blog.za3k.com/understanding-gzip-2/?replytocom=5435#respond
-[58]: https://blog.za3k.com/understanding-gzip-2/#comment-5441
-[59]: https://blog.za3k.com/understanding-gzip-2/?replytocom=5441#respond
-[60]: https://blog.za3k.com/understanding-gzip-2/#comment-5444
-[61]: https://blog.za3k.com/understanding-gzip-2/?replytocom=5444#respond
-[62]: https://blog.za3k.com/understanding-gzip-2/#comment-5449
-[63]: https://blog.za3k.com/understanding-gzip-2/?replytocom=5449#respond
-[64]: https://blog.za3k.com/understanding-gzip-2/#comment-8298
-[65]: https://blog.za3k.com/understanding-gzip-2/?replytocom=8298#respond
-[66]: https://blog.za3k.com/understanding-gzip-2/#comment-8300
-[67]: https://blog.za3k.com/understanding-gzip-2/?replytocom=8300#respond
-[68]: https://blog.za3k.com/understanding-gzip-2/#comment-11528
-[69]: https://blog.za3k.com/understanding-gzip-2/?replytocom=11528#respond
-[70]: https://blog.za3k.com/understanding-gzip-2/#comment-11531
-[71]: https://blog.za3k.com/understanding-gzip-2/?replytocom=11531#respond
index 1e4297819ad98823cb5bf1484d0d451eab5e01dd..c58dd06148afab60c1144cf16fe42040ebef57b7 100644 (file)
@@ -14,38 +14,40 @@ wordpress_slug: url-handlers-in-linux
 ---
 When you click an email address, it automatically opens in your email client. But I don’t have an email client, I use webmail. I wrote a custom handler for Linux.  
   
-First write a program to open [mailto][1] links. Mailto links look like “**mailto:me@mail.com**” or maybe even “**mailto:me@mail.com?subject=mysubject&body=mybody**“. Test it by hand on a few links. Mine ([mailto-opener][2]) composes a new message using my webmail.
+First write a program to open [mailto](https://en.wikipedia.org/wiki/Mailto) links. Mailto links look like “**mailto:me@mail.com**” or maybe even “**mailto:me@mail.com?subject=mysubject&body=mybody**“. Test it by hand on a few links. Mine ([mailto-opener](https://github.com/za3k/short-programs?tab=readme-ov-file#mailto-opener)) composes a new message using my webmail.
 
 Next, write a desktop file for the opener. Here’s one:
 
-    #/usr/local/share/applications/mailto-opener.desktop 
-    [Desktop Entry]
-    Type=Application
-    Name=mailto: link opener (github.com/za3k/short-programs)
-    
-    # The executable of the application, possibly with arguments.
-    Exec=/home/zachary/.projects/short-programs/mailto-opener %u
+```
+#/usr/local/share/applications/mailto-opener.desktop 
+[Desktop Entry]
+Type=Application
+Name=mailto: link opener (github.com/za3k/short-programs)
+
+# The executable of the application, possibly with arguments.
+Exec=/home/zachary/.projects/short-programs/mailto-opener %u
+```
 
 Note the %u in the **Exec=** line. That’s required.
 
 Now update your system mimetype database. On my Arch Linux install, I run
 
-    xdg-mime default mailto-opener.desktop x-scheme-handler/mailto
+```
+xdg-mime default mailto-opener.desktop x-scheme-handler/mailto
+```
 
 Finally, restart your browser. Really. Firefox and Chromium/Chrome both cache mimetype openers.
 
 ---
 
-A related opener I added recently was for [magnet links][3], such as are popularly used for bittorrent.
+A related opener I added recently was for [magnet links](https://en.wikipedia.org/wiki/Magnet_URI_scheme), such as are popularly used for bittorrent.
 
-    ~ $ cat /usr/local/share/applications/transmission-remote.desktop 
-    [Desktop Entry]
-    Type=Application
-    Name=transmission-remote magnet link opener
-    Exec=transmission-remote <TRANSMISSION INSTANCE> -a
+```
+~ $ cat /usr/local/share/applications/transmission-remote.desktop 
+[Desktop Entry]
+Type=Application
+Name=transmission-remote magnet link opener
+Exec=transmission-remote <TRANSMISSION INSTANCE> -a
+```
 
 `transmission-remote` is the name of a command-line Linux program. It connects to an instance of Tranmission (a popular torrent client) running on another machine.
-
-[1]: https://en.wikipedia.org/wiki/Mailto
-[2]: https://github.com/za3k/short-programs?tab=readme-ov-file#mailto-opener
-[3]: https://en.wikipedia.org/wiki/Magnet_URI_scheme
index 8748f016549bc4df1881dbddea07ce2b62949853..5fd6964a6f94dcfe911a96b0f15bbc26501ae564 100644 (file)
@@ -15,8 +15,8 @@ updated: 2022-03-10 09:22:34-07:00
 wordpress_id: 726
 wordpress_slug: usb-flash-longevity-testing-year-2
 ---
-[Year 0][1] – I filled 10 32-GB Kingston flash drives with random data.  
-[Year 1][2] – Tested drive 1, zero bit rot. Re-wrote the drive with the same data.  
+[Year 0](https://www.reddit.com/r/DataHoarder/comments/e3nb2r/longterm_reliability_testing/) – I filled 10 32-GB Kingston flash drives with random data.  
+[Year 1](https://www.reddit.com/r/DataHoarder/comments/lwgsdr/research_flash_media_longevity_testing_1_year/) – Tested drive 1, zero bit rot. Re-wrote the drive with the same data.  
 Year 2 – Re-tested drive 1, zero bit rot. Tested drive 2, zero bit rot. Re-wrote both with the same data.
 
 They have been stored in a box on my shelf, with a 1-month period in a moving van (probably below freezing) this year.
@@ -34,10 +34,6 @@ FAQs:
 -   Q: Which flash type is this model?  
     A: We don’t know. If you do know, please tell me.
 -   Q: What data are you testing with?  
-    A: ([Repeatable][3]) randomly generated bits
+    A: ([Repeatable](https://github.com/za3k/short-programs#prng)) randomly generated bits
 -   Q: What filesystem are you using? / Doesn’t the filesystem do error correction?  
     A: I’m writing data directly to the drive using Linux’s block devices.
-
-[1]: https://www.reddit.com/r/DataHoarder/comments/e3nb2r/longterm_reliability_testing/
-[2]: https://www.reddit.com/r/DataHoarder/comments/lwgsdr/research_flash_media_longevity_testing_1_year/
-[3]: https://github.com/za3k/short-programs#prng
index d3c022a1ed4d22f4488493d0a66f8df674e255f6..23e403a9343b613fb0ea30d35e49f5abe8c94d47 100644 (file)
@@ -14,6 +14,4 @@ updated: 2020-05-17 12:53:27-07:00
 wordpress_id: 513
 wordpress_slug: when-is-rick-and-morty-out-season-4-episode-6
 ---
-I made a website to give you countdowns and let you know whether an episode is out: [http://isrickandmortyout.com/][1]. Been up since before season 4, but I forgot to post it until now.
-
-[1]: http://isrickandmortyout.com/
+I made a website to give you countdowns and let you know whether an episode is out: [http://isrickandmortyout.com/](http://isrickandmortyout.com/). Been up since before season 4, but I forgot to post it until now.
index ad93a1a57d651881041638bfb91f728d1bd4cf82..93fe08c4b81c1f6f2830ebe8993e21e31833b008 100644 (file)
@@ -32,8 +32,3 @@ I’m a little embarrassed at having done all this, since it was obvious as soon
 ![whiteboard 5](https://blog.za3k.com/wp-content/uploads/2015/04/whiteboard-5.jpg)
 
 and I never saw it again
-
-1.  Pingback: [Year in Review | Optimal Prime][1]
-    
-
-[1]: https://blog.za3k.com/year-in-review/
index b6c7feb44143af7526b4a9ed6d5e5d97e1304192..ac4c2ed5913d713c6bc1b8da3463f1cb690b3a4f 100644 (file)
@@ -14,10 +14,8 @@ updated: 2015-10-17 19:15:58-07:00
 wordpress_id: 282
 wordpress_slug: whoosh
 ---
-[![Action Potato](https://blog.za3k.com/wp-content/uploads/2015/10/action-potato-300x300.png)][1]
+[![Action Potato](https://blog.za3k.com/wp-content/uploads/2015/10/action-potato-300x300.png)](https://blog.za3k.com/wp-content/uploads/2015/10/action-potato.png)
 
 Action Potato
 
 It’s whooshing because it’s going as fast as a WEAK SPEEDBOAT.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/10/action-potato.png
index 04390aee843dc537eabd36828130dd557c3e9209..f15bf4f5b14ab4d0697c57f640edda2081122b09 100644 (file)
@@ -15,8 +15,6 @@ updated: 2015-10-10 18:32:20-07:00
 wordpress_id: 288
 wordpress_slug: whsh
 ---
-[![Space Action Potato 2 big](https://blog.za3k.com/wp-content/uploads/2015/10/Space-Action-Potato-2-big.gif)][1]
+[![Space Action Potato 2 big](https://blog.za3k.com/wp-content/uploads/2015/10/Space-Action-Potato-2-big.gif)](https://blog.za3k.com/wp-content/uploads/2015/10/Space-Action-Potato-2-big.gif)
 
 In space no one car hear “whoosh” sounds but action potato is so cool you still can mostly.
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/10/Space-Action-Potato-2-big.gif
index dfa86e015fa640fb493d65ae9eddb9d8fed14c24..8d81035e36299bfb71cf26bc9906280b7f014598 100644 (file)
@@ -14,20 +14,12 @@ updated: 2015-04-16 18:43:33-07:00
 wordpress_id: 153
 wordpress_slug: wip-dead-tree-publishing-2
 ---
-[Last post][1] I discussed the publishing website I’m working on.
+[Last post](https://blog.za3k.com/wip-dead-tree-publishing/ "WIP: Dead Tree Publishing") I discussed the publishing website I’m working on.
 
-Today I added credit card processing and address forms–it’s functionally complete and available at [https://publishing.za3k.com][2]
+Today I added credit card processing and address forms–it’s functionally complete and available at [https://publishing.za3k.com](https://publishing.za3k.com)
 
 Next up I have to clean the site up, because it looks like this:
 
-[![20150402](https://blog.za3k.com/wp-content/uploads/2015/04/20150402.jpg)][3]
+[![20150402](https://blog.za3k.com/wp-content/uploads/2015/04/20150402.jpg)](https://blog.za3k.com/wp-content/uploads/2015/04/20150402.jpg)
 
 I’ll also add HTTPS.
-
-1.  Pingback: [WIP: Dead Tree Publishing 3 | Optimal Prime][4]
-    
-
-[1]: https://blog.za3k.com/wip-dead-tree-publishing/ "WIP: Dead Tree Publishing"
-[2]: https://publishing.za3k.com
-[3]: https://blog.za3k.com/wp-content/uploads/2015/04/20150402.jpg
-[4]: https://blog.za3k.com/wip-dead-tree-publishing-3/
index 4319b436b06bd6cfb87c9f27b4cd652373fb3494..386a1ca71833e62bdc24a2521245135d6c82b9d6 100644 (file)
@@ -15,15 +15,12 @@ updated: 2015-04-16 18:58:51-07:00
 wordpress_id: 167
 wordpress_slug: wip-dead-tree-publishing-3
 ---
-Compared with [last update][1],  the Dead Tree Publishing website is looking nicer.
+Compared with [last update](https://blog.za3k.com/wip-dead-tree-publishing-2/ "WIP: Dead Tree Publishing 2"),  the Dead Tree Publishing website is looking nicer.
 
-[![Looking better](https://blog.za3k.com/wp-content/uploads/2015/04/2015-04-16-184416_1366x768-e1429235272387.jpg)][2]
+[![Looking better](https://blog.za3k.com/wp-content/uploads/2015/04/2015-04-16-184416_1366x768-e1429235272387.jpg)](https://blog.za3k.com/wp-content/uploads/2015/04/2015-04-16-184416_1366x768.jpg)
 
 Looking better
 
 It’s served over HTTPS now (not needed for security, but it puts people at ease and enabled Chrome’s autocomplete) and you can order multiple books at a time.
 
 Other than some more visual improvements, the main thing missing is proper detection of page size — my server doesn’t understand about page margins, so it things books are bigger than they really are.
-
-[1]: https://blog.za3k.com/wip-dead-tree-publishing-2/ "WIP: Dead Tree Publishing 2"
-[2]: https://blog.za3k.com/wp-content/uploads/2015/04/2015-04-16-184416_1366x768.jpg
index 19ddd0f3ec5773d2893ad44b7859ae7c2eaf781d..a87817fac3ba234996cece7600427dd8edd2a399 100644 (file)
@@ -16,7 +16,7 @@ wordpress_slug: wip-dead-tree-publishing-4
 ---
 I consider Dead Tree Publishing to be **G**ood **E**nough at this point. It’s launched.
 
-[![2015-04-30-180400_1366x768](https://blog.za3k.com/wp-content/uploads/2015/04/2015-04-30-180400_1366x768.jpg)][1]
+[![2015-04-30-180400_1366x768](https://blog.za3k.com/wp-content/uploads/2015/04/2015-04-30-180400_1366x768.jpg)](https://blog.za3k.com/wp-content/uploads/2015/04/2015-04-30-180400_1366x768.jpg)
 
 New site style, FAQ page
 
@@ -24,6 +24,7 @@ I’m going to add support for URLs instead of uploading PDFs, and fix some bugs
 
 Meanwhile, I’ve already received my first physical book I’m publishing through the site. I got this nice email from Eric Eve:
 
+```
 Dear Zachary,
 
 Thank you for your interest in my work. Yes, do please feel free to offer print copies of the TADS 3 Tour Guide (or any other of my TADS 3 documentation) along the lines you suggest. The only copyright right I’m interested in enforcing is my right to be identified as the author of the work, and I'm sure that's not as issue here.
@@ -31,28 +32,4 @@ Thank you for your interest in my work. Yes, do please feel free to offer print
 Best wishes,
 
 Eric
-
-1.  ![](https://secure.gravatar.com/avatar/2d89a1cc42432c9e73fc4c4c2c43237f?s=40&d=mm&r=g)TheTechRobo says:
-    
-    [April 23, 2022 at 5:46 pm][2]
-    
-    Out of curiosity, why did you stop the service?
-    
-    [Reply][3]
-    
-    -   ![](https://secure.gravatar.com/avatar/09485be3ee1e86da6e39412f5c1b2a48?s=40&d=mm&r=g)admin says:
-        
-        [April 24, 2022 at 9:39 am][4]
-        
-        This was launched in 2015, and you’re the first person to ask me about the the service since. That should give you an idea of the popularity. I’m very bad at marketing, to be fair, so it’s not totally clear that means the service was undesirable.
-        
-        So when I eventually ran into some problem with active maintenance (the site needed updating to keep working, or something of that kind), I just didn’t.
-        
-        [Reply][5]
-        
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/04/2015-04-30-180400_1366x768.jpg
-[2]: https://blog.za3k.com/wip-dead-tree-publishing-4/#comment-7928
-[3]: https://blog.za3k.com/wip-dead-tree-publishing-4/?replytocom=7928#respond
-[4]: https://blog.za3k.com/wip-dead-tree-publishing-4/#comment-7947
-[5]: https://blog.za3k.com/wip-dead-tree-publishing-4/?replytocom=7947#respond
+```
index 3746491cae786accc1df875d45eae079cfecbc2e..4d0dad8c392409026ae33f512535f48c35dfbd0d 100644 (file)
@@ -23,21 +23,14 @@ I use a “back end” publisher who does all the actual printing, and the one I
 
 First you upload a PDF:
 
-[![2](https://blog.za3k.com/wp-content/uploads/2015/03/2-300x90.jpg)][1]
+[![2](https://blog.za3k.com/wp-content/uploads/2015/03/2-300x90.jpg)](https://blog.za3k.com/wp-content/uploads/2015/03/1.jpg)
 
 Uploading a book
 
 Then I tell you what your ordering options are (hardcover, softcover, color), and what they cost. I’m also supposed to ask you your address to ship the book, and for you to pay for it,  but those aren’t done yet.
 
-[![1](https://blog.za3k.com/wp-content/uploads/2015/03/1-300x254.jpg)][2]
+[![1](https://blog.za3k.com/wp-content/uploads/2015/03/1-300x254.jpg)](https://blog.za3k.com/wp-content/uploads/2015/03/1.jpg)
 
 Book-buying options
 
 Hopefully in the next day or two I’ll have something up and running so people can order books, and then make it gradually nicer! I’m very excited about this website existing.
-
-1.  Pingback: [WIP: Dead Tree Publishing 2 | Optimal Prime][3]
-    
-
-[1]: https://blog.za3k.com/wp-content/uploads/2015/03/1.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2015/03/1.jpg
-[3]: https://blog.za3k.com/wip-dead-tree-publishing-2/
index 8c6e9d1db3777b007dc37acae1649a51f0e0c8ab..f448a1aa96e9c18edd9e4b07051bfb94b5c51fa9 100644 (file)
@@ -18,38 +18,52 @@ updated: 2015-04-13 17:51:06-07:00
 wordpress_id: 158
 wordpress_slug: xp-boot-usb-stick
 ---
-Most of the following taken from : [http://www.msfn.org/board/topic/151992-install-xp-from-usb-without-extra-tools/][1], just modified to include syslinux support.
+Most of the following taken from : [http://www.msfn.org/board/topic/151992-install-xp-from-usb-without-extra-tools/](http://www.msfn.org/board/topic/151992-install-xp-from-usb-without-extra-tools/), just modified to include syslinux support.
 
 Let me know if there are any omissions; it an XP installer bluescreens on boot for me so I can’t actually test.
 
 1.  Obtain an XP iso file
 2.  Format drive with one FAT parition, marked bootable.
-3.  syslinux -i /dev/sdXX
+3.  ```
+    syslinux -i /dev/sdXX
+    ```
     
-4.  $ cp /usr/lib/syslinux/bios/mbr.bin >/dev/sdX
+4.  ```
+    $ cp /usr/lib/syslinux/bios/mbr.bin >/dev/sdX
+    ```
     
-5.  $ mount /dev/sdXX /mnt
+5.  ```
+    $ mount /dev/sdXX /mnt
+    ```
     
-6.  mkdir /tmp/xp\_iso
-    mount xp.iso /tmp/xp\_iso
-    cp -ar /tmp/xp\_iso/\* /mnt
-    umount /tmp/xp\_iso
-    rmdir xp\_iso
+6.  ```
+    mkdir /tmp/xp_iso
+    mount xp.iso /tmp/xp_iso
+    cp -ar /tmp/xp_iso/* /mnt
+    umount /tmp/xp_iso
+    rmdir xp_iso
+    ```
     
-7.  cp /usr/lib/syslinux/bios/{chain.c32,libutil.c32,menu.c32,libcom.c32} /mnt
+7.  ```
+    cp /usr/lib/syslinux/bios/{chain.c32,libutil.c32,menu.c32,libcom.c32} /mnt
+    ```
     
-8.  cp /mnt/I386/{NTDETECT.COM,SETUPLDR.BIN,TXTSETUP.SIF} /mnt
+8.  ```
+    cp /mnt/I386/{NTDETECT.COM,SETUPLDR.BIN,TXTSETUP.SIF} /mnt
+    ```
     
 9.  Edit /mnt/syslinux.cfg:
     
+    ```
     UI menu.c32# Windows XP
-    LABEL windows\_xp
+    LABEL windows_xp
     MENU LABEL Run Windows ^XP Setup
     COM32 chain.c32
     APPEND fs ntldr=SETUPLDR.BIN
+    ```
     
-10.  umount /mnt
+10.  ```
+    umount /mnt
+    ```
     
 11.  Boot from the USB stick
-
-[1]: http://www.msfn.org/board/topic/151992-install-xp-from-usb-without-extra-tools/
index a5f236a602c1aa094795708c17d8fa3e3f0b7be7..5760a725b7df8bf201f8249e7a687ec623a84843 100644 (file)
@@ -15,16 +15,16 @@ wordpress_slug: year-in-review
 ---
 Sep, Oct, Nov 2014: Vietnam.
 
-A year ago, I left my job at Streak and moved to Vietnam. I felt like I needed change. Vietnam ended up being wonderful; I was really glad I travelled with my friends [Richard][1] and [Kathy][2], which ended up making the experience a hundred times better than it would have been otherwise. The basic environment was: everything is cheap, I newly have endless free time, I was automatically prompted by my friends in the evenings and sometimes during the day to go on small novel adventures involving physical activity, and I had little internet access. This is probably my perfect environment, and I was functioning very well (the vietnamese diet also has small, well-balanced meals which might have helped). For some reason, I was also able to intensely single-task. \[I’d like to write more about what Vietnam is like, but this article is quite long enough as it is\]
+A year ago, I left my job at Streak and moved to Vietnam. I felt like I needed change. Vietnam ended up being wonderful; I was really glad I travelled with my friends [Richard](http://www.jollybit.com/) and [Kathy](http://thedragonseyelashes.tumblr.com/), which ended up making the experience a hundred times better than it would have been otherwise. The basic environment was: everything is cheap, I newly have endless free time, I was automatically prompted by my friends in the evenings and sometimes during the day to go on small novel adventures involving physical activity, and I had little internet access. This is probably my perfect environment, and I was functioning very well (the vietnamese diet also has small, well-balanced meals which might have helped). For some reason, I was also able to intensely single-task. \[I’d like to write more about what Vietnam is like, but this article is quite long enough as it is\]
 
 While I was in Vietnam, I made a to-do list. The to-do list had all the burning projects I actually wanted to do. I’ve ended up accomplishing most of them, at a rate of one every week or two, and it’s a decent summary of what I’ve been doing since. Two things made the to-do list a success. First, it had BIG tasks. These are projects like my recent “set up an IRC server” or “start a publishing company”. Because of that, I don’t get bogged down in minutae, and the tasks are always motivating. I find I function better when I try to carefully plan around having any logistics. The second reason, which I realized today, is that I was very careful to only include tasks I was planning to do (subtly different than tasks I wanted to do). The list was descriptive, not normative, although it certainly included some things like doing taxes I wasn’t wild about.
 
 Looking at my journal and it really only starts up again in March, so I’m going to organize this post in terms of the to-do list. There are a couple items that don’t fit:
 
--   I started dating my wonderful pet, [Lealend][3], while I was in Vietnam. I went to visit them for a month in Puerto Rico where they live. This is very very important to me (the most important thing that happened in the last year), but I don’t usually write about things that personal on my blog so I’m not doing to say much. I’ve been emotionally maturing a lot by being with them.
--   Conventions. I went to [DEF CON][4], which was probably the best single week this year so far. I’m definitely going again next year. I attended a [mirix][5] \[paper\] in the South Bay, which ended up being stressful for transportation-related reasons but really good while I was there. I’m planning on going to [Burning Man][6] this year as well.
--   I started contracting, that’s how I’ve been alive for a year. I’ve been doing some work for [Zinc][7] and [Paul Christiano][8] on a [workflowy clone][9], mostly. I work two hours a day average.
--   I’ve been developing a [minecraft modpack][10] \[I’ll write more about this when it’s stable\], and recently taken an interest in livestreaming.
+-   I started dating my wonderful pet, [Lealend](http://sick-ghost.tumblr.com/), while I was in Vietnam. I went to visit them for a month in Puerto Rico where they live. This is very very important to me (the most important thing that happened in the last year), but I don’t usually write about things that personal on my blog so I’m not doing to say much. I’ve been emotionally maturing a lot by being with them.
+-   Conventions. I went to [DEF CON](https://www.defcon.org/), which was probably the best single week this year so far. I’m definitely going again next year. I attended a [mirix](https://intelligence.org/mirix/) \[paper\] in the South Bay, which ended up being stressful for transportation-related reasons but really good while I was there. I’m planning on going to [Burning Man](http://burningman.org/) this year as well.
+-   I started contracting, that’s how I’ve been alive for a year. I’ve been doing some work for [Zinc](http://priceyak.com/) and [Paul Christiano](http://paulfchristiano.com/) on a [workflowy clone](https://github.com/WuTheFWasThat/vimflowy), mostly. I work two hours a day average.
+-   I’ve been developing a [minecraft modpack](http://za3k.com/colony.md) \[I’ll write more about this when it’s stable\], and recently taken an interest in livestreaming.
 
 Now on to the to-do list.
 
@@ -35,7 +35,7 @@ Now on to the to-do list.
     
 -   Project: Set up my phone so dropping/losing it isn’t horrible  
     Success: Partial success  
-    Description: I wanted to root and then [automatically backup][11] my phone. I did figure out how to do as much backing up as I can, and it is automatic. Unfortunately it turns out most of the filesystem (including SMS) just isn’t available over [Media Transfer Protocol][12] which android uses to display files, so I had to special case the things I desperately needed backed up. I’d prefer the state of the world let me back up everything on the phone, but that’s as much work as I’m willing to do.
+    Description: I wanted to root and then [automatically backup](https://blog.za3k.com/backup-android-on-plugin/ "Backup android on plugin") my phone. I did figure out how to do as much backing up as I can, and it is automatic. Unfortunately it turns out most of the filesystem (including SMS) just isn’t available over [Media Transfer Protocol](https://en.wikipedia.org/wiki/Media_Transfer_Protocol) which android uses to display files, so I had to special case the things I desperately needed backed up. I’d prefer the state of the world let me back up everything on the phone, but that’s as much work as I’m willing to do.
     
 -   Project: Get digital copies of all books I own  
     Success: Success  
@@ -43,11 +43,11 @@ Now on to the to-do list.
     
 -   Project: Switch to private email  
     Success: Not done  
-    Description: I get a little nervous entrusting Google (or any third party) with the ability to read, lose, or add restrictions on what I can do with my email. I want to set up my own email address ([za3k@za3k.com][13]) and have it be my main point of contact. My email does work, but I can’t send outgoing email, and I haven’t switched everything over to it for that reason.
+    Description: I get a little nervous entrusting Google (or any third party) with the ability to read, lose, or add restrictions on what I can do with my email. I want to set up my own email address ([za3k@za3k.com](mailto:za3k@za3k.com)) and have it be my main point of contact. My email does work, but I can’t send outgoing email, and I haven’t switched everything over to it for that reason.
     
 -   Project: Download ArXiV  
     Success: Done  
-    Description: As an [archive nut][14], I worry that the [ArXiV][15] collection, one of the nicer collections of scientific papers I access regularly, might someday go down or get censored. I downloaded a copy and stashed it away somewhere. Unfortunately ArXiV’s licenses they get papers under doesn’t permit redistribution, so I can’t publicly host it. (This was really cool but I had to decide whether I was going to publicly mention, since it’s a legal gray area)  
+    Description: As an [archive nut](https://blog.za3k.com/tag/backup/), I worry that the [ArXiV](http://arxiv.org/) collection, one of the nicer collections of scientific papers I access regularly, might someday go down or get censored. I downloaded a copy and stashed it away somewhere. Unfortunately ArXiV’s licenses they get papers under doesn’t permit redistribution, so I can’t publicly host it. (This was really cool but I had to decide whether I was going to publicly mention, since it’s a legal gray area)  
     Future plans: Someone (not me) should host a torrent. Contact me and I can get you a copy.
     
 -   Project: Pack and unpack storage bins (trip to vietnam)  
@@ -55,7 +55,7 @@ Now on to the to-do list.
     Description: Okay I know this sounds stupid, but I spent about a month packing up to go to Vietnam, and all my physical stuff has stayed organized ever since. That’s a really big change for me.
     
 -   Project: Host an IRC server  
-    Success: [Success][16]
+    Success: [Success](https://blog.za3k.com/irc/ "IRC")
     
 -   Project: Make hibernate work on my laptop  
     Success: Success  
@@ -71,7 +71,7 @@ Now on to the to-do list.
     
 -   Project: N-grams  
     Success: Obsolete  
-    Description: The [Google N-grams dataset][17] from their book scanning project is freely available, but in a terrible format (split across set-size file chunks, but in random rather than sorted order). My plan was to convert the formatting and offer it as a torrent / s3 bucket. Google has corrected the problem in a revised version of the dataset.
+    Description: The [Google N-grams dataset](http://storage.googleapis.com/books/ngrams/books/datasetsv2.html) from their book scanning project is freely available, but in a terrible format (split across set-size file chunks, but in random rather than sorted order). My plan was to convert the formatting and offer it as a torrent / s3 bucket. Google has corrected the problem in a revised version of the dataset.
     
 -   Project: NNTP over tor  
     Success: Didn’t do  
@@ -89,13 +89,13 @@ Now on to the to-do list.
     
 -   \[Censored project involving an arbitrage opportunity I haven’t cornered\]
 -   Project: Back up email  
-    Success: [Success][18]
+    Success: [Success](https://blog.za3k.com/archiving-gmail/ "Archiving gmail")
 -   Project: Flatten backups  
     Success: Good enough  
-    Description: Oh just go read the [XKCD][19]. Now imagine you’ve been archiving computers onto other computers for 15 years, and buy cheap laptops.
+    Description: Oh just go read the [XKCD](https://xkcd.com/1360/). Now imagine you’ve been archiving computers onto other computers for 15 years, and buy cheap laptops.
     
 -   Project: QR codes for ebooks  
-    Success: [Success][20]
+    Success: [Success](https://blog.za3k.com/the-double-lives-of-books/ "The Double Lives of Books")
 -   Project: Business cards  
     Success: Not done  
     Description: Make some personal business cards
@@ -113,10 +113,10 @@ Now on to the to-do list.
     Description: I want to make a desk out of cardboard, because it sounds fun. I’m proud of doing the design right here. I’ve finished mocking it out of cardstock, and actually noticed a lot of flaws and fixed the design instead of hoping them away. Now I mostly have to get the cardboard and make it, should be fun.
     
 -   Project: Make a whiteboard partition  
-    Success: [Success][21]
+    Success: [Success](https://blog.za3k.com/whiteboard-partition/ "Whiteboard Partition")
     
 -   Project: Write about paper backups  
-    Success: [Success][22]
+    Success: [Success](https://blog.za3k.com/paper-archival/ "Paper archival")
     
 -   Project: Sort physical scans  
     Success: Success  
@@ -128,11 +128,11 @@ Now on to the to-do list.
     
 -   Project: Treemap finances  
     Success: Not done  
-    Description: I’ve made my [finances public][23], but my analysis tools aren’t great. I’d like to update some old work I’ve done and add a web interface to see where I spent money during a particular time span, using a [treemap][24] display.
+    Description: I’ve made my [finances public](http://za3k.com/money.html), but my analysis tools aren’t great. I’d like to update some old work I’ve done and add a web interface to see where I spent money during a particular time span, using a [treemap](https://en.wikipedia.org/wiki/Treemapping) display.
     
 -   Project: Archive Github (aka download all the code in the world)  
     Success: Not done, on hold  
-    Description: I’m kind of burnt out on archiving tasks lately, so this doesn’t sound fun to me. I decided to work with [archive team][25] on this one. It’ll get done if it sounds low-stress and no one else seems to be doing it, but it’s less likely than the older archiving projects, despite being important for the world.
+    Description: I’m kind of burnt out on archiving tasks lately, so this doesn’t sound fun to me. I decided to work with [archive team](http://archiveteam.org/index.php?title=Main_Page) on this one. It’ll get done if it sounds low-stress and no one else seems to be doing it, but it’s less likely than the older archiving projects, despite being important for the world.
     
 -   Project: Encrypt backup  
     Success: Not done  
@@ -140,32 +140,4 @@ Now on to the to-do list.
     
 -   Project: Gwernify  
     Success: Not done  
-    Description: Gwern writes about how to [protect links][26] against link rot. He does this for all links on his website. I ambitiously plan to automatically save a copy of every site I visit (not just the actual URL I visit ideally, but the whole page).
-    
-
-[1]: http://www.jollybit.com/
-[2]: http://thedragonseyelashes.tumblr.com/
-[3]: http://sick-ghost.tumblr.com/
-[4]: https://www.defcon.org/
-[5]: https://intelligence.org/mirix/
-[6]: http://burningman.org/
-[7]: http://priceyak.com/
-[8]: http://paulfchristiano.com/
-[9]: https://github.com/WuTheFWasThat/vimflowy
-[10]: http://za3k.com/colony.md
-[11]: https://blog.za3k.com/backup-android-on-plugin/ "Backup android on plugin"
-[12]: https://en.wikipedia.org/wiki/Media_Transfer_Protocol
-[13]: mailto:za3k@za3k.com
-[14]: https://blog.za3k.com/tag/backup/
-[15]: http://arxiv.org/
-[16]: https://blog.za3k.com/irc/ "IRC"
-[17]: http://storage.googleapis.com/books/ngrams/books/datasetsv2.html
-[18]: https://blog.za3k.com/archiving-gmail/ "Archiving gmail"
-[19]: https://xkcd.com/1360/
-[20]: https://blog.za3k.com/the-double-lives-of-books/ "The Double Lives of Books"
-[21]: https://blog.za3k.com/whiteboard-partition/ "Whiteboard Partition"
-[22]: https://blog.za3k.com/paper-archival/ "Paper archival"
-[23]: http://za3k.com/money.html
-[24]: https://en.wikipedia.org/wiki/Treemapping
-[25]: http://archiveteam.org/index.php?title=Main_Page
-[26]: http://www.gwern.net/Archiving%20URLs
+    Description: Gwern writes about how to [protect links](http://www.gwern.net/Archiving%20URLs) against link rot. He does this for all links on his website. I ambitiously plan to automatically save a copy of every site I visit (not just the actual URL I visit ideally, but the whole page).
index 832f5b51f45212b2a5c34ffc97881f2e4460a77b..7ad2d53edb0d0d9b3bfcc06d9d26b4340e77247c 100644 (file)
@@ -15,13 +15,10 @@ updated: 2022-07-08 12:02:57-07:00
 wordpress_id: 745
 wordpress_slug: youtube-autodl
 ---
-I just wrote the first pass at [youtube-autodl][1], a tool for automatically downloading youtube videos. It’s inspired by Popcorn Time, a similar program I never ended up using, for automatically pirating the latest video from a TV series coming out.
+I just wrote the first pass at [youtube-autodl](https://github.com/za3k/youtube-autodl), a tool for automatically downloading youtube videos. It’s inspired by Popcorn Time, a similar program I never ended up using, for automatically pirating the latest video from a TV series coming out.
 
 You explain what you want to download, where you want to download it to, and how to name videoes. youtube-autodl takes care of the rest, including de-duplication and downloading things ones.
 
-The easiest way to understand it is to take a look at the example [config file][2], which is my actual config file.
+The easiest way to understand it is to take a look at the example [config file](https://github.com/za3k/youtube-autodl/blob/master/config.yaml), which is my actual config file.
 
 Personally, I find youtube is pushing “watch this related” video and main-page feeds more and more, to the point where they actually succeed with me. I don’t want to accidentally waste time, so I wanted a way to avoid visiting youtube.com. This is my solution.
-
-[1]: https://github.com/za3k/youtube-autodl
-[2]: https://github.com/za3k/youtube-autodl/blob/master/config.yaml
index 1b481c4f6a4a6a288354156d88961aec2e8aabef..3ac7fc985afa2487a0990c522f314443a9c79df6 100644 (file)
@@ -25,7 +25,7 @@ Or how to attach headers to the inside of an existing keyboard, which looks like
 
 ![Mapping the Innards of a Keyboard : 7 Steps (with Pictures) - Instructables](https://content.instructables.com/FOM/VMTN/HZN0VZGV/FOMVMTNHZN0VZGV.jpg?auto=webp&frame=1&width=2100)
 
-But I found a project called [GOLEM][1] with an excellent guide to making your own keyboard. Here is their wiring:
+But I found a project called [GOLEM](https://golem.hu/guide/keyboard-build-logs/) with an excellent guide to making your own keyboard. Here is their wiring:
 
 ![](https://blog.za3k.com/wp-content/uploads/2024/05/image.png)
 
@@ -35,31 +35,22 @@ I can do that! They got me out of a major rut.
 
 ---
 
-[Their advice][2] walks you through how to do a small keyboard in a cardboard plate. I did a few keys, gauged the effort, and decided to use my 3D printer. Cutting out 50-60 keys precisely by hand doesn’t sound easy. Worse, if you mess up, you have to start over. In plastic, I can’t mess up halfway, and the spacers to support the keyboard can be part of the print.
+[Their advice](https://golem.hu/guide/first-macropad) walks you through how to do a small keyboard in a cardboard plate. I did a few keys, gauged the effort, and decided to use my 3D printer. Cutting out 50-60 keys precisely by hand doesn’t sound easy. Worse, if you mess up, you have to start over. In plastic, I can’t mess up halfway, and the spacers to support the keyboard can be part of the print.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/2024-05-20-233106_2560x1440_scrot-1024x576.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/2024-05-20-233106_2560x1440_scrot-1024x576.png)](https://blog.za3k.com/wp-content/uploads/2024/05/2024-05-20-233106_2560x1440_scrot.png)
 
 Above, I’m designing a “sampler” keyboard in CAD (OpenSCAD). I want to iron out problems in my process before I try a full-size keyboard. Below, Prusa-Slic3r is slicing the finished model for my 3D printer to print.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/2024-05-20-235849_1920x1080_scrot-1024x576.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/2024-05-20-235849_1920x1080_scrot-1024x576.png)](https://blog.za3k.com/wp-content/uploads/2024/05/2024-05-20-235849_1920x1080_scrot.png)
 
 Here’s the finished sampler keyboard:
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/tiny_keyboard2-1-1024x747.jpg)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/tiny_keyboard2-1-1024x747.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/tiny_keyboard2-1.jpg)
 
 Currently I’m waiting on keycaps and switches ordered from China, and then I’ll put together my finished keyboard. But I have been making some progress in the meantime. Here’s the layout I’m going to try.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/keyboard57.png)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/keyboard57.png)](https://blog.za3k.com/wp-content/uploads/2024/05/keyboard57.png)
 
-And I’ve started streaming some development of a case and keyboard on [Twitch][7] (Tue/Thu 12pm noon, EDT). Feel free to join! Anyone can watch, but you need an account to chat.
+And I’ve started streaming some development of a case and keyboard on [Twitch](https://www.twitch.tv/za3k) (Tue/Thu 12pm noon, EDT). Feel free to join! Anyone can watch, but you need an account to chat.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/stream-1024x576.png)][8]
-
-[1]: https://golem.hu/guide/keyboard-build-logs/
-[2]: https://golem.hu/guide/first-macropad
-[3]: https://blog.za3k.com/wp-content/uploads/2024/05/2024-05-20-233106_2560x1440_scrot.png
-[4]: https://blog.za3k.com/wp-content/uploads/2024/05/2024-05-20-235849_1920x1080_scrot.png
-[5]: https://blog.za3k.com/wp-content/uploads/2024/05/tiny_keyboard2-1.jpg
-[6]: https://blog.za3k.com/wp-content/uploads/2024/05/keyboard57.png
-[7]: https://www.twitch.tv/za3k
-[8]: https://blog.za3k.com/wp-content/uploads/2024/05/stream.png
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/stream-1024x576.png)](https://blog.za3k.com/wp-content/uploads/2024/05/stream.png)
index bcccd2d45b994e7df9920b1b1df04be0677de400..ece7455d8fdfc1cea88f5748bbe62dbfed05ad4d 100644 (file)
@@ -14,7 +14,7 @@ wordpress_slug: zorchpad-update-cardboard-mockup-mk1
 ---
 I’ve gotten to the point in Zorchpad development where I’d like to see how the whole thing fits together and if there will be any insurmountable problems. We’re still trying to figure out some things like–will it have one screen or two? What form factor will it be? Will the keyboard fold in half? So I put together a cardboard model.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/v0_cardboard_zorchpad-1024x576.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/v0_cardboard_zorchpad-1024x576.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/v0_cardboard_zorchpad.jpg)
 
 This model has:
 
@@ -29,7 +29,7 @@ This model has:
 -   A custom keyboard (total power usage: variable/unknown)  
     The keyboard is closely modeled off a standard one, for now.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/v0_keyboard.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/v0_keyboard.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/v0_keyboard.jpg)
 
 Immediately, a few problems pop out:
 
@@ -38,6 +38,3 @@ Immediately, a few problems pop out:
 -   It’s hard to get the screen to stay propped up on my cardboard model. I’d like a solution that doesn’t use hinges, since those tend to loosen over time.
 
 My next step will probably be to make a custom working keyboard. Then, I’ll make an entire working zorchpad. Both will be either cardboard or 3d-printed (whichever is easier).
-
-[1]: https://blog.za3k.com/wp-content/uploads/2024/05/v0_cardboard_zorchpad.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2024/05/v0_keyboard.jpg
index bee46a5aa1653929df734cb41cc21f631639adca..0a32fe0ea5a7b02e38c071a140fd46f5c253b5bd 100644 (file)
@@ -12,43 +12,34 @@ updated: 2024-06-05 10:36:45-07:00
 wordpress_id: 1384
 wordpress_slug: zorchpad-update-first-3d-print
 ---
-I’ve been designing a keyboard and case for the [zorchpad][1].
+I’ve been designing a keyboard and case for the [zorchpad](https://blog.za3k.com/tag/zorchpad/).
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/all_parts_color1-664x1024.png)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/all_parts_color1-664x1024.png)](https://blog.za3k.com/wp-content/uploads/2024/06/all_parts_color1.png)
 
 There are four pieces in the first iteration.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/bottom_shell-1-1024x418.png)][3]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/bottom_shell-1-1024x418.png)](https://blog.za3k.com/wp-content/uploads/2024/06/bottom_shell-1.png)
 
 A top bottom base, to enclose the keyboard electronics.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/keyboard_plate_green-1024x990.png)][4]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/keyboard_plate_green-1024x990.png)](https://blog.za3k.com/wp-content/uploads/2024/06/keyboard_plate_green.png)
 
 A keyboard plate. The keys fit into the holes here. You type on the top, electronics go in the bottom.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/top_plate_green-1024x966.png)][5]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/top_plate_green-1024x966.png)](https://blog.za3k.com/wp-content/uploads/2024/06/top_plate_green.png)
 
 A top plate. You see the screens, and switches through the cutouts. Otherwise, it keeps the behind-the-scenes wiring out of sight.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/top_clamshell_v2-1024x410.png)][6]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/top_clamshell_v2-1024x410.png)](https://blog.za3k.com/wp-content/uploads/2024/06/top_clamshell_v2.png)
 
 And finally, the top piece.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/printed_assembly.jpg)][7]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/printed_assembly.jpg)](https://blog.za3k.com/wp-content/uploads/2024/06/printed_assembly.jpg)
 
 Here are the pieces in correct position. In the top will be the screens and battery. The bottom is a keyboard you type on. The whole things is meant to fold on a hinge, much like a laptop.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/06/printed_parts.jpg)][8]
+[![](https://blog.za3k.com/wp-content/uploads/2024/06/printed_parts.jpg)](https://blog.za3k.com/wp-content/uploads/2024/06/printed_parts.jpg)
 
 The same pieces, spread out.
 
 There were many, many problems with the first design and the first print. I’ll talk about them (and my fixes) in my next post.
-
-[1]: https://blog.za3k.com/tag/zorchpad/
-[2]: https://blog.za3k.com/wp-content/uploads/2024/06/all_parts_color1.png
-[3]: https://blog.za3k.com/wp-content/uploads/2024/06/bottom_shell-1.png
-[4]: https://blog.za3k.com/wp-content/uploads/2024/06/keyboard_plate_green.png
-[5]: https://blog.za3k.com/wp-content/uploads/2024/06/top_plate_green.png
-[6]: https://blog.za3k.com/wp-content/uploads/2024/06/top_clamshell_v2.png
-[7]: https://blog.za3k.com/wp-content/uploads/2024/06/printed_assembly.jpg
-[8]: https://blog.za3k.com/wp-content/uploads/2024/06/printed_parts.jpg
index 7d711d06f58288b983fe9cb07db561be64132296..39fc17fb0584d53f606e89119aca0ccfd82265fc 100644 (file)
@@ -15,20 +15,14 @@ wordpress_slug: zorchpad-update-keyboard
 ---
 Another update on the zorchpad. We now have a working 16-button keyboard (sadly no QWERTY yet). Here you can see a simple typing program that shows what you type on screen.
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/zorchpad_keyboard-1024x576.jpg)][1]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/zorchpad_keyboard-1024x576.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/zorchpad_keyboard-scaled.jpg)
 
-[![](https://blog.za3k.com/wp-content/uploads/2024/05/zorchpad_keyboard_zoom-1024x331.jpg)][2]
+[![](https://blog.za3k.com/wp-content/uploads/2024/05/zorchpad_keyboard_zoom-1024x331.jpg)](https://blog.za3k.com/wp-content/uploads/2024/05/zorchpad_keyboard_zoom.jpg)
 
-As mentioned in a [previous post][3], the reason we’re using a custom keyboard is to stay to low power usage–much lower than a standard keyboard.
+As mentioned in a [previous post](https://blog.za3k.com/diy-keyboards-and-how-keyboards-work/), the reason we’re using a custom keyboard is to stay to low power usage–much lower than a standard keyboard.
 
 So far we have:
 
--   [Screen display][4] — both pixels and letters
+-   [Screen display](https://blog.za3k.com/introducing-the-zorchpad-display-demo/) — both pixels and letters
 -   Sound output (simple beeps for now)
--   [Keyboard input][5]
-
-[1]: https://blog.za3k.com/wp-content/uploads/2024/05/zorchpad_keyboard-scaled.jpg
-[2]: https://blog.za3k.com/wp-content/uploads/2024/05/zorchpad_keyboard_zoom.jpg
-[3]: https://blog.za3k.com/diy-keyboards-and-how-keyboards-work/
-[4]: https://blog.za3k.com/introducing-the-zorchpad-display-demo/
-[5]: https://blog.za3k.com/zorchpad-update-keyboard/
+-   [Keyboard input](https://blog.za3k.com/zorchpad-update-keyboard/)
index 2819e39373a784f9756f41498b2a9bce636f7e10..22b7ce5d61d09d6c13b8171a53f13c9cfbc41693 100644 (file)
        <item>
                <title>{{title}}</title>
                <link>{{web_root}}/post/{{id}}.html</link>
-               <dc:creator><![CDATA[{{author}}]]></dc:creator>
+               <dc:creator><![CDATA[{{author.tag}}]]></dc:creator>
                <pubDate>{{date_rfc822}}</pubDate>
         {{# categories }}
-        <category><![CDATA[{{.}}]]></category>
+        <category><![CDATA[{{tag}}]]></category>
         {{/ categories }}
         {{# tags }}
-        <category><![CDATA[{{.}}]]></category>
+        <category><![CDATA[{{tag}}]]></category>
         {{/ tags }}
                <guid isPermaLink="false">{{id}}</guid>
         <!--<description><![CDATA[SHORT_DESCRIPTION]]></description>-->
-        <content:encoded><![CDATA[{{post}}]]></content:encoded>
+        <content:encoded><![CDATA[{{post}}]]></content:encoded>
     </item>
     {{/ posts.first10 }}
 </channel>
index 8c2ccb3d1a20910969645f07744e68ff40db4eb2..4de7eee57c11049c2c84ac96f2578a2f8fe8bff6 100644 (file)
@@ -1,5 +1,6 @@
 <html>
 <head>
+    <base target="_PARENT"> <!-- for side-by-side iframe comparison -->
     <title>{{ title }}</title>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     <meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1.0, minimum-scale=1.0, maximum-scale=3.0">
index ba0758988fd6b7cf6c7d04d76556557bb3f67193..85f2a3f80b8bb8bb6a0fa407b47a306a880a105a 100644 (file)
@@ -19,20 +19,42 @@ html, body {
 #iframes {
     display: flex;
 }
-iframe {
+#iframes > * {
     flex: 1 1;
-    height: 10000px;
+    display: flex;
+    flex-direction: column;
+    position: relative;
+}
+#iframes > *:first-child {
+    border-right: 3px dashed lightgray
+}
+#iframes > *::before {
+    display: block;
+    position: absolute;
+    background: rgba(255, 255, 255, 0.7);
+    padding: 10px;
+    width: 7rem;
+    margin-left: -3.5rem;
+    left: 50%;
+    font-variant: small-caps;
+    font-size: 18pt;
+    text-align: center;
+}
+#html::before {
+    content: "Html";
+}
+#markdown::before {
+    content: "Markdown";
+}
+#iframes * {
+    height: 35000px;
+}
+iframe {
     padding: 0;
     margin: 0;
     border: 0;
-    scrollbar-width: none;
     display:block;
-}
-iframe:first-child {
-    border-right: 3px dashed lightgray
-}
-iframe::-webkit-scrollbar {
-    display: none;
+    flex: 1 1;
 }
 
 </style>
@@ -43,5 +65,11 @@ iframe::-webkit-scrollbar {
     <a href="https://git.za3k.com/?p=blog.git;a=blob_plain;f=posts-html/{{id}}.html;hb=HEAD">html source</a>
     <a href="https://git.za3k.com/?p=blog.git;a=blob_plain;f=posts-md/{{id}}.md;hb=HEAD">markdown source</a>
 </ul>
-<div id="iframes"><iframe src="{{url_html}}" id="html"></iframe><iframe src="{{url_md}}" id="markdown"></iframe></body></div>
+<div id="iframes">
+    <div id="html">
+        <iframe src="{{url_html}}"></iframe>
+    </div>
+    <div id="markdown">
+        <iframe src="{{url_md}}"></iframe></body></div>
+    </div>
 </html>