<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on jacksonchen666.com</title>
    <link>https://jacksonchen666.com/posts/</link>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language><atom:link href="https://jacksonchen666.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Disclaimer: This Blog May Be Bad and Incorrect</title>
      <link>https://jacksonchen666.com/posts/2024-01-27/00-17-49/</link>
      <pubDate>Sat, 27 Jan 2024 00:17:49 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2024-01-27/00-17-49/</guid>
      <description>&lt;p&gt;Today I just decided to read some of my old blog posts and I was like &amp;ldquo;wtf&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So I decided to make a dedicated blog post to say &amp;ldquo;wtf&amp;rdquo; and also &amp;ldquo;don&amp;rsquo;t only
rely on me&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;If you feel like you can trust me for all of your information, think again.
I got the amount of words in my passphrase wrong (in the &lt;a href=&#34;https://jacksonchen666.com/posts/2023-08-28/20-39-31/&#34; rel=&#34;noopener noreferrer&#34;&gt;post about my
passwords&lt;/a&gt;). I actually got that wrong multiple times until I
realized that I was wrong.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a non-zero chance that I have made factual (and grammatical) errors
in my other blog posts. So if you are in doubt on whether to trust me, my
answer would be &amp;ldquo;don&amp;rsquo;t only trust me, verify me&amp;rdquo;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>QR Code Shenanigans</title>
      <link>https://jacksonchen666.com/posts/2024-01-24/14-14-53/</link>
      <pubDate>Wed, 24 Jan 2024 14:14:53 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2024-01-24/14-14-53/</guid>
      <description>&lt;img class=&#34;pixelated fit-to-screen&#34; src=&#34;https://jacksonchen666.com/posts/2024-01-24/14-14-53/v40-qr-code.png&#34; alt=&#34;A QR code that looks kinda crazy, like something you don&#39;t see every day.&#34; /&gt;
&lt;p&gt;If you couldn&amp;rsquo;t tell, it is indeed a QR code. An absurdly sized QR code, in
fact.&lt;/p&gt;
&lt;p&gt;Actually, it doesn&amp;rsquo;t even have to be that big, I just made it that big
because I like being absurd sometimes.&lt;/p&gt;
&lt;p&gt;So you may ask: How did you do that?!?!&lt;/p&gt;
&lt;p&gt;Well here&amp;rsquo;s the command I ran:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;qrencode -l H -v 40 https://jacksonchen666.com/posts/2024-01-24/14-14-53/ -o content/posts/2024-01-24-qr-code-shenanigans/v40-qr-code.png
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It uses &lt;a href=&#34;https://github.com/fukuchi/libqrencode/&#34; rel=&#34;noopener noreferrer&#34;&gt;qrencode&lt;/a&gt;, and specifies &lt;code&gt;-v 40&lt;/code&gt; which tells qrencode to make a QR
code which is version 40.&lt;/p&gt;
&lt;p&gt;Version 40 of a QR code is the biggest QR code you can get. It can store
about 3 kilobytes of stuff, which won&amp;rsquo;t fit pictures because pictures those
tend to be very big.&lt;/p&gt;
&lt;p&gt;But the thing is: The data in the QR code is
&lt;a href=&#34;https://jacksonchen666.com/posts/2024-01-24/14-14-53/&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;https://jacksonchen666.com/posts/2024-01-24/14-14-53/&lt;/code&gt;&lt;/a&gt;, not something that
takes up anywhere close to 3 kilobytes. So like, why?&lt;/p&gt;
&lt;p&gt;Well, because I can and I thought it would be funny and ridiculous, my kind
of thing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>2 Years of Sysadmining</title>
      <link>https://jacksonchen666.com/posts/2024-01-17/23-34-52/</link>
      <pubDate>Wed, 17 Jan 2024 23:34:52 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2024-01-17/23-34-52/</guid>
      <description>&lt;h2 id=&#34;2-years-of-sysadmining&#34;&gt;2 years of sysadmining &lt;/h2&gt;
&lt;p&gt;On 2021-09-04T12:37Z, I installed Fedora Linux on an Asus laptop. That is
pretty much the start of my server adventures.&lt;/p&gt;
&lt;p&gt;That date comes from &lt;code&gt;dnf history&lt;/code&gt;. It keeps track of packages you install,
uninstall, or whatever. It also pretty much never purges the history, so you
pretty much always have the first package management thing in your history,
which is probably the first time you installed Fedora Linux.&lt;/p&gt;
&lt;p&gt;In my initial server setup, I was interested in matrix synapse. Then
eventually I found Mastodon, more things (calendars, PeerTube, etc.), and a
lot more things happened since then.&lt;/p&gt;
&lt;p&gt;And today, I have 2 computers which pretty much monitor each other (both
computers run on the same internet and power lines, so it&amp;rsquo;s not necessarily
redundant). I have &lt;a href=&#34;https://wiki.jacksonchen666.com/wiki/My_domain_names#Subdomains&#34;&gt;a crap ton of subdomains&lt;/a&gt; with a bunch of
crap as well, and questionable infrastructure (status. subdomain has
&amp;ldquo;redundancy&amp;rdquo; if you use Tor Onions).&lt;/p&gt;
&lt;h3 id=&#34;recent-downtime&#34;&gt;Recent downtime &lt;/h3&gt;
&lt;p&gt;Recently, I had &lt;a href=&#34;https://jacksonchen666.com/maintenance/2024-01-17/16-10-00/&#34;&gt;downtime&lt;/a&gt;. For some reason, the internet connection
just died, and then later came back. I didn&amp;rsquo;t do anything on my side for
that to be fixed.&lt;/p&gt;
&lt;p&gt;However, with the internet connection being interrupted then resumed, I
uncovered a bug in &lt;a href=&#34;https://gitdab.com/cadence/out-of-your-element&#34;&gt;Out of your Element&lt;/a&gt; where it would just tie up
all the RAM and swap trying to connect to Discord or something. It was
weird.&lt;/p&gt;
&lt;h2 id=&#34;a-new-wiki&#34;&gt;A new wiki &lt;/h2&gt;
&lt;p&gt;On the note of running new things, I&amp;rsquo;ve got a new thing:
&lt;a href=&#34;https://wiki.jacksonchen666.com/&#34;&gt;https://wiki.jacksonchen666.com/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a wiki where I dump my knowledge. I do feel as though a wiki is much
more frictionless than having to deal with the publishing mess that is my
website (having to use &lt;code&gt;git&lt;/code&gt; for a website with blog posts is not the best
thing).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve already gotten a few pages up written.&lt;/p&gt;
&lt;p&gt;The goal of the wiki isn&amp;rsquo;t to replace Wikipedia or anything like that,
actually. It&amp;rsquo;s usually for when I suddenly recall something, and want it to
be written down somewhere in a quick notice.&lt;/p&gt;
&lt;p&gt;Blog posts though, I will probably continue writing them if I feel that&amp;rsquo;s
appropriate. Just know that I don&amp;rsquo;t plan to do the &lt;a href=&#34;https://100daystooffload.com/&#34;&gt;100 days to
offload&lt;/a&gt; challenge anymore (it was kind of hell when I tried (and
succeeded)), so there shouldn&amp;rsquo;t be much of a blog post spam this year.&lt;/p&gt;
&lt;h2 id=&#34;website-dead-urls&#34;&gt;Website dead URLs &lt;/h2&gt;
&lt;p&gt;Yes, I check the things I link. I also do stuff about links when a URL I
linked is dead.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve recently done a check after the &lt;a href=&#34;https://status.sr.ht/issues/2024-01-10-network-outage/&#34;&gt;extended downtime of
sourcehut&lt;/a&gt;, and probably after a while too.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Verifying Links in Mastodon Using More Mastodon</title>
      <link>https://jacksonchen666.com/posts/2024-01-08/10-13-47/</link>
      <pubDate>Mon, 08 Jan 2024 10:13:47 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2024-01-08/10-13-47/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;#verify_profiles&#34;&gt;Skip explanation and go to relevant section&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;verify_links&#34;&gt;Verifying links in your profile fields &lt;/h2&gt;
&lt;p&gt;In Mastodon (and probably the wider parts of the Fediverse as well), you can
put links in your profile fields. Those links can also be verified.&lt;/p&gt;
&lt;p&gt;Mastodon gives this thing that it asks you to put into your website:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;rel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;me&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://example.com/@example&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Mastodon&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The important part is the &lt;code&gt;rel=&amp;quot;me&amp;quot;&lt;/code&gt; part. It says &amp;ldquo;yes, this is me&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Of course, it would have to link to your actual Mastodon profile&amp;rsquo;s URL, the
above is just an example. But place that into your website and link your
website in your profile fields and you&amp;rsquo;ll have links verified.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the stuff you probably already know.&lt;/p&gt;
&lt;h2 id=&#34;invisible_verification&#34;&gt;Verifying links in your profile fields without having the link visible &lt;/h2&gt;
&lt;p&gt;The HTML snippet I just gave you is one way to do it. Another way to do it
is like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;rel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;me&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://example.com/@example&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Put that within your &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; element and now you can have links verified
while actually having no links visible to the user.&lt;/p&gt;
&lt;p&gt;Mastodon does talk about this, but doesn&amp;rsquo;t give examples. If you needed one,
there you go.&lt;/p&gt;
&lt;h2 id=&#34;verify_profiles&#34;&gt;Verifying you control another Mastodon/Fedi account &lt;/h2&gt;
&lt;p&gt;What if you wanted to prove that you control an alt account? Or some other
account?&lt;/p&gt;
&lt;p&gt;For this example, there will be Account 1 and Account 2:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On Account 1, put the URL for Account 2 in a profile field&lt;/li&gt;
&lt;li&gt;On Account 2, put the URL for Account 1 in a profile field&lt;/li&gt;
&lt;li&gt;On both accounts, save your profile again (no changes needed, just save
it). Then you should have the verification check marks on both accounts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Important things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You cannot use your fediverse handle instead of a URL to the profile. It
just won&amp;rsquo;t work.&lt;/li&gt;
&lt;li&gt;Both accounts must link to each other.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &amp;ldquo;Account 1&amp;rdquo; and &amp;ldquo;Account 2&amp;rdquo; in this example can be any fedi account,
provided you control both of them. You can also have any number of fedi
accounts linked, provided you have enough profile fields and put links to
each profile in all profiles. It can get complicated quite fast.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>More Notes on Replacing the Fairphone 4 Screen</title>
      <link>https://jacksonchen666.com/posts/2024-01-02/13-00-05/</link>
      <pubDate>Tue, 02 Jan 2024 13:00:05 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2024-01-02/13-00-05/</guid>
      <description>&lt;p&gt;So this time, I actually did a real screen replacement with a real screen!
And I have some more notes based on the &lt;a href=&#34;https://jacksonchen666.com/posts/2023-07-10/19-07-16/&#34;&gt;previous notes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last time, I did a &amp;ldquo;replacement&amp;rdquo; i.e. Did the replacement procedures but
used the same screen. This time, I did actually replace the screen with
another screen.&lt;/p&gt;
&lt;p&gt;This time, I wanted to fix a couple of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-touch unreliability&lt;/li&gt;
&lt;li&gt;Dead pixels (tiny and not noticeable during normal use)&lt;/li&gt;
&lt;li&gt;Replace my screen protector because I broke it again (I&amp;rsquo;m on the 6th
screen protector so far, I think)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I ordered a replacement screen and also screen protector. Then it arrived
via &lt;em&gt;being fucking thrown over the home gate&lt;/em&gt;. Thankfully, the parts did not
get damaged after being thrown by the delivery person, as the box had too
much padding and the replacement screen had bubble wrap.&lt;/p&gt;
&lt;h2 id=&#34;the-notes-part&#34;&gt;The notes part &lt;/h2&gt;
&lt;p&gt;This is in addition to the &lt;a href=&#34;https://jacksonchen666.com/posts/2023-07-10/19-07-16/&#34;&gt;previous notes&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When taking the screen replacement part out of its packaging, there might
be a tiny sticky cover on where the front camera is. Take that sticky
cover off, you don&amp;rsquo;t want that there.&lt;/li&gt;
&lt;li&gt;A screw in the lower right side of the phone (relative to looking at the
back of the opened phone) was resisting to be screwed back in. I had to
use a lot more than usual force to get the screw back in. I may have
screwed up that single screw in the process.&lt;/li&gt;
&lt;li&gt;I had difficulty trying to plug the display back in. I think I just had
to push on the connector a little harder for it to connect back together.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After replacement, the replacement has been done. Obviously.&lt;/p&gt;
&lt;h2 id=&#34;testing-for-problems-after-replacement&#34;&gt;Testing for problems after replacement &lt;/h2&gt;
&lt;p&gt;I mentioned earlier that I had problems with multi-touch. That is, any
finger that isn&amp;rsquo;t my thumb has very unreliable touchscreen detection.&lt;/p&gt;
&lt;p&gt;Well, guess what? Replacing the screen did absolutely nothing. In fact, the
same workarounds I found still works on the new screen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Placing the phone on my MacBook&lt;/li&gt;
&lt;li&gt;Plugging headphones in (not wirelessly)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any one of those workarounds can be used, and it does not have to be all of
them.&lt;/p&gt;
&lt;p&gt;Multi-touch is important to me because I play rhythm games. In the current
state, I would need to play harder levels to progress in skill, and those
harder levels require more than just thumbs. But because anything other than
thumbs is unreliable (and I need to use more than just thumbs), I can&amp;rsquo;t
properly play.&lt;/p&gt;
&lt;h2 id=&#34;dealing-with-the-old-part&#34;&gt;Dealing with the old part &lt;/h2&gt;
&lt;p&gt;Now that I have swapped the screen with a new one, what do I do with the old
one?&lt;/p&gt;
&lt;p&gt;Answer would be to send it off to some electronics recycling center, but I
have no idea how to do any of that, and I don&amp;rsquo;t know where to send it off
to.&lt;/p&gt;
&lt;p&gt;So I am just going to keep the old display until I deal with it eventually.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Monitor Resolutions and Sizes Review</title>
      <link>https://jacksonchen666.com/posts/2024-01-01/23-38-54/</link>
      <pubDate>Mon, 01 Jan 2024 23:38:54 +0100</pubDate>
      <author>Jackson</author>
      <guid>/posts/2024-01-01/23-38-54/</guid>
      <description>&lt;p&gt;As a very computer person, I have used monitors with differing resolutions
and sizes.&lt;/p&gt;
&lt;p&gt;Today, I have 2 comparisons to make:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A random 21-inch (or 24-inch) 1920x1080 (HD 1080p) monitor compared to a
random 27-inch 3840x2160 (4k) monitor&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://support.apple.com/kb/SP824&#34;&gt;My MacBook&amp;rsquo;s&lt;/a&gt; internal display compared to my
&lt;a href=&#34;https://shop.fairphone.com/fairphone-4#section4&#34;&gt;Fairphone 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;21-inch-1080p-vs-27-inch-4k&#34;&gt;21-inch 1080p vs. 27-inch 4k &lt;/h2&gt;
&lt;p&gt;(I am not exactly sure of the exact inches of my previous 1080p monitor, and
it might be 24-inch. So I&amp;rsquo;ll include a 24-inch 1080p monitor in the
comparison.)&lt;/p&gt;
&lt;p&gt;My previous monitor was a 21-inch 1920x1080 (1080p) monitor. Because the
text wasn&amp;rsquo;t really that sharp to my liking (I have a MacBook with its sharp
internal display, after all), I decided to get a 4k monitor.&lt;/p&gt;
&lt;p&gt;The 4k monitor I happened to get is an LS27A70 with the Samsung brand on it.
Feel free to look up whatever that is, but the monitor is a 27-inch
3840x2160 monitor.&lt;/p&gt;
&lt;p&gt;Putting the numbers into &lt;a href=&#34;https://www.calculatorsoup.com/calculators/technology/ppi-calculator.php&#34;&gt;a random online Pixels Per Inch
calculator&lt;/a&gt;, it returns &lt;strong&gt;104.90 PPI for the 1080p monitor and
163.18 PPI for the 4k monitor&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;(Assuming that the 1080p monitor was actually 24-inch, it would be 91.79
PPI)&lt;/p&gt;
&lt;p&gt;Well, what do those numbers even mean?&lt;/p&gt;
&lt;p&gt;Actually, it doesn&amp;rsquo;t say much about how sharp text will look on those
monitors.&lt;/p&gt;
&lt;p&gt;With the 1080p monitor, I can pretty much see the tiny pixels when sitting
quite close to it but still being able to see the entire monitor. I don&amp;rsquo;t
like not very sharp text, so I got a 4k monitor.&lt;/p&gt;
&lt;p&gt;In my experience with the 27-inch 4k, I have to sit far away enough to see
the entire monitor. At that point, the text is pretty sharp and I wouldn&amp;rsquo;t
be able to tell apart the tiny pixels. Looking any closer at the display is
pretty abnormal (for me, at least), but does mean I can see the pixels more.&lt;/p&gt;
&lt;h2 id=&#34;my-macbook-vs-fairphonenbsp4&#34;&gt;My MacBook vs Fairphone 4 &lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://support.apple.com/kb/SP824&#34;&gt;My MacBook&lt;/a&gt; has a 13.3 inch 2560x1600 display. The
&lt;a href=&#34;https://shop.fairphone.com/fairphone-4#section4&#34;&gt;Fairphone 4&lt;/a&gt; has a 1080x2340 display when in portrait mode, and
2340x1080 in landscape mode.&lt;/p&gt;
&lt;p&gt;These are getting into &amp;ldquo;weird resolutions territory&amp;rdquo;. MacBooks tend to have
a 16:10 aspect ratio, and my Fairphone 4 has an aspect ratio of 19.5:9.&lt;/p&gt;
&lt;p&gt;Basically, MacBooks have a slightly taller displays than 16:9 monitors (the
1080p and 4k monitors that I talked about earlier), and the Fairphone 4
has a wider display in landscape mode.&lt;/p&gt;
&lt;p&gt;Number-wise, my MacBook has a 226.98 PPI display, and the Fairphone 4
has a 409.08 PPI display.&lt;/p&gt;
&lt;p&gt;Experience-wise, both have sharp text at reasonable viewing distances. I can
start seeing the pixels on my MacBook if I stared at it closely, but on the
Fairphone 4? I can&amp;rsquo;t see pixels even if I tried, except for dead pixels
at max brightness in very dark rooms.&lt;/p&gt;
&lt;h2 id=&#34;recap&#34;&gt;Recap &lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I primarily use a 13-inch MacBook, which has pretty sharp text&lt;/li&gt;
&lt;li&gt;A 4k monitor (27-inch) had sharper text compared to the 1080p monitor
(21-inch) I had&lt;/li&gt;
&lt;li&gt;The Fairphone 4 display (6.3 inch, 1080p but wider in landscape) has
a PPI that is way too high for me to see individual pixels (except for
dead pixels with max brightness in dark rooms)&lt;/li&gt;
&lt;li&gt;The 4k monitor, my MacBook, and the Fairphone 4 all has pretty sharp
text, with the baseline being &lt;a href=&#34;https://support.apple.com/kb/SP824&#34;&gt;my MacBook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, higher pixels per inch means more pixels to make sharper text,
although anything above a MacBook could start being too much (e.g.
Fairphone 4).&lt;/p&gt;
&lt;p&gt;Also, there&amp;rsquo;s another factor to account for: Viewing distance. I have not
accounted for that, and I think that&amp;rsquo;s an important factor.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Who Am I?</title>
      <link>https://jacksonchen666.com/posts/2023-12-31/23-27-14/</link>
      <pubDate>Sun, 31 Dec 2023 23:27:14 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-12-31/23-27-14/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Warning: If you expected a computer related post or an introduction of me,
this post is&lt;/strong&gt; &lt;em&gt;&lt;strong&gt;neither&lt;/strong&gt;&lt;/em&gt;. Instead, this is a very recent experience I
just had and wanted to just write about for some reason.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;So I sit down at my computer, and start doing random stuff (as usual). I
check my RSS feeds, and I notice one of my feed being from &lt;a href=&#34;https://koshka.love/&#34; rel=&#34;noopener noreferrer&#34;&gt;koshka.love&lt;/a&gt;. Of
course, out of curiosity (and because I forgot about what it was again), I
navigate to it and them got myself into the &lt;a href=&#34;https://koshka.love/autism/index.html&#34; rel=&#34;noopener noreferrer&#34;&gt;autism acceptance rabbit
hole&lt;/a&gt; again.&lt;/p&gt;
&lt;p&gt;As I keep reading- wait no, scrambling and solving my rubiks cube while
listening to breakcore music from &lt;a href=&#34;https://hkmori.bandcamp.com/&#34; rel=&#34;noopener noreferrer&#34;&gt;hkmori&lt;/a&gt; and simultaneously having Firefox
(actually LibreWolf) reader view read out the words in a post, I listen to
the words being said. Maybe understanding some of the sentences, or maybe
just forgetting it and leaving it somewhere in my brain.&lt;/p&gt;
&lt;p&gt;Then I have to go to the bathroom to do bathroom stuff. So I pause the
reader view from reading by pressing N, press the pause button for the
music, and finally move my mouse cursor to the bottom left to activate the
screen saver and lock my computer. Then I head to the bathroom.&lt;/p&gt;
&lt;p&gt;And then I am reminded of my existence.&lt;/p&gt;
&lt;p&gt;I am a brain trapped in a human body. I am also using different senses to
navigate and stuff like that, limbs to interact with things. You know, stuff
like a normal human does and has.&lt;/p&gt;
&lt;p&gt;Turns out, I am not a faceless entity that is infinitely thin in all
dimensions. I am me. Myself. Bigger than nothing.&lt;/p&gt;
&lt;p&gt;However, during all that reading and stimming, I was just am. I am. No &amp;ldquo;me&amp;rdquo;,
I just am. Not in terms of time, I was just&amp;hellip; being. And ingesting all the
words and sentences from &lt;a href=&#34;https://koshka.love/autism/index.html&#34; rel=&#34;noopener noreferrer&#34;&gt;those posts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also, I have a face. That shouldn&amp;rsquo;t be much of a surprise, but what kind of
is a surprise is that I avoid eye contact with myself in mirrors or at all.
I don&amp;rsquo;t like looking at me, and that avoidance is done subconsciously.&lt;/p&gt;
&lt;p&gt;Right now, I am staring at a thing called a &amp;ldquo;monitor&amp;rdquo;. It is basically the
computer screen. The screen itself also blurs any reflection, so any
(subconscious) attempts to use the monitor and reflections to see my face
will inevitably fail, since it&amp;rsquo;s so blurry you cannot make details out of
it.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s great, because then I don&amp;rsquo;t have to be reminded of my face. Although
that applies to the external monitor that I have. In the case of the
internal display of the computer, it does not blur reflections or anything
really. So I can indeed try and see myself, and I would be able to succeed.&lt;/p&gt;
&lt;p&gt;Speaking of my face, why do I not like it?&lt;/p&gt;
&lt;p&gt;Well, I have no idea. Maybe I don&amp;rsquo;t want to be look like that gender or look
like that type of people or whatever. Maybe I am reminded of something I
cannot recall, except for my subconscious.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m now here writing a post about realizing my existence (after having a
brief pause on &amp;ldquo;escapism&amp;rdquo;) and why I just don&amp;rsquo;t really like my face. And the
conclusion is: I don&amp;rsquo;t understand why either.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>osu!lazer and Health Drain</title>
      <link>https://jacksonchen666.com/posts/2023-12-17/01-47-06/</link>
      <pubDate>Sun, 17 Dec 2023 01:47:06 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-12-17/01-47-06/</guid>
      <description>&lt;h2 id=&#34;important-preface&#34;&gt;Important preface &lt;/h2&gt;
&lt;p&gt;I exclusively use osu!lazer. I have never touched osu!stable in my life (nor
with my account), ever. Everything here is in the context of osu!lazer, not
osu!stable.&lt;/p&gt;
&lt;h2 id=&#34;brief-history-of-my-skills-in-osu&#34;&gt;Brief history of my skills in osu! &lt;/h2&gt;
&lt;p&gt;I joined osu! in 2021-10-27 by creating an account (&lt;a href=&#34;https://osu.ppy.sh/users/26820178&#34;&gt;my osu! account&lt;/a&gt;, by the way). By now, I have almost 200 hours or 8 days of playtime for
the osu! game mode.&lt;/p&gt;
&lt;p&gt;Previously, I had around 60 or 70 percent hit accuracy, and I can do maybe 5
or 6 star maps with a grade of D (less than 70% accuracy in osu!lazer), and
not fail.&lt;/p&gt;
&lt;p&gt;Or, at least I &lt;em&gt;could&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;an-osulazer-update&#34;&gt;An osu!lazer update &lt;/h2&gt;
&lt;p&gt;There was &lt;a href=&#34;https://github.com/ppy/osu/releases/tag/2023.1130.0&#34;&gt;an osu!lazer update on 2023-11-30&lt;/a&gt; that included &lt;a href=&#34;https://github.com/ppy/osu/pull/25418&#34;&gt;a
change to health drain in the osu! game mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then suddenly after that change and update, I suck at osu!. Much worse than
before. Now I&amp;rsquo;m failing at maps I could previously pass. Like the 5 and 6
star maps that I could pass before the update is now a fail, and my replays
are ruined since they are wrong.&lt;/p&gt;
&lt;p&gt;Oh no, my self-esteem is completely ruined. /s&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;Wait, osu!catch??&lt;/p&gt;
&lt;h2 id=&#34;looking-at-my-osucatch-stats&#34;&gt;Looking at my osu!catch stats &lt;/h2&gt;
&lt;p&gt;Yes, I did indeed play osu!catch. I have about 37 hours of playtime and 91%
hit accuracy. How the heck am I better at osu!catch?&lt;/p&gt;
&lt;p&gt;Well, I don&amp;rsquo;t know. But in terms of accuracy and grade, I&amp;rsquo;m pretty good!
Well, at least for maps in the 3 or 4 star range.&lt;/p&gt;
&lt;p&gt;So how the heck do I have better grades in osu!catch with less playtime?
(albeit with less hard maps &amp;ldquo;compared&amp;rdquo; to osu!)&lt;/p&gt;
&lt;h2 id=&#34;playing-easier-maps-and-getting-way-better&#34;&gt;Playing easier maps, and getting way better &lt;/h2&gt;
&lt;p&gt;Well, &amp;ldquo;easier&amp;rdquo; and &amp;ldquo;better&amp;rdquo;. It&amp;rsquo;s more like osu! maps which are actually for
my skill level, not something that is way beyond my skill level. Those maps
are in the 3 to 4 star range.&lt;/p&gt;
&lt;p&gt;By playing those &amp;ldquo;easier&amp;rdquo; maps and getting &amp;ldquo;better&amp;rdquo;, I have actually
increased my stats in the game by a lot.&lt;/p&gt;
&lt;p&gt;On 2023-12-08, my rank (at least on &lt;a href=&#34;https://lazer.ppy.sh/users/26820178&#34;&gt;lazer.ppy.sh&lt;/a&gt;) was about
260k. Then 2 days later on 2023-12-10, my rank suddenly jumped to 210k.
Today (2023-12-17), it&amp;rsquo;s 200k.&lt;/p&gt;
&lt;p&gt;My maximum combo has reached 799. That would at least mean I would get the
medal for 500 combo at least, but since medals aren&amp;rsquo;t a thing yet in
osu!lazer (coming soon(tm)), I didn&amp;rsquo;t get one.&lt;/p&gt;
&lt;p&gt;My hit accuracy has also gotten much higher, going from around the 60% to
70% range to 86.98% right now.&lt;/p&gt;
&lt;p&gt;Now that I compare to my osu!catch plays, it&amp;rsquo;s kind of the same story: I&amp;rsquo;m
actually good at this game (at least at the level I&amp;rsquo;m currently at).&lt;/p&gt;
&lt;p&gt;I also even gained performance points. When I played maps not for my skills,
I just never got any at all.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion &lt;/h2&gt;
&lt;p&gt;I just had to play the game at the level that worked for me. Well, it was
fun trying to play the game with fun maps, but I guess I&amp;rsquo;m going on numbers
instead now.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What it takes to setup a new domain name (for me)</title>
      <link>https://jacksonchen666.com/posts/2023-12-01/19-29-37/</link>
      <pubDate>Fri, 01 Dec 2023 19:29:37 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-12-01/19-29-37/</guid>
      <description>&lt;p&gt;While I&amp;rsquo;m trying to get certificates for &lt;a href=&#34;https://reinfo.wiki&#34; rel=&#34;noopener noreferrer&#34;&gt;reinfo.wiki&lt;/a&gt;, I&amp;rsquo;m going to
talk about setting up new domain names for stuff.&lt;/p&gt;
&lt;p&gt;Usually, I may put my stuff under a subdomain on jacksonchen666.com, like
&lt;a href=&#34;https://videos.jacksonchen666.com&#34; rel=&#34;noopener noreferrer&#34;&gt;videos.jacksonchen666.com&lt;/a&gt; or &lt;a href=&#34;https://status.jacksonchen666.com&#34; rel=&#34;noopener noreferrer&#34;&gt;status.jacksonchen666.com&lt;/a&gt;
or &lt;a href=&#34;https://files.jacksonchen666.com&#34; rel=&#34;noopener noreferrer&#34;&gt;files.jacksonchen666.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Those kinds of new domains are easy to deal with:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add more nginx configuration&lt;/li&gt;
&lt;li&gt;Use a subdomain as the &lt;code&gt;server_name&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And that&amp;rsquo;s it. The server software part is pretty specific and setup varies,
so that&amp;rsquo;s not included in the list.&lt;/p&gt;
&lt;p&gt;But what about the cases of new different domains? Like
&lt;a href=&#34;https://reinfo.wiki&#34; rel=&#34;noopener noreferrer&#34;&gt;reinfo.wiki&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Well, that involves a lot more setup. Here&amp;rsquo;s the case for reinfo.wiki:&lt;/p&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;Get the domain name&lt;/li&gt;
&lt;li&gt;Setup authoritative nameserver (if not setup already)&lt;/li&gt;
&lt;li&gt;Add a domain in deSEC.io&lt;/li&gt;
&lt;li&gt;Setup DNSSEC&lt;/li&gt;
&lt;li&gt;Setup DNS records&lt;/li&gt;
&lt;li&gt;Get certificates&lt;/li&gt;
&lt;li&gt;Setup the software that&amp;rsquo;s gonna run the thing (already done)&lt;/li&gt;
&lt;li&gt;Setup the Tor Onions&lt;/li&gt;
&lt;li&gt;Add nginx configuration&lt;/li&gt;
&lt;li&gt;Do &lt;a href=&#34;https://hstspreload.org/&#34; rel=&#34;noopener noreferrer&#34;&gt;HSTS preloading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update prometheus and blackbox configuration (the uptime checker)&lt;/li&gt;
&lt;li&gt;Update links in many places (specific for reinfo wiki as it already
existed)&lt;/li&gt;
&lt;li&gt;Add CAA records&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yeah, there&amp;rsquo;s a lot of work involved in a new domain name that isn&amp;rsquo;t just a
subdomain.&lt;/p&gt;
&lt;p&gt;So yeah that&amp;rsquo;s it I guess. There&amp;rsquo;s not much special about the setup.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Logistical Mess of Trying to Process a Lot of Videos</title>
      <link>https://jacksonchen666.com/posts/2023-11-26/14-51-57/</link>
      <pubDate>Sun, 26 Nov 2023 14:51:57 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-11-26/14-51-57/</guid>
      <description>&lt;p&gt;Warning: Rushed blog post. Yeah.&lt;/p&gt;
&lt;h2 id=&#34;the-last-time-vs-now&#34;&gt;The last time vs Now &lt;/h2&gt;
&lt;p&gt;Remember &lt;a href=&#34;https://jacksonchen666.com/posts/2022-09-30/19-11-04/&#34;&gt;last time&lt;/a&gt;? Yeah this time I&amp;rsquo;m doing it for over 700
gigabytes of videos, with more specific parameters to ffmpeg and with more
being added to the pile of videos.&lt;/p&gt;
&lt;p&gt;Again, it&amp;rsquo;s gameplay videos (because turns out I&amp;rsquo;m back to playing that game
again). This time, with more specific parameters.&lt;/p&gt;
&lt;h2 id=&#34;goals&#34;&gt;Goals &lt;/h2&gt;
&lt;p&gt;This time, I wanted to do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preserve 4k resolution (for text clarity)&lt;/li&gt;
&lt;li&gt;Make the quality of the videos OK-ish but not horrible&lt;/li&gt;
&lt;li&gt;Keep 60 fps&lt;/li&gt;
&lt;li&gt;Use much less space than the original recording&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I settled on using &lt;code&gt;-crf 29 -preset slow&lt;/code&gt; to keep file sizes low and quality
OK enough.&lt;/p&gt;
&lt;h2 id=&#34;not-enough-time&#34;&gt;Not enough time &lt;/h2&gt;
&lt;p&gt;However, there&amp;rsquo;s a major problem with &lt;code&gt;-preset slow&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s slow (duh). Like way too slow for me to process a single hour video in
less than 10 hours.&lt;/p&gt;
&lt;p&gt;After trying to process a single video in many weeks, I decided that purely
my Macbook with maybe 8 hours of availability to process videos was not
enough. I have to go farther with the amount of time available.&lt;/p&gt;
&lt;h2 id=&#34;an-idea&#34;&gt;An idea &lt;/h2&gt;
&lt;p&gt;After some thought, I decided that I will now have to use every other
computer that is available to me. Here&amp;rsquo;s the list of &lt;a href=&#34;https://jacksonchen666.com/misc/hostnames/&#34;&gt;hostnames&lt;/a&gt; of
computers I &lt;em&gt;could&lt;/em&gt; use for video processing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;imac&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stupid-desktop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stupid-laptop&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;actual-setup&#34;&gt;Actual setup &lt;/h2&gt;
&lt;p&gt;The actual setup was a bit different.&lt;/p&gt;
&lt;p&gt;I tried using &lt;code&gt;laptop-server&lt;/code&gt;, but I forgot it doesn&amp;rsquo;t have more RAM and
ffmpeg needed 2 or 4 gigabytes of RAM for some reason. So I use it as a
middleman of all the video files (using an external SSD), and as a place to
hold videos while I&amp;rsquo;m away.&lt;/p&gt;
&lt;p&gt;The computers were setup to run in a while loop, constantly going over all
videos that haven&amp;rsquo;t been processed yet, then processing them.&lt;/p&gt;
&lt;p&gt;Now for the other shenanigans.&lt;/p&gt;
&lt;h3 id=&#34;file-synchronization&#34;&gt;File synchronization &lt;/h3&gt;
&lt;p&gt;To get files from my SSD to the computers, I used &lt;code&gt;laptop-server&lt;/code&gt; as an
middleman with another SSD plugged in. It&amp;rsquo;s actually my old 2TB Sandisk
SSD before I needed to get a larger SSD for more crap.&lt;/p&gt;
&lt;p&gt;I would transfer video the file onto the SSD plugged into &lt;code&gt;laptop-server&lt;/code&gt;,
then make the processing computers pull the video files.&lt;/p&gt;
&lt;p&gt;I would then transfer the finished video files back onto &lt;code&gt;laptop-server&lt;/code&gt;,
then back to my actual SSD where I store my crap.&lt;/p&gt;
&lt;p&gt;This extra roundtrip is pretty inefficient, and I have (technically)
eliminated the extra roundtrip of transferring files onto the processing
computers. But this middleman place is kind of used as a place to hold
files before I get the time to actually grab it.&lt;/p&gt;
&lt;p&gt;It also allows for using a single &lt;code&gt;rsync&lt;/code&gt; command to grab all the processed
videos if all of it is on the middleman. And I did use &lt;code&gt;rsync&lt;/code&gt; for all of
this file transfer thing.&lt;/p&gt;
&lt;h3 id=&#34;if-ran-on-lockedmac&#34;&gt;If ran on &lt;code&gt;LockedMac&lt;/code&gt; &lt;/h3&gt;
&lt;p&gt;The actual time it took to process 1 hour of video is about 12 hours, which
means processing over 72 hours of video would take a long fucking time.&lt;/p&gt;
&lt;p&gt;So processing it on my Macbook (&lt;code&gt;LockedMac&lt;/code&gt;) would&amp;rsquo;ve been a major pain and
would take way too long.&lt;/p&gt;
&lt;p&gt;actually it will still take too long whatever just continue with this ok&lt;/p&gt;
&lt;h3 id=&#34;charging-for-stupid-laptop&#34;&gt;Charging for &lt;code&gt;stupid-laptop&lt;/code&gt; &lt;/h3&gt;
&lt;p&gt;Of course, due to resource constraints (lack of cables for charging
&lt;code&gt;stupid-laptop&lt;/code&gt;), I also had to rearrange my charging setup a little bit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Charging brick for &lt;code&gt;f&lt;/code&gt; had to be given to &lt;code&gt;stupid-laptop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Charging cable for &lt;code&gt;f&lt;/code&gt; was plugged into &lt;code&gt;stupid-desktop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Another charging cable was provided to &lt;code&gt;stupid-laptop&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was what I can do with what I had. Not much, and it will change when I
have to take the charging brick (although not much and not very disruptive).&lt;/p&gt;
&lt;h3 id=&#34;speedrunning-an-install-on-stupid-desktop&#34;&gt;Speedrunning an install on stupid-desktop &lt;/h3&gt;
&lt;p&gt;I didn&amp;rsquo;t have an OS installed on &lt;code&gt;stupid-desktop&lt;/code&gt;. So I had to install it.&lt;/p&gt;
&lt;p&gt;I followed my own blog post for &lt;a href=&#34;https://jacksonchen666.com/posts/2023-08-15/09-37-49/&#34;&gt;Alpine Linux with /boot/ and /
encrypted&lt;/a&gt;, and finished it before I had to leave to do
other things. It took about half an hour or an hour.&lt;/p&gt;
&lt;p&gt;Doing all the commands was quite manual work, so later I decided to make a
script that does all of it. It&amp;rsquo;s unlikely to be as robust as Alpine&amp;rsquo;s
&lt;code&gt;setup-disk&lt;/code&gt;, but hey it works (although I haven&amp;rsquo;t yet published it).&lt;/p&gt;
&lt;h3 id=&#34;networking-for-stupid-desktop&#34;&gt;Networking for &lt;code&gt;stupid-desktop&lt;/code&gt; &lt;/h3&gt;
&lt;p&gt;&lt;code&gt;stupid-desktop&lt;/code&gt; is a desktop computer. It does not have Wi-Fi, so I had to
give it my Ethernet cable so it can get access to the files.&lt;/p&gt;
&lt;p&gt;That meant for &lt;code&gt;LockedMac&lt;/code&gt;, it would have to use Wi-Fi. Which I had
experienced many problems in the past few days just trying to play games.&lt;/p&gt;
&lt;h3 id=&#34;storage-and-space-management&#34;&gt;Storage and space management &lt;/h3&gt;
&lt;p&gt;I also had to manage the space available and used.&lt;/p&gt;
&lt;p&gt;Each hour of unprocessed video is around 20 gigabytes. Yes, 20 gigabytes per
hour. That&amp;rsquo;s about 44444 kilobits per second. Very intense footage, and it
makes sense given that it&amp;rsquo;s also in 4k 60 fps.&lt;/p&gt;
&lt;p&gt;I could maybe give each computer 100 gigabytes before there is concern about
running out of space for processed videos. So currently, all computers have
100 gigabytes of videos to deal with.&lt;/p&gt;
&lt;h2 id=&#34;long-term-solutions&#34;&gt;Long-term solutions &lt;/h2&gt;
&lt;p&gt;This kind of setup was actually for the short term to process everything I
had right now and quickly (hopefully).&lt;/p&gt;
&lt;p&gt;The longer-term would be to get a computer that can handle a stupid amount
of CPU transcoding crap (and other intensive stuff), then use that for my
PeerTube and whatever else.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Recovering From Syncthing Deleting My Data</title>
      <link>https://jacksonchen666.com/posts/2023-11-19/22-49-58/</link>
      <pubDate>Sun, 19 Nov 2023 22:49:58 +0100</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-11-19/22-49-58/</guid>
      <description>&lt;h2 id=&#34;syncthing-fork&#34;&gt;Syncthing-fork &lt;/h2&gt;
&lt;p&gt;So I decided to try &lt;a href=&#34;https://github.com/Catfriend1/syncthing-android&#34;&gt;Syncthing-fork&lt;/a&gt; to see if it was any better
at battery life (spoilers: I have no idea).&lt;/p&gt;
&lt;p&gt;To my surprise, it has much more tweaking options and stuff, plus more
information.&lt;/p&gt;
&lt;p&gt;However, I now wanted to migrate from Syncthing to Syncthing-fork because
now I wanted to use Syncthing-fork.&lt;/p&gt;
&lt;p&gt;The easiest way was to just export the config from Syncthing and import it
into Syncthing-fork. Easy and done.&lt;/p&gt;
&lt;h2 id=&#34;data-loss&#34;&gt;Data loss &lt;/h2&gt;
&lt;p&gt;I explore around the app, saw a folder with the &amp;ldquo;revert local changes&amp;rdquo;
button, promptly pressed it and didn&amp;rsquo;t think about it more.&lt;/p&gt;
&lt;p&gt;Much later, I wanted to use my password manager to login to GitHub to find
the code that defines the mode function in libqalculate (actually the
specifics don&amp;rsquo;t matter, I just wanted to use my password manager). I open my
password manager app, and it says file not found.&lt;/p&gt;
&lt;p&gt;So I went ahead and looked in my Sync folder (at the root of user facing
internal storage). I found&amp;hellip; nothing but .stfolder and .stversions.&lt;/p&gt;
&lt;p&gt;Well, fuck. I&amp;rsquo;ve just lost data, and setting it all back up was going to be
a pain.&lt;/p&gt;
&lt;h3 id=&#34;complaints-sent&#34;&gt;Complaints sent &lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Catfriend1/syncthing-android/issues/1038#issue-2000479076&#34;&gt;I file an issue&lt;/a&gt; about the data loss I had, then move on to some
other thing.&lt;/p&gt;
&lt;h2 id=&#34;data-recovery&#34;&gt;Data recovery &lt;/h2&gt;
&lt;p&gt;Later, I look into the .stversions folder. And I realize that my data is
literally right there. It&amp;rsquo;s all there.&lt;/p&gt;
&lt;p&gt;So I made a copy of all my data in .stversions by doing an rsync from my
phone to my computer in Termux. I think it took over 5 hours.&lt;/p&gt;
&lt;p&gt;(In hindsight, I did not need to make a copy of 100GB of data, only the
filenames. But hey, who knows what the future can hold.)&lt;/p&gt;
&lt;p&gt;Anyways, looking at the filenames, I came up with this python program to
change the name to remove the syncthing time marker:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;filenames&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sub&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;(.*)~\d&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{8}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;-\d&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{6}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;(.*)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\1\2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;filenames&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MULTILINE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;list2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Code is under public domain/CC0-1.0 by the way)&lt;/p&gt;
&lt;p&gt;The program gets file contents from a file called &lt;code&gt;list&lt;/code&gt;, does some regex
(which should only remove the last date and time part in the filename added
by Syncthing) and writes it to &lt;code&gt;list2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Renaming the file was done with a shell script with a bunch of &lt;code&gt;mv&lt;/code&gt;
commands, not the python program.&lt;/p&gt;
&lt;p&gt;After making the (hyperspecific to my setup and files) shell script, I put
it on my phone and transferred it.&lt;/p&gt;
&lt;p&gt;I then also had to restart my phone to fix Syncthing-fork not using the
right private keys.&lt;/p&gt;
&lt;p&gt;And my data is back, and Syncthing-fork is working.&lt;/p&gt;
&lt;h2 id=&#34;bye-bye-syncthing-not-fork&#34;&gt;Bye bye Syncthing (not fork) &lt;/h2&gt;
&lt;p&gt;After all that, I just deleted Syncthing (not the fork one) from my phone,
because I already had another version (it was the fork version).&lt;/p&gt;
&lt;h2 id=&#34;post-mortem&#34;&gt;Post-mortem &lt;/h2&gt;
&lt;p&gt;So how did Syncthing just delete all my data? And keep it?&lt;/p&gt;
&lt;p&gt;Well, here&amp;rsquo;s how it went:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A receive only folder was set to the entire Sync folder&lt;/li&gt;
&lt;li&gt;I revert local changes&lt;/li&gt;
&lt;li&gt;It deletes (and saves a copy into .stversions)&lt;/li&gt;
&lt;li&gt;I realize the issue (trying to use my password manager)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have no idea how one of my receive only folders was set to the entire Sync
folder, but I guess it was in that state.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Last Few Days of My Server</title>
      <link>https://jacksonchen666.com/posts/2023-11-19/13-34-09/</link>
      <pubDate>Sun, 19 Nov 2023 13:34:09 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-11-19/13-34-09/</guid>
      <description>&lt;p&gt;In the last few days of my server, you may have noticed that it was down
sometimes. This is because in the last few days, I did multiple things that
kept leading to the downtime of my server. Oops.&lt;/p&gt;
&lt;h2 id=&#34;the-initial-issue&#34;&gt;The initial issue &lt;/h2&gt;
&lt;p&gt;On 2023-11-16, I was woken up by some emergency monitoring alerts
notifications at 04:00Z. I look at it, and the services I host was not
available (website, subdomains stuff, etc.).&lt;/p&gt;
&lt;p&gt;Because it was 04:00Z at the time, I just decided to put the investigation
off later.&lt;/p&gt;
&lt;p&gt;Later at about almost 07:00Z, I dig around and check what&amp;rsquo;s available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Onion services&lt;/li&gt;
&lt;li&gt;I2P eep sites&lt;/li&gt;
&lt;li&gt;Yggdrasil network stuff&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Based on what was available, I concluded that clearnet services (so going to
&lt;a href=&#34;https://jacksonchen666.com&#34;&gt;https://jacksonchen666.com&lt;/a&gt; and etc.) were broken.&lt;/p&gt;
&lt;p&gt;The issue I found was that &lt;code&gt;ddclient&lt;/code&gt; was just&amp;hellip; not working for some
unknown reason.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ddclient&lt;/code&gt; is used to change the IP address for my domains when my public IP
for the server changes. However, it just decided to remove the IP address
from my domains, resulting in the issue and downtime.&lt;/p&gt;
&lt;p&gt;I fixed it by getting my server to do the IP update again. Probably by
running &lt;code&gt;ddclient&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;(&lt;a href=&#34;https://status.jacksonchen666.com/issues/2023-11-16-server-ip-got-removed/&#34;&gt;Status post issue&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id=&#34;more-issues-arise&#34;&gt;More issues arise &lt;/h2&gt;
&lt;p&gt;So, after that was resolved, we had&amp;hellip; the same issue again!&lt;/p&gt;
&lt;p&gt;I have no idea why the issue keeps reoccurring. I just tried to do the same
thing again, running &lt;code&gt;ddclient&lt;/code&gt; and&amp;hellip; it immediately exiting. I just hoped
it worked.&lt;/p&gt;
&lt;p&gt;I continue trying to figure out the issue at around 08:00Z. I still have no
idea.&lt;/p&gt;
&lt;p&gt;I login to my deSEC account (on 2023-11-16 08:00Z) and look around. Then I
get hit with a 24 hour rate limit (on 2023-11-16 08:20Z).&lt;/p&gt;
&lt;p&gt;Yes, deSEC has rate limits that apply for 24 hours. In &lt;a href=&#34;https://desec.readthedocs.io/en/latest/rate-limits.html&#34;&gt;deSEC&amp;rsquo;s
documentation for rate limits&lt;/a&gt;, there is a rate limit name
called &lt;code&gt;user&lt;/code&gt; and it gives 2000 requests per day (or 24 hours).&lt;/p&gt;
&lt;p&gt;I have somehow exceeded that rate limit. I also did nothing to exceed that
rate limit.&lt;/p&gt;
&lt;p&gt;It seemed weird, but my server was luckily online with the web, so I just
decided to wait out the rate limit.&lt;/p&gt;
&lt;h3 id=&#34;my-desec-account-the-next-day&#34;&gt;My deSEC account, the next day &lt;/h3&gt;
&lt;p&gt;After waiting for 24 hours (now 2023-11-17 09:30Z), I decided to try to
login again. And I am still under a 24 hour rate limit.&lt;/p&gt;
&lt;p&gt;At this point, I decided to email deSEC support for this issue, asking why I
still have a 24 hour rate limit.&lt;/p&gt;
&lt;p&gt;I then receive an email back saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Devices with the IP address [laptop-server IPv6 address 1] and
[laptop-server IPv6 address 2] are doing thousands of dynDNS requests,
sometimes several times per second.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(That&amp;rsquo;s a partial quote, and I have replaced the IPv6 addresses with the
actual device. It was originally an actual IPv6 address)&lt;/p&gt;
&lt;p&gt;I checked the server and&amp;hellip; oh&amp;hellip;&lt;/p&gt;
&lt;p&gt;The server has multiple instances of &lt;code&gt;ddclient&lt;/code&gt;, all of them quickly
retrying (within less than 60 seconds), all trying to do dynDNS requests,
then causing my account to be rate limited because of all those requests
adding up.&lt;/p&gt;
&lt;p&gt;Turns out, &lt;code&gt;ddclient&lt;/code&gt; defaults to being a daemon, not being foreground. I
assumed that when I ran &lt;code&gt;ddclient&lt;/code&gt;, it would just stick output to my
terminal. Nope, it just went on its own.&lt;/p&gt;
&lt;p&gt;So here&amp;rsquo;s how I got into the rate limit again:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I ran &lt;code&gt;ddclient&lt;/code&gt; without the foreground flag&lt;/li&gt;
&lt;li&gt;Multiple instances of &lt;code&gt;ddclient&lt;/code&gt; were just spamming the deSEC API&lt;/li&gt;
&lt;li&gt;That cause it to hit the worst-case rate limits&lt;/li&gt;
&lt;li&gt;Repeat&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I just went ahead and stopped the &lt;code&gt;ddclient&lt;/code&gt; service, and killed all
&lt;code&gt;ddclient&lt;/code&gt; processes.&lt;/p&gt;
&lt;p&gt;The problem should be solved, so I went ahead and asked deSEC support:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can the rate limit on my account be removed earlier?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They responded:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That&amp;rsquo;s not simple on our side, so we would only do it in extraordinary
circumstances.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So I decided to come back after the rate limit again.&lt;/p&gt;
&lt;h2 id=&#34;even-more-issues&#34;&gt;Even more issues &lt;/h2&gt;
&lt;p&gt;I earlier stopped all &lt;code&gt;ddclient&lt;/code&gt; processes. However, on 2023-11-18 11:40Z,
my server IP address actually changed and there was nothing to fix that
issue automatically (not even &lt;code&gt;ddclient&lt;/code&gt; because I stopped it).&lt;/p&gt;
&lt;p&gt;So of course, when I noticed the issue (at around 2023-11-18 14:10Z), I went
ahead and just started &lt;code&gt;ddclient&lt;/code&gt; again. And it&amp;rsquo;s fixed.&lt;/p&gt;
&lt;p&gt;(&lt;a href=&#34;https://status.jacksonchen666.com/issues/2023-11-18-ip-address-wrong/&#34;&gt;Status post issue&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id=&#34;hopefully-no-more-issues&#34;&gt;Hopefully no more issues &lt;/h2&gt;
&lt;p&gt;Now the server should be back to normal, and everything should be back to
normal. Things should be running just fine as before the initial issue.&lt;/p&gt;
&lt;p&gt;Upon reviewing the past few days and the mistakes I made, I&amp;rsquo;m not sure if I
can say that I am without issues (there&amp;rsquo;s another blog post about another
mistake coming soon(tm)).&lt;/p&gt;
&lt;h2 id=&#34;recap&#34;&gt;Recap &lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Server removed IP address&lt;/li&gt;
&lt;li&gt;Alerts at 2023-11-16 04:00Z&lt;/li&gt;
&lt;li&gt;I fixed the issue&lt;/li&gt;
&lt;li&gt;I was rate limited on deSEC (2023-11-16 08:20Z)&lt;/li&gt;
&lt;li&gt;Next day, I try to login to deSEC, still rate limited (2023-11-17 09:30Z)&lt;/li&gt;
&lt;li&gt;I found the issue for the second rate limit, multiple instances of
&lt;code&gt;ddclient&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;I wait for the rate limit&lt;/li&gt;
&lt;li&gt;The server IP changes, and &lt;code&gt;ddclient&lt;/code&gt; isn&amp;rsquo;t running (2023-11-18 11:40Z)&lt;/li&gt;
&lt;li&gt;I fix that issue (2023-11-18 14:10Z)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Hey, I&#39;m trying to juggle a million things. Be patient, OK?</title>
      <link>https://jacksonchen666.com/posts/2023-11-14/16-46-27/</link>
      <pubDate>Tue, 14 Nov 2023 16:46:27 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-11-14/16-46-27/</guid>
      <description>&lt;p&gt;You may have noticed that it has been 6 days since my last blog post. The
thing is, I have like a million giant things to juggle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Drew DeVault captions (I&amp;rsquo;m updating all current captions)&lt;/li&gt;
&lt;li&gt;Reinformation wiki (it isn&amp;rsquo;t online yet, but there&amp;rsquo;s still work to be
done)&lt;/li&gt;
&lt;li&gt;My servers (maintaining them)&lt;/li&gt;
&lt;li&gt;My life (maintaining it)&lt;/li&gt;
&lt;li&gt;Switching to SSH for git commit signing?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s at least some of the things I&amp;rsquo;m currently dealing with, maybe not
today and maybe yesterday.&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s why I haven&amp;rsquo;t been doing blog posts. Because I&amp;rsquo;ve been doing
everything else now, so there&amp;rsquo;s not much I can do about blog posts. Plus I
don&amp;rsquo;t have ideas.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tridactyl with iTerm2</title>
      <link>https://jacksonchen666.com/posts/2023-11-08/22-21-11/</link>
      <pubDate>Wed, 08 Nov 2023 22:21:11 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-11-08/22-21-11/</guid>
      <description>&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: This post contains multiple licenses in use. The different license
use is in &lt;a href=&#34;#script&#34;&gt;the script section&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heads up&lt;/strong&gt;: This is a quick infodump near midnight. Expect severe
incoherence.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tridactyl/tridactyl&#34;&gt;Tridactyl&lt;/a&gt; is basically vim keys in Firefox. &lt;a href=&#34;https://iterm2.com/&#34;&gt;iTerm2&lt;/a&gt; is a
terminal emulator.&lt;/p&gt;
&lt;p&gt;Tridactyl supports a special feature: you can use your own editor in the terminal,
something like vim.&lt;/p&gt;
&lt;p&gt;I wanted to do something like that, but for some reason, I just couldn&amp;rsquo;t
figure it out. Until today.&lt;/p&gt;
&lt;p&gt;Today, I have a script and lots more information to bring to you to the
table. More specifically, how to setup Tridactyl with iTerm2.&lt;/p&gt;
&lt;h2 id=&#34;complications-with-iterm2&#34;&gt;Complications with iTerm2 &lt;/h2&gt;
&lt;p&gt;iTerm2, from what I can tell, is a macOS application. It does not behave
like on Linux, where you can run the program to start a terminal, then the
program exits when the terminal exits.&lt;/p&gt;
&lt;p&gt;This presented an interesting problem to solve: How do you make iTerm2
behave like a program which would open the terminal, and exits when the
terminal is closed?&lt;/p&gt;
&lt;p&gt;Well, the answer is I made a Python script using the Python API for iTerm2.
That&amp;rsquo;s a thing, and you have to enable it too.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#script&#34;&gt;Script for that thing&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;setting-up-tridactyl&#34;&gt;Setting up Tridactyl &lt;/h2&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install&lt;/li&gt;
&lt;li&gt;Setup native messaging&lt;/li&gt;
&lt;li&gt;Setup editor command&lt;/li&gt;
&lt;li&gt;???&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;installing-tridactyl&#34;&gt;Installing Tridactyl &lt;/h3&gt;
&lt;p&gt;Easy. Go to the &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/tridactyl-vim/&#34;&gt;Firefox add-ons store&lt;/a&gt; and add to Firefox.&lt;/p&gt;
&lt;h3 id=&#34;setup-native-messaging&#34;&gt;Setup native messaging &lt;/h3&gt;
&lt;p&gt;Setting up Tridactyl native messaging was easy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Type &lt;code&gt;:installnative&lt;/code&gt; in the browser&lt;/li&gt;
&lt;li&gt;Paste the &lt;code&gt;curl | sh&lt;/code&gt; command into your terminal&lt;/li&gt;
&lt;li&gt;Let it do its thing&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;:native&lt;/code&gt; in the browser to check if it works&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Of course, running with a Firefox based browser that is actually not Firefox
(it&amp;rsquo;s &lt;a href=&#34;https://librewolf.net/&#34;&gt;LibreWolf&lt;/a&gt;) and uses a different path for native messaging and
everything.&lt;/p&gt;
&lt;p&gt;So I had to replace step 3 with &amp;ldquo;Let it do its thing, then copy the files
over to the approprivate directory&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I ran something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp ~/Library/Application&lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;Support/Mozilla/NativeMessagingHosts/tridactyl.json ~/Library/Application&lt;span class=&#34;se&#34;&gt;\ &lt;/span&gt;Support/LibreWolf/NativeMessagingHosts/tridactyl.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;setup-editor&#34;&gt;Setup editor &lt;/h3&gt;
&lt;p&gt;I had to set it to something like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;:set editorcmd /opt/homebrew/bin/bash -c &amp;#34;&amp;#39;/Users/jackson/Library/Application Support/iTerm2/iterm2env/versions/3.10.4/bin/python3&amp;#39; &amp;#39;/Users/jackson/Library/Application Support/iTerm2/Scripts/neovim_in_new_window.py&amp;#39; %f %l %c&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Replace
&lt;code&gt;/Users/jackson/Library/Application Support/iTerm2/iterm2env/versions/3.10.4/bin/python3&lt;/code&gt;
with whatever is correct by first checking
&lt;code&gt;/Users/jackson/Library/Application Support/iTerm2/iterm2env/versions/&lt;/code&gt;
for folders, then finding the &lt;code&gt;python3&lt;/code&gt; executable.&lt;/p&gt;
&lt;p&gt;Because of &lt;a href=&#34;https://github.com/tridactyl/tridactyl/issues/684&#34;&gt;some weirdness in macOS&lt;/a&gt;, you must use absolute paths for
everything.&lt;/p&gt;
&lt;h3 id=&#34;debugging-editor&#34;&gt;Debugging &lt;code&gt;:editor&lt;/code&gt; &lt;/h3&gt;
&lt;p&gt;If running &lt;code&gt;:editor&lt;/code&gt; gives you something like &lt;code&gt;TypeError: e2 is null&lt;/code&gt;, it
probably means you setup the &lt;code&gt;editorcmd&lt;/code&gt; incorrectly.&lt;/p&gt;
&lt;p&gt;Run the following in your browser&amp;rsquo;s Tridactyl:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;:set logging.native debug
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then check the console for the current webpage you&amp;rsquo;re on, then run &lt;code&gt;:editor&lt;/code&gt;
again.&lt;/p&gt;
&lt;p&gt;When finished debugging, run the following to revert debugging config:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;:unset logging.native
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;about-the-script&#34;&gt;About the script &lt;/h2&gt;
&lt;p&gt;I had to read a lot of the iTerm2 Python API documentation for this&amp;hellip;&lt;/p&gt;
&lt;p&gt;So, you cannot simply launch the iTerm2 binary and expect terminal windows
to show up.&lt;/p&gt;
&lt;p&gt;So I had to make a script that kinda emulates the terminal emulators on
Linux, where you can run the program, a terminal shows up, then the program
exits on terminal closing. That&amp;rsquo;s what the script does basically.&lt;/p&gt;
&lt;p&gt;It also takes character numbers and moves the cursor to the right place.&lt;/p&gt;
&lt;h2 id=&#34;script&#34;&gt;The Script &lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: This code is licensed under the MIT license. The rest has its own
license on &lt;a href=&#34;https://jacksonchen666.com/license/&#34;&gt;the licensing page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heads up: This code is hardcoded to my configuration.&lt;/strong&gt; Replace all
absolute paths as necessary, and replace &amp;ldquo;LibreWolf&amp;rdquo; with &amp;ldquo;Firefox&amp;rdquo; if you
use Firefox instead.&lt;/p&gt;
&lt;p&gt;I put this file at
&lt;code&gt;~/Library/Application Support/iTerm2/Scripts/neovim_in_new_window.py&lt;/code&gt;. It
also needs the Python API to be enabled in iTerm2&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env python3.10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# vim: tw=0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# tridactyl :editor but with iterm2 (which doesn&amp;#39;t have the right behavior so&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# this is basically a wrapper script for that)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# https://github.com/tridactyl/tridactyl/issues/4697&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# https://github.com/tridactyl/tridactyl/issues/684&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# MIT License&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Copyright (c) 2023 JacksonChen666&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Permission is hereby granted, free of charge, to any person obtaining a copy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# of this software and associated documentation files (the &amp;#34;Software&amp;#34;), to deal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# in the Software without restriction, including without limitation the rights&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# copies of the Software, and to permit persons to whom the Software is&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# furnished to do so, subject to the following conditions:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# The above copyright notice and this permission notice shall be included in all&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# copies or substantial portions of the Software.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# THE SOFTWARE IS PROVIDED &amp;#34;AS IS&amp;#34;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# SOFTWARE.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;iterm2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;subprocess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This script was created with the &amp;#34;basic&amp;#34; environment which does not support adding dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# with pip.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Your code goes here. Here&amp;#39;s a bit of example code that adds a tab to the current window:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iterm2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;async_get_app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#filename, line, character = &amp;#34;&amp;#34;, 0, 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;character&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#if len(sys.argv) &amp;gt;= 2:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#    filename = sys.argv[1]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#if len(sys.argv) &amp;gt;= 3:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#    line = sys.argv[2]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#if len(sys.argv) &amp;gt;= 4:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#    character = sys.argv[3]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# defaults already assigned earlier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/opt/homebrew/bin/bash -l -i -c &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/opt/homebrew/bin/nvim &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &amp;#39;+normal!&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;Gzv&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;character&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;|&amp;#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;new_window&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iterm2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Window&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;async_create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new_window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;async_activate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raise_all_windows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ignoring_other_apps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new_window&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;async_activate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#print(new_window.current_tab)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iterm2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FocusMonitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;monitor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;# TODO: make it trigger if it&amp;#39;s the last window and it closes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;monitor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;async_get_next_update&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new_window&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;windows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;# end&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# focus web browser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;subprocess&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;osascript&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;-e&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;tell application &amp;#34;LibreWolf&amp;#34; to activate&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;iterm2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run_until_complete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;does-it-work&#34;&gt;Does it work? &lt;/h2&gt;
&lt;p&gt;Yes!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>OBS Multi Track Audio Setup</title>
      <link>https://jacksonchen666.com/posts/2023-11-06/20-58-20/</link>
      <pubDate>Mon, 06 Nov 2023 20:58:20 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-11-06/20-58-20/</guid>
      <description>&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: There is a &lt;a href=&#34;https://obsproject.com/kb/multiple-audio-track-recording-guide&#34;&gt;guide on the OBS project website&lt;/a&gt; which is
basically this blog post. You can use that if you want.&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction &lt;/h2&gt;
&lt;p&gt;In &lt;a href=&#34;https://obsproject.com/&#34;&gt;OBS Studio&lt;/a&gt;, you can have up to 6 audio tracks, all of which can be
recorded into the recorded video file.&lt;/p&gt;
&lt;p&gt;With separate audio tracks, you can have things like your computer sounds,
microphone sounds, and music, all on a separate audio track, allowing you to
individually mess with each audio track post-production.&lt;/p&gt;
&lt;p&gt;Now, how do you do audio tracks?&lt;/p&gt;
&lt;h2 id=&#34;advanced-audio-properties&#34;&gt;Advanced Audio Properties &lt;/h2&gt;
&lt;p&gt;Look at your Audio Mixer dock.&lt;/p&gt;
&lt;p&gt;It should have some audio outputs, having your computer and microphone audio
(or maybe something else). To make them separate into audio tracks, click on
the 3 dots menu and click &amp;ldquo;Advanced Audio Properties&amp;rdquo;.&lt;/p&gt;
&lt;picture&gt;
    &lt;source srcset=&#39;https://jacksonchen666.com/posts/2023-11-06/20-58-20/obs-audio-dock-dropdown-menu-light.png&#39;
    media=&#34;(prefers-color-scheme: light)&#34;&gt;
    &lt;img src=&#39;https://jacksonchen666.com/posts/2023-11-06/20-58-20/obs-audio-dock-dropdown-menu.png&#39;
    alt=&#39;OBS Studio. Cursor highlights &#34;Advacned Audio Properties&#34; from a dropdown menu in the Audio Mixer.&#39;&gt;
&lt;/picture&gt;
&lt;p&gt;Now you should see a new window for the Advanced Audio Properties:&lt;/p&gt;
&lt;picture&gt;
    &lt;source srcset=&#39;https://jacksonchen666.com/posts/2023-11-06/20-58-20/obs-advanced-audio-properties-light.png&#39;
    media=&#34;(prefers-color-scheme: light)&#34;&gt;
    &lt;img src=&#39;https://jacksonchen666.com/posts/2023-11-06/20-58-20/obs-advanced-audio-properties.png&#39;
    alt=&#34;OBS Studio, Advanced Audio Properties window.&#34;&gt;
&lt;/picture&gt;
&lt;p&gt;Next thing is to manage the audio tracks each audio thing outputs to.&lt;/p&gt;
&lt;h2 id=&#34;selecting-audio-tracks-for-audio-outputs&#34;&gt;Selecting audio tracks for audio outputs &lt;/h2&gt;
&lt;p&gt;Tip: Video players (and video services) default to using the first audio
track&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, so use the first audio track for all audio you want to have by
default (computer, mic, and music audio combined), and use the rest for
whatever you want (unfiltered mic, only computer audio, etc.).&lt;/p&gt;
&lt;p&gt;In my case, I want to include a filtered microphone output, and my computer
audio in my video for viewers. I do not want to include an unfiltered
microphone output to the viewers by default.&lt;/p&gt;
&lt;p&gt;That means I would have to include my computer and filtered microphone into
Audio Track 1. The rest of the 5 tracks I can just use for whatever, like a
dedicated audio track for computer sounds, filtered microphone, and
unfiltered microphone (for better post-production quality, if there even is
any kind of post-production).&lt;/p&gt;
&lt;p&gt;So for me, it looks something like this:&lt;/p&gt;
&lt;picture&gt;
    &lt;source srcset=&#39;https://jacksonchen666.com/posts/2023-11-06/20-58-20/obs-advanced-audio-properties-light.png&#39;
    media=&#34;(prefers-color-scheme: light)&#34;&gt;
    &lt;img src=&#39;https://jacksonchen666.com/posts/2023-11-06/20-58-20/obs-advanced-audio-properties.png&#39;
    alt=&#34;OBS Studio, Advanced Audio Properties window.&#34;&gt;
&lt;/picture&gt;
&lt;p&gt;My computer sounds and microphone output to Audio Track 1, along with 3
dedicated audio tracks for each output. The unfiltered microphone (named
&amp;ldquo;Mic/Aux Unfiltered&amp;rdquo; in the picture) does not output to Audio Track 1, which
is quite important, because I do not want it included in the default audio
track.&lt;/p&gt;
&lt;p&gt;Your actual setup may differ from mine. That&amp;rsquo;s fine, as long as it works for
you.&lt;/p&gt;
&lt;h2 id=&#34;video-output-settings&#34;&gt;Video output settings &lt;/h2&gt;
&lt;p&gt;After doing the checkboxes, you should also do the same for checkboxes in
your video output settings. Select the audio tracks you want to save, which
should be the audio tracks you used and selected in the Advanced Audio
Properties.&lt;/p&gt;
&lt;p&gt;In Simple mode for Output mode, you can tick boxes.&lt;/p&gt;
&lt;p&gt;In Advanced mode for Output mode, you can tick boxes in the Recording
section, and name the audio tracks in the Audio section.&lt;/p&gt;
&lt;h3 id=&#34;selecting-audio-track-for-streaming&#34;&gt;Selecting audio track for streaming &lt;/h3&gt;
&lt;p&gt;(Applicable to advanced output mode only)&lt;/p&gt;
&lt;p&gt;For streaming, you can only choose 1 audio track to stream.&lt;/p&gt;
&lt;p&gt;If you followed the earlier tip, you can just use audio track 1. If you
didn&amp;rsquo;t follow the earlier tip, determine or create an audio track where all
the audio you want is combined into 1 track. Then select that track.&lt;/p&gt;
&lt;h2 id=&#34;recap&#34;&gt;Recap &lt;/h2&gt;
&lt;p&gt;OBS Audio Tracks can be helpful to separate different audio outputs from one
another. What you do is tick boxes in Advanced Audio Properties and Audio
Tracks in your output.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Well, from at least what I can tell. The default track seems to be the
first track, but that could be different for different files. But using
the first audio track has worked for me.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>The Shift Key</title>
      <link>https://jacksonchen666.com/posts/2023-10-27/21-41-43/</link>
      <pubDate>Fri, 27 Oct 2023 21:41:43 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-10-27/21-41-43/</guid>
      <description>&lt;p&gt;The shift key. You can use it to make characters UPPERCASE. or you could not
use it and be lowercase.&lt;/p&gt;
&lt;h2 id=&#34;physical-shift-key-like-behaviors&#34;&gt;Physical shift key like behaviors &lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s something you might not know: You can hold the shift key on your
smartphone. Yes, hold it, and type in uppercase until you release it. It
acts like a physical shift key when held down.&lt;/p&gt;
&lt;p&gt;However by default, the shift key on smartphone is sticky for usability
reasons. Sticky as in you press it and it stays on for the next character.
If you double tap the shift key though, it will enable basically the
equivalent of caps lock.&lt;/p&gt;
&lt;p&gt;(You can have sticky keys on your computers too. If you were on Windows and
pressed the shift key 5 times in a row, you will get annoyed by a prompt
from Windows asking if you want to enable sticky keys.)&lt;/p&gt;
&lt;p&gt;Sticky keys out of the way, here&amp;rsquo;s a quick recap:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You can use your shift key on your smartphone keyboard like a physical
shift key&lt;/li&gt;
&lt;li&gt;Shift keys are sticky by default on smartphone keyboards&lt;/li&gt;
&lt;li&gt;Double tap the shift key to turn on caps lock&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You&amp;rsquo;ve probably known the last 2 by now if you&amp;rsquo;ve used a smartphone
keyboard. You probably didn&amp;rsquo;t know about the first point though.&lt;/p&gt;
&lt;h2 id=&#34;chinese-smartphone-keyboards&#34;&gt;Chinese smartphone keyboards &lt;/h2&gt;
&lt;p&gt;Now on Android phones made by Chinese phone manufactures. The software is&amp;hellip;
not great. Like most of it is not great, and also quite foreign in
behaviors.&lt;/p&gt;
&lt;p&gt;Two notable different behaviors in keyboards made by Chinese manufactures
is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You cannot hold the shift key down, it only reacts when you release on
the shift key.&lt;/li&gt;
&lt;li&gt;Caps lock by default, not single character shift by default.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These behaviors may vary between Chinese phone manufactures, but I&amp;rsquo;ve
absolutely encountered that behaviors on what I call &amp;ldquo;Chinese phones&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;These behaviors may come from extreme time constraints, or just the
developers were somehow not exposed to the behaviors on iPhones or other
Android phones, or they had an &amp;ldquo;innovative&amp;rdquo; idea.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fixing an Email Problem</title>
      <link>https://jacksonchen666.com/posts/2023-10-24/22-28-24/</link>
      <pubDate>Tue, 24 Oct 2023 22:28:24 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-10-24/22-28-24/</guid>
      <description>&lt;h2 id=&#34;something-is-missing&#34;&gt;Something is missing &lt;/h2&gt;
&lt;p&gt;On 2023-10-20, I noticed that my server wasn&amp;rsquo;t sending me emails.&lt;/p&gt;
&lt;p&gt;Usually, my server sends me sysadmin related emails like server updates and
stuff.&lt;/p&gt;
&lt;p&gt;But I realized for the last few days, my server has not sent me a single
email ever since. Not an alert, not an update, not anything really.&lt;/p&gt;
&lt;p&gt;I made that realization after my server has stopped emailing me for 10 days.
Which to be honest is quite a bit, but they weren&amp;rsquo;t extremely important
emails.&lt;/p&gt;
&lt;p&gt;I tried to figure out what was going on, but for some reason I could not
figure it out. For what I knew, the server was apparently trying to send
some emails and it didn&amp;rsquo;t work. The emails were stuck in the queue, being
retried and retried and retried.&lt;/p&gt;
&lt;p&gt;More specifically, it seemed like it was sending to the wrong email server.
It was sending to the receiving server, not the sending server.&lt;/p&gt;
&lt;p&gt;I did not understand how this happened. I also did not know what was the
source of the problem. Basically, I was completely clueless, unable to
understand problem, and left without emails to receive from my server.&lt;/p&gt;
&lt;h2 id=&#34;desperately-searching-for-a-solution&#34;&gt;Desperately searching for a solution &lt;/h2&gt;
&lt;p&gt;I tried and tried, but found nothing.&lt;/p&gt;
&lt;p&gt;I decided on last straw to ask my email provider (Migadu) why my emails were
not sending.&lt;/p&gt;
&lt;p&gt;I provided some logs, and went to play some osu!. Then when I checked my
email, there it was! A response.&lt;/p&gt;
&lt;p&gt;They came back asking for my IP addresses, after looking at the postfix logs
and thinking that I might be IP banned.&lt;/p&gt;
&lt;p&gt;I provided the IP addresses, and they came back with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You&amp;rsquo;ve disabled sending to noreply address, so that [email] is getting
rejected.&lt;/p&gt;
&lt;p&gt;The other machine is sending to other addresses.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oh.&lt;/p&gt;
&lt;p&gt;So basically, imac was sending emails successfully. Those emails were some
test emails that I had made to test that imac&amp;rsquo;s email was working.&lt;/p&gt;
&lt;p&gt;On laptop-server, it was trying to send a &amp;ldquo;bounced email&amp;rdquo; notice to the
sender, who was&amp;hellip; noreply!&lt;/p&gt;
&lt;p&gt;I have setup noreply to not accept any emails. If you try, it won&amp;rsquo;t work.
The only thing the noreply email is allowed to do is send emails from any
address on my domain.&lt;/p&gt;
&lt;p&gt;So, now I disable &lt;a href=&#34;https://github.com/infertux/zeyple&#34;&gt;zeyple&lt;/a&gt; on laptop-server and send a test email. And
it works.&lt;/p&gt;
&lt;p&gt;So I respond with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oh&amp;hellip; I just realized that, it&amp;rsquo;s sending to the wrong addresses.&lt;/p&gt;
&lt;p&gt;Sending the email to my receivable address gets me an email, so I guess
it&amp;rsquo;s another issue with my setup somehow.&lt;/p&gt;
&lt;p&gt;Thanks for your help though!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have realized that I did not read &lt;code&gt;mailq&lt;/code&gt; properly. Turns out the
&lt;code&gt;MAILER-DAEMON&lt;/code&gt; part was the sender and I thought the receiver part was
actually the sender.&lt;/p&gt;
&lt;h2 id=&#34;how-this-issue-even-happened&#34;&gt;How this issue even happened &lt;/h2&gt;
&lt;p&gt;I have setup my postfix server to encrypt emails that are being sent. This
was done with PGP. I used &lt;a href=&#34;https://github.com/infertux/zeyple&#34;&gt;zeyple&lt;/a&gt;, which requires the gpg Python module.&lt;/p&gt;
&lt;p&gt;Unfortunately, in doing some cleanup with the &lt;code&gt;autoremove&lt;/code&gt; command in dnf,
dnf has removed the gpg Python module. It was basically a cascading failure:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The zeyple program fails to run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Postfix tries to send an email, but running the zeyple program means exit
code non-zero.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Postfix tries to send an email to the sender, saying the email could not
be sent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The email addresses postfix was trying to send to would not accept
emails, either because the email address didn&amp;rsquo;t exist or doesn&amp;rsquo;t accept
emails.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Postfix now constantly retries to send the bounced email notification to
nobody, and gets rejected on every time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So if something went wrong with my server that required an email, I probably
would not have heard it.&lt;/p&gt;
&lt;h2 id=&#34;why-imac-worked&#34;&gt;Why imac worked &lt;/h2&gt;
&lt;p&gt;Because it did not encrypt emails to me using zeyple. The problem was in the
email encryption on laptop-server, due to a missing Python module. imac had
none of that. So it had no issues.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion &lt;/h2&gt;
&lt;p&gt;So what did I learn?&lt;/p&gt;
&lt;p&gt;Well:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I need to &lt;a href=&#34;https://jacksonchen666.com/posts/2023-10-18/19-50-24/&#34;&gt;learn to read carefully&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have ignored one important aspect of mailq: it includes the sender and
the receiver, and I have ignored the sender because it did not look like
an email address. It was &amp;ldquo;MAILER-DAEMON&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This issue could&amp;rsquo;ve been entirely avoided if I had made a package for it
with the proper dependencies. The root cause of this issue is because a
python module got removed, so an important program could not be run
anymore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I should probably centralize my logging, but I&amp;rsquo;m not actually sure how to
do that with zeyple.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And thanks to Dejan at Migadu for helping me get on the right track.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Starting at the Wrong Place</title>
      <link>https://jacksonchen666.com/posts/2023-10-18/19-50-24/</link>
      <pubDate>Wed, 18 Oct 2023 19:50:24 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-10-18/19-50-24/</guid>
      <description>&lt;p&gt;I think there&amp;rsquo;s something that&amp;rsquo;s common between everyone that I&amp;rsquo;ve seen
quite a bit in technology: Nobody reads. At least, people read, but they
find the starting point too quickly, and land on the wrong starting point.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had times where I read something, then completely misunderstand it,
proceed to continue on the basis of that misunderstanding, and then realize
later that I&amp;rsquo;ve misunderstood the thing.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;ve thought of something: Can misreadings be attributed to
incorrect/poor emphasis in the design of things?&lt;/p&gt;
&lt;h2 id=&#34;finding-a-kernel-bug&#34;&gt;Finding a kernel bug &lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say you run into some problem with the Linux kernel. You go and report
it, and then you get told to &amp;ldquo;bisect the bug&amp;rdquo; and linked to the
&lt;a href=&#34;https://docs.kernel.org/admin-guide/bug-bisect.html&#34;&gt;documentation about bisecting kernel bugs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, you the reader, do as I instruct before you go do it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open that page&lt;/li&gt;
&lt;li&gt;Casually find the first step in the process (no looking harder or
something)&lt;/li&gt;
&lt;li&gt;Come back to this page&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After you done that, I have a question:&lt;/p&gt;
&lt;p&gt;What were your eyes drawn to first?&lt;/p&gt;
&lt;p&gt;If you were drawn to the &lt;code&gt;git bisect start&lt;/code&gt; command, you started on the
wrong step. And I won&amp;rsquo;t fault you for doing that.&lt;/p&gt;
&lt;p&gt;There are multiple issues with that page:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The list of steps is an unordered list. This makes noticing &amp;ldquo;you&amp;rsquo;re on the
wrong step&amp;rdquo; harder, and has definitely lead to confusion.&lt;/li&gt;
&lt;li&gt;The first bullet point does not stand out, but the &lt;code&gt;git bisect start&lt;/code&gt;
command does stand out. That&amp;rsquo;s probably why your eyes was drawn to that
first.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;finding-the-first-line-of-my-bio&#34;&gt;Finding the first line of my bio &lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s my bio, roughly to how it is shown in Tusky:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;jackson ☑️ &lt;br&gt;
@jacksonchen666&lt;br&gt;
word, annoy, joke, question mark&lt;/p&gt;
&lt;p&gt;serial bookmarker (18k), excessive screenshoter, data hoarder, computer
user, self hosted server manager, minecraft accounts holder, mediocre
circle clicker, fruit catcher, Phigros player&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What was your eye drawn to first?&lt;/p&gt;
&lt;p&gt;(The rest of the bio is trimmed off, since that&amp;rsquo;s not the main topic.)&lt;/p&gt;
&lt;p&gt;If you missed &amp;ldquo;word, annoy, joke, question mark&amp;rdquo;, well I wouldn&amp;rsquo;t blame it
on you either. I would&amp;rsquo;ve missed that, and in fact, I did!&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s big spacing after the display name, username, and the first line of
my bio.&lt;/p&gt;
&lt;p&gt;You might have quickly skipped to the second line of my bio (&amp;ldquo;serial
bookmarker[&amp;hellip;]&amp;rdquo;) as your eyes was drawn towards that when looking for the
bio, but in fact, that was not where the bio started. It was grouped with
the display name and username.&lt;/p&gt;
&lt;p&gt;The problem here is separation. There was no immediately clear separation
with the names stuff from the bio. No lines, nothing. Just suddenly, bio.&lt;/p&gt;
&lt;h2 id=&#34;sourcehut&#34;&gt;SourceHut &lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s your goals:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find the &amp;ldquo;Permalink&amp;rdquo; link&lt;/li&gt;
&lt;li&gt;Find the &amp;ldquo;Summary&amp;rdquo; link&lt;/li&gt;
&lt;li&gt;Find the owner of the git repository (&amp;quot;~jacksonchen666&amp;quot;)&lt;/li&gt;
&lt;li&gt;Find line 4 of the file&lt;/li&gt;
&lt;li&gt;Do all of the above with just your eyes&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you&amp;rsquo;re ready, you can head to &lt;a href=&#34;https://git.sr.ht/~jacksonchen666/jacksonchen666.com/tree/master/item/.gitignore&#34;&gt;the .gitignore file for my
website&lt;/a&gt;, do all of those, and try timing yourself (in your head
is fine too).&lt;/p&gt;
&lt;p&gt;After you done that, here&amp;rsquo;s my question: How fast/easy was that?&lt;/p&gt;
&lt;p&gt;Did you have to look at the entire page for a specific thing, or did you hit
the right thing very quickly?&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re not used to looking at sourcehut pages, you may had to take some
more time to search the page. If you use sourcehut quite a bit though, you
would know where you want to look for what you want, and you would do that
with minimal error and quickly.&lt;/p&gt;
&lt;p&gt;When &lt;a href=&#34;https://drewdevault.com/2019/03/04/sourcehut-design.html&#34;&gt;emphasis on certain elements are considered&lt;/a&gt;, it can
be easier to find things, or there wouldn&amp;rsquo;t be any issues with finding
things.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion &lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve explored some stuff where people can get confused on where the
&amp;ldquo;starting point&amp;rdquo; is at. I also shown sourcehut and how it tries to not be
too confusing, and easy to find the things you want.&lt;/p&gt;
&lt;p&gt;If you only read the start of paragraphs of this blog post, then you
might&amp;rsquo;ve missed a lot. That kind of misreading is not included, only &amp;ldquo;oh
wait, I looked at the wrong thing&amp;rdquo; kind of thing.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Sorry if you&amp;rsquo;re vision impaired. I&amp;rsquo;m not sure of an alternative.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>100 Days to Offload Finally Complete</title>
      <link>https://jacksonchen666.com/posts/2023-10-18/17-56-33/</link>
      <pubDate>Wed, 18 Oct 2023 17:56:33 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-10-18/17-56-33/</guid>
      <description>&lt;p&gt;This is the final update on the 100 days to offload challenge for 2023.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m on &lt;a href=&#34;https://100daystooffload.com/#-hall-of-fame-&#34; rel=&#34;noopener noreferrer&#34;&gt;the list&lt;/a&gt;. I have completed the challenge.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it. I have another blog post that I&amp;rsquo;m in the process of right now,
expect that very soon and possibly even today.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Day 104</title>
      <link>https://jacksonchen666.com/posts/2023-10-17/17-33-31/</link>
      <pubDate>Tue, 17 Oct 2023 17:33:31 +0000</pubDate>
      <author>Jackson</author>
      <guid>/posts/2023-10-17/17-33-31/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part of the &lt;a href=&#34;https://100daystooffload.com/&#34;&gt;100 days to offload&lt;/a&gt; challenge, also including
other blog posts in 2023.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;100-days-to-offload-update&#34;&gt;100 days to offload update &lt;/h2&gt;
&lt;p&gt;It is day 104 of the 100 days to offload challenge. I have overachieved by 4
days now.&lt;/p&gt;
&lt;p&gt;I made some empty blog posts, but the extra 4 should&amp;rsquo;ve made up for it
anyways.&lt;/p&gt;
&lt;p&gt;That is all you should know on the current status of the 100 days to offload
challenge.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://jacksonchen666.com/posts/2023-07-28/11-47-09/&#34;&gt;Previous 100 days blog post&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;website-changes-considerations&#34;&gt;Website changes considerations &lt;/h2&gt;
&lt;p&gt;After getting rid of pretty much all tags in my posts, I&amp;rsquo;ve started to tag
them a little more.&lt;/p&gt;
&lt;p&gt;Previously, the tags would be a mess. I would have a single tag for a single
blog post. No grouping, just tags. Like another way to view blog posts,
although horribly.&lt;/p&gt;
&lt;p&gt;This time though, I&amp;rsquo;m starting from scratch. It&amp;rsquo;s not yet available for
browsing purposes, but hopefully soon.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
