<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Oliver Atkinson</title><description>See what Oliver Atkinson is up to! Fullstack developer, developing sites &amp; applications in Rust and Astro! Here I write mostly about code but also my findings in the Bible. Or even just my recent thoughts! Contains: My linktree, Blog, and Papers.</description><link>https://oliveratkinson.net</link><item><title>Malicious Computers</title><link>https://oliveratkinson.net/malicious-computers</link><guid isPermaLink="true">https://oliveratkinson.net/malicious-computers</guid><description>&lt;p&gt;Open source is obviously safer than running propriatary code.
Bugs can be found and squashed easier, backdoors can theoretically be found.
But despite all this freedom in computing, it’s still very hard to actually know what code you are running.
&lt;a href=&quot;https://dwheeler.com/trusting-trust/dissertation/wheeler-trusting-trust-ddc.pdf&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Double Compiling&lt;/a&gt;,
&lt;a href=&quot;https://underhanded-c.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Underhanded C&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In adition, there are also threats at the hardware level such as with
&lt;a href=&quot;https://en.wikipedia.org/wiki/Intel_Management_Engine&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Intel ME&lt;/a&gt; and possibly
&lt;a href=&quot;https://en.wikipedia.org/wiki/AMD_Platform_Security_Processor&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;AMD PSP&lt;/a&gt;.
&lt;a href=&quot;https://ieeexplore.ieee.org/stampPDF/getPDF.jsp?arnumber=7546493&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Analog Malicous Hardwrae&lt;/a&gt;,
&lt;a href=&quot;https://www.contrib.andrew.cmu.edu/~somlo/BTCP/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;A &lt;em&gt;true&lt;/em&gt; libre computer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The computer build by Gabriel L. Somlo is quite interesting as he built a whole RISC-V computer on FPGAs.
This means that the user of this computer can be reasonibly sure that there is no &lt;em&gt;hardware&lt;/em&gt; backdoors.
This is a step in a good direction.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Me and a friend were discussing homelabbing not too long ago and how most things are probably backdoored by the USA and China.
Things like Intel ME really make me sad, considering how cheap Intel hardware is second hand.
However, to run the securest server, would it make sense to run on RISC-V?
Since we could get chips from other places that wouldn’t have a “management engine” supervising the CPU at all times with access to the network.
But then at that point you are trusting a small company that would be easier to bend to the will of a state actor to backdoor it.&lt;/p&gt;</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>TUI Minesweeper</title><link>https://oliveratkinson.net/minesweeper</link><guid isPermaLink="true">https://oliveratkinson.net/minesweeper</guid><description>&lt;p&gt;Created a TUI version of Minesweeper, check it &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/minesweeper-rs&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;out here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My wife and I both got interested in Minesweeper this last week so I decided to make my own version.
I also added multiplayer support!
(Check out the &lt;code&gt;multiplayer&lt;/code&gt; branch of the code, thought it does need some cleanup on the host/join logic.)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is the first game I’ve written (obvously I didn’t invent the idea or anything),
this is subsiquently also the first multiplayer game I’ve written.
It was interesting to see the complexity of the program increase &lt;em&gt;drastically&lt;/em&gt; by adding multiplayer.&lt;/p&gt;
&lt;p&gt;The single player version is just one 385 line rust file.
Whereas the multiplayer version is now 5 files and 1115 lines.
Part of this is because I didn’t want to do something cringe like just sending game state with json objects.
If I had done this I could’ve saved several hundred lines of code, but then the networking would be bloated.
It was also more fun to create bit flags for bounding the data being sent.
I also can send the whole gamestate in &amp;#x3C;100 bytes.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Skill Floor</title><link>https://oliveratkinson.net/skill-floor</link><guid isPermaLink="true">https://oliveratkinson.net/skill-floor</guid><description>&lt;p&gt;Assumptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;People don’t get more intelligent over time (generation over generation)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;If we are to believe the AI marketing, AI is about to be &lt;em&gt;super smart&lt;/em&gt;.
Like &lt;em&gt;take all the jobs&lt;/em&gt; smart.
We are so close!
We’ve been 6 months away from complete workforce displacement for only about 4 years!&lt;/p&gt;
&lt;p&gt;So obviously AI isn’t about to take &lt;em&gt;everybody’s&lt;/em&gt; job.
But it may take some.
Here’s why it could be extremely bad.&lt;/p&gt;
&lt;h2 id=&quot;two-futures&quot;&gt;Two Futures&lt;/h2&gt;
&lt;h3 id=&quot;if-ai-continues-to-get-smarter&quot;&gt;If AI continues to get smarter&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;If sites like &lt;a href=&quot;https://trackingai.org/home&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;this one&lt;/a&gt; are to be believed, then AI is already well into the 90th percentile of humans.
As we interact with these models however, we can feel that that’s not true.
Therefor IQ isn’t the &lt;em&gt;best&lt;/em&gt; metric to judge intelligence, but the &lt;em&gt;idea&lt;/em&gt; of IQ is what matters here.
It works as a stand-in for some sort of quantitative value of intelligence.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Every job has a lower bound on how smart the worker has to be.
With a normal innovation, say the cotton gin, that only displaces one job type.
The cotton gin didn’t change how tobacco was processed.
The workers displaced by the cotton gin can flow into other jobs of similar mental caliber (perhaps tobacco farming).
There is a &lt;em&gt;possibility&lt;/em&gt; with AI that all jobs of low mental compute requirements could &lt;em&gt;all&lt;/em&gt; get displaced (the cotton, tobacco, etc, laborer).
Purportedly that is the goal of AI.
Then what do we do with all these displaced persons?&lt;/p&gt;
&lt;p&gt;Hopefully many of these workers have mental headroom, meaning that to obtain a higher intelligence job and they don’t need to change how smart they are.
This would be ideal, considering you &lt;em&gt;can’t&lt;/em&gt; change how smart you are.
You can learn things, but an increase in head-knowledge doesn’t increase IQ.
This is an important distinction because AI can also “learn” things, but it, like you, can’t get smarter.&lt;/p&gt;
&lt;p&gt;Since humans have a range of approx: 80-120 IQ, and AI’s IQ will continue to rise, fewer and fewer humans will be necessary / useful.
Every generation of both humans and AI (each model being considered a “generation”) somewhat “roll the dice” as to how smart they will be.
It is somewhat inheritable, but not without fluctuations.
The difference however, is that AI’s “generations” are about 3-6 months, and since they are just fancy math machines, there is no problem disposing of non-useful members.
With humans, obviously our generations are about 25 years and we don’t get rid of non-useful members.&lt;/p&gt;
&lt;p&gt;As the intelligence of AI rises, this will bring the lower bound of useful humans’ IQ, up with it.
We will have a growing “useless eater” population.
This could lead to things like more useless wars to kill them off, or things like UBI to keep them alive.&lt;/p&gt;
&lt;h3 id=&quot;if-ai-has-plateaued&quot;&gt;If AI has plateaued&lt;/h3&gt;
&lt;p&gt;Then we are safe, and all this investment into AI companies is mostly meaningless and the basket with all our eggs has an overstated value.
Open-source can take it from here, building agents and tooling.
We’ve already seen things like OpenClaw being “hugely disruptive” in the AI world.
But this wasn’t because models got better, it’s because a cool tool was overlaid &lt;em&gt;on top&lt;/em&gt; of the existing technology.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you are concerned with being replaced I dug through some of FRED’s data to product &lt;a href=&quot;/most-valuable-skills-24-34&quot;&gt;the projected most valuable skills in 2024-2034&lt;/a&gt;.
It could be interesting for you.&lt;/p&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><category>Blog</category><category>AI</category><category>Skills</category><author>Oliver Atkinson</author></item><item><title>Most valuable Skills</title><link>https://oliveratkinson.net/most-valuable-skills-24-34</link><guid isPermaLink="true">https://oliveratkinson.net/most-valuable-skills-24-34</guid><description>&lt;p&gt;Based on Bureau of Labor Statistics’ skills and occupation data, we see the following are the most valuable skills in the years 2024-2034.
This ranking is the top skills denoted by jobs projected to increase, minus the skills denoted by jobs projected to decrease.
Giving you the new skills you need to learn.&lt;/p&gt;































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Skills&lt;/th&gt;&lt;th&gt;Value&lt;sup&gt;&lt;a href=&quot;#user-content-fn-value&quot; id=&quot;user-content-fnref-value&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/th&gt;&lt;th&gt;Adjusted for Income&lt;sup&gt;&lt;a href=&quot;#user-content-fn-afi&quot; id=&quot;user-content-fnref-afi&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/th&gt;&lt;th&gt;Adjusted for Income (Weighted)&lt;sup&gt;&lt;a href=&quot;#user-content-fn-afiw&quot; id=&quot;user-content-fnref-afiw&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Writing and reading&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;0.000&lt;/td&gt;&lt;td&gt;1.286&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Interpersonal&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;0.540&lt;/td&gt;&lt;td&gt;1.513&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Critical and analytical thinking&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;0.000&lt;/td&gt;&lt;td&gt;0.890&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Leadership&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;0.000&lt;/td&gt;&lt;td&gt;0.377&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mathematics&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;0.122&lt;/td&gt;&lt;td&gt;0.247&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mechanical&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;0.000&lt;/td&gt;&lt;td&gt;0.042&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Problem solving and decision making&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0.089&lt;/td&gt;&lt;td&gt;0.172&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Computers and information technology&lt;/td&gt;&lt;td&gt;-3&lt;/td&gt;&lt;td&gt;-0.434&lt;/td&gt;&lt;td&gt;-0.801&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Speaking and listening&lt;/td&gt;&lt;td&gt;-3&lt;/td&gt;&lt;td&gt;-0.243&lt;/td&gt;&lt;td&gt;-0.295&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Physical strength and stamina&lt;/td&gt;&lt;td&gt;-3&lt;/td&gt;&lt;td&gt;-0.446&lt;/td&gt;&lt;td&gt;-0.446&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customer service&lt;/td&gt;&lt;td&gt;-6&lt;/td&gt;&lt;td&gt;-0.485&lt;/td&gt;&lt;td&gt;-0.608&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fine motor&lt;/td&gt;&lt;td&gt;-11&lt;/td&gt;&lt;td&gt;-1.022&lt;/td&gt;&lt;td&gt;-1.371&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adaptability&lt;/td&gt;&lt;td&gt;-26&lt;/td&gt;&lt;td&gt;-3.208&lt;/td&gt;&lt;td&gt;-7.064&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Detail oriented&lt;/td&gt;&lt;td&gt;-54&lt;/td&gt;&lt;td&gt;-7.041&lt;/td&gt;&lt;td&gt;-10.705&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;observations&quot;&gt;Observations&lt;/h2&gt;
&lt;p&gt;This yielded some interesting perspectives.
While “Adaptability” is cited the &lt;em&gt;most&lt;/em&gt; in jobs projected in increase, it’s cited nearly twice as much in jobs that are projected to &lt;em&gt;decrease&lt;/em&gt;, thus turning down it’s value in this chart.
Therefor this chart is only helpful to you if you are &lt;em&gt;already&lt;/em&gt; a professional, and have the baseline skills, such as “Adaptability”, but now need to learn some &lt;em&gt;new&lt;/em&gt; skills (maybe better writing or critical thinking?) to stay relevant.&lt;/p&gt;
&lt;h2 id=&quot;if-you-are-not-yet-in-the-workforce&quot;&gt;If you are not yet in the workforce&lt;/h2&gt;
&lt;p&gt;You may be inclined to &lt;em&gt;only&lt;/em&gt; learn the skils in the above table.
However, that table is only useful it you are &lt;em&gt;already&lt;/em&gt; in the workforce, in a relevant sector.
Here are the skills you need to learn to be relevant in general.&lt;/p&gt;













































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Top Skills&lt;sup&gt;&lt;a href=&quot;#user-content-fn-top5&quot; id=&quot;user-content-fnref-top5&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/th&gt;&lt;th&gt;Percentile&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Computers and information technology&lt;/td&gt;&lt;td&gt;90.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Critical and analytical thinking&lt;/td&gt;&lt;td&gt;86.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Problem solving and decision making&lt;/td&gt;&lt;td&gt;76.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Writing and reading&lt;/td&gt;&lt;td&gt;75.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Detail oriented&lt;/td&gt;&lt;td&gt;74.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mathematics&lt;/td&gt;&lt;td&gt;69.6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adaptability&lt;/td&gt;&lt;td&gt;66.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Leadership&lt;/td&gt;&lt;td&gt;66.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Creativity and innovation&lt;/td&gt;&lt;td&gt;60.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Speaking and listening&lt;/td&gt;&lt;td&gt;58.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Science&lt;/td&gt;&lt;td&gt;58.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Project management&lt;/td&gt;&lt;td&gt;57.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Interpersonal&lt;/td&gt;&lt;td&gt;45.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mechanical&lt;/td&gt;&lt;td&gt;43.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fine motor&lt;/td&gt;&lt;td&gt;43.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customer service&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Physical strength and stamina&lt;/td&gt;&lt;td&gt;37.2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;takeaways&quot;&gt;Takeaways&lt;/h2&gt;
&lt;p&gt;You need to be good at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Computers&lt;/strong&gt; (Note that this &lt;em&gt;could&lt;/em&gt; mean just being able to use excel, since “Nurse practitioner” scores highly.
However, I would recommend knowing more than just “how to use” a computer and actually be able to &lt;em&gt;use&lt;/em&gt; computers.
Meaning learn how to do (at least basic) programming, and IT tasks.
Even if you don’t do programming it gives you a good intuition on how to fix computers IT style.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is your baseline.
Being good at computers will just get your “foot in the door”, so to say.
What will make you stand out is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;People&lt;/strong&gt; (seen in “Writing and reading”, “Interpersonal”, “Leadership”, “Problem solving and decision making”, “Leadership”)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because these skillsets won’t be filled 1:1 from transfers from declining job markets.&lt;/p&gt;
&lt;h2 id=&quot;source&quot;&gt;Source&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bls.gov/emp/data/skills-data.htm&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Skills data&lt;/a&gt; [&lt;a href=&quot;https://www.bls.gov/emp/skills/skills.xlsx&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;direct link&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bls.gov/emp/tables/emp-by-major-occupational-group.htm&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Occupation data&lt;/a&gt; [&lt;a href=&quot;https://www.bls.gov/emp/ind-occ-matrix/occupation.xlsx&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;direct link&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;“Skills” shows what jobs need what skills - labeled as Skill 1, 2, 3.
“Occupation” shows what jobs will be in more or less demand (theoretically) in the years 2024-2034.&lt;/p&gt;
&lt;p&gt;By combining these two datasets we can see what skills will be in more demand in the future.
The first table is the results.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-value&quot;&gt;
&lt;p&gt;Each time either the job increase or decrease projection mentions the skill in it’s top 3, the skill will get counted and multiplied by it’s ranking.
The multiplication is: ×3 if 1st,×2 if 2nd, ×1 if third.
Then the “Value” is derived by subtracing skills in the projected job decreases, from projected job increases.
This means that “Writing and reading” is found (weighted) 13 more times as a skill that will increase, vs a skill that will decrease.
(Note that if these numbers seem too small to be worthwhile, there are only 57 jobs represented between the projected increasing and decreasing jobs.) &lt;a href=&quot;#user-content-fnref-value&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-afi&quot;&gt;
&lt;p&gt;“Adjusted for Income” is finding the average income (as percent) for jobs that list each skill - and multipling by the “Value”. &lt;a href=&quot;#user-content-fnref-afi&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-afiw&quot;&gt;
&lt;p&gt;“Adjusted for Income (Weighted)” is found by take all the jobs that list these skills in their top 3 most required skills.
If the skill is ranked first, ×3 income, second, ×2, and third, ×1.
These incomes are then averaged for each skill, turned into a percent, then multipled by “Value”. &lt;a href=&quot;#user-content-fnref-afiw&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-top5&quot;&gt;
&lt;p&gt;This is the average skill percentile, of the of top 5 jobs.
The top 5 jobs are selected based on their income percentile + job growth percentile. &lt;a href=&quot;#user-content-fnref-top5&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><category>Blog</category><category>Skills</category><author>Oliver Atkinson</author></item><item><title>Bye Bye Discord</title><link>https://oliveratkinson.net/bye-bye-discord</link><guid isPermaLink="true">https://oliveratkinson.net/bye-bye-discord</guid><description>&lt;p&gt;Discord has decided to attack privacy.
This is not a real surprise to anybody, and perhaps you could even defend them saying that “governments forced their hands”.
Either way, the platform has to go.&lt;/p&gt;
&lt;h1 id=&quot;the-what&quot;&gt;The What&lt;/h1&gt;
&lt;p&gt;Discord &lt;a href=&quot;https://arstechnica.com/tech-policy/2026/02/discord-faces-backlash-over-age-checks-after-data-breach-exposed-70000-ids/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;just leaked 70,000 IDs&lt;/a&gt;
and has decided the only logical solution is to &lt;a href=&quot;https://www.youtube.com/watch?v=WI4U1SVIO3I&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;prevent users from being able to sue them.&lt;/a&gt;
And then that the next, &lt;strong&gt;next&lt;/strong&gt; logical step was to force &lt;em&gt;all&lt;/em&gt; of it’s users to undergo &lt;a href=&quot;https://www.youtube.com/watch?v=jAyAg7DBqbg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;invasive age verification.&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;why-is-this-a-bad-thing&quot;&gt;Why Is This A Bad Thing?&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Discord doesn’t &lt;em&gt;need&lt;/em&gt; this information (We live in the USA, no age verification is needed.)&lt;/li&gt;
&lt;li&gt;They will most likely &lt;em&gt;loose&lt;/em&gt; this information, which can lead to very bad IRL things (identity theft, etc.) (The best way to not loose something is to never have it in the first place.)&lt;/li&gt;
&lt;li&gt;This will pave the way for police to come knocking on your door if you say the wrong thing. (Not a conspiracy, already happening in the UK.)&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;what-can-we-do&quot;&gt;What Can We Do?&lt;/h1&gt;
&lt;p&gt;We can move to platforms like Matrix (&lt;a href=&quot;https://matrix.org/ecosystem/clients/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Clients&lt;/a&gt;/&lt;a href=&quot;https://matrix.org/ecosystem/servers/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Servers&lt;/a&gt;), &lt;a href=&quot;https://stoat.chat&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Stoat&lt;/a&gt;, &lt;a href=&quot;https://xmpp.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;XMPP&lt;/a&gt;, &lt;a href=&quot;https://zulip.com/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Zulip&lt;/a&gt;, &lt;a href=&quot;https://signal.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Signal&lt;/a&gt;, etc.&lt;/p&gt;
&lt;p&gt;Personally, I use signal for all my 1:1 messaging and Matrix for all my 1:* messaging, and I &lt;em&gt;&lt;strong&gt;highly&lt;/strong&gt;&lt;/em&gt; suggest you do as well.
I’ve had very good luck getting friends &amp;#x26; family to use Signal instead of texting.
This just takes slightly different approaches depending on their temperament.
But something along the lines of “Illegal in France”, “Used by USA officials to make war plans”, “Was subpoenaed by the US for info an they returned a timestamp” will get you there.
I’m in the middle of trying to get a friend group off of Discord and into a Matrix server so I don’t have advice on that plan yet.&lt;/p&gt;</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Printf TUI Debugging</title><link>https://oliveratkinson.net/printf-tui-debugging</link><guid isPermaLink="true">https://oliveratkinson.net/printf-tui-debugging</guid><description>&lt;p&gt;I’ve been working on my TUI spreadsheet program, &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/neoscim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;neoscim&lt;/a&gt; quite a bit recently.
In this process I had to do some debugging, as you would with any program.
&lt;strong&gt;However&lt;/strong&gt; since this is a TUI application, it throws a wrench in the whole “throw a print statement in there” method of debugging.
“Why” You may ask?
This is because when we are running a normal CLI or GUI application we have multiple output mediums.
For a CLI, there is no visual output, so &lt;em&gt;everything&lt;/em&gt; goes to the terminal, causing no issues with “printf” debugging.
For a GUI application, you have your UI - as the name implies - graphically rendered to another window, leaving your terminal open for printf debugging.&lt;/p&gt;
&lt;p&gt;Now the fun 3rd option: TUIs.
TUI (Terminal User Interface) is like a CLI (Command Line Interface) in that it only takes a terminal to run (something as simple as a tty (the thing that you get to when pressing Ctrl Alt F1-7 on most Unix machines)).
You may use common ones such as &lt;code&gt;alsamixer&lt;/code&gt; or &lt;code&gt;nmtui&lt;/code&gt; for managing audio or networks on your Linux machine.
However, when you want to write some debug statements, how do you do that?
The UI &lt;strong&gt;is&lt;/strong&gt; the terminal, so if you place a &lt;code&gt;print!(&quot;{}&quot;)&lt;/code&gt; statement (neoscim is written in Rust), it will mangle the UI.
We could send the logs to a server like Loki, but that would be too complex for some simple debugging.
We can’t even do a &lt;code&gt;eprint!(&quot;{}&quot;)&lt;/code&gt; (print on stderr), since stdout and stderr both go to the terminal.
If only there was another way…&lt;/p&gt;
&lt;p&gt;Guess what!
There’s another way!
We can use some cool techniques learned in &lt;a href=&quot;/select-optionrs&quot;&gt;my other post&lt;/a&gt; to move data streams all around the system.
I’ll show you how:&lt;/p&gt;
&lt;p&gt;What we had before:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Run the program (simple)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; neoscim&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But since the program is put into stdout which is rendered together with stderr, they can mangle each other.
Step 1 of this solution is putting our debug statements into stderr.
This way debug messages go to stderr, and the UI goes to stdout.
Now we can run the program with some redirection:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; neoscim&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; 2&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; file.log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This fixes the mangling issue!
But we sill have a problem.
I’m not getting my log statements in real time.
We can now implement a fancy thing called a &lt;code&gt;fifo&lt;/code&gt;, aka a First-In-First-Out queue.
This is actually really simple in Linux (since everything is a file!)&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mkfifo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; queue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ls&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;queue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; neoscim&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; 2&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; queue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you can see here; mkfifo creates a “file” (named &lt;code&gt;queue&lt;/code&gt;) which is actually a fifo queue.
Now when neoscim runs, it will take a hold of stdout to render the UI and stderr will get redirected into the “file” &lt;code&gt;queue&lt;/code&gt;.
However, this will prevent neoscim from launching!
Why?
Because writing to the fifo will block the writing program until the queue also a a reader.
So we then open another terminal and type:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; queue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And now the messages start flowing!&lt;/p&gt;</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Select Option - Hottest new TUI tool</title><link>https://oliveratkinson.net/select-optionrs</link><guid isPermaLink="true">https://oliveratkinson.net/select-optionrs</guid><description>&lt;p&gt;Howdy gamers! I just created a sweet new tool for bash scripts that have branching logic:
&lt;a href=&quot;https://git.oliveratkinson.net/Oliver/select_option&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;select_option&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Simply pipe in data, then a TUI will appear, letting the user select which line they want.
Once they press enter (can’t cancel, they must choose) the selected text is put in stdout.&lt;/p&gt;
&lt;p&gt;A simple use case is as follows:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;lsblk&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -lno&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; type,name&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; part&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; awk&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;{ print &quot;/dev/&quot; $2 }&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; select_option&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; tee&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; file.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This (once an option is selected) will output something akin to: &lt;code&gt;/dev/nvme1n1p1&lt;/code&gt; into &lt;code&gt;file.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can also make really aids scripts like:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exec&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; 4&gt;&amp;#x26;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;printf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;a\nb\nc&apos;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; select_option&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; tee&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /proc/self/fd/4&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; xargs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -I%&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; You&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; selected:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; %&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which will output (example):&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;You selcted: c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But you may ask “what is the &lt;code&gt;exec 4&gt;&amp;#x26;1&lt;/code&gt; line?
To which I response “Hahahah!! That is my redirect-inator” &lt;em&gt;(In a Dr. Dufinshmertz voice)&lt;/em&gt;.
But actually that is creating something called a &lt;a href=&quot;https://www.man7.org/linux/man-pages/man5/proc_pid_fd.5.html&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;file descriptor&lt;/a&gt;.
I’m not going to full explain them here (it would be better to just read that link) but you can think of them as a FIFO queue (first-in-first-out).
We are using this because when &lt;code&gt;select_option&lt;/code&gt; takes over the terminal to draw the TUI, it is taking over stdout.
This is why we can’t just &lt;code&gt;input... | select_option | ...outupt&lt;/code&gt; because that tries to pipe the TUI into the next command (&lt;code&gt;...output&lt;/code&gt; in this case.)
So instead we &lt;code&gt;tee&lt;/code&gt;, which writes to a file and stdout.
Not quite sure on the &lt;em&gt;specifics&lt;/em&gt; of why this works.
My intuition just said it would and it did.
Regardless - this gives us stdout to use for the TUI, but then &lt;strong&gt;duplicates&lt;/strong&gt; the output to &lt;code&gt;/proc/self/fd/4&lt;/code&gt; - our FIFO queue.
But this fd is special, because we set it, (4), up to redirect it’s input into stdout (1).
This means that xargs can pick it up on it’s stdin (0) pipe, because 4 is redirected to 1 which is redirected to 0.&lt;/p&gt;
&lt;p&gt;I split the command into multiple lines (this wouldn’t actually run like this) so I can spam comments.
I put the FDs in parentheses (quite verbosely) because 0,1,2 are really just stdin/out/err.
I think this helps de-mystifies FDs.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Setup fd 4 (4) to redirect it&apos;s input to stdout (1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# This creates a new &quot;file&quot; in /proc/self/fd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;exec&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; 4&gt;&amp;#x26;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Put &apos;a\nb\nc&apos; onto stdout (1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;printf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;a\nb\nc&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Redirct stdout (1) to stdin (0) of the next command&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Read data piped thru stdin (0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;select_option&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Pipe stdout (1) to stdin (0) of next command&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Read stdin (0) and pipe it to stdout (1) and fd 4 (4)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tee&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /proc/self/fd/4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# stdout (1) is captured by the output of select_option and displays the TUI.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Once select_option is done, it prints it&apos;s result to stdout (1) (which is piped to tee&apos;s stdin (0)).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# tee then pushes this value to both stdout (1) and fd 4 (4).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Since fd 4 (4) is redirected to stdout (1), it is then piped to the next command&apos;s stdin (0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# xargs reads stdin (0) and operates on it.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# echo puts it&apos;s arguments on stdout (1) which we read in the terminal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;xargs&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -I%&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; You&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; selected:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; %&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Final output:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# You selected: a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This still has some weird-ness tho.
If I pipe the output to word count: &lt;code&gt;... | wc&lt;/code&gt;, the characters it sees stays 1, but the bytes it sees increases, meaning that it is getting the whole TUI, but is somehow filtering out just the correct char.&lt;/p&gt;
&lt;p&gt;Also, the final output shows the value you selected: ‘a’, but this value was also passed it along to the next command (xargs).
The single value ‘a’ doesn’t mess with anything, but I’m not too sure how it escapes “containment”.&lt;/p&gt;
&lt;p&gt;If you have questions or comments (you can explain it better than me lol) feel free to reach out!&lt;/p&gt;</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><category>Programming</category><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Psychology isn&apos;t real</title><link>https://oliveratkinson.net/psychology-isnt-real</link><guid isPermaLink="true">https://oliveratkinson.net/psychology-isnt-real</guid><description>&lt;blockquote&gt;
&lt;p&gt;“Psychology is the scientific study of mind and behavior … mental processes such as thoughts, feelings … ”&lt;sup&gt;&lt;a href=&quot;#user-content-fn-wiki&quot; id=&quot;user-content-fnref-wiki&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are a number of religious things you can explain away just using psychology.
This was detrimental to my faith, so I’ve decided that psychology isn’t real.&lt;/p&gt;
&lt;p&gt;What does that mean?
Have I decided that the happenings in our brains are all fake?
No, everything we ascribe to psychology is perhaps, just spiritual.&lt;/p&gt;
&lt;p&gt;Why?
Let me give you a scenario:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Somebody says they are depressed, we pray for them, they feel better.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Do they feel better because God interacted with them and performed a miracle?
Or do they feel better because they now know that people around them support them?
Either option causes the prayer to be “answered” but did God do anything?&lt;/p&gt;
&lt;p&gt;If God isn’t doing anything, then what do we need God for?
(Yes, obviously we need him to be saved, regardless if he is curing depression right now.)
What if God, since he created the human brain, knows all the inner workings of the brain, and how to exploit them.
So what if God just have us systems (like prayer) which aren’t “actually” doing anything but are just methods to exploit the systems God already setup?
So in once sense God is still doing something, but he just did it in the past.&lt;/p&gt;
&lt;p&gt;Same thing with evangelical worship.
It’s common to have people cry and get surrounded by their group of friends, praying for them.
We actually organize the worship set so invoke emotions like this.
Then people in the congregation who are crying will then talk about how much they felt God, specifically the Holy Spirit.
But how much of that is just emotion, and how much is God?
If we engineered the set to invoke emotion, are people actually interacting with God?
Well, we could take the position that we took with prayer.
God gave you emotions, you now exploit the emotions praising God, your emotions are invoked, and you “feel God”.
So in once sense, again, God did something, but isn’t &lt;em&gt;doing&lt;/em&gt; something.&lt;/p&gt;
&lt;p&gt;I didn’t like this whole situation, so I scrapped it.
No more psychology, no more problem.
Everything in your mind is spiritual.
This isn’t even that much of a stretch, really all I’m saying is consciousness is spiritual.
This might even be how people used to think:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Job 20:2-3 [NASB]&lt;/p&gt;
&lt;p&gt;2: “Therefore my disquieting thoughts make me respond,&lt;/p&gt;
&lt;p&gt;Even because of my inward agitation.&lt;/p&gt;
&lt;p&gt;3: I listened to the reprimand which insults me,&lt;/p&gt;
&lt;p&gt;And the spirit of my understanding makes me answer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here we see that Zophar doesn’t say “I was thinking”, “my inner dialog came to the conclusion of”, or anything to that effect.
But instead “…the spirit of my understanding…”.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-wiki&quot;&gt;
&lt;p&gt;Source; the opening statements on &lt;a href=&quot;https://en.wikipedia.org/wiki/Psychology&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;the wiki page&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-wiki&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><category>Blog</category><category>God</category><author>Oliver Atkinson</author></item><item><title>Advanced Moral Decisions</title><link>https://oliveratkinson.net/advanced-moral-descisions</link><guid isPermaLink="true">https://oliveratkinson.net/advanced-moral-descisions</guid><description>&lt;p&gt;Good ol’ advanced technology, my old friend.
Unfortunately I’m not here to have a chat, but to tell you how you are a mistake, once again.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;advanced-medical-technology--advanced-moral-decisions&quot;&gt;Advanced Medical Technology = Advanced Moral Decisions&lt;/h2&gt;
&lt;p&gt;I’ve been listening to several Charlie Kirk videos (terrible that he’s gone) and I, as anyone would, noticed how much abortion came up.
Obviously killing children because you don’t want to take responsibility for having sex is truly insane, selfish, evil, and hedonistic.
Several the college students bring up the following question however:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What about when the mother or child’s life is in danger?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Really we know they probably don’t care about the child’s life, just the mothers.
Charlie noted how there is possibly never a medical reason for an abortion.
In really any of the cases you could just do a C-section instead of an abortion because its faster and safer.&lt;/p&gt;
&lt;p&gt;But let’s go on a hypothetical…&lt;/p&gt;
&lt;p&gt;Let’s pretend that we have a mother who is pregnant and about to die because of it.
Somehow our only options have boiled down to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kill the mother&lt;/li&gt;
&lt;li&gt;Kill the child&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What are you supposed to do?
It’s absolutely crazy to think there is just an “easy answer”.
You are having to decide between two innocent human lives.
What’s the moral decision?
Which of those decisions are you willing to go before God and try to justify?&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;no-medical-technology--no-moral-decisions&quot;&gt;No Medical Technology = No Moral Decisions&lt;/h2&gt;
&lt;p&gt;Now imagine this same situation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kill the mother&lt;/li&gt;
&lt;li&gt;Kill the child&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, now, we don’t have any medical technology.
Which one do we decide to keep?
Actually, do don’t decide anything.
We let God decide.
We let God make the hard moral decision.
When you go to face God you can ask &lt;em&gt;him&lt;/em&gt; why did he choose option 1 or 2.
We would let God handle the morality of human life and we would maintain our place, far away from it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;By taking on more and more of the privileges of God, we have inadvertently also taken on the responsibility.&lt;/p&gt;</description><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><category>Blog</category><category>God</category><author>Oliver Atkinson</author></item><item><title>Intelligent Design against Materialism</title><link>https://oliveratkinson.net/inteligent-design</link><guid isPermaLink="true">https://oliveratkinson.net/inteligent-design</guid><description>&lt;p&gt;Here are a few points I want to go over.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Christians famously believe in ‘intelligent design’.&lt;/li&gt;
&lt;li&gt;Your actual belief is shown by your actions, not your words.&lt;/li&gt;
&lt;li&gt;Atomic Farming&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;Contrary to the ideas of evolution Christians famously believe in intelligent design.
Even Christians who are trying to bring evolution into the Church acknowledge that evolution would only be possible if guided by God.&lt;/p&gt;
&lt;p&gt;Q: What is intelligent design?&lt;/p&gt;
&lt;p&gt;A: The belief that creation (everything) was designed by an intelligent being (God). Unlike traditional evolution where we just accidentally became who we are today.&lt;/p&gt;
&lt;p&gt;So let’s put a pin in that real quick.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;belief&quot;&gt;Belief&lt;/h2&gt;
&lt;p&gt;What you believe is shown by what you do, not what you say, &lt;em&gt;really&lt;/em&gt;.
If you say “I trust this chair will be sturdy enough for me to sit on it” but then refuse to sit on it or brace yourself as you do, then you never really believed what you were saying, right?
But by watching what you &lt;em&gt;do&lt;/em&gt; we can tell what you actually believe.
This is also apparent with politicians.
Many (at least US) politicians say “God this” and “God that”, but then don’t live their life representing God, we can see that the whole thing was a lie.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;James 1:22-27
22: But prove yourselves doers of the word, and not just hearers who deceive themselves.
23: For if anyone is a hearer of the word and not a doer, he is like a man who looks at his natural face in a mirror;
24: for once he has looked at himself and gone away, he has immediately forgotten what kind of person he was.
25: But one who has looked intently at the perfect law, the law of freedom, and has continued in it, not having become a forgetful hearer but an active doer, this person will be blessed in what he does.
26: If anyone thinks himself to be religious, yet does not bridle his tongue but deceives his own heart, this person’s religion is worthless.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Really just verse 22 is needed but the whole bit gives good context.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;atomic-gardening&quot;&gt;Atomic Gardening&lt;/h2&gt;
&lt;p&gt;To get to our modern food we decided to dabble in a little genetic modifications.
However, when we decided to do this, we didn’t have the ability to just modify genes directly like we can now.
So we decided to basically speed-run “hopeful monster” evolution by dumping large amounts of radiation into seeds, then planting them.
If seeds grew up and had attributes we liked; such as increasing the yield, quality, or even something as superficial as the color of the crop, they kept it.
They would then take this modified seed, plant it a bunch, then sell it to people as if nothing happened.
This seems like quite the bad idea right?&lt;/p&gt;
&lt;p&gt;The the good ol’ “scientists” don’t seem to think so.
But you must remember, these “scientists” are going to be, in majority, &lt;a href=&quot;https://en.wikipedia.org/wiki/Materialism&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;materialists&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;it-all-comes-together&quot;&gt;It all comes together&lt;/h2&gt;
&lt;p&gt;This blind trust in “scientists” as always struck me as weird.
When I say “always” really what I’m referring to is post-2020 version of me.&lt;/p&gt;
&lt;p&gt;Growing up obviously I didn’t really care about any of this and just did what my parents did.&lt;/p&gt;
&lt;p&gt;However, in 2020, I was in high school.
Right at the age of where you start caring about the wider country or world as a whole, and the veil of “everything is ok, because we are so advanced” starts to rip.&lt;/p&gt;
&lt;p&gt;In 2020, obviously, COVID was everywhere.
People were desperate for our “such advanced science and technology” to come through and save us once again.
(Kinda sounds like faith in a god, but that’s for another time.)
And luckily for the believers, their “god” provided.&lt;/p&gt;
&lt;p&gt;Well, somewhat, but the result also kinda would make people just drop dead while at peak health.
Something that not even COVID was doing to them.
But really, if you notice that you are just a crazy heretic who is polluting the good believers with your dangerous ideas.&lt;/p&gt;
&lt;p&gt;Just a few days ago I realized this divide was probably based of the underlying belief in &lt;strong&gt;intelligent design&lt;/strong&gt;.
If I believe (&lt;em&gt;actually&lt;/em&gt; believe, as previously stated) that I was created by God, exactly as I should be, why would I want to augment myself with human technology?&lt;/p&gt;
&lt;p&gt;This same problem will come up when we decide to start genetically editing humans.
Those of us who believe we were created by God, obviously hate that idea.
But the people who think that we are just mutated pond-scum (materialists) say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Why not? May as well do everything to augment the mistake that is us, since we know such much now!.
We are &lt;em&gt;so&lt;/em&gt; smart after all, we can right the wrongs that happened during our evolution.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But even to those people I would say: “Look at atomic gardening. If it were so great why are people allergic to so much food now. Why is so much food bad for you? These are effects we are only discovering some 70 years after the modifications, basically a whole generation. When we go to modify humans, how long will it take to see the negative effects? Will it be too late?”
We certainly are not at smart as we would like to think, we tried messing with food, and only messed it up.&lt;/p&gt;
&lt;p&gt;It seems obviously be we should probably leave the creating to God.&lt;/p&gt;</description><pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate><category>Blog</category><category>God</category><category>Materialism</category><category>Intelligent Design</category><author>Oliver Atkinson</author></item><item><title>Hell</title><link>https://oliveratkinson.net/hell</link><guid isPermaLink="true">https://oliveratkinson.net/hell</guid><description>&lt;p&gt;The idea held in many people’s brain about what hell is, is frankly quite misguided.
So what are the common perceptions?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You go to hell when you die (if you don’t have your faith in Jesus).&lt;/li&gt;
&lt;li&gt;Hell is a place where you go to be eternally tortured.&lt;/li&gt;
&lt;li&gt;Hell is full of fire.&lt;/li&gt;
&lt;li&gt;You are falling into a bottomless pit while worms eat your flesh eternally.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;1&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;do-people-go-to-hell-point-1&quot;&gt;Do People go to Hell? Point #1&lt;/h1&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 10:28:
&lt;p&gt;“Do not fear those who kill the body but are unable to kill the soul;
but rather fear Him who is able to destroy both soul and body in hell.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Luke 12:5:
&lt;p&gt;“But I will warn you whom to fear: fear the One who, after He has killed,
has authority to cast into hell; yes, I tell you, fear Him!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;These seem pretty cut and dry, however you could make that case against Matthew 10:28 &amp;#x26; Luke 12:5 with the argument
being “it’s not that He &lt;em&gt;will&lt;/em&gt; throw you into hell, he just &lt;em&gt;could&lt;/em&gt;. And you should fear (respect) Him for that”.
Ok, so how about:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 5:29-30:
&lt;p&gt;29: “If your right eye makes you stumble, tear it out and throw it from you;
for it is better for you to lose one of the parts of your body, than for your whole body to be thrown into hell.&lt;/p&gt;
&lt;p&gt;30: “If your right hand makes you stumble, cut it off and throw it from you;
for it is better for you to lose one of the parts of your body, than for your whole body to go into hell.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 18:8-9:
&lt;p&gt;8: “If your hand or your foot causes you to stumble, cut it off and throw it from you;
it is better for you to enter life crippled or lame, than to have two hands or two feet and be cast into the eternal fire.&lt;/p&gt;
&lt;p&gt;9: “If your eye causes you to stumble, pluck it out and throw it from you.
It is better for you to enter life with one eye, than to have two eyes and be cast into the fiery hell.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Mark 9:43-48:
&lt;p&gt;43: “If your hand causes you to stumble, cut it off; it is better for you to enter life
crippled, than, having your two hands, to go into hell, into the unquenchable fire,&lt;/p&gt;
&lt;p&gt;44: [ where THEIR WORM DOES NOT DIE, AND THE FIRE IS NOT QUENCHED.]&lt;/p&gt;
&lt;p&gt;45: “If your foot causes you to stumble, cut it off; it is better for you to enter life
lame, than, having your two feet, to be cast into hell,&lt;/p&gt;
&lt;p&gt;46: [ where THEIR WORM DOES NOT DIE, AND THE FIRE IS NOT QUENCHED.]&lt;/p&gt;
&lt;p&gt;47: “If your eye causes you to stumble, throw it out; it is better for you to enter the
kingdom of God with one eye, than, having two eyes, to be cast into hell,&lt;/p&gt;
&lt;p&gt;48: where THEIR WORM DOES NOT DIE, AND THE FIRE IS NOT QUENCHED.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In these three sections we see that you could get thrown into hell.&lt;/p&gt;
&lt;p&gt;The counter point would be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The encouragement to self-harm in the start of each verse leads us to conclude that
the verses aren’t being literal. So then we must take this frame into the latter part of the sentence. Therefor:
the ‘whole body being thrown into hell’ is still metaphorical.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, I would say that this rebuttal is actually in err.
These verses are Jesus upping the anty on the Old Testament law (at least Matthew 5 is).
This is where we get the “hate is murder” verse.
As well as the idea of “you are liable to the court” (Matt 5:21) is persisted.
And if you are guilty (liable to the court) you will be thrown into “fiery hell” (Matt 5:22).&lt;/p&gt;
&lt;p&gt;Relevant verses:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 5:21-22:
&lt;p&gt;21: “You have heard that the ancients were told, ‘YOU SHALL NOT COMMIT
MURDER’ and ‘Whoever commits murder shall be liable to the court.’&lt;/p&gt;
&lt;p&gt;22: “But I say to you that everyone who is angry with his brother shall
be guilty before the court; and whoever says to his brother,
‘You good-for-nothing,’ shall be guilty before the supreme court;
and whoever says, ‘You fool,’ shall be guilty enough to go into the fiery hell.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;However, the previous rebuttal isn’t entirely wrong.
It is good to note how some things in the Bible are just teaching tools, and not meant literally.&lt;/p&gt;
&lt;p&gt;So don’t go and gouge your eye out.&lt;/p&gt;
&lt;p&gt;But on the other hand, these verses do tell us that hell is a real place!
(Even if we are not sure &lt;em&gt;what&lt;/em&gt; hell is.)
And if gouging your eye out is what it would take to not go to hell, then get to poking!
It would be worth it!&lt;/p&gt;
&lt;p&gt;However, we know that:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] John 14:6:
&lt;p&gt;Jesus said to him, “I am the way, and the truth, and the life;
no one comes to the Father but through Me.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So taking out your eye won’t help you. Only Jesus can.&lt;/p&gt;
&lt;p&gt;But to answer the question - yes hell is a place you can go.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;2&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;hell-is-a-place-where-you-go-to-be-eternally-tortured-point-2&quot;&gt;Hell is a place where you go to be eternally tortured. Point #2&lt;/h1&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Revelation 20:10:
&lt;p&gt;And the devil who deceived them was thrown into the lake of fire and brimstone,
where the beast and the false prophet are also; and they will be tormented
day and night forever and ever.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Revelation 14:10:
&lt;p&gt;he also will drink of the wine of the wrath of God, which is mixed in full
strength in the cup of His anger; and he will be tormented with fire and brimstone
in the presence of the holy angels and in the presence of the Lamb.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;As I will explain here in the next point I don’t really like taking Revelation verses very literally.
Considering the whole book is a vision of the future (most likely using metaphors) I think this is an acceptable stance to take.&lt;/p&gt;
&lt;p&gt;However, even if we do take these verses literally, it’s only the devil, the beast, and the false prophet who will be tormented.&lt;/p&gt;
&lt;p&gt;That being said, we &lt;strong&gt;do&lt;/strong&gt; get a lot of talk about “weeping and gnashing of teeth” in the “outer darkness”, which we
will take a look at when talking about the darkness in point &lt;a href=&quot;#4.3&quot;&gt;4.3&lt;/a&gt; specifically.&lt;/p&gt;
&lt;p&gt;Conclusion?&lt;/p&gt;
&lt;p&gt;Yes you can go to hell, but as for what happens there we don’t have anything better to go off of than just imagery.
See the point 3 for more details.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;3&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;hell-is-full-of-fire-point-3&quot;&gt;Hell is full of fire. Point #3&lt;/h1&gt;
&lt;p&gt;&lt;a name=&quot;3.1&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;31-lake-of-fire&quot;&gt;3.1 Lake of Fire&lt;/h2&gt;
&lt;p&gt;We agree that the verses from point &lt;a href=&quot;#1&quot;&gt;#1&lt;/a&gt; aren’t to be taken word-for-word literally, so is
“fiery hell”,
“eternal fire”,
“unquenchable fire”,
and “where THEIR WORM DOES NOT DIE, AND THE FIRE IS NOT QUENCHED.”
literal?&lt;/p&gt;
&lt;p&gt;I think the point &lt;em&gt;could be made&lt;/em&gt; that these are just being imagery tools similar to how “cutting off your hand” wasn’t being literal.
So it’s time to pull in some more verses!
Lots of our ideas of “lake of fire” and such come from Revelation:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Revelation 19:20:
&lt;p&gt;And the beast was seized, and with him the false prophet who performed the signs in his presence,
by which he deceived those who had received the mark of the beast and those who worshiped his image;
these two were thrown alive into the lake of fire which burns with brimstone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Revelation 20:10:
&lt;p&gt;And the devil who deceived them was thrown into the lake of fire and brimstone,
where the beast and the false prophet are also; and they will be tormented day and night forever and ever.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Revelation 20:14-15:
&lt;p&gt;14: Then death and Hades were thrown into the lake of fire. This is the second death, the lake of fire.&lt;/p&gt;
&lt;p&gt;15: And if anyone’s name was not found written in the book of life, he was thrown into the lake of fire.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Revelation 19:20, 20:10, 20:14 are talking about the beast, the devil, death, and Hades.
It’s not until 20:15 that we get “anyone’s name … thrown into the lake of fire”.
But if we start pulling from Revelation big warning bells should go off in your head, warning you that we are now in speculation land.
This is because the future hasn’t happened yet and Revelation is drenched in metaphors.
Because of the metaphors I think using Revelation 20:15 as a verse to claim that hell is a lake of fire is weak, because
if we were taking that much liberty we could have just used Luke 16:19-31 (Parable of Lazarus).
So let’s back up a book and take a look at Jude - another common book when talking about hell.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;3.2&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;32-sodom-and-gomorrah&quot;&gt;3.2 Sodom and Gomorrah&lt;/h2&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Jude 1:6-7:
&lt;p&gt;6: And angels who did not keep their own domain, but abandoned their proper abode,
He has kept in eternal bonds under darkness for the judgment of the great day,&lt;/p&gt;
&lt;p&gt;7: just as Sodom and Gomorrah and the cities around them, since they in the same
way as these indulged in gross immorality and went after strange flesh, are exhibited
as an example in undergoing the punishment of eternal fire.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Verse 6 is only talking about fallen angels.
However verse 7 however could be saying the following; (edits made for clarity)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Sodom and Gomorrah &amp;#x26; cities arround them&lt;/code&gt; are &lt;code&gt;currently&lt;/code&gt; exhibited
as an example in undergoing &lt;code&gt;(currently)&lt;/code&gt; the punishment of
eternal fire. &lt;code&gt;eternal meaning unending&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However this is possible as well:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Sodom and Gomorrah &amp;#x26; cities arround them&lt;/code&gt; are &lt;code&gt;currently&lt;/code&gt; exhibited
as an example in &lt;code&gt;read: of - meaning past&lt;/code&gt; undergoing the punishment of
eternal fire. &lt;code&gt;not literally eternal or that&apos;s just the name of God&apos;s fire&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Similar to how we might say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;U.S. Navy Seals are exhibited as an example in undergoing the best training.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Where it doesn’t mean that the Navy Seals are &lt;em&gt;currently&lt;/em&gt; undergoing the best training, but that
they &lt;em&gt;did&lt;/em&gt; undergo the best training. How we read “in” in that verses is very important!&lt;/p&gt;
&lt;p&gt;Here are some edits of the verse to show this point.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Normal - NASB]
… are exhibited as an example in undergoing the punishment of eternal fire.
&lt;br&gt;&lt;br&gt;
[Edit 1 - Past tense]
… are exhibited as an example of undergoing the punishment of eternal fire.
&lt;br&gt;&lt;br&gt;
[Edit 2 - Present tense]
… are exhibited as an example, undergoing the punishment of eternal fire.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Context verses:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Genesis 19:24:
&lt;p&gt;Then the LORD rained on Sodom and Gomorrah brimstone and fire from the LORD out of heaven,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Genesis 19:28:
&lt;p&gt;and he looked down toward Sodom and Gomorrah, and toward all the land of the valley, and he saw,
and behold, the smoke of the land ascended like the smoke of a furnace.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I personally would think that it is intentioned to be the “Edit 1” version on past tense. This means that
the “eternal fire” that Sodom and Gomorrah experienced was just the fire and brimstone during their destruction.
One of the reasons I think this is because:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 10:15:
&lt;p&gt;“Truly I say to you, it will be more tolerable for the land of
Sodom and Gomorrah in the day of judgment than for that city.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;”… will be … ”&lt;/em&gt; - Does this mean that judgment day hasn’t yet arrived? (Yes)&lt;sup&gt;&lt;a href=&quot;#user-content-fn-judgment&quot; id=&quot;user-content-fnref-judgment&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Then how could Sodom and Gomorrah be an example of burning in hell without being judged yet?&lt;/p&gt;
&lt;p&gt;This makes me think that Sodom and Gomorrah received some &lt;strong&gt;judgment&lt;/strong&gt; and were burnt to a crisp (with eternal fire).
But they haven’t been &lt;strong&gt;judged&lt;/strong&gt; yet (and sent to hell).
Meaning that in this verse they are just burning with non-hell eternal fire.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;However&lt;/strong&gt;&lt;/em&gt; the case for “Edit 2” would to bring in verse 6.
If we do some chopping as to not get distracted, you end up with this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;6: And angels who did not keep their own domain &amp;#x3C;…&gt;
He has kept in eternal bonds under darkness for the judgment of the great day,&lt;/p&gt;
&lt;p&gt;7: just as Sodom and Gomorrah &amp;#x3C;…&gt; are exhibited as an
example in undergoing the punishment of eternal fire.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;So therefor if the angels are still in bonds, then Sodom and Gomorrah are still undergoing the punishment of eternal fire.
If this doesn’t make sense yet here’s the basic syntax of the verses:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{group 1} {status 1} just as {group 2} {status 2}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Where&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Group 1 = Fallen Angels&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Status 1 = In eternal bonds under darkness&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Group 2 = Sodom and Gomorrah&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Status 2 = Undergoing the punishment of eternal fire&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We would assume that &lt;code&gt;status 1&lt;/code&gt; and &lt;code&gt;status 2&lt;/code&gt; are the same duration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But if we look at Strong’s concordance we get some support for “Edit 1”.
“Are exhibited” is Strong’s: &lt;a href=&quot;https://biblehub.com/greek/4295.htm&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;4295&lt;/a&gt; which says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Set forth.&lt;/p&gt;
&lt;p&gt;From pro and keimai; to lie before the view, i.e. (figuratively) to be present (to the mind), to stand forth (as an example or reward) — be first, set before (forth).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then “in undergoing” which is Strong’s &lt;a href=&quot;https://biblehub.com/greek/5254.htm&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;5254&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;suffer.&lt;/p&gt;
&lt;p&gt;From hupo and echo; to hold oneself under, i.e. Endure with patience — suffer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Word 5254 appears to have some sense of “present tense” but not enough to change my argument where the “present tense” nature is
referring to the tense of the example.&lt;/p&gt;
&lt;p&gt;All this to say; it is an example that is used &lt;strong&gt;currently&lt;/strong&gt;, of an event that happened in the &lt;strong&gt;past&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;3.3&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;33-snatched-out-of-the-fire&quot;&gt;3.3 Snatched out of the fire&lt;/h2&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Jude 1:22-23:
&lt;p&gt;22: And have mercy on some, who are doubting;&lt;/p&gt;
&lt;p&gt;23: save others, snatching them out of the fire;
and on some have mercy with fear, hating even the garment polluted by the flesh.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I would call this metaphorical fire as well.&lt;/p&gt;
&lt;p&gt;I say this considering that it’s not us (or the people who Jude is writing to)‘s job to do the “snatching” in “snatching them out of the fire”.
That’s God’s job.
We can just participate in His plan.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-pred&quot; id=&quot;user-content-fnref-pred&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;
Therefor if the “snatching” is more of an image for us - the reader - as a call to action,
that would imply that the “fire” could just be imagery as well.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;3.4&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;34-other-verses&quot;&gt;3.4 Other Verses&lt;/h2&gt;
&lt;p&gt;Other verse which the same logic can be applied to.
These don’t really go against my previous points
but I figured it would be good to be through.&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Isaiah 66:24:
&lt;p&gt;“Then they will go forth and look On the corpses of the men
Who have transgressed against Me. For their worm will not
die And their fire will not be quenched; And they will be
an abhorrence to all mankind.”&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There are also several verses in 1 Enoch that talk about fire in hell. I’m not observing the Book of Enoch as
cannon so I’m not including them here. But it’s was worth mentioning that they &lt;em&gt;exist&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;4&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;maggots--eternal-pits-of-darkness-point-4&quot;&gt;Maggots &amp;#x26; Eternal Pits of Darkness. Point #4&lt;/h1&gt;
&lt;p&gt;&lt;a name=&quot;4.1&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;41-maggots--worms&quot;&gt;4.1 Maggots / Worms&lt;/h2&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Isaiah 14:11:
&lt;p&gt;‘Your pomp and the music of your harps Have been brought down to Sheol;
Maggots are spread out as your bed beneath you And worms are your covering.’&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB]  Mark 9:48
&lt;p&gt;where THEIR WORM DOES NOT DIE, AND THE FIRE IS NOT QUENCHED.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I’m not too sure what to do with these verses.
Isaiah is probably just imagery, considering this is a prophesy of the ends times.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-enoch&quot; id=&quot;user-content-fnref-enoch&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;
And in Mark it &lt;em&gt;would seem&lt;/em&gt; that he’s just driving home the idea of hell = bad.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;4.2&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;42-outer-darkness&quot;&gt;4.2 (Outer) Darkness&lt;/h2&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Jude 1:12-13:
&lt;p&gt;12: These are the men who are hidden reefs in your love feasts when
they feast with you without fear, caring for themselves;
clouds without water, carried along by winds;
autumn trees without fruit, doubly dead, uprooted;&lt;/p&gt;
&lt;p&gt;13: wild waves of the sea, casting up their own shame like foam;
wandering stars, for whom the black darkness has been reserved forever.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is how I read verses 12-13:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;These are the men who &lt;em&gt;&lt;strong&gt;are&lt;/strong&gt;&lt;/em&gt; hidden reefs in your love feasts when they feast with you without fear, caring for themselves;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ They are &lt;em&gt;like&lt;/em&gt;: ]&lt;/strong&gt;&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Thing&lt;/th&gt;&lt;th&gt;That Is&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;clouds without water&lt;/td&gt;&lt;td&gt;carried along by winds&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;autumn trees without fruit&lt;/td&gt;&lt;td&gt;doubly dead, uprooted&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;wild waves of the sea&lt;/td&gt;&lt;td&gt;casting up their own shame like foam&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;wandering stars&lt;/td&gt;&lt;td&gt;for whom the black darkness has been reserved forever&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;And since angels (and Jesus? it gets confusing) are sometimes referred to
as stars (Numbers 24:17, Job 38:7, Isaiah 14:12, Revelation 8:10-11, Revelation 9:1, Revelation 22:16),
and with the context of Jude 1:6 (same chapter)(angels kept in darkness) and 2 Peter 2:4 (angels kept in darkness),
I would say that verse 13 is about fallen angels.&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] 2 Peter 2:4:
&lt;p&gt;For if God did not spare angels when they sinned, but cast
them into hell and committed them to pits of darkness, reserved for judgment;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So it would appear that these verse are just about angels, and we can discard them for our purposes.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Jesus talking to the centurion:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 8:11-12:
&lt;p&gt;11: “I say to you that many will come from east and west,
and recline at the table with Abraham, Isaac and Jacob
in the kingdom of heaven;&lt;/p&gt;
&lt;p&gt;12: but the sons of the kingdom will be cast out into the
outer darkness; in that place there will be weeping
and gnashing of teeth.”&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Parable of the wedding feast:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 22:11-13:
&lt;p&gt;11: “But when the king came in to look over the dinner guests,
he saw a man there who was not dressed in wedding clothes,&lt;/p&gt;
&lt;p&gt;12: and he said to him, ‘Friend, how did you come in here
without wedding clothes?’ And the man was speechless.&lt;/p&gt;
&lt;p&gt;13: “Then the king said to the servants, ‘Bind him hand and
foot, and throw him into the outer darkness; in that place
there will be weeping and gnashing of teeth.’&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The ending of the parable of the talents ends the same:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 25:30:
&lt;p&gt;“Throw out the worthless slave into the outer darkness;
in that place there will be weeping and gnashing of teeth.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It would appear that “outer darkness” and “weeping and gnashing of teeth” are &lt;em&gt;very&lt;/em&gt; closely related.
As such, we will look at them together in the following point.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;4.3&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;43-weeping-and-gnashing-of-teeth&quot;&gt;4.3 Weeping and Gnashing of Teeth&lt;/h2&gt;
&lt;p&gt;Jesus is talking to the centurion, then seemingly randomly drops this:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 8:11-12:
&lt;p&gt;11: “I say to you that many will come from east and west,
and recline at the table with Abraham, Isaac and Jacob in
the kingdom of heaven;&lt;/p&gt;
&lt;p&gt;12: but the sons of the kingdom will be cast out into the
outer darkness; in that place there will be weeping and
gnashing of teeth.”&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Then, After explaining how the “reapers” will gather the people, separate the “wheat” from the “tares”, and cast the “tares” into the furnace.&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 13:41-42:
&lt;p&gt;41: “The Son of Man will send forth His angels, and they will gather out
of His kingdom all stumbling blocks, and those who commit lawlessness,&lt;/p&gt;
&lt;p&gt;42: and will throw them into the furnace of fire; in that place there
will be weeping and gnashing of teeth.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Then for the next few verses He sextuples-down on the point, ending with:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 13:49-50:
&lt;p&gt;49: “So it will be at the end of the age; the angels will come
forth and take out the wicked from among the righteous,&lt;/p&gt;
&lt;p&gt;50: and will throw them into the furnace of fire; in that place
there will be weeping and gnashing of teeth.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Parable of the wedding feast:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 22:11-13:
&lt;p&gt;11: “But when the king came in to look over the dinner guests,
he saw a man there who was not dressed in wedding clothes,&lt;/p&gt;
&lt;p&gt;12: and he said to him, ‘Friend, how did you come in here
without wedding clothes?’ And the man was speechless.&lt;/p&gt;
&lt;p&gt;13: “Then the king said to the servants, ‘Bind him hand and
foot, and throw him into the outer darkness; in that place
there will be weeping and gnashing of teeth.’&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Here the weeping and gnashing of teeth seems like an odd juxtaposition to the wedding feast.
Almost making it feel like the “weeding and gnashing of teeth” is a interruption from the story into the real world.&lt;/p&gt;
&lt;p&gt;Jesus starts by saying:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 22:2:
&lt;p&gt;“The kingdom of heaven may be compared to a king who gave a wedding feast for his son.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Then the wedding guest that wasn’t prepared, which would appear to convey the same
message as the following:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 24:40-42:
&lt;p&gt;40: “Then there will be two men in the field; one will be taken and one will be left.&lt;/p&gt;
&lt;p&gt;41: “Two women will be grinding at the mill; one will be taken and one will be left.&lt;/p&gt;
&lt;p&gt;42: “Therefore be on the alert, for you do not know which day your Lord is coming.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The wedding guest was not on the alert.
The day of the Lord came (the wedding), he was not prepared (dressed), and was thrown into the outer darkness.&lt;/p&gt;
&lt;p&gt;Here again Jesus is talking about slaves who’s master is away for a while:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 24:50-51:
&lt;p&gt;50: the master of that slave will come on a day when he does not expect him and at an hour which he does not know,&lt;/p&gt;
&lt;p&gt;51: and will cut him in pieces and assign him a place with the hypocrites; in that place there will be weeping and gnashing of teeth.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Here we see again: unprepared ➞ thrown into the place of weeping and gnashing of teeth.&lt;/p&gt;
&lt;p&gt;Parable of the 10 virgins ends nearly the same, but just doesn’t mention “weeping and gnashing of teeth”.&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew:11-13:
&lt;p&gt;11: “Later the other virgins also came, saying, ‘Lord, lord, open up for us.’&lt;/p&gt;
&lt;p&gt;12: “But he answered, ‘Truly I say to you, I do not know you.’&lt;/p&gt;
&lt;p&gt;13: “Be on the alert then, for you do not know the day nor the hour.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The ending of the parable of the talents ends the same:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Matthew 25:30:
&lt;p&gt;“Throw out the worthless slave into the outer darkness;
in that place there will be weeping and gnashing of teeth.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Then our only non-Matthew mention of it:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Luke 13:27-28:
&lt;p&gt;27: and He will say, ‘I tell you, I do not know where you are from;
DEPART FROM ME, ALL YOU EVILDOERS.’&lt;/p&gt;
&lt;p&gt;28: “In that place there will be weeping and gnashing of teeth when
you see Abraham and Isaac and Jacob and all the prophets in the
kingdom of God, but yourselves being thrown out.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;All of these verses remind me of:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[English NASB] Genesis 7:16:
&lt;p&gt;Those that entered, male and female of all flesh, entered as God had commanded him;
and the LORD closed it behind him.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;but that would probably be a paper for another time. Relating the Old Testament to the New.&lt;/p&gt;
&lt;p&gt;I don’t think that I nor anyone else will be able to decipher exactly what
“weeping and gnashing of teeth” &lt;em&gt;literally&lt;/em&gt; is, but we do know that
“weeping and gnashing of teeth” more or less just means “extreme anguish”.
So while this isn’t “torture” like point &lt;a href=&quot;#2&quot;&gt;#2&lt;/a&gt; was about, it sounds like it would be &lt;em&gt;torturous&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And the avoidance of this torturous end is being ready, “for you do not know the day nor the hour” (Matthew 25:13).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name=&quot;4.4&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;44-bottomless-pits&quot;&gt;4.4 Bottomless Pits&lt;/h2&gt;
&lt;p&gt;These ideas of a “bottomless” pit &lt;em&gt;probably&lt;/em&gt; come from the Book of Enoch&lt;sup&gt;&lt;a href=&quot;#user-content-fn-ver&quot; id=&quot;user-content-fnref-ver&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;, as I don’t see this idea in the Bible anywhere.
I don’t personally see the Book(s) of Enoch as cannon, thus why I don’t have references in the other points to it.
However, since this is the only place I see this particular idea mentioned, we will take a look at Enoch for this point.&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[Jay Winter] 1 Enoch 6:3:
&lt;p&gt;And I saw the places of the luminaries and the treasuries of the stars and of the
thunder and in the uttermost depths, where were a fiery bow and arrows and
their quiver, and a fiery sword and all the lightnings.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Then, the following verse sound similar to Jude 1:6:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[Jay Winter] 1 Enoch 6:17-23:
&lt;p&gt;17: And I saw a deep abyss, with columns of heavenly fire, and among them I
saw columns of fire fall, which were beyond measure alike towards the height
and towards the depth.&lt;/p&gt;
&lt;p&gt;18: And beyond that abyss I saw a place which had no firmament of the heaven
above, and no firmly founded earth beneath it: there was no water upon it, and
no birds, but it was a waste and horrible place.&lt;/p&gt;
&lt;p&gt;19: I saw there seven stars like great burning mountains, and to me, when I
inquired regarding them. The angel said: “This place is the end of heaven and
earth. This has become a prison for the stars and the host of heaven.&lt;/p&gt;
&lt;p&gt;20: And the stars which roll over the fire are they which have transgressed the
commandment of the Lord in the beginning of their rising, because they did not
come forth at their appointed times.&lt;/p&gt;
&lt;p&gt;21: And He was wroth with them, and bound them till the time when their guilt
should be consummated for ten thousand years.”&lt;/p&gt;
&lt;p&gt;22: And Uriel said to me: “Here shall stand the angels who have connected
themselves with women, and their spirits assuming many different forms are
defiling mankind and shall lead them astray into sacrificing to demons as gods.&lt;/p&gt;
&lt;p&gt;23: Here shall they stand, till the day of the great judgement in which they shall
be judged till they are made an end of. And the women also of the angels who
went astray shall become sirens.”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;bible&quot;&gt;
[Jay Winter] 1 Enoch 7:13,17:
&lt;p&gt;13: And from thence I went to another place, which was still more horrible than
the former, and I saw a horrible thing. A great fire there which burnt and blazed,
and the place was cleft as far as the abyss, being full of great descending
columns of fire. Neither its extent or magnitude could I see, nor could I
conjecture.&lt;/p&gt;
&lt;p&gt;17: And he said unto me: “This place is the prison of the angels, and here they
will be imprisoned for ever.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So it would seem 1 Enoch lines up with Jude 1 and 2 Peter 2.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So does that mean we can use it as a source?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’m not going to (even though it &lt;em&gt;is&lt;/em&gt; interesting!), but you would have to decide for yourself.&lt;/p&gt;
&lt;p&gt;It’s worth noting that even if we are using the book of 1 Enoch as a source, 1 Enoch 7:19-20 says this:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;
[Jay Winter] 1 Enoch 7:19-20:
&lt;p&gt;19: And there was in it four hollow places, deep and wide and very smooth. How
smooth are the hollow places and deep and dark to look at.&lt;/p&gt;
&lt;p&gt;20: Then Raphael answered, one of the holy angels who was with me, and said
unto me: “These hollow places have been created for this very purpose, that the
spirits of the souls of the dead should assemble therein, yea that all the souls of
the children of men should assemble here. And these places have been made to
receive them till the day of their judgement and till their appointed period, till
the great judgement upon them.”&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So people wouldn’t (or at least aren’t &lt;em&gt;yet&lt;/em&gt;) thrown into pits. Just angels.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&quot;conclusions--tldr&quot;&gt;Conclusions / TL;DR&lt;/h1&gt;
&lt;p&gt;We started with these questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You go to hell when you die (if you don’t have your faith in Jesus).&lt;/li&gt;
&lt;li&gt;Hell is a place where you go to be eternally tortured.&lt;/li&gt;
&lt;li&gt;Hell is full of fire.&lt;/li&gt;
&lt;li&gt;You are falling into a bottomless pit while worms eat your flesh eternally.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And ended with these answers&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Yes.&lt;/li&gt;
&lt;li&gt;Not really tortured by an &lt;em&gt;entity&lt;/em&gt;, but rather everything sucks.&lt;/li&gt;
&lt;li&gt;Probably not, still possible though.&lt;/li&gt;
&lt;li&gt;No.&lt;/li&gt;
&lt;/ol&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-judgment&quot;&gt;
&lt;p&gt;2 Peter 2:4 says fallen angels are “&lt;em&gt;reserved&lt;/em&gt; for judgment”.
Matthew 10:15 says “it &lt;em&gt;will&lt;/em&gt; be … in the day of judgment”. &lt;a href=&quot;#user-content-fnref-judgment&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-pred&quot;&gt;
&lt;p&gt;From the point of pseudo-free will. Explaining this will require a whole other paper. &lt;a href=&quot;#user-content-fnref-pred&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-enoch&quot;&gt;
&lt;p&gt;Perhaps worth noting that 2 Enoch 2:11 mentions worms similarly to how Isaiah 14:11 does.
&lt;strong&gt;Also&lt;/strong&gt; worth noting that chapter 2’s title is “The Second Parable”. And parables are just teaching tools, imagery. &lt;a href=&quot;#user-content-fnref-enoch&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-ver&quot;&gt;
&lt;p&gt;I’m using
&lt;a href=&quot;https://ia601001.us.archive.org/19/items/TheCompleteBookOfEnochStandardEnglishVersionJayWinter/The%20Complete%20Book%20of%20Enoch%2C%20Standard%20English%20Version%20-%20Jay%20Winter.pdf&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;this version&lt;/a&gt;
of the Book of Enoch. &lt;a href=&quot;#user-content-fnref-ver&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Tue, 27 May 2025 06:00:00 GMT</pubDate><category>Paper</category><category>Bible</category><author>Oliver Atkinson</author></item><item><title>A/B Testing</title><link>https://oliveratkinson.net/ab-splits</link><guid isPermaLink="true">https://oliveratkinson.net/ab-splits</guid><description>&lt;p&gt;Newest project hot off the keyboard: A/B(/C/D/etc…) split testing with Astro.
Going into this project you will first need to know two major things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What is Astro&lt;/li&gt;
&lt;li&gt;What is A/B Split testing&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;what-is-astro&quot;&gt;What is Astro?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://astro.build&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Astro&lt;/a&gt; is my favorite web framework for it’s simplicty and server-side nature.
Astro is the framework I’ve build &lt;em&gt;this&lt;/em&gt; website in but also sites like &lt;a href=&quot;https://tegan.training&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;tegan.training&lt;/a&gt; and
&lt;a href=&quot;https://foss.cooking&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;foss.cooking&lt;/a&gt; - which you can read about &lt;a href=&quot;/fosscooking&quot;&gt;here&lt;/a&gt;.
The two main things I like about are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the css scoping&lt;/li&gt;
&lt;li&gt;and the backend tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSS scoping means that on one page, &lt;code&gt;/index.html&lt;/code&gt; for example, I can write some custom css for a &lt;code&gt;div&lt;/code&gt;,
then on another page, let’s say &lt;code&gt;/foo.html&lt;/code&gt;, the div won’t be styled.
You can, of course, override this behavior but it’s nice to not need 1000 different css classes, just to
get some unique styling on a specifc page, or part of page.&lt;/p&gt;
&lt;p&gt;The other great thing being the backend tooling.
Astro provides helper functions for doing simple things like getting cookies, but also for more
advanced things such as creating custom (pseudo-)html classes. Also, since Astro tries to keep all
javascript away from the front end, we can easily pass backend variables into the html to be rendered
then sent to the frontend. This will be useful in a second!&lt;/p&gt;
&lt;h2 id=&quot;what-is-ab-testing&quot;&gt;What is A/B testing?&lt;/h2&gt;
&lt;p&gt;aka: A/B testing, Split testing, A/B split testing&lt;/p&gt;
&lt;p&gt;A/B testing is where we serve different versions of a website(/advertisement/whatnot) to the
users, then track how many sales were gotten with which version of the media.
Let me explain with a little diagram:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;user_1 	-&gt; website_a -&gt; doesn&apos;t buy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;user_2 	-&gt; website_b -&gt; buys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;user_3 	-&gt; website_a -&gt; buys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;user_4 	-&gt; website_b -&gt; doesn&apos;t buy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;user_5 	-&gt; website_a -&gt; doesn&apos;t buy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;user_6 	-&gt; website_b -&gt; buys&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here we can see that &lt;code&gt;website_a&lt;/code&gt; lead to one purchase, but &lt;code&gt;website_b&lt;/code&gt; lead to two purchases. This must mean
that &lt;code&gt;website_b&lt;/code&gt; had better copy or styling and thus made us more sales! Neat!&lt;/p&gt;
&lt;h1 id=&quot;implementation&quot;&gt;Implementation&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Incase I change stuff on the repo later I made a tag &lt;code&gt;writeup&lt;/code&gt; so you can go back and look at the code
as I’m describing it here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: If you haven’t worked with &lt;code&gt;.astro&lt;/code&gt; files before, you can think of them just like normal &lt;code&gt;.html&lt;/code&gt; files,
except that there is a fenced area at the top (denoted by &lt;code&gt;---&lt;/code&gt;). Inside the fence is typescript code that is
run either on every page load (how this project is configured), or just once when generating the static site.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://git.oliveratkinson.net/Oliver/AB-funnels&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Link to the repository.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is the main flow of the website:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;User requests any page on the site&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As the request comes into the server, &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/AB-funnels/src/commit/ff469e2bf6f35aae5ec9cbd25d7aaa61d0ceae06/src/middleware.ts&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;middleware (middleware.ts)&lt;/a&gt;
intercepts it and checks the user’s cookies&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If the user has the cookie with the name &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/AB-funnels/src/commit/ff469e2bf6f35aae5ec9cbd25d7aaa61d0ceae06/src/middleware.ts#L10&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;“split”&lt;/a&gt;
then don’t do anything, we have already tagged this user&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If there is no cookie detected, then we choose a split at random and set a cookie to reflect that choice&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We then set the &lt;code&gt;Astro.locals.split&lt;/code&gt; object to be the split we have detected/chosen for this browser, &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/AB-funnels/src/commit/ff469e2bf6f35aae5ec9cbd25d7aaa61d0ceae06/src/middleware.ts#L21&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;as seen here&lt;/a&gt;.
This is to allow us to make descisions while rendering the page,
based on the split chosen (we will see this in just a second)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally - pass the request onto the next stop - in this case to be rendered&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inside the code for any given page (&lt;a href=&quot;https://git.oliveratkinson.net/Oliver/AB-funnels/src/commit/ff469e2bf6f35aae5ec9cbd25d7aaa61d0ceae06/src/pages/index.astro&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;like index.astro&lt;/a&gt;)
we can &lt;code&gt;switch&lt;/code&gt; on the &lt;code&gt;Astro.locals.split&lt;/code&gt; object. Then depending on what split this user is requesting we
can serve modified versions of the webpage to them!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the user is checking out - as seen in the in the check for &lt;code&gt;POST&lt;/code&gt; requests &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/AB-funnels/src/commit/ff469e2bf6f35aae5ec9cbd25d7aaa61d0ceae06/src/pages/checkout.astro#L9&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; -
we, similar fashion to how  we modifed &lt;code&gt;index.astro&lt;/code&gt; based on the split, read
and save split identifier when processing the transaction! (If this doesn’t make
sense, here’s a footnote to a more in-depth explanation&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From here the obvious next steps would be to connect this to a database to store identifiers so we could later
count our results with some SQL or whatever your DB users as a query language.&lt;/p&gt;
&lt;p&gt;Perhaps for the next project I could make a proxy that automatically does split testing for you, and just routes
between two different backend webservers. That is, if I ever sit down and learn how to write a reverse proxy…&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;When a user requests the &lt;code&gt;/checkout&lt;/code&gt; url, their browser will submit a &lt;code&gt;GET&lt;/code&gt; request to that endpoint.
On line 9 we see that we have a check for &lt;code&gt;POST&lt;/code&gt; reqeusts, so none of that code will get run, and the user
will recieve the html that is written below the fence (&lt;code&gt;---&lt;/code&gt;).
This html includes a form.
As you can see on line 39, the form’s &lt;code&gt;method&lt;/code&gt; is &lt;code&gt;POST&lt;/code&gt;. This means that when the form is submitted it will
request this same endpoint (&lt;code&gt;/checkout&lt;/code&gt;) but this time making a &lt;code&gt;POST&lt;/code&gt; request instead of a &lt;code&gt;GET&lt;/code&gt; request.
Now all the code that is inside that &lt;code&gt;if&lt;/code&gt; statment’s body will be run, which does some “validation” (not really),
then prints out the user’s email and split identifier to the server’s console! &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><category>Blog</category><category>Portfolio</category><author>Oliver Atkinson</author></item><item><title>Crazy Fast Linux</title><link>https://oliveratkinson.net/tiny-core-linux</link><guid isPermaLink="true">https://oliveratkinson.net/tiny-core-linux</guid><description>&lt;p&gt;While looking for a super small Linux distro for an upcoming project, I came across &lt;a href=&quot;https://tinycorelinux.net&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tiny Core Linux&lt;/a&gt;(TCL).
After setting it up in a Proxmox vm, I now have a system that books in just arround ~10 seconds - pretty awesome!
Here are the quirks I found while setting it up:&lt;/p&gt;
&lt;h2 id=&quot;setup&quot;&gt;Setup&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Assuming you are also using Proxmox, you need to make sure that the disk type you are trying to install to is &lt;code&gt;ide&lt;/code&gt; not the default &lt;code&gt;scsi&lt;/code&gt;.
For whatever reason TCL doesn’t recognize &lt;code&gt;scsi&lt;/code&gt; disk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You need to install the install script. It doesn’t come pre-loaded on the system like many distros.
Install by using the &lt;code&gt;tce&lt;/code&gt; command to search for “install”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Before running the install script you need to use &lt;code&gt;fdisk&lt;/code&gt; to make partitions&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you plan on having persistant files/folders you need atleast 2 paritions&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;persistance&quot;&gt;Persistance&lt;/h2&gt;
&lt;p&gt;Now that you have a bootable system (from disk, not iso), you may want to persist some data after shutdown.
By default nothing is saved (Besides installed packages?).&lt;/p&gt;
&lt;p&gt;If you look in the &lt;code&gt;/opt/&lt;/code&gt; directory there is a file called &lt;code&gt;.filetool.lst&lt;/code&gt; this contains two entries by default:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# .filetool.lst&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;home&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;opt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These are the folders that will be backed up when using the &lt;code&gt;backup&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;By default these will be restored on boot, so you may want to add config files to the &lt;code&gt;/opt/.filetool.lst&lt;/code&gt; to persist configs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cool! But where does it backup to?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Backups are stored in &lt;code&gt;/mnt/sda1/tce/&lt;/code&gt; or the equivilent drive name, it just so happns that my system has &lt;code&gt;sda1&lt;/code&gt;
as the drive/partition name.&lt;/p&gt;
&lt;p&gt;The config settings for this are stored in &lt;code&gt;/mnt/sda1/tce/boot/extlinux/extlinux.conf&lt;/code&gt;.
If you were to &lt;code&gt;cat&lt;/code&gt; this file you would see the last line starts with “APPEND”.
Inside this line you should see &lt;code&gt;tce=UUID=&quot;&amp;#x3C;disk-uuid&gt;&quot;&lt;/code&gt;.
This means that the disk with that UUID has the “tce” directory and it should restore from there.&lt;/p&gt;
&lt;p&gt;You can view all the possible options for “APPEND” &lt;a href=&quot;https://wiki.tinycorelinux.net/doku.php?id=wiki:boot_options#generic_kernel_boot_parameters&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;login&quot;&gt;Login&lt;/h3&gt;
&lt;p&gt;Lets say that you are getting closer to production of your system that’s running TCL.
You will probably want to set a password and would like to stop the system from auto logging-in on boot.
Looking at the link above we see that we can add &lt;code&gt;noautologin&lt;/code&gt; to prevent the second issue, of, autologin.&lt;/p&gt;
&lt;p&gt;But how to we set a password and have it persist thru the next book?&lt;/p&gt;
&lt;p&gt;Well, we just need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Set a password using &lt;code&gt;passwd&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure that &lt;code&gt;/etc/shadow&lt;/code&gt; is persisted.
To do this add “etc/shadow/” to your &lt;code&gt;/opt/.filetool.lst&lt;/code&gt;, then run the &lt;code&gt;backup&lt;/code&gt; command to save.
Now when you powercycle the machine it will no longer drop you into a shell on boot, it will ask for a username/password combo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description><pubDate>Fri, 11 Apr 2025 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>New site! foss.cooking</title><link>https://oliveratkinson.net/fosscooking</link><guid isPermaLink="true">https://oliveratkinson.net/fosscooking</guid><description>&lt;h1 id=&quot;announcement&quot;&gt;Announcement&lt;/h1&gt;
&lt;p&gt;Hello everybody! Today I’m announcing that I’ve added another website to my lineup: &lt;a href=&quot;https://foss.cooking&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;foss.cooking&lt;/a&gt;!
This website is a spiritual successor of Luke Smith’s old website &lt;a href=&quot;https://based.cooking&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;based.cooking&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why&lt;/h2&gt;
&lt;p&gt;Luke’s based.cooking site is an awesome place on the internet, but it’s last commit was over two years ago.
While the content itself is evergreen, it would be nice to get new additions to the site. This is why I spent
the weekend merging in some 40-odd pull requests from the original site into the new foss.cooking site.&lt;/p&gt;
&lt;h2 id=&quot;tech-stack&quot;&gt;Tech stack&lt;/h2&gt;
&lt;p&gt;The original based.cooking site was built with hugo, similar to my old website.
And, like my website, I’ve ported it over to Astro!
This allows for neat things such as enforcing schema on the toml headers on markdown files, as well as storing data
inside of json file - all with enforced schema.
This allows for more assured correct-ness of data I’m serving.&lt;/p&gt;
&lt;p&gt;The server is currently hosted on github pages with domain pointed to it. I may move it off a GH pages and onto
my server later if I want to collect some stats about it. If I do that I’ll probably make another post about it
so keep an eye out!&lt;/p&gt;
&lt;h2 id=&quot;contribute&quot;&gt;Contribute&lt;/h2&gt;
&lt;p&gt;If you feel like contributing some recipes or code &lt;a href=&quot;https://github.com/Rushmore75/foss.cooking&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;here’s the repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Happy cooking!&lt;/p&gt;</description><pubDate>Sat, 22 Mar 2025 00:00:00 GMT</pubDate><category>Blog</category><category>Portfolio</category><author>Oliver Atkinson</author></item><item><title>Results Shading</title><link>https://oliveratkinson.net/results-shading</link><guid isPermaLink="true">https://oliveratkinson.net/results-shading</guid><description>&lt;blockquote&gt;
&lt;p&gt;This is gonna be a bit more informal and fun&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ever tried searching for some more obscure knowledge on the internet, only to find that the search results are littered with modern junk?
Whether it be movies, shows, or new tech, my proposition is that this is perhaps, in some cases, intentional.&lt;/p&gt;
&lt;p&gt;The goal of this isn’t to turn this website into some conspiracy site.
However, this idea is at the very least a fun, and at worse, it’s the “deep state” obscuring information from us.&lt;/p&gt;
&lt;p&gt;Let’s take some examples: In Wendigoon’s &lt;em&gt;Conspiracy Theory Iceberg&lt;/em&gt; videos he comes across an item labeled “Nexus 7” and he is unable to find &lt;em&gt;any&lt;/em&gt; results on it because there as since been a Google phone called “Nexus 7”.
What if Google was told to create a phone brand line “Nexus” just to cover up clear-web viewers from finding “the real truth”.
Now, it would be good to note that “Nexus 7” is &lt;em&gt;probably&lt;/em&gt; just a Blade Runner reference, just “wow spooky, what if an android is like a human and we can’t tell”.
So not really anything worth hiding.&lt;/p&gt;
&lt;p&gt;A modern example of this would be the new Captain America movie that came out in Feb of 2025.
Captain America - Brave New World.
The subtitle is obviously also the title of Aldous Huxley’s book by the same name.
But interestingly, the movie’s original subtitle was “New World Order”.
If you’d like you can go to &lt;a href=&quot;https://en.wikipedia.org/wiki/Captain_America:_Brave_New_World&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;the Wikipedia page for the movie&lt;/a&gt; and check it out for yourself.
Just &lt;code&gt;Ctrl+F&lt;/code&gt; for “New world order”.&lt;/p&gt;
&lt;p&gt;It would have been interesting if Hollywood was trying to obscure the search results for “New World Order”.
But perhaps the movie wasn’t going to do well enough to burn that name on it (as reviews start rolling in they seem to be negative).
So maybe they would like to save the name for a better performing movie, which will &lt;em&gt;actually&lt;/em&gt; hide some information.&lt;/p&gt;
&lt;p&gt;Just a funny quirky thought.&lt;/p&gt;</description><pubDate>Thu, 13 Feb 2025 04:49:14 GMT</pubDate><category>Blog</category><category>Conspiracy</category><author>Oliver Atkinson</author></item><item><title>Static Captcha</title><link>https://oliveratkinson.net/static-captcha</link><guid isPermaLink="true">https://oliveratkinson.net/static-captcha</guid><description>&lt;p&gt;While being a resident of the internet this past week I found &lt;a href=&quot;https://www.youtube.com/watch?v=RNhiT-SmR1Q&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;this video&lt;/a&gt;. The TL;DR of the video is: Your mind can decipher moving objects even when any given frame doesn’t have intelligible data. This affords you some interesting opportunities. In the context of the video, the creator is messing around with Godot. Having the skybox use a static image of static (aka noise) then having objects use the same noise. Sounds like everything is invisible, right? And you are correct &lt;strong&gt;if&lt;/strong&gt; nothing is &lt;em&gt;moving&lt;/em&gt;. Now, once something starts moving, that’s where the fun begins. Somehow (I’m not going to pretend I know &lt;em&gt;why&lt;/em&gt; this works) your mind can use previous images to help decipher the current image. While this is a very cool game idea, it also sounds like a good technology to use for a captcha.&lt;/p&gt;
&lt;h1 id=&quot;requirements&quot;&gt;Requirements&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Run from the command line&lt;/li&gt;
&lt;li&gt;Allow for 6 characters to be displayed&lt;/li&gt;
&lt;li&gt;The server needs to know the 6 characters so it can verify the correct answer.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;building&quot;&gt;Building&lt;/h1&gt;
&lt;p&gt;Firstly I knew I would need an image filled with static. This sound like a job for &lt;a href=&quot;https://imagemagick.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;imagemagick&lt;/a&gt;. A very cool and very powerful CLI image editing tool. Think something like GIMP or Photoshop, but all from the command line.&lt;/p&gt;
&lt;p&gt;Magick can be invoked using the &lt;code&gt;convert&lt;/code&gt; command. (Note that sometime between v6 and v7 the command changed from &lt;code&gt;convert&lt;/code&gt; to &lt;code&gt;magick&lt;/code&gt;, but &lt;code&gt;convert&lt;/code&gt; still works.)&lt;/p&gt;
&lt;p&gt;Let’s start with some random noise:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;convert&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -size&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 100x100&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; canvas:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; +noise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Random&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -monochrome&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; noise.png&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/noise.png&quot; alt=&quot;Image of noise&quot;&gt;&lt;/p&gt;
&lt;p&gt;Very cool, we now have noise!&lt;/p&gt;
&lt;p&gt;We will also need some text. How about the string “hello”:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;convert&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;	-background&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; none&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fill&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; black&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;	-pointsize&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 24&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -size&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 100x100&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -gravity&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; center&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;	label:hello&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mask.png&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note the &lt;code&gt;-background none&lt;/code&gt;, this means that the background will just be transparent (alpha).
Here on the site the totally clear background looks like more of a dark grey:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/mask.png&quot; alt=&quot;Hello, as a black mask&quot;&gt;&lt;/p&gt;
&lt;p&gt;Good, now overlay them:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;convert&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; noise.png&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mask.png&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -gravity&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; center&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -background&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -layers&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Flatten&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; layered.png&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/layered.png&quot; alt=&quot;Layered image&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Now, you can probably see the issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It’s not moving&lt;/li&gt;
&lt;li&gt;The text is solid, not noisy like it’s supposed to be&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, let’s tackle the first problem; movement.&lt;/p&gt;
&lt;p&gt;Since we have a static image and need to to be moving, what better format that &lt;code&gt;.gif&lt;/code&gt;? We can run a bunch of images back to back as separate frames of a gif! First thing’s first. We need a bunch of images. We should also introduce some variables so we can change parameters later.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Width of the output&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Height of the output&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Y&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Create directories&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; back&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; out&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; fore&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Create our mask&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;convert&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;	-background&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; none&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -fill&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; black&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;	-pointsize&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 24&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ${X}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;${Y} &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-gravity&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; center&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;	label:hello&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mask.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Create 10 frames&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;seq&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # Create noisy background images&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;	convert&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ${X}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;${Y} &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;canvas:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; +noise&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Random&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -monochrome&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; back/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;${i}&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;seq&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;	# Layer the text on the background&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;	convert&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; back/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.png&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mask.png&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -gravity&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; center&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -background&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -layers&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Flatten&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; out/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Combine all the images in the `out/` directory into a .gif&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;convert&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -delay&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -loop&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; out/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; out.gif&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/first.gif&quot; alt=&quot;the first gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;By reading the Code comments you can probably get the gist of what’s happening.
First we create the text mask.
Then we create 10 frames of background static, then layer the text on the background, saving the result into the &lt;code&gt;out/&lt;/code&gt; directory.
Then finally select everything from the &lt;code&gt;out/&lt;/code&gt; directory and combine it into a &lt;code&gt;.gif&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now that we see it’s working, we need to disguise the text as well.
We will use the previous “hello” image as a mask for some new noisy images.
You can think of it like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate a noisy image.&lt;/li&gt;
&lt;li&gt;Generate an imgae that just says “Hello” and all the other pixels are transparent.&lt;/li&gt;
&lt;li&gt;Copy the transparency data from the “Hello” image to the noisy image.
Now all you are left with is “Hello”, but it is written with noise instead of just black pixels!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here’s the code changes to do that:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;diff&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;for i in $(seq 1 10); do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	convert -size ${X}x${Y} canvas: +noise Random -monochrome back/${i}.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	# Use the test-mask image to generate foreground images&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++	convert -size ${X}x${Y} canvas: +noise Random -monochrome mask.png -compose CopyOpacity -composite fore/${i}.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;for i in $(seq 1 10); do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	# Instead of compositng the mask and the background&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;--	convert back/$i.png mask.png -gravity center -background None -layers Flatten out/$i.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	# Composite the foreground and background&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++	convert back/$i.png fore/$i.png -gravity center -background None -layers Flatten out/$i.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/second.gif&quot; alt=&quot;the second gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hmm… well that’s no good! Even though they are &lt;em&gt;technically&lt;/em&gt; two different pieces of noise layered, we can’t tell the difference!&lt;/p&gt;
&lt;p&gt;After re-watching the video it seems that we need to use a smoothly scrolling piece of noise instead of lots of random pictures of noise just strung together sequentially.&lt;/p&gt;
&lt;p&gt;We can start by making the noise to be one long image:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;diff&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Remove this code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- for i in $(seq 1 10); do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- 	convert -size ${X}x${Y} canvas: +noise Random -monochrome back/${i}.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- convert -size ${X}x${Y} canvas: +noise Random -monochrome mask.png -compose CopyOpacity -composite fore/${i}.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Add this code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++ convert -size 2000x${Y} canvas: +noise Random -monochrome background.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++ convert -size ${X}x${Y} -background none -fill black -pointsize 24 -gravity center label:hello mask.png&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s now 2000px long&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/long-bg.png&quot; alt=&quot;Long background&quot;&gt;&lt;/p&gt;
&lt;p&gt;And the mask is back to just being black text, with alpha around it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/new-mask.png&quot; alt=&quot;The new mask&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we need to animate it. Just like how imagemagick is good for CLI image editing, ffmpeg is great for CLI video editing! So let’s take a look. To not make this post take forever, here’s the final ffmpeg command I came up with. There are thousands of ffmpeg options to choose from.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ffmpeg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -loglevel&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; error&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -hide_banner&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -framerate&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 60&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -loop&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; background.png&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; mask.png&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;	-filter_complex&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;		[0] crop=x=n:w=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}:h=${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Y&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;},split[bg][a];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;		[a] hflip,vflip [flip];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;		[1] alphaextract [mask];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;		[flip][mask] alphamerge [text];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;		[bg][text] overlay&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;	-c:v&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; libx264&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -crf&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -an&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; out.mp4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here’s a quick breakdown:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ffmpeg -loglevel error -hide_banner -y -framerate 60 -loop true -t 10&lt;/code&gt; This hides away most of the output, considering this will go into automated systems, we don’t need it. Obviously the framerate is set to 60 then &lt;code&gt;-t 10&lt;/code&gt; sets the total duration to 10 seconds.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-i background.png -i mask.png \&lt;/code&gt; This pulls in background as input &lt;strong&gt;0&lt;/strong&gt; and mask as input &lt;strong&gt;1&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Here we get into the video filters:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-filter_complex&lt;/code&gt; Start the filter&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[0] crop=x=n:w=${X}:h=${Y},split[bg][a];&lt;/code&gt; Take input &lt;strong&gt;0&lt;/strong&gt;, crop it to the width(w) and height(h) of the rest of the clip. We also set the x location of the crop (x=) to offset every frame (n=current frame). So for frame 0, the x offset is zero, but on frame 1, the x offset is 1, etc. We then split this stream into two other streams, naming them “bg” and “a”.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[a] hflip,vflip [flip];&lt;/code&gt; Take the “a” stream, flip it on the horizontal axis, then the vertical axis. Send this out down the “flip” stream. The horizontal flip will make it appear that the text’s static is moving opposite to the background. The vertical flip is so that small characters (like “h”) don’t look weird if they are near the center. (Try removing the vflip and saying hi!)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[1] alphaextract [mask];&lt;/code&gt; Take input &lt;strong&gt;1&lt;/strong&gt; (the mask) and turn it into a alpha mask.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[flip][mask] alphamerge [text];&lt;/code&gt; Take the “flip” and “mask” streams, then mask out “flip” using “mask”. This will cause the “flip” stream to only show where it overlaps with “mask”. Then send this as the “text” stream.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[bg][text] overlay&lt;/code&gt; Collect streams “bg” and “text” and overlay them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c:v libx264 -crf 10 -an out.mp4&lt;/code&gt; Finally; set the video Codec (&lt;code&gt;-c:v&lt;/code&gt;), the compression (&lt;code&gt;-crf&lt;/code&gt;), and remove the audio track (&lt;code&gt;-an&lt;/code&gt;) (there wasn’t one to begin with, but it’s nice to be sure.) Then output all of this into the file &lt;code&gt;out.mp4&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then here’s the final product!&lt;/p&gt;
&lt;video controls&gt;
	&lt;source src=&quot;/static-captcha/out.mp4&quot; type=&quot;video/mp4&quot;&gt;
	Looks like your browser doesn&apos;t support mp4 video. 
	&lt;a href=&quot;/static-captcha/out.mp4&quot;&gt;Here&apos;s the link to download it:&lt;/a&gt;
&lt;/video&gt;
&lt;p&gt;Try pausing the video and watch the text disappear!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This fulfills requirement 1 (Running from the command line).
To fulfill requirement 2 will just take some tweaking of the size (Allow for 6 characters to be displayed).
Then to fulfill requirement 3 (The server needs to know what the 6 characters it used were)
we just need to take in an argument from the command line, then use that as our text.&lt;/p&gt;
&lt;p&gt;Taking in input from the command line is as easy as:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;diff&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;convert \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	-background none -fill black \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	-pointsize 120 -size ${X}x${Y} -gravity center \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;--	label:hello mask.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++	label:$1 mask.png&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then we are all done! Check out the &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/static-captcha&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;full Code here&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&quot;why-did-i-do-it-like-this&quot;&gt;Why did I do it like this?&lt;/h1&gt;
&lt;p&gt;If you watched the video you may have noted an interesting difference between Branta Games’s demo and mine (take a look 3:12). He’s using a moving background but a static foreground. So why did I choose to do both a scrolling foreground and background?&lt;/p&gt;
&lt;p&gt;Considering the nature of captchas, we are trying to make a system where humans can decipher text, but robots can’t. Our enemy is an automated one. Here’s the system diagram so you can visualize the threat better&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;+------ Server ------+      +------ Client ------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;|                    |      |                    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;| 1. Generate video  | ---&gt; | 2. Download video  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;|                    |      | 3. Parse video     |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;| 5. Verify response | &amp;#x3C;--- | 4. Send result     |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;|                    |      |                    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;+--------{Us}--------+      +------{Threat}------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;We&lt;/strong&gt; can only control the settings during the &lt;em&gt;generation&lt;/em&gt;, but the attacker can control all the &lt;em&gt;parsing&lt;/em&gt; settings.&lt;/p&gt;
&lt;p&gt;So let me show you why not scrolling the foreground is a bad thing.
If we change the ffmpeg filters to look like this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;diff&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- ffmpeg -loglevel error -hide_banner -y -framerate 60 -loop true -t 5 -i background.png -i mask.png \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++ ffmpeg -loglevel error -hide_banner -y -framerate 60 -loop true -t 5 -i background.png -i mask.png -i background.png \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- [0] crop=x=n:w=${X}:h=${Y},split[bg][a];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++	[0] crop=x=n:w=${X}:h=${Y}[bg];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- [a] hflip,vflip [flip];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++	[2] crop=w=${X}:h=${Y}[a];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	[1] alphaextract [mask];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FDAEB7&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;-&lt;/span&gt;-- [flip][mask] alphamerge [text];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;&lt;span style=&quot;user-select: none;&quot;&gt;+&lt;/span&gt;++	[a][mask] alphamerge [text];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	[bg][text] overlay&quot;\&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you don’t want to decipher what that diff changed; basically we added a third input containing the background image (again) then used this with the mask to create a static foreground.
Here’s the result:&lt;/p&gt;
&lt;video controls&gt;
	&lt;source src=&quot;/static-captcha/wrong.mp4&quot; type=&quot;video/mp4&quot;&gt;
	Looks like your browser doesn&apos;t support mp4 video. 
	&lt;a href=&quot;/static-captcha/wrong.mp4&quot;&gt;Here&apos;s the link to download it:&lt;/a&gt;
&lt;/video&gt;
&lt;p&gt;Now, why is this a bad thing?
I’ll show you.
If the attacker were to download this video then split every frame into individual pictures,
then merge them together into one picture you could make it &lt;em&gt;much&lt;/em&gt; easier to see the words.
(You can download that video if you want to follow along.) (Also &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/static-captcha/src/branch/master/merge.sh&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;here is the final “attacker” code&lt;/a&gt; that we are writing here.)&lt;/p&gt;
&lt;h4 id=&quot;step-1&quot;&gt;Step 1&lt;/h4&gt;
&lt;p&gt;Take the video and break it into every frame:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; frames&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Split up the video so that each frame becomes a separate png photo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ffmpeg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; input.mp4&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; frames/frame%04d.png&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should now have 600 images (10 seconds of 60fps =&gt; 10*60=600).&lt;/p&gt;
&lt;h4 id=&quot;step-2&quot;&gt;Step 2&lt;/h4&gt;
&lt;p&gt;So now you can take every frame and mask out the white. If you are familiar with chromakeys (greenscreen) that is pretty much what we are doing. Just more of a “white-screen” than a greenscreen&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chromakeyed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; frames/*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    convert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $f &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-fuzz&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 99%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -transparent&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; white&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chromakeyed/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;basename&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $f) &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now that we have every frame processed, we can merge them all on top of a red background:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;convert&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chromakeyed/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -background&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; red&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -flatten&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flat.png&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Super easy to see!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/flat.png&quot; alt=&quot;The result of every frame merged&quot;&gt;&lt;/p&gt;
&lt;p&gt;How about if we try that trick on the file where &lt;em&gt;both&lt;/em&gt; the foreground and background are sliding?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/good-flat.png&quot; alt=&quot;The result of every frame merged, again&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nice!&lt;/p&gt;
&lt;p&gt;Here’s the full merging script:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Split the frames out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; frames&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;ffmpeg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; $1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; frames/frame%04d.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Change the white -&gt; transparent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chromakeyed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; frames/*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    convert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $f &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;-fuzz&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 99%&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -transparent&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; white&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chromakeyed/&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;basename&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $f) &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# Merge all the frames into one image&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;convert&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chromakeyed/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -background&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; red&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -flatten&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; flat.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;rm&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; frames&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chromakeyed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1 id=&quot;breaking-it&quot;&gt;Breaking it&lt;/h1&gt;
&lt;p&gt;It should be noted that if you mess with the fuzz percent you can get some intelligible data out of even the “better” method of moving both the foreground and background. The previous examples were done with 99% fuzz, to prove a point, but what about trying some other values? Since the fuzzing is done on the attacker’s machine, they can use whatever fuzz percent they want.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/flat-percentages/flat0.png&quot; alt=&quot;Flat at 0%&quot;&gt;
0%&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/flat-percentages/flat25.png&quot; alt=&quot;Flat at 25%&quot;&gt;
25%&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/flat-percentages/flat50.png&quot; alt=&quot;Flat at 50%&quot;&gt;
50%&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/flat-percentages/flat75.png&quot; alt=&quot;Flat at 75%&quot;&gt;
75%&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/flat-percentages/flat99.png&quot; alt=&quot;Flat at 99%&quot;&gt;
99%&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/flat-percentages/flat100.png&quot; alt=&quot;Flat at 100%&quot;&gt;
100%&lt;/p&gt;
&lt;h2 id=&quot;mitigation&quot;&gt;Mitigation&lt;/h2&gt;
&lt;p&gt;As you can see from the 0% and 100%, by just changing the fuzz value we can get more intelligible text. Interestingly, while the background &lt;em&gt;is&lt;/em&gt; red,  at 0% we are deciphering the words with the color white. Hmm, that’s odd. It would seem that we aren’t actually &lt;em&gt;seeing thru&lt;/em&gt; to the background, but more just reading the artifacts of multiple images. What if we mess with the amount of data that exists, so that merging isn’t as effective.&lt;/p&gt;
&lt;p&gt;Let’s first change the amount of data by shortening the video, and reducing the framerate. We will also try to compress the video. Here are the best (well, worst, because we can read them) results. (The images above were 10 seconds @ 60fps, crf 1)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/crf30/10sec60fps-fuzz50.png&quot; alt=&quot;10 Seconds of 60 FPS @ 50% fuzz&quot;&gt;
10 seconds @ 60fps, 50% fuzz, crf 30&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/crf30/1sec24fps-fuzz50.png&quot; alt=&quot;1 Second of 24 FPS @ 50% fuzz&quot;&gt;
1 second @ 24fps, 50% fuzz, crf 30&lt;/p&gt;
&lt;p&gt;It looks like having &lt;em&gt;less&lt;/em&gt; data makes the text &lt;em&gt;more&lt;/em&gt; viable! These were both done with &lt;code&gt;-crf 30&lt;/code&gt;. The &lt;code&gt;-crf&lt;/code&gt; flag sets compression. Testing again at &lt;code&gt;-crf 1&lt;/code&gt; made the problem &lt;em&gt;much&lt;/em&gt; worse, it was incredibly easy to read the text:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/crf1/1sec24fps-fuzz50.png&quot; alt=&quot;1 Second of 24 FPS @ 0% fuzz&quot;&gt; 1 second @ 24fps, 50% fuzz, crf 1&lt;/p&gt;
&lt;p&gt;According to the &lt;a href=&quot;https://trac.ffmpeg.org/wiki/EnCode/H.264&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;ffmpeg docs&lt;/a&gt; crf can go from 0-51. With 0 being the best quality, and 51 the worst. Since the attacker can always increase the compression once they’ve downloaded the video, our only option (and luckily for us, the &lt;em&gt;best&lt;/em&gt; option) is to increase compression. Since we could still see the words at 30, let’s try 40&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static-captcha/crf40/1sec24fps-fuzz50.png&quot; alt=&quot;1 Second of 24 FPS @ 0% fuzz&quot;&gt; 1 second @ 24fps, 50% fuzz, crf 40&lt;/p&gt;
&lt;p&gt;Going up to 50 just breaks the whole point, while there is no possibility of reading the letters with a computer, there is an equally non-existent chance of a human reading the video.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;
&lt;video controls&gt;
	&lt;source src=&quot;/static-captcha/crf40/demo.mp4&quot; type=&quot;video/mp4&quot;&gt;
	Looks like your browser doesn&apos;t support mp4 video. 
	&lt;a href=&quot;/static-captcha/crf40/demo.mp4&quot;&gt;Here&apos;s the link to download it:&lt;/a&gt;
&lt;/video&gt;
1 second @ 24fps, crf 40
&lt;p&gt;In my opinion, having only 24fps makes this hard to see, but increasing the framerate can make the words a bit easier to see when merged (yes, this is opposite of our previous findings.) As fancy and unique as I thought this idea was, it looks like we are back in the same old trench of: hard enough so that a computer can’t read it, but easy enough that a human can.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://git.oliveratkinson.net/Oliver/static-captcha&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Code repository&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Jan 2025 23:45:54 GMT</pubDate><category>Blog</category><category>Code</category><category>Project</category><author>Oliver Atkinson</author></item><item><title>Downloading the internet</title><link>https://oliveratkinson.net/internet-mapper</link><guid isPermaLink="true">https://oliveratkinson.net/internet-mapper</guid><description>&lt;p&gt;Hello! Here to show off a neat project I’ve been working on!&lt;/p&gt;
&lt;p&gt;Over on &lt;a href=&quot;https://git.oliveratkinson.net/Oliver?tab=repositories&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;my git site&lt;/a&gt; I’ve been working on two (well one, but kinda three?) projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git.oliveratkinson.net/Oliver/internet_mapper&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;internet mapper&lt;/a&gt;, a robot which crawls the web then saves it’s findings to a database&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.oliveratkinson.net/Oliver/internet_mapper_viewer&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;internet mapper viewer&lt;/a&gt;, hosting the afore mentioned database back to the user. This project also includes a firefox extension to intercept web requests, which aides in the “hosting” the content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is one of the more involved projects I’ve done. Probably not the &lt;em&gt;hardest&lt;/em&gt;, as all the documentation has been pretty good. But probably one of the more complex projects. So let’s break it down!&lt;/p&gt;
&lt;h1 id=&quot;the-crawler&quot;&gt;The crawler&lt;/h1&gt;
&lt;p&gt;This was the first part I built. It was spawned from a combination of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Seeing &lt;a href=&quot;https://github.com/spider-rs/spider&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;spider-rs&lt;/a&gt;, apparently it was a super fast crawler (more on that later)&lt;/li&gt;
&lt;li&gt;Preparing for the potential downfall of western civilization (as of Oct 2024)&lt;/li&gt;
&lt;li&gt;archive.org being shut down (kind of).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Originally I was trying to use spider-rs. However, this was causing too many issues, with it’s documentation lacking/incorrect it was just too hard to use. Thus I made my own! Using an amalgamation of rust Code and libraries, most notably html5ever and reqwest, it was trivial to download and parse the page.&lt;/p&gt;
&lt;p&gt;Of course, to store all this data we need a database. Actually, two databases. To keep myself from having to do the hard work of tracking what sites we’ve been to and where we need to go, I offloaded this burden to a database. &lt;a href=&quot;https://surrealdb.com/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;SurrealDB&lt;/a&gt; to be exact! Using schemaless prototyping was awesome for development, then locking in a schema later &amp;#x3C;3 ! This project is also using the relational side of surreal to keep track of that site links to what other sites. Writing the queries for this is just so much more fun that traditional SQL (even though they really are pretty close), and that makes a big difference in the developer experience.&lt;/p&gt;
&lt;p&gt;Using surreal works great for deciding where we’ve been and where we need to go. But now we need to store all the sites we have visited. For this I chose &lt;a href=&quot;https://min.io/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;minio&lt;/a&gt;. This is a s3-like storage system that you can locally host using docker. The fact that it’s s3 compatible doesn’t really do anything for us, we are just using it like a remote filesystem.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For hosting the content back to the user we need two parts.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We need a way to interact with minio&lt;/li&gt;
&lt;li&gt;We need a way to intercept requests for a remote server, and redirect them to the server defined in #1&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;part-1---the-server&quot;&gt;Part 1 - The Server&lt;/h1&gt;
&lt;p&gt;To build this server it was most easily done in rust using &lt;a href=&quot;https://rocket.rs&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;rocket&lt;/a&gt;. I use this for all my servers because it has a great balance of control and ease of use. It was also beneficial to write this in rust since we are interacting again with minio and the crawler was written in rust. So we can just copy and paste the minio Code into this server. The Code to this server is really pretty simple. If you’d like &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/internet_mapper_viewer/src/branch/master/src&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;you can view it here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The file structure of minio is as follows &lt;code&gt;bucket_name/domain_name/file_path&lt;/code&gt; This keeps it simple but still sorted by domain.&lt;/p&gt;
&lt;h1 id=&quot;part-2---interception&quot;&gt;Part 2 - Interception&lt;/h1&gt;
&lt;p&gt;This is where the project turns into the wild west. To make this easier to explain, the server as defined in part 1 I will just be calling “the database”, obviously normal databases don’t have HTTP capabilities but I’ll be pretending it does, when in actuality it’s calling the server which is calling the database.&lt;/p&gt;
&lt;p&gt;So let’s walk thru how this is going to work.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We go to a page, such as &lt;code&gt;wikipedia.org&lt;/code&gt;. This would create a request like &lt;code&gt;GET https://wikipedia.org&lt;/code&gt;, and this is why we need an extension, so we can intercept this.&lt;/li&gt;
&lt;li&gt;Intercept the &lt;code&gt;GET https://wikipedia.org&lt;/code&gt; request and forward it to the database.&lt;/li&gt;
&lt;li&gt;We get back the corresponding HTML from the database, then using the powers of extensions - set the DOM as this incoming HTML.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;notes-on-the-api&quot;&gt;Notes on the API&lt;/h2&gt;
&lt;p&gt;The API that I’m currently using for connecting the extension to the database is very simple. Just &lt;code&gt;localhost/s3/{url}&lt;/code&gt;. However this causes some interesting issues. Since any given URL will have slashes ”/” in it, that causes problems because the URL of &lt;code&gt;https://wikipedia.org/&lt;/code&gt; gets turned into “HTTPS:” + &quot;&quot; + “wikipedia.org”. Which is not how the crawler was saving them into the database. So to prevent this (this is also what the crawler does) is we base64 encode the whole URL, so &lt;code&gt;https://wikipedia.org&lt;/code&gt; turns into &lt;code&gt;aHR0cHM6Ly93aWtpcGVkaWEub3Jn&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;However this causes another issue. What about relative links?&lt;/p&gt;
&lt;p&gt;You see, a website can link to other resources (js, css, videos, pictures, hyperlinks) using both absolute and relative URLs. An absolute URL would look like this: &lt;code&gt;https://wikipedia.org/picture.png&lt;/code&gt;. But if we were already on the main page (&lt;code&gt;https://wikipedia.org/&lt;/code&gt;) a link to &lt;code&gt;picture.png&lt;/code&gt; or &lt;code&gt;/picture.png&lt;/code&gt; would go to the same place. But obviously when you encode &lt;code&gt;https://wikipedia.org/picture.png&lt;/code&gt; and &lt;code&gt;/picture.png&lt;/code&gt; you get different results, thus they point to different resources in the database.&lt;/p&gt;
&lt;p&gt;So we need to save the domain that we are currently on. You might think this would be as easy as just getting the URL bar in Code. However, once intercepted by the extension and redirected to the database, the URL bar shows the database’s URL.&lt;/p&gt;
&lt;p&gt;So what needs to happen, when first intercepted, the extension&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Saves the domain name to a cookie&lt;/li&gt;
&lt;li&gt;Redirects the request&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then on subsequent requests it can prefix this saved domain to the relative path. To make this easier on the API side it looks like this: &lt;code&gt;localhost/s3/{domain}/{path}&lt;/code&gt; with “domain” being the raw string and “path” being base64 encoded. Ex: &lt;code&gt;GET http://localhost/s3/en.wikipedia.org/cGljdHVyZS5wbmc=&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Reminder that you can follow the development of the &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/internet_mapper&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;crawler&lt;/a&gt; or the &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/internet_mapper_viewer&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;server/extension&lt;/a&gt;. These are hosted on via gitea so you can subscribe to rss updates of the individual repos if so desired.&lt;/p&gt;</description><pubDate>Sat, 14 Dec 2024 07:29:03 GMT</pubDate><category>Blog</category><category>Code</category><category>Websites</category><category>surrealdb</category><category>Project</category><author>Oliver Atkinson</author></item><item><title>Caddy Over Nginx</title><link>https://oliveratkinson.net/caddy-over-nginx</link><guid isPermaLink="true">https://oliveratkinson.net/caddy-over-nginx</guid><description>&lt;h1 id=&quot;friendship-ended-with-nginx-now-caddy-is-my-best-friend&quot;&gt;Friendship ended with Nginx, Now Caddy is my best friend.&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;(Note: It might be good to know what a &lt;a href=&quot;https://www.cloudflare.com/learning/cdn/glossary/reverse-proxy/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;reverse proxy is&lt;/a&gt;.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you have followed Luke Smith’s &lt;a href=&quot;https://landchad.net/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;website tutorials&lt;/a&gt; you know that he recommends Nginx. And that’s just what I had been using on all my servers because it was the first reverse-proxy I picked up. I could just copy and modify my old configs for new sites and I was good to go! I did also used Apache for a bit in college for some projects (&lt;a href=&quot;https://aws.amazon.com/what-is/lamp-stack/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;LAMP stack&lt;/a&gt; or something) but that doesn’t really count. Apache and Nginx feel about the same to use.&lt;/p&gt;
&lt;p&gt;But just recently (while being very productive at work), I found Caddy, a reverse-proxy written in Go that is Nginx but better in every way.&lt;/p&gt;
&lt;p&gt;So let’s take a look at why you need to be using Caddy instead of Nginx.&lt;/p&gt;
&lt;h2 id=&quot;configs&quot;&gt;Configs&lt;/h2&gt;
&lt;p&gt;Take the config for this site (Nginx):&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;r&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;server&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    server_name&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; oliveratkinson.net&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    location&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        proxy_set_header&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; Host&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;host&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        proxy_set_header&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; X&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;Real&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;IP&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; $&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;remote_addr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        proxy_pass&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; http&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;://&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;localhost&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;8000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    listen&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;443&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; ssl&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; ipv6only&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# managed by Certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    listen&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 443&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; ssl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# managed by Certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    ssl_certificate&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;etc&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;letsencrypt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;live&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;friendlyfire.oliveratkinson.net&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;fullchain.pem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# managed by Certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    ssl_certificate_key&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;etc&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;letsencrypt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;live&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;friendlyfire.oliveratkinson.net&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;privkey.pem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# managed by Certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    include&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;etc&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;letsencrypt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;ssl&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;nginx.conf&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# managed by Certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    ssl_dhparam&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;etc&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;letsencrypt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;ssl&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;dhparams.pem&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# managed by Certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;server&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;host&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; oliveratkinson.net&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 301&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; https&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;://$&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;host&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;request_uri&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# managed by Certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    listen&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 80&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    listen&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    server_name&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; oliveratkinson.net&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 404&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# managed by Certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now take a look at the updated config for this site using caddy:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;r&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;oliveratkinson.net&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;        reverse_proxy&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;8000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These configs do the exact same thing!&lt;/p&gt;
&lt;p&gt;But instead of 31 lines of config it’s 3! Caddy also auto-magically handles &lt;strong&gt;https&lt;/strong&gt; for you so you no longer need &lt;strong&gt;certbot&lt;/strong&gt; to get Let’s Encrypt certificates for you site. I haven’t researched it but I would imagine that Caddy uses something similar to certbot under the hood.&lt;/p&gt;
&lt;p&gt;Another feature (that technically Nginx has - but Caddy does better) is a single config for multiple sites. While Nginx &lt;em&gt;does technically&lt;/em&gt; do this, the config is so long that it makes it quite hard to read, thus forcing you to split up the files. But with Caddy’s 3-line config, I can now put all my sites right next to each other &lt;strong&gt;cleanly&lt;/strong&gt;!&lt;/p&gt;
&lt;h2 id=&quot;monitoring&quot;&gt;Monitoring&lt;/h2&gt;
&lt;p&gt;Nginx can - again - &lt;em&gt;technically&lt;/em&gt; do monitoring, but it is really hard, I have &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/DockerPrograms/src/branch/main/Tracing&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;an attempt at it in this repo&lt;/a&gt;. But Caddy - as we are used to by now - has a better way of doing this. With a &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/DockerPrograms/src/branch/main/Caddy&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;simple config&lt;/a&gt; I was able to have Prometheus scrape Caddy for metrics then have Grafana display the Prometheus logs. Much less shenanigans than whatever Nginx does with their &lt;strong&gt;Nginx+&lt;/strong&gt; or whatever paid product they have.&lt;/p&gt;
&lt;p&gt;Remember to &lt;a href=&quot;https://en.wikipedia.org/wiki/KISS_principle&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;KISS&lt;/a&gt; - use &lt;a href=&quot;https://caddyserver.com/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Caddy&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sat, 01 Jun 2024 16:45:52 GMT</pubDate><category>Websites</category><category>Blog</category><category>Code</category><author>Oliver Atkinson</author></item><item><title>Lies to Children</title><link>https://oliveratkinson.net/lies-to-children</link><guid isPermaLink="true">https://oliveratkinson.net/lies-to-children</guid><description>&lt;p&gt;The sheer amount of lies you are told whilst growing up in western culture - more specifically United States’ culture is astounding.
I’m not entirely why we tell each next generation these things.
Or even that we are consciously lying.
But never the less we are.&lt;/p&gt;
&lt;h2 id=&quot;lie-1&quot;&gt;Lie 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;You want to live in suburbia.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s the American dream right? Live in suburbia where all the houses are the identical. You all have nice white vinyl fence, wife and two kids, nice dog, and your 9-5 (which is actually 7:30-5:30) desk job at Mega Corp.&lt;/p&gt;
&lt;p&gt;But this isn’t what I want at all.
I was nearly drawn into wanting this until I realized the ridiculousness of maintaining a lawn.
You have a patch of foliage, grown in such a way that is unnatural, just to cut down (who decided on cutting grass?), and spray with toxic chemicals to keep the &lt;em&gt;natural&lt;/em&gt; foliage away.
This is not what I want at all. I want my yard to be full of native plants. Whether that is grass or sagebrush that’s ok with me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You want a vinyl fence.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Naw, barbwire is good enough.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You want a wife, two kids, and a dog.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, actually yes.
Actually more than two kids.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HOA’s will increase your home’s value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Stop telling me if I can change something on my private property. This is also another strike against living in city limits.&lt;/p&gt;
&lt;h2 id=&quot;lie-2&quot;&gt;Lie 2&lt;/h2&gt;
&lt;p&gt;Professionalism&lt;/p&gt;
&lt;p&gt;I don’t know who decided to start spewing that the “real world” is “professional”, but they are lying to you.
Remember that kid that was told off in class for swearing (“How are you gonna hold a job with a mouth like that?”)
Well guess what, at every job I’ve had, whether it’s a high school job or a “adult” job like I have now.
People and co-workers swear.
There are other reasons you shouldn’t swear (it makes you appear less intelligent), but it’s not for the sake of professionalism.&lt;/p&gt;
&lt;p&gt;And when you get this big professional job you will feel accomplished!…
Right? Well probably not.
For a year or two at the longest.
It wore off of me within a week.
I don’t see real differences working in I.T. for a school than laying brick on a campground.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/blog-posts/professionalism-is-dead/&quot;&gt;Here are more of my thoughts on the subject.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;lie-25&quot;&gt;Lie 2.5&lt;/h2&gt;
&lt;p&gt;Drop ceilings.&lt;/p&gt;
&lt;p&gt;This one might sound a bit unhinged.
But related to the lies of professionalism are drop ceilings.
We all know why they are used - so that wiring and HVAC can be hidden from sight.
But why?
We all know they are there.
We know that maintenance will need to be done on them.
Why are we hiding it? It seems to be to maintain this illusion of professionalism.
That if we look the part maybe we can trick ourselves into feeling the part.&lt;/p&gt;
&lt;h2 id=&quot;lie-3&quot;&gt;Lie 3&lt;/h2&gt;
&lt;p&gt;College.&lt;/p&gt;
&lt;p&gt;I would like to ask you, the reader, a question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Look at the people you see successfully working a job. How many of the went to school for that job?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For me, it’s not many.
Sure, I know people who are medical doctors and they went to medical school.
But I know plenty of persons in the I.T. field which are “uneducated” in the field.
And this doesn’t even have to be an anecdotal point, the data is with me.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Have you ever done a CBA (cost-benefit analysis) on going to college.
Generally it’s pretty bad.
What kind of job are you expecting to get to offset the cost of 4 years of your life and $100,000? I know colleges promise there are plenty of jobs that pay six figures, right out of college.
But those are the &lt;em&gt;exceptions&lt;/em&gt;, not the rule.
Considering that the average U.S. income is $76,330&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; (all ages) and that’s with 37% of the population having bachelors or higher degrees.
If we include two year degrees that number jumps up to 47%&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;And please, do not go to college just because that’s “the thing to do”.
It &lt;em&gt;is&lt;/em&gt; scary to go and get that first job.
But after about two months you’ll be ok.
It will be scary whether or not you have a degree.
But I will have to say, things are less scary when you can fall back on savings.
With going to college, you don’t have any more savings.
Just saying.&lt;/p&gt;
&lt;h2 id=&quot;lie-4&quot;&gt;Lie 4&lt;/h2&gt;
&lt;p&gt;Safety first&lt;/p&gt;
&lt;p&gt;I could speak on this, but honestly, &lt;a href=&quot;https://mikerowe.com/2020/03/walk-me-through-this-safety-third-thing/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Mike Rowe did a fantastic job&lt;/a&gt; talking on the subject.&lt;/p&gt;
&lt;h2 id=&quot;lie-5&quot;&gt;Lie 5&lt;/h2&gt;
&lt;p&gt;Follow your dreams.&lt;/p&gt;
&lt;p&gt;Again Mike Rowe has talked about this so there isn’t too much to cover.
But why do you need to “follow you dreams”?
Why is a “normal job” (take a look at like #2) a bad thing?
Even jobs that should have been a bad experience purely based on the work being performed, I have actually quite enjoyed!
&lt;em&gt;This is because of the people I was working with.&lt;/em&gt;
It’s not about what you are doing, it’s about who you are doing it with.&lt;/p&gt;
&lt;h2 id=&quot;lie-6&quot;&gt;Lie 6&lt;/h2&gt;
&lt;p&gt;Apple.&lt;/p&gt;
&lt;p&gt;The company of Apple has their consumers under a pretty tight grip.
As of writing this they are currently undergoing multiple lawsuits about their monopolistic tendencies.
However, consumers keep ignoring their bad treatment and keep buying.
I nearly fell into the trap of buying Apple thinking: “Why, it’s what all the &lt;strong&gt;PRO&lt;/strong&gt;grammers use” (in promotional material).
It’s what everyone at college uses.
&lt;em&gt;It’s what the cool kids use&lt;/em&gt;.
I was lucky enough to already know GNU/Linux at this time so I could just load up KDE Plasma and change my theme to “Big Sur” to get the Apple “experience”.
It sucks.
Glad I could just switch back to using AwesomeWM or Gnome and that it didn’t take $1500+&lt;sup&gt;&lt;a href=&quot;#user-content-fn-4&quot; id=&quot;user-content-fnref-4&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; to figure out that Apple sucks.
No matter how good their aesthetic is.&lt;/p&gt;
&lt;h2 id=&quot;lie-7&quot;&gt;Lie 7&lt;/h2&gt;
&lt;p&gt;Marketing&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You work a job you hate to buy s**t you don’t need.”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tyler Durden&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marketing is manipulation, there is no two ways about it.
Many things you own you were probably manipulated into purchasing.
(Just see Lie #6).&lt;/p&gt;
&lt;h2 id=&quot;lie-8&quot;&gt;Lie 8&lt;/h2&gt;
&lt;p&gt;Men are women are equal.&lt;/p&gt;
&lt;p&gt;I suppose this can be true depending on how you mean it.
But most likely you don’t mean it as you should.&lt;/p&gt;
&lt;p&gt;If we are going to say, “men and women have equal value”, then absolutely.
However many people want to say “men and women are mentally equal” absolutely not.
Or how about “men and women are physically equal”, that’s completely wrong.
(And why we need to keep men out of women’s sports.)&lt;/p&gt;
&lt;p&gt;I would go into this more here, but I have a whole other post about this subject.
(I will link it here once it’s done.)&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.census.gov/library/visualizations/interactive/from-college-to-jobs-stem.html&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Census.gov info-graphic&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.census.gov/library/publications/2023/demo/p60-279.html&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Census.gov&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.census.gov/newsroom/press-releases/2023/educational-attainment-data.html&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Census.gov&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-4&quot;&gt;
&lt;p&gt;As of writing this Apple’s M3 Mac with 16GB of ram and an 8-core CPU costs: $1699, whereas a Lenovo P16s will only run you $1090. With advertised Linux support, so it well never be &lt;a href=&quot;https://en.wikipedia.org/wiki/End-of-life_product&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;EOL&lt;/a&gt;. &lt;a href=&quot;#user-content-fnref-4&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Sat, 04 May 2024 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Professionalism Is Dead</title><link>https://oliveratkinson.net/professionalism-is-dead</link><guid isPermaLink="true">https://oliveratkinson.net/professionalism-is-dead</guid><description>&lt;p&gt;Growing up you are told “don’t do xyz”, that’s not professional. For example: “Don’t swear, it’s not professional, that wouldn’t go over well in the workplace!” (Note that there are other good reasons not do to this.) Or how about: “Workplace safety is #1 priority!”&lt;/p&gt;
&lt;p&gt;I don’t particularly know &lt;em&gt;why&lt;/em&gt; we’ve been told these lies but it’s probably important to remove as many lies from your life as possible. But they are &lt;em&gt;still lies&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;My first jobs were all working with trades people. These of course are people who are generally a bit rougher around the edges, so I figured “hey, they must all curse because that’s just the type of job.” But now I work in a much more “sophisticated” workplace, and whilst talking to one of the high-ups in the organization (part of the admin team) and they were swearing all over the place. Granted this was informal and in-person communication, but still, I wasn’t expecting it.&lt;/p&gt;
&lt;p&gt;Then for the safety bit; I could explain this but  I think Mike Rowe does a good job &lt;a href=&quot;https://mikerowe.com/2020/03/walk-me-through-this-safety-third-thing/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;in this article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I know there isn’t too much deep thought in this article, but it was just a weird observation.&lt;/p&gt;</description><pubDate>Mon, 01 Apr 2024 17:19:42 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Internet Divide</title><link>https://oliveratkinson.net/internet-divide</link><guid isPermaLink="true">https://oliveratkinson.net/internet-divide</guid><description>&lt;p&gt;I’ve been considering the likelihood of finding people with the same interests as myself.&lt;/p&gt;
&lt;p&gt;It’s not hard to find someone who likes Lord of the Rings or Star Wars or Minecraft. But to find someone who is interested in tech the way I am is a formidable challenge. I’ve noticed that many friends don’t necessarily share interests in everything, that’s to be expected. But in the realm of tech (perhaps all of STEM) it seems to be a greater divide. You have the one friend that has their job or hobby in something incredible technical and the the other who doesn’t know the first thing about the subject, except that their friend spends an awful amount of time with it.&lt;/p&gt;
&lt;p&gt;Now that we have the abstract out of the way we can use more specific examples.&lt;/p&gt;
&lt;p&gt;Incase you don’t know much about me, I’m currently (as of Q1 2023) in college for software development, getting my associates (NOT bachelors, &lt;a href=&quot;https://oliveratkinson.net/blog-posts/schools-failure/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;see why&lt;/a&gt;). And during any givin class I’m sitting in I already know &lt;strong&gt;as much&lt;/strong&gt; or &lt;strong&gt;more&lt;/strong&gt; about the subject than the teacher, or at least could figure it out on my own faster than they can teach it (or at least &lt;em&gt;do&lt;/em&gt; teach it).&lt;/p&gt;
&lt;p&gt;Seeing as I have lots of (perhaps niche) knowledge about computers, it isolates me from other people. I have lots of knowledge and no one to share it with. That perhaps sounds dramatic and arrogant saying “I’m know so much more than everyone else, woe is me!” but it’s actually kind of a problem. Now, the counter argument is that I can’t really be “smarter than everyone else” because &lt;em&gt;I learned&lt;/em&gt; from &lt;em&gt;&lt;strong&gt;someone&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Yes, that is true.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Q: But &lt;em&gt;who&lt;/em&gt; did I learn it from?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;A: People on the internet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And where are all the people who wrote the &lt;a href=&quot;https://wiki.archlinux.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Arch Wiki&lt;/a&gt; pages? Nowhere near me, I can just about guarantee you that! So it’s not so much an issue of me being smarter than everyone (or anyone) but just an issue of my knowledge not coming from a local source. If we took my Linux knowledge as an example; is average if looked at, gauging against the internet’s perspective. But if gauged from the perspective of anyone I personally know, I am eons ahead of them. Especially considering most people barely know the difference between PC / Mac! Totally unaware that a third major operating system exists (Yes, BSD and others also exist but they have a &lt;em&gt;very&lt;/em&gt; small market share, so not knowing about them is a little more understandable.) (Just to note: my professors &lt;em&gt;do&lt;/em&gt; know what Linux is etc, etc, they just have little experience with it.) Therefor I’m in an isolated bubble; me and my knowledge, but no one to share it with.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is generally the part where the person falls into a para-social relationship with some internet personality who said person relates with.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But that’s actually not where this story is going to go. I’m aware of the issues arising from para-social relationships so I try to spend less and less time on YouTube, as well as other social media. (&lt;a href=&quot;https://oliveratkinson.net/blog-posts/was-it-worth-it/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;You should too&lt;/a&gt;!) Thus, I feel more and more isolated, as if I am the only one with my knowledge and no one who wants to learn. Who am I suppose to share it with? The instant you mention computers most people’s eyes glaze over, let alone nerd operating systems like Linux&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;This, interestingly, leads us to Ted Kaczynski, and his work: &lt;a href=&quot;https://www.washingtonpost.com/wp-srv/national/longterm/unabomber/manifesto.text.htm&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;INDUSTRIAL SOCIETY AND ITS FUTURE&lt;/a&gt;. Specifically in paragraph 87, where he is talking about how science and technology are what he denotes “surrogate activities.” These are activities which we do, but are not required for our survival. In this paragraph he mentions a scientist that is researching &lt;em&gt;isopropyltrimethylmethane&lt;/em&gt; and how the scientist “wouldn’t give a damn about isopropyltrimethylmethane” if he had to (actually) work to find food every day. And I would imagine that said scientist may feel out of place when in a conversation where he wishes to talk about this cool chemical he’s researching, but he also knows that if he starts mentioning nerdy science stuff all the conversation participants will &lt;em&gt;quickly&lt;/em&gt; loose interest and try to divert the conversation. (And he would also wish to do that. As talking to a bunch of blank stares is quite awkward! (I know!)) &lt;em&gt;&lt;strong&gt;However&lt;/strong&gt;&lt;/em&gt;, if this scientist and all these friends still had to go about their farming / ranching / fishing / etc jobs everyday, they would still want to talk about their work, but the aforementioned jobs are easier to talk about with other people who are unacquainted with the job, as they are easier to understand&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;So now when the Fisherman, the Rancher, and the Farmer all come together at some social event, they can easily talk about their jobs, and no one feels excluded or isolated. But now lets say myself, and two other STEM majors come together at a social event. All of our areas of interest are &lt;em&gt;similar&lt;/em&gt; right? Not really, while all stem, we might have a Electrical Engineer, a Computer Scientist (myself), and a Chemist. The Electrical Engineer might find the resonance of circuits and components fascinating, the Chemist and I have either no - or very little knowledge on the subject. The Chemist them tries to mention what they’ve been working on (maybe isopropyltrimethylmethane). Then the blank stares start again. So I figure I might try and share my cool findings as of late. I begin to explain Ones’ Complement and how they are important to checksums and addition in computers. But before I can explain the first bit (get it?) I’m talking at two blank stares. Now all three of us “smart” and “educated” people have to resort to talking about the weather or some equally useless topic as all this “getting smart” that the new world allows us to do, really has only forced our conversation to regress.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;This is is 90% of the reason I created this website. That I could share my thoughts and knowledge with &lt;em&gt;someone&lt;/em&gt;, even though the likelihood that many people will read this is low. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Note: I’m not calling farmers / ranchers / fishermen / etc, stupid or simple, just that their work is more intuitive to understand. This I imagine is because it is tangible. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Mon, 06 Feb 2023 00:16:43 GMT</pubDate><category>Psychology</category><category>Internet</category><category>Ted Kaczynski</category><category>Paper</category><author>Oliver Atkinson</author></item><item><title>Schools&apos; Failure</title><link>https://oliveratkinson.net/schools-failure</link><guid isPermaLink="true">https://oliveratkinson.net/schools-failure</guid><description>&lt;p&gt;“Every school has failed me”&lt;/p&gt;
&lt;p&gt;That seems a bit extreme, let me explain. To do so, let’s go on a trip.&lt;/p&gt;
&lt;p&gt;We’re standing on a gravel street in Montana, at the house where I grew up. Now this is actually the location of the only school that didn’t fail me. This is where I grew up, and where I has home-schooled until middle school. By the time middle school rolled around I had moved to South Dakota (SD), still doing school at home as my primary form of education but also taking band class through the local public school.&lt;/p&gt;
&lt;p&gt;This is the beginning of the first failure.&lt;/p&gt;
&lt;p&gt;I was in 5th grade at the time, and wanted to be in band. Due to how the rules are set in SD I was able to take some classes at the public school while still being home-schooled on all the core subjects.&lt;/p&gt;
&lt;p&gt;So, as a 5th grader I auditioned with the band director she inserted me into the 8th grade band class. I stayed there for 5th &amp;#x26; 6th grade but when 7th grade rolled around I was quite ready to move up. So naturally I would just go up to the 9th grade band. The freshmen band. But the same school district that OK-ed a 5th grader to be in the 8th grade band (normally you start band in 6th grade) now decided that and 7th grader being in the 9th grade band was just too much. How dare we think of putting a middle schooler in the high-school program. Never mind that it was the same building, classroom, and teacher. So my parents and I fought the school to let me be in the freshmen band. So after several months of this and a few interviews later, they let me in. A couple months later we moved.&lt;/p&gt;
&lt;p&gt;We moved back to Montana. The specific district we moved to had no rules associated with home-schoolers taking public school classes like SD did. So they just defaulted to not allowing it. Not wanting to fight a school again I just decided to join public school. I was relatively advanced in several subjects, primarily math, so instead of going into 7th grade I went straight into 8th grade.&lt;/p&gt;
&lt;p&gt;8th &amp;#x26; 9th grade passed with out much fanfare. Sophomore year was almost passed but then COVID happened in the last months of the school year. This threw a wrench in everything. Now all the public schoolers were sent home to do school there. Everyone faked school through the end of the year.&lt;/p&gt;
&lt;p&gt;With my Junior approaching end of that summer I decided: “Hey, since last year we were all sent to be (a worse version of) home schoolers, why don’t I just do this a better way?” So we began petitioning the school to let me do my core subject at home with my own curriculum then take band and science at public school.&lt;/p&gt;
&lt;p&gt;The school eventually allowed it on the terms that I would take 4 out of 7 classes at the school. See how that is over 50% of the school day? That means that they still getting their money for me being a student. Schools say that they care about you as a person and want to help you. This is false. If the school doesn’t get reimbursed for having to deal they couldn’t care less about you. So with this new schedule crafted up I did my junior year. It got boring fast.&lt;/p&gt;
&lt;p&gt;You see, I like learning, not busy work. I had learned all I could at the high school. This doesn’t mean that I took the “hardest” classes, many of the higher level classes had an insane amount of busy work. Sure, the content also got more difficult but the ratio of &lt;code&gt;[learning potential]:[work put in]&lt;/code&gt; became extremely low. So, a quarter way though my senior year I decided that public school was wasting my time, thus, at the semester I left saying “I’m going to college.”&lt;/p&gt;
&lt;p&gt;Now I’m enrolled as a “connection student” at the Montana State University Billings. This just means that I’m a dual enrolled student. While I did give the middle finger to &lt;em&gt;public&lt;/em&gt; high-school I am still taking &lt;em&gt;homeschool&lt;/em&gt; high-school. This allows for the classes to be cheaper. But mainly I am doing college work. Now at the end of the year there is this trip to New Orleans that the band is going on. I decided that that might be a fun thing to do so I signed up. I figured everything was OK until I got an email from the chair of the music department informing me that I would have to pay my own way if I wanted to go on the trip unlike all the “real” students who’s plane fare would be covered by the college. This was because I was punching above my age range and doing college early. For “insurance reasons” the college couldn’t pay for a dual enrolled student’s plane ticket.&lt;/p&gt;
&lt;p&gt;I have fought every school I’ve attended up till this point and now I am tired of it. I’m not going on what could be an amazing trip because I am done fighting schools. Schools are suppose to be for education. I guess that got lost some time ago.&lt;/p&gt;
&lt;p&gt;For example: here this week before finals I found out that I was suppose to be performing a solo for a panel who would judge my performance and determine my grade for the “applied drumming” class I am taking. This class was literally just private lessons though the college with an adjunct professor. Why does this need to be graded? What happened to learning for the sake of gaining knowledge? Why must we slap a letter of the alphabet and a number on every thing we try to learn. Schools aren’t for learning. They are for getting some sort of alphanumeric rating so they can hand you a piece of paper saying “look at all this extra time and money you spent getting this fancy meaningless number.”&lt;/p&gt;
&lt;p&gt;Congratulations.&lt;/p&gt;
&lt;p&gt;See, I want to learn just for the sake of gaining knowledge. I could care less about what letter you give me. Now don’t go off thinking I’m a slacker. In high-school I was a straight A-s 4.0 student. So by your weird standards I’m perfect. But I would much rather cut the boring classes short and extend the interesting ones so that I can maximize learning. Oh wait. That’s just homeschool.&lt;/p&gt;</description><pubDate>Thu, 03 Nov 2022 23:10:14 GMT</pubDate><category>Life</category><category>School</category><category>Paper</category><author>Oliver Atkinson</author></item><item><title>Was it worth it?</title><link>https://oliveratkinson.net/was-it-worth-it</link><guid isPermaLink="true">https://oliveratkinson.net/was-it-worth-it</guid><description>&lt;p&gt;An interesting observation as of late is how attached to social medias people are. I used to be the same way. In some ways I still am. Granted, they can be useful, connecting with friends and family. However, once you spend more than a few minutes a week what are you achieving?&lt;/p&gt;
&lt;p&gt;You may have convinced yourself that there is something to gain by checking each platform daily (even hourly, minutely?!). But if you were to take a critical look at your usage I think most people would agree that they spend too much time. Just look at people talk about TikTok, nearly everyone that uses it confesses to using it too much. Without trying all that hard we can see there is a problem. But what if we went a step further, take a more critical look?&lt;/p&gt;
&lt;p&gt;In all of our lives we have something I would like to denote as “wasted time.” This is just a fact of the age we are in. This is the time you have when you arrive to the maintenance shop a little early and they haven’t quite finished fixing your car. Or sitting in the waiting room for your dental appointment. Many people are fine with filling this “wasted time” with checking their phone. Just look around next time you ride any public transportation. You’ll see.&lt;/p&gt;
&lt;p&gt;But since we are taking a more critical look than most we must also examine this “wasted time” and decide if it became “wasted” &lt;em&gt;before&lt;/em&gt; or &lt;em&gt;after&lt;/em&gt; we decided to fill it with scrolling. To analyze this we need to think about the idea of taking a snapshot of our individual existence, all of your cumulative knowledge. Take this snapshot of your life just before you open your phone. Then take another snapshot after your close it. If we were able to quantify your knowledge, we could pipe this into a simple math equation:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Where:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    K1 | Is knowledge before.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    K2 | Is knowledge after.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Kg | Is gained knowledge.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;K2 – K1 = Kg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;From my experience, and I would be willing to bet that in many of your’s, the Kg value equals 0. So this means that we can verifiable say the “wasted time” window is  &lt;strong&gt;wasted&lt;/strong&gt; after you looked at your phone.&lt;/p&gt;
&lt;p&gt;Now, what would our Kg value be if we didn’t reach for our phones at the first whiff of boredom? Well, since we can’t loose knowledge, we are just about guaranteed an improvement over reaching for social media. All we have to do is gain 1 knowledge point! (However you want to quantify that.) So as long as &lt;code&gt;Kg &gt; 0&lt;/code&gt; (very low bar) we have succeeded.&lt;/p&gt;
&lt;p&gt;But now you are saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“In my very specific situation, I’m stuck in a cement box just waiting here. And all I have to entertain myself is my phone with social media on it. I can’t possible get anything out of sitting here!”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(Now let’s acknowledge that this is a very unlikely situation.) But for the sake of this argument let’s add another value to our snapshots. We will take our happiness/contentment/joy/etc and set it to a variable named &lt;code&gt;H&lt;/code&gt;. So now our equation looks like:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Where:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	H1 | Is happiness before.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	H2 | Is happiness after.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	Hg | Is happiness gained.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; H2 – H1 = Hg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the two equations combined:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;(K2 – K1) + (H2 - H1) = Kg + Hg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now let’s convert the product to a single value, &lt;code&gt;S&lt;/code&gt;, this is your status as a whole.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Where:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	S | Is status&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	Kg + Hg = S&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;(K2 – K1) + (H2 - H1) = S&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And now unlike knowledge, which you can’t loose. Happiness can be both gained &lt;em&gt;&lt;strong&gt;and&lt;/strong&gt;&lt;/em&gt; lost. So now assuming our previous situation where, when just looking at knowledge, our equation equaled 0. Since &lt;code&gt;K1 = K2&lt;/code&gt; we can just entirely remove them.&lt;/p&gt;
&lt;p&gt;Just looking at the first equation &lt;code&gt;H2 – H1 = Hg&lt;/code&gt;. Let’s say happiness is just a 0%-100% scale, just for ease of explanation. So lets say an average day is 50%. Which when converted into decimal form so we can use it in mathematics would now equal 0.50.&lt;/p&gt;
&lt;p&gt;So now we are back in that cement box. You are sitting there, and for some reason or another sitting in a cement box is just a normal situation you find yourself in. So your happiness as you sit down is at 50% (0.50). This equals &lt;code&gt;H1&lt;/code&gt;. Now you hop onto the social media platform of your choice.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The side bar adds shows you an article of how this 23yr old is a multimillionaire, and he/she has just 5 simple steps you you to be as successful as themselves. This kid is any number of years younger than you raking in several times your yearly income? Figures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You scroll some more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;See everyone is having the time of their life on that cool trip to Greece. Then look, you friends are either getting married or having kids already! What are you doing with your life? Sitting in this cement box. So obviously you’ll never amount to the things of everyone else.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“John Doe? We are finished with your car, you can pay at the desk.” Says the clerk. You turn off your phone and start the rest of your life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don’t know about you but at this point my &lt;code&gt;H2&lt;/code&gt; value is defiantly lower than my &lt;code&gt;H1&lt;/code&gt; value. So when we plug that into our equation we have:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0.40 – 0.50 = -0.10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This means that your lost 10% of your happiness while just looking at your phone waiting here! And think of how easy it is to go from a mood of 5/10 to 4/10! I don’t think these are unreasonable numbers. So now you see the point!&lt;/p&gt;
&lt;p&gt;Now you keep adding variables to the left hand side of the equation to try and justify/un-justify being on your phone at any given time. We can start adding things such as “productivity” or “inter-personal relationships”, ANYTHING! And just remember to take a quick little snapshot of your status before and after your do something, it could be anything, it wouldn’t just have to be checking your phone. We could apply this to someone who likes to shop a little too much. For them we might add the very tangible value of their bank account as one of the variables. Ideally you take into account every possible variable and insert it into the left side. At this point the goal is to keep &lt;code&gt;S&lt;/code&gt;, on the right side a positive number.&lt;/p&gt;
&lt;p&gt;Snapshots wouldn’t have to be across a short time frame either. It could be before and after a week, month, year, and eventually a lifetime.&lt;/p&gt;
&lt;p&gt;Now remember, the goal is to have the lifetime’s &lt;code&gt;S&lt;/code&gt; value be greater than 0. So doing something “dumb” right now that might boost your short-term &lt;code&gt;S&lt;/code&gt; value above 0 but may also cause it to drop in equal or possibly greater value later. Thus netting a negative &lt;code&gt;S&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So while it may be be possible to justify foolish things in the short-term. If used correctly by using theoretical values for a theoretical “after” snapshot, you can get an example of what your status will be if you chose any given action. And there are plenty of people around you to gather these theoretical data points from to use for your own calculations to decide if you should do something.&lt;/p&gt;</description><pubDate>Thu, 03 Nov 2022 18:52:54 GMT</pubDate><category>Psychology</category><category>Paper</category><author>Oliver Atkinson</author></item><item><title>Movie Theater Trailers</title><link>https://oliveratkinson.net/movie-theater-trailers</link><guid isPermaLink="true">https://oliveratkinson.net/movie-theater-trailers</guid><description>&lt;p&gt;I went to see The Odyssey in theaters as it just came out.
This was the first movie theater I’ve been to in probably over a year, so obviously, I’m a bit disconnected from the scene.
Expectedly there were trailers for other movies leading up to the movie (all of which looked uninteresting.)&lt;/p&gt;
&lt;p&gt;But there was one trailer right before the movie started for a horror movie.
Since The Odyssey is rated R it’s not totally unexpected that there would be more graphic trailers.
(Though I didn’t know The Odyssey was rated R until I just looked it up. The movie could’ve probably been PG-13 if not for some out-of-place usage of “f**k”.)&lt;/p&gt;
&lt;p&gt;What struck me as particularly weird was how demonic/evil the horror movie ad was.
It appears that the whole point of the movie is a mom has a evil doppelganger (who is ostensibly trying to kill them? That wasn’t clear.)
But it was interesting how the horror movie needed to strike right to the core of what’s sacred.
The family unit.
The whole trailer’s theme was: “Can the dad and child trust the person who claims to be the benevolent mom? Or is it the malevolent mom?”
That whole concept is really evil.
The bond between the mom and dad should not be questioned and the bond from parent to child likewise, should not be questioned, and vise versa.&lt;/p&gt;
&lt;p&gt;Everyone knows that Hollywood is “satanic” but it’s just so bizarre that somebody would cast a child (looked to be 8-ish) into a horror movie.
But from what I’ve heard from people who like horror movies “everything is just creeper when it’s a child”.
Probably because you are stepping on and mutilating something that is sacred.&lt;/p&gt;
&lt;p&gt;The trailer was so courrupt that it interfiered with the viewing experiance of the actual movie we paid to see.
That experiance was bad enough to write-off movie theaters.&lt;/p&gt;</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Low Expectations</title><link>https://oliveratkinson.net/low-expectations</link><guid isPermaLink="true">https://oliveratkinson.net/low-expectations</guid><description>&lt;p&gt;What’s up with everybody’s low expectations?&lt;/p&gt;
&lt;h2 id=&quot;schools-dont-expect-you-to-learn&quot;&gt;Schools don’t expect you to learn.&lt;/h2&gt;
&lt;p&gt;I wrote about this &lt;a href=&quot;/history-channels&quot;&gt;here&lt;/a&gt;, but the gist is that there is this thread in traditional education material that pooh-poohs the concept of learning itself.
Teaching students that learning is just for nerds, and that us cool adults don’t need to learn.&lt;/p&gt;
&lt;h2 id=&quot;parents-dont-expect-their-children-to-behave&quot;&gt;Parents don’t expect their children to behave.&lt;/h2&gt;
&lt;p&gt;If you listen to parents talk, many of them talk about how hard and dismal having teenagers is.
In order to fit in, parents of young children dread the fact that their kids will become teenagers.
You might hear “right now it the terrible twos, when they are 13 it’s going to be horrible”.
So what - are you just throwing in the towel on your child’s behavior?
Are you just a victim of the system?
Helpless to manifest your agency?
Then these same people will mention how they can’t wait to be empty nest-ers.
They (&lt;em&gt;&lt;strong&gt;hopefully&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;for show&lt;/em&gt;) espouse hate for their own children.&lt;/p&gt;
&lt;h2 id=&quot;bad-media-for-children&quot;&gt;Bad media for children&lt;/h2&gt;
&lt;p&gt;Much of this is driven by what the parents teach their children, though many parents would not like to believe this.
It is of my opinion that, for example, the whole idea of “kid draws on walls with marker while parents are away” mostly doesn’t exist in real life.
It happens occasionally, sure.
But I speculate that this behavior is mostly downstream of children’s media showing a character doing it, so the child replicates this media.
Children’s media should be showing the children how to act correctly, 100% of the time.
Flawed hero’s are a cool device for older people’s media, young children need more black and white than that.&lt;/p&gt;
&lt;h2 id=&quot;internal-family-enmity&quot;&gt;Internal family enmity&lt;/h2&gt;
&lt;p&gt;Children (also for show) dislike their siblings and parents.
This is all very unnatural.
The extremely weird part is that you see people in churches playing into this fiction even though it’s not biblical.
(Granted, evangelical church-goers.)&lt;/p&gt;
&lt;h2 id=&quot;men-grovel-at-their-wifes-feet&quot;&gt;Men grovel at their wife’s feet&lt;/h2&gt;
&lt;p&gt;Men (again in churches, though it is unbiblical) openly bend to their wife’s every request.
Quipping things such as “happy wife, happy life”.
This is just setting up people for unhappy futures if they think that is &lt;em&gt;actually&lt;/em&gt; how marriage works.&lt;/p&gt;</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>Blog</category><category>School</category><category>Family</category><category>Church</category><author>Oliver Atkinson</author></item><item><title>Abortion in Exodus 21?</title><link>https://oliveratkinson.net/exodus-21</link><guid isPermaLink="true">https://oliveratkinson.net/exodus-21</guid><description>&lt;p&gt;I’ve already taken a look at the &lt;a href=&quot;/numbers-5&quot;&gt;Numbers 5&lt;/a&gt; abortion argument.
Not it’s time to take a look at Exodus 21:12,22-25.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[English NASB] Exodus 21:12,22-25:&lt;/p&gt;
&lt;p&gt;12: “He who strikes a man so that he dies shall surely be put to death.&lt;/p&gt;
&lt;p&gt;[…]&lt;/p&gt;
&lt;p&gt;22: “[a] If men struggle with each other and strike a woman with child so that she gives birth prematurely, [b] yet there is no injury, [c] he shall surely be fined as the woman’s husband may demand of him, and he shall pay as the judges decide.&lt;/p&gt;
&lt;p&gt;23: “[a] But if there is any further injury, [b] then you shall appoint as a penalty life for life,&lt;/p&gt;
&lt;p&gt;24: eye for eye, tooth for tooth, hand for hand, foot for foot,&lt;/p&gt;
&lt;p&gt;25: burn for burn, wound for wound, bruise for bruise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The argument goes as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Verse 12 and verse 23b show a life for a life justice system.
However, in verse 22 if a woman gets hit and she miscarries, there is no life for a life payment, just a fine.
Therefor, the child in the womb is not a “life”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This relies on a few assumptions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;v22a “gives birth prematurely” equals “miscarriage”&lt;/li&gt;
&lt;li&gt;v22b a miscarriage is not an injury&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let’s imagine that your wife is pregnant, and she gets hit, sending her in to labor.
The the fight you and another man are having (v22a) stops because something serious just happened.
Luckily, your wife is close to the natural birth date so the baby is delivered somewhat early, but overall no harm no foul, the child is safe (v22b).
You are still somewhat mad at the other man who hit your wife causing this whole issue, so he needs justice brought upon him (v22c).&lt;/p&gt;
&lt;p&gt;Now, if your wife’s child were pre-viability and the strike happened, causing labor, causing a miscarriage, there is injury (v23a) and the other man should be put to death (v12, v23b).&lt;/p&gt;
&lt;p&gt;This proposed argument only stands if a miscarriage is not considered an injury, which seems &lt;em&gt;&lt;strong&gt;highly&lt;/strong&gt;&lt;/em&gt; unlikely.
In fact, certain translations such as the Amplified Bible (AMP) and Expanded Bible (EXP) mention that the baby survives the birth, or that the Hebrew is unclear as to the baby’s health, respectively.&lt;/p&gt;
&lt;p&gt;Additionally, if you are taking this verse for the pro-choice stance, it must also be noted that the context of the birth/miscarriage is two men fighting (v22a) and they, ostensibly accidentally, hurt the woman.
This would put this verse as not anti-abortion at best, not pro-choice, since no “choice” was made.
If you were to take this for pro-choice, you would have to intentionally “accidentally” injure the woman.
This then starts two new problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;God knows your heart and plans, and you are not going to fool God&lt;/li&gt;
&lt;li&gt;You are assaulting women&lt;/li&gt;
&lt;/ol&gt;</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><category>Blog</category><category>Abortion</category><author>Oliver Atkinson</author></item><item><title>Groff MOM</title><link>https://oliveratkinson.net/groff-mom</link><guid isPermaLink="true">https://oliveratkinson.net/groff-mom</guid><description>&lt;p&gt;Using something like Microsoft Word or LibreWriter is a bad experiance.
But there aren’t many good alternatives.
An alternative that is &lt;em&gt;good enough&lt;/em&gt; is GNU’s roff, also known as just “groff”.
If you are on a Linux system right now, chances are - whether you realise it or not - groff is installed on your computer.
As well as several macro sets, including &lt;code&gt;mom&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Learning these macro sets is relatively annoying (there are so many, and you have to take about 2 hours to learn each, just to find out that wasn’t a good macro set.)
So I’ve gone ahead and decided for you.
Use &lt;code&gt;mom&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There are special use-cases for &lt;code&gt;man&lt;/code&gt; (creating mandocs), &lt;code&gt;mm&lt;/code&gt; writing scientific papers, &lt;code&gt;all the others&lt;/code&gt;… for doing … &lt;em&gt;something&lt;/em&gt; 🤷‍♂️.
&lt;code&gt;mom&lt;/code&gt; is used for making books, generally.
But I’ve gone ahead and created an oppiononated template that I may use in the future (and &lt;a href=&quot;/file.mom&quot;&gt;you can too&lt;/a&gt;!)&lt;/p&gt;
&lt;p&gt;Once rendered using &lt;code&gt;groff -mom -T pdf file.mom &amp;gt; out.pdf&lt;/code&gt; you get the follow:&lt;/p&gt;
&lt;iframe src=&quot;/mom.pdf&quot; width=&quot;100%&quot; height=&quot;600px&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Other useful links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.stephenlindholm.com/groff_macros.html&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Short description of differnet macro sets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.schaffter.ca/mom/momdoc/version-2.html&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;MOM docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.schaffter.ca/mom/pdf/mom-pdf.pdf&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Short document about using MOM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate><category>Blog</category><category>Linux</category><category>groff</category><author>Oliver Atkinson</author></item><item><title>Markdown to PDF</title><link>https://oliveratkinson.net/md-to-mm</link><guid isPermaLink="true">https://oliveratkinson.net/md-to-mm</guid><description>&lt;p&gt;New cool tool: &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/md_to_mm&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;md-to-mm&lt;/a&gt;!
You can think of it as a preprocessor for markdown, turning it into mm macros so groff can read it.
From there, groff can turn it into (most importantly) PDFs, but also things like HTML, but you can find dozens of MD -&amp;gt; HTML converters on Github.&lt;/p&gt;
&lt;p&gt;For some reason going from markdown to a pdf is hard to to - but not anymore!
You can take a look at the project’s readme to see what syntax is supported.&lt;/p&gt;
&lt;p&gt;The program reads from &lt;code&gt;stdin&lt;/code&gt; and outputs on &lt;code&gt;stdout&lt;/code&gt;, very suckless.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;cat file.md | md-to-mm | groff -mm -tbl -Tpdf &amp;gt; out.pdf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><category>Blog</category><category>Suckless</category><author>Oliver Atkinson</author></item><item><title>Abortion in Numbers 5?</title><link>https://oliveratkinson.net/numbers-5</link><guid isPermaLink="true">https://oliveratkinson.net/numbers-5</guid><description>&lt;p&gt;It is generally held that the Church is pro-life.
However, there is a small constituent who believe otherwise.
From what I can tell this crowd is mostly, if not all, non Christians who are trying to have a “gotcha” from the Bible.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[English NASB] Numbers 5:11-31:&lt;/p&gt;
&lt;p&gt;11: Then the LORD spoke to Moses, saying,&lt;/p&gt;
&lt;p&gt;12: “Speak to the sons of Israel and say to them, ‘If any man’s wife goes astray and is unfaithful to him,&lt;/p&gt;
&lt;p&gt;13: and a man has intercourse with her and it is hidden from the eyes of her husband and she is undetected, although she has defiled herself, and there is no witness against her and she has not been caught in the act,&lt;/p&gt;
&lt;p&gt;14: if a spirit of jealousy comes over him and he is jealous of his wife when she has defiled herself, or if a spirit of jealousy comes over him and he is jealous of his wife when she has not defiled herself,&lt;/p&gt;
&lt;p&gt;15: the man shall then bring his wife to the priest, and shall bring as an offering for her one-tenth of an ephah of barley meal; he shall not pour oil on it nor put frankincense on it, for it is a grain offering of jealousy, a grain offering of memorial, a reminder of iniquity.&lt;/p&gt;
&lt;p&gt;16: ‘Then the priest shall bring her near and have her stand before the LORD,&lt;/p&gt;
&lt;p&gt;17: and the priest shall take holy water in an earthenware vessel; and he shall take some of the dust that is on the floor of the tabernacle and put it into the water.&lt;/p&gt;
&lt;p&gt;18: ‘The priest shall then have the woman stand before the LORD and let the hair of the woman’s head go loose, and place the grain offering of memorial in her hands, which is the grain offering of jealousy, and in the hand of the priest is to be the water of bitterness that brings a curse.&lt;/p&gt;
&lt;p&gt;19: ‘The priest shall have her take an oath and shall say to the woman, “If no man has lain with you and if you have not gone astray into uncleanness, being under the authority of your husband, be immune to this water of bitterness that brings a curse;&lt;/p&gt;
&lt;p&gt;20: if you, however, have gone astray, being under the authority of your husband, and if you have defiled yourself and a man other than your husband has had intercourse with you”&lt;/p&gt;
&lt;p&gt;21: (then the priest shall have the woman swear with the oath of the curse, and the priest shall say to the woman), “the LORD make you a curse and an oath among your people by the LORD’S making your thigh waste away and your abdomen swell;&lt;/p&gt;
&lt;p&gt;22: and this water that brings a curse shall go into your stomach, and make your abdomen swell and your thigh waste away.” And the woman shall say, “Amen. Amen.”&lt;/p&gt;
&lt;p&gt;23: ‘The priest shall then write these curses on a scroll, and he shall wash them off into the water of bitterness.&lt;/p&gt;
&lt;p&gt;24: ‘Then he shall make the woman drink the water of bitterness that brings a curse, so that the water which brings a curse will go into her and cause bitterness.&lt;/p&gt;
&lt;p&gt;25: ‘The priest shall take the grain offering of jealousy from the woman’s hand, and he shall wave the grain offering before the LORD and bring it to the altar;&lt;/p&gt;
&lt;p&gt;26: and the priest shall take a handful of the grain offering as its memorial offering and offer it up in smoke on the altar, and afterward he shall make the woman drink the water.&lt;/p&gt;
&lt;p&gt;27: ‘[a] When he has made her drink the water, then it shall come about, if she has defiled herself and has been unfaithful to her husband, that the water which brings a curse will go into her and cause bitterness, [b] and her abdomen will swell and her thigh will waste away, and the woman will become a curse among her people.&lt;/p&gt;
&lt;p&gt;28: ‘But if the woman has not defiled herself and is clean, she will then be free and conceive children.&lt;/p&gt;
&lt;p&gt;29: ‘This is the law of jealousy: when a wife, being under the authority of her husband, goes astray and defiles herself,&lt;/p&gt;
&lt;p&gt;30: or when a spirit of jealousy comes over a man and he is jealous of his wife, he shall then make the woman stand before the LORD, and the priest shall apply all this law to her.&lt;/p&gt;
&lt;p&gt;31: ‘Moreover, the man will be free from guilt, but that woman shall bear her guilt.’”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The argument goes as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“God allows for an abortion to be performed (v27b), therefor, being pro-choice is a biblical stance.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This argument has the following assumptions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This is about the baby, not proving the woman’s (im)purity&lt;/li&gt;
&lt;li&gt;The woman is pregnant after having sex with the man who isn’t her husband&lt;/li&gt;
&lt;li&gt;v27 is an abortion, and not just sterilization&lt;/li&gt;
&lt;li&gt;Dirt and parchment is enough to abort a baby&lt;/li&gt;
&lt;li&gt;The abortion is voluntary / the woman’s choice&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;assumption-1&quot;&gt;Assumption 1&lt;/h2&gt;
&lt;p&gt;This seems to come from a place of wanting to hate on men.
They think that the man is just insecure and is forcing the woman to go through this humiliating ritual just for the man’s uneasy mental state.
However, they don’t seem to mention the fact that it’s very possible the woman has cheated.
And God, instead of letting this issue fester in the marriage, gives a methodology for solving the issue definitively.
As I read this I don’t see the “humiliation ritual” or whatnot that others seem to pull out of these verses.
On the contrary, living above reproach so that when accusations come your way, they fall off you (Titus 2:8, Philippians 2:14-15, 1 Peter 2:12) is a normal part of your life.
Clearing your name when you’ve done nothing wrong, is not in the least bit humiliating.&lt;/p&gt;
&lt;h2 id=&quot;assumption-2&quot;&gt;Assumption 2&lt;/h2&gt;
&lt;p&gt;Obviously, it mentions the woman having sex with another man (v20) but this doesn’t strictly mean that she got pregnant from the encounter.
Depending on the time of month and if the man “spills his seed” or not, which, ostensibly, he would do if he were cheating with her, she may have not have gotten pregnant.&lt;/p&gt;
&lt;h2 id=&quot;assumption-3&quot;&gt;Assumption 3&lt;/h2&gt;
&lt;p&gt;The supporters of this argument would claim that v27b is an abortion (thus implicitly containing assumption #2).
Contrarily, v28 makes this seem more like a sterilization, seeing as when not guilty, the woman is free to conceive children (in the future).
Meaning that the opposite option, when the woman is guilty, is that she will &lt;em&gt;not&lt;/em&gt; be able to conceive children (in the future).&lt;/p&gt;
&lt;h2 id=&quot;assumption-4&quot;&gt;Assumption 4&lt;/h2&gt;
&lt;p&gt;The ingredients (from a strictly natural perspective) are: (v17) water + dust, (v23) ink + paper.
Hardly would that be enough to make a woman’s body eject a viable pregnancy, though some people make this claim the other way.&lt;/p&gt;
&lt;h2 id=&quot;assumption-5&quot;&gt;Assumption 5&lt;/h2&gt;
&lt;p&gt;As mentioned above, this verse is used by pro-choice-ers to justify abortions.
However, at no point in these verses is this the woman’s choice considered, even &lt;strong&gt;if&lt;/strong&gt; this were an abortion.
At best (assuming this really is killing a small human) it is God’s judgment in the matter: v19,21.
However, this would be contrary to verses like Galatians 1:15, Psalms 139:13, Luke 1:15, which all have to do with the pre-born.
The possible counter arguments to those verse would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(Galatians) God foreknew that who Paul was, specifically him, and this verse has no meaning to the rest of us.&lt;/li&gt;
&lt;li&gt;(Psalms) Being “woven together in the mother’s womb” is what all mammals experience, it is nothing deeper than a rabbit being created.
However, the counter-&lt;em&gt;counter&lt;/em&gt; argument is that if you read the rest of Psalms 139 it’s talking about how much God knows about &lt;em&gt;us&lt;/em&gt;, not just any given animal.
His inescapable knowledge and caring.
It would be odd to acknowledge all of the care God put into a human, just to say “well but it annoys me, so I shall kill it”.&lt;/li&gt;
&lt;li&gt;(Luke) John the Baptist is seen being filled with the Holy Spirit while being a pre-born (human).
If John were not a human (as it would be required for an abortion to not be murder), how was he filled with the holy spirit?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It would seem that the &lt;em&gt;best&lt;/em&gt; argument that can be made in the pro-choice-ers favor; is that God can kill people if he wishes.
While the pro-lifers argument for these verses is that they are irrelevant and have nothing to do with abortion, only adultery.&lt;/p&gt;</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><category>Blog</category><category>Abortion</category><author>Oliver Atkinson</author></item><item><title>Abortion</title><link>https://oliveratkinson.net/abortion</link><guid isPermaLink="true">https://oliveratkinson.net/abortion</guid><description>&lt;p&gt;Here’s a flowchart of the abortion argument.
After listening to many a talk where everybody just goes in circlces over the same topics, it would probably be easier to just create this.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;flowchart TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	start{Is abortion ok?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	start --&amp;gt;|No| Done[We are on the same page.]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	start --&amp;gt;|Yes| W{Why?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	W --&amp;gt;|Medical Reasons| LOTM[Life-of-the-mother cases are &amp;lt;0.5%]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	W --&amp;gt;|My body my choice| WhyOk{What about the baby&amp;#39;s choice?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	W --&amp;gt;|The living conditions that the baby will grow up in are sub-optimal| E[A.K.A Eugenics]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	E --&amp;gt;|That was the Nazi&amp;#39;s big thing| W&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	WhyOk --&amp;gt;|I conceed the baby has a choice as well| W&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	LOTM --&amp;gt; AOC{Should all other cases be outlawed?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	AOC --&amp;gt;|Yes| Save[Wouldn&amp;#39;t it be better to try to save both lives?]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Save --&amp;gt; Done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	AOC --&amp;gt;|No| W&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	WhyOk --&amp;gt;|It&amp;#39;s not a human| Human{When does it become a human?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Human --&amp;gt;|When it&amp;#39;s born| When[What about pre-mature births? Obviously a baby born pre-maturly, when it grows up is a human. So you are saing it&amp;#39;s a function of viability?]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	When --&amp;gt; Viable &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	WhyOk --&amp;gt;|It&amp;#39;s a parasite| Viable{A 2yr old isn&amp;#39;t &amp;#39;viable&amp;#39; without parental intervention... Can we kill toddlers?}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Viable --&amp;gt;|Yes| Troll[You are trolling.]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;	Viable --&amp;gt;|No| WhyOk&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate><category>Blog</category><category>Abortion</category><author>Oliver Atkinson</author></item><item><title>Lighthouse CI</title><link>https://oliveratkinson.net/lighthouse-ci</link><guid isPermaLink="true">https://oliveratkinson.net/lighthouse-ci</guid><description>&lt;p&gt;You website loads fast… right?
If it’s a blog website like this, it &lt;em&gt;better&lt;/em&gt; load pretty fast, it just some text!&lt;/p&gt;
&lt;p&gt;But how do you &lt;em&gt;know&lt;/em&gt; your website is fast, and that adding a cool new feature didn’t just make it totally worse?
Or what if it was fast last month, but then you made a bunch of changes across multiple days, when did it become slow?&lt;/p&gt;
&lt;p&gt;These are the problems &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse-ci/tree/main&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Lighthouse-CI&lt;/a&gt; is trying to solve.&lt;/p&gt;
&lt;p&gt;Lighthouse CI loads your site in a Chrome browser and runs the built-in Chrome site diagnostic tool.
These metrics are then saved to a database where you can view how your site historically performed, vs how it’s performing now.
And the coolest part, is this is just another step in the CI/CD pipeline (that you may already be running).&lt;/p&gt;
&lt;h1 id=&quot;lxc&quot;&gt;LXC&lt;/h1&gt;
&lt;p&gt;Setup a LXC container by following these two guides:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/GoogleChrome/lighthouse-ci/blob/main/docs/getting-started.md&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;1&lt;/a&gt;,
&lt;a href=&quot;https://github.com/GoogleChrome/lighthouse-ci/blob/main/docs/server.md&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They will walk you through both how to setup your git project (the website) and the Lighthouse server (thing that stores the test results).&lt;/p&gt;
&lt;h1 id=&quot;custom-docker-image&quot;&gt;Custom Docker Image&lt;/h1&gt;
&lt;p&gt;Since I’m running my own git instance (&lt;a href=&quot;https://git.oliveratkinson.net&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;git.oliveratkinson.net&lt;/a&gt;),
I needed to create my own docker image for the lighthouse CI pipeline.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; lscr.io/linuxserver/chrome:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; root&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; apt-get update &amp;amp;&amp;amp; apt-get install -y nodejs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm install -g @lhci/cli&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; rm -rf /var/lib/apt/lists/*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; chown -R abc:abc /config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;ENV&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; HOME=/config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; abc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then build the image with&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nodechrome:latest&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;cicd-vm&quot;&gt;CI/CD VM&lt;/h1&gt;
&lt;p&gt;Now that the docker image is built, we let the forgejo runner know that it’s avaliable:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;labels&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # ... other labels...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;lighthouse-ci:docker://nodechrome:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;cicd-workflow&quot;&gt;CI/CD Workflow&lt;/h1&gt;
&lt;p&gt;Just a simple workflow like this in &lt;code&gt;{ .gitea | .forgejo }/workflows/&amp;lt;workflow-name&amp;gt;.yml&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;yml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;CI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;jobs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  lhci&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Lighthouse&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    runs-on&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;lighthouse-ci&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    steps&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;uses&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;actions/checkout@v4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Build the project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        run&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          npm i&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          npm run build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;run Lighthouse CI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;        run&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;          lhci autorun --config=lighthouserc.cjs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description><pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>What is RSS</title><link>https://oliveratkinson.net/what-is-rss</link><guid isPermaLink="true">https://oliveratkinson.net/what-is-rss</guid><description>&lt;a class=&quot;center-me&quot; href=&quot;/rss.xml&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/rss.svg&quot; alt=&quot;The rss icon&quot; style=&quot;width: 100px&quot;/&gt;&lt;/a&gt;
&lt;p&gt;I used the term “RSS” in conversation recently and learned it’s use isn’t as ubiquitous (even in tech-y circles) as I thought.
You can think of RSS as a vendor-agnostic subscription feed.
Similar to how YouTube will send you a notifcation when someone releases a new video, your RSS reader can notify you when sombody posts on their website.
But to understand that we should quick learn how it works.
Like any webpage or API there are two parts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Server&lt;/li&gt;
&lt;li&gt;Client&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The server serves an API route (URL) that responds with with an XML file (a file computers can read easily).
This includes dated entries with some optional additional information.
The RSS feed for this site is at &lt;code&gt;https://oliveratkinson.net/rss.xml&lt;/code&gt; and roughly contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Title of the article&lt;/li&gt;
&lt;li&gt;Link to the article on this website&lt;/li&gt;
&lt;li&gt;The date the article is published&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the you (client) then add that URL to your RSS reader, it will periodically download a list of all the articles and see if there are any new entries.
If there are, it will then send you a notification!
Pretty simple and neat!&lt;/p&gt;
&lt;p&gt;Here’s the phone RSS reader app I use: &lt;a href=&quot;https://f-droid.org/packages/com.tughi.aggregator/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Aggregator - FDroid&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are no accounts or separate apps for each platform, just 1 simple XML file per website, all collected into the same app on your phone or desktop!&lt;/p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Server has API route (generally at &lt;code&gt;/rss.xml&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Client periodically checks this route for new information.&lt;/li&gt;
&lt;li&gt;If there is new information, notify the user.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id=&quot;some-cool-rss-feeds-to-you-started&quot;&gt;Some cool RSS feeds to you started&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mine, of course &lt;code&gt;https://oliveratkinson.net/rss.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;XKCD: &lt;code&gt;https://xkcd.com/rss.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;HaveIBeenPwnd &lt;code&gt;https://haveibeenpwned.com/feed/breaches/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;American cyber threats &lt;code&gt;https://www.ic3.gov/rssIndustry.xml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;notes-if-you-have-a-website&quot;&gt;Notes if &lt;em&gt;you&lt;/em&gt; have a website&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If your website is built with Astro, they provide a &lt;a href=&quot;https://docs.astro.build/en/recipes/rss/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;plugin&lt;/a&gt; to handle most of the RSS stuff for you.&lt;/li&gt;
&lt;li&gt;Hugo, which is what I was using before Astro, has RSS feeds built into it.&lt;/li&gt;
&lt;li&gt;You should put the following tag in your home page’s head:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;alternate&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;application/rss+xml&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;Your Site&amp;#39;s Title&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&amp;quot;https://yoursite.example/path-to-your-feed.xml&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(&lt;a href=&quot;https://docs.astro.build/en/recipes/rss/#enabling-rss-feed-auto-discovery&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;source&lt;/a&gt;)
This allows for RSS readers like Aggregator to locate the RSS feed without you needing to put in the “correct” URL (makes it more idiot proof).&lt;/p&gt;</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Spreadsheets in the terminal with neoscim</title><link>https://oliveratkinson.net/neoscim</link><guid isPermaLink="true">https://oliveratkinson.net/neoscim</guid><description>&lt;p&gt;With the advent of my personal business, I’ve needed to use spreadsheets more often.
Mostly tracking for bills and whatnot.
There is a large problem though.
This would normally require one of a few options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Google Sheets&lt;/li&gt;
&lt;li&gt;Microsoft 365&lt;/li&gt;
&lt;li&gt;Excel&lt;/li&gt;
&lt;li&gt;Open Office&lt;/li&gt;
&lt;li&gt;LibreOffice&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Options 1-3 are non-starters, since they rely on proprietary code bases.
And the problems with 4 and 5 is that they are large GUI applications.
I can’t speak too much on behalf of Open Office, but LibreOffice just doesn’t boot quickly.
Now yes, compared to Excel it boots instantly. But compared to something like neovim, it takes ages.&lt;/p&gt;
&lt;p&gt;The second problem with one of these office suites is that they are made for normies.
Do normies want to learn keybinds? No.
Therefore; these apps are built for use with a mouse 🤮.
So now we have some requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start quickly (comparable to (n)vim).&lt;/li&gt;
&lt;li&gt;Use vim-like keybinds.&lt;/li&gt;
&lt;li&gt;Be free (libre) software.&lt;/li&gt;
&lt;li&gt;Act like Excel (I use it for day-job work).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These requirements leave us with either &lt;a href=&quot;https://en.wikipedia.org/wiki/Sc_(spreadsheet_calculator)&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;sc&lt;/a&gt; or &lt;a href=&quot;https://github.com/andmarti1424/sc-im&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;scim&lt;/a&gt;.
I gave &lt;code&gt;scim&lt;/code&gt; a bit of a try, but the keybinds just weren’t vim-y enough.
It also has a problem of cells not being duck-typed / polymorphic.
What does this mean?
It means that in &lt;code&gt;scim&lt;/code&gt; I can insert &lt;strong&gt;both&lt;/strong&gt; a number and a string into a cell, with the cell holding both values at the same time.
This means that you have to choose via what key you press, what type of data you are inserting.
This is not how Excel works 😔.
I want one keybind for entering all the datatypes.
I’m sure that &lt;code&gt;scim&lt;/code&gt; is great for the people who use it, but I’m not one of those people.&lt;/p&gt;
&lt;h2 id=&quot;now-entering-neoscim&quot;&gt;Now entering… &lt;strong&gt;NEOSCIM&lt;/strong&gt;!&lt;/h2&gt;
&lt;p&gt;To fix my perceived problems with &lt;code&gt;scim&lt;/code&gt; I created &lt;a href=&quot;https://git.oliveratkinson.net/Oliver/neoscim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;neoscim&lt;/a&gt;!
This program solves all my problems with the previously discussed options.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Input text with your favorite vim keys (i,I,a,A,r)&lt;/li&gt;
&lt;li&gt;Cells detect if you are entering a string or a number, and just accept it (duck typing!)
&lt;ul&gt;
&lt;li&gt;Note: that cells with things such as formulas have the actual value (the formula) and the displayed value (the solution)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fast launch time (feels same as neovim)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;why-the-name&quot;&gt;Why the name?&lt;/h2&gt;
&lt;p&gt;In vim fashion:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vi -&amp;gt; vim -&amp;gt; neovim&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;sc -&amp;gt; scim -&amp;gt; neoscim&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Bill Generator</title><link>https://oliveratkinson.net/bill-generator</link><guid isPermaLink="true">https://oliveratkinson.net/bill-generator</guid><description>&lt;p&gt;Similar to how &lt;a href=&quot;/neoscim&quot;&gt;neoscim&lt;/a&gt; was built (mainly) for my business, I also have created some bill generators.
I solved this in two ways, so you get your pick:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://git.oliveratkinson.net/Oliver/html-to-pdf&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;HTML to PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git.oliveratkinson.net/Oliver/bill-generator&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CSV to PDF&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Personally, I’m using option 2 - csv to pdf, because of the tight workflow it has with neoscim.&lt;/p&gt;
&lt;h2 id=&quot;workflow&quot;&gt;Workflow&lt;/h2&gt;
&lt;p&gt;Throughout the month I’m tracking expenses and hours in a spreadsheet.
Something that might look like this:&lt;/p&gt;

















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Work&lt;/th&gt;&lt;th&gt;Hrs&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Setup Thing&lt;/td&gt;&lt;td&gt;1.5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Moved Thing&lt;/td&gt;&lt;td&gt;.25&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;There may be some other data flying around in the rest of the spreadsheet, but that’s ok.
In neoscim I enter visual mode with &lt;code&gt;v&lt;/code&gt;, select the region, then run the command &lt;code&gt;:export hrs.csv&lt;/code&gt;.
TADA!
A new csv file has appeared in my workspace with just the selected data.
I can then run this through the bill generator like such: &lt;code&gt;bill-gen -1 hrs.csv &amp;#39;Person Who is Paying Me&amp;#39;&lt;/code&gt;.
Lo and behold; there is now a pdf already labeled with an invoice number (globally tracked and incremented) all ready to send out to a client!&lt;/p&gt;
&lt;iframe src=&quot;/bill-generator/invoice.pdf&quot; width=&quot;100%&quot; height=&quot;600px&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;In an alternate form (“bill-gen -2 hrs.csv items.csv ‘Person Who is Paying Me’) I can also generate a bill that cost of goods:&lt;/p&gt;
&lt;iframe src=&quot;/bill-generator/two-col-invoice.pdf&quot; width=&quot;100%&quot; height=&quot;600px&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;How does all this magic work?
With the power of groff!
Perhaps at some point I will do a post or video on groff, since it is quite nice (mm macros used in this program), but it wouldn’t really fit with the content of this post.
If you are currious in the meantime, feel free to &lt;code&gt;man groff&lt;/code&gt; and &lt;code&gt;man groff_mm&lt;/code&gt;.
A quick start is &lt;code&gt;groff -m mm file.mm -T pdf &amp;gt; out.pdf&lt;/code&gt;.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Serve From the Home</title><link>https://oliveratkinson.net/serve-from-the-home</link><guid isPermaLink="true">https://oliveratkinson.net/serve-from-the-home</guid><description>&lt;p&gt;Recently I did a VPS&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; migration because to renew my old plan would have been over $300/year.
I originally got this plan because it was part of a really good sale.
I could stay with my old VPS provider (Vultr) for somewhere around $6/month for a few CPUs and 1GB ram,
or I could jump ship to this shiny new hosting company; Hostinger; and get 8 CPUs and 16GB of ram, for ~10/month.
I could use this new VPS to host my websites &lt;em&gt;and&lt;/em&gt; game servers if I so desired!&lt;/p&gt;
&lt;p&gt;But now that the sale is done the price went to the moon (~30$/month).
Luckily, in the past 2 years since I last had to rent server space
I have gotten much smarter (and my homelab has gotten much better)!&lt;/p&gt;
&lt;p&gt;By the end of my run with the beefy VPS I was really only running a few websites (such as this),
an email server, and a Matrix server.
Matrix really doesn’t work well (tho I wish it did) so I was getting rid of that service anyway.&lt;/p&gt;
&lt;p&gt;My homelab on the other hand, is now running rocking 2x 24 core Intel Xeons, 72GB RAM, 25TB Storage, and 4 Ethernet ports.
If I tried to rent that kind of power in the cloud I would go broke nearly instantly.
This system is very overkill for what I use it for even today
but it’s fun to have the extra headroom (10yr old hardware is very cheap on Ebay).&lt;/p&gt;
&lt;h2 id=&quot;problem&quot;&gt;Problem&lt;/h2&gt;
&lt;p&gt;So now that I have all this computing capacity at home, why would I need any in the cloud?
Well, the public IP address.&lt;/p&gt;
&lt;p&gt;Due to how the internet (networking in general) works, all computers have IP addresses.
The most common being IPv4.
The problem however is that there aren’t enough IPv4 addresses to go around.
This makes them a scarce resource, which makes them cost money.
For this reason your ISP&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; doesn’t give residential connections (such as my homelab) a public IP.&lt;/p&gt;
&lt;p&gt;What this means in practice is that I can’t route traffic inbound to my network, which is a basic requirement of hosting a website.&lt;/p&gt;
&lt;h2 id=&quot;solution&quot;&gt;Solution&lt;/h2&gt;
&lt;p&gt;The two-part solution is first, a VPN&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.
My homelab lacks a public/routable IP, but my small VPS doesn’t.&lt;/p&gt;
&lt;p&gt;But first, how do websites even work?&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;/caddy-over-nginx&quot;&gt;you may know&lt;/a&gt;, I already use a reverse proxy for my websites.
This is to maximize the amount of websites I can have on one server.
To understand why this is useful we have to first understand how a browser gets to a web page.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You type in a URL such as &lt;code&gt;https://oliveratkinson.net&lt;/code&gt; and hit enter&lt;/li&gt;
&lt;li&gt;The browser asks a DNS server for the IP address of &lt;code&gt;oliveratkinson.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The DNS server responds back with an IP &lt;code&gt;1.2.3.4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The browser navigates to &lt;code&gt;1.2.3.4&lt;/code&gt; on port &lt;code&gt;443&lt;/code&gt;&lt;sup&gt;&lt;a href=&quot;#user-content-fn-port&quot; id=&quot;user-content-fnref-port&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;The server has a program listening on &lt;code&gt;1.2.3.4:443&lt;/code&gt; and responds to the request (in this case responds with HTML).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You may notice a problem.
How did the browser get the idea to send the request to port 443?
Nobody told it to go there, just a convention.
So what if I have multiple websites that I want to host?
I only have one public IP (&lt;code&gt;1.2.3.4&lt;/code&gt;) and one port &lt;code&gt;443&lt;/code&gt;.
Does this mean I have to rent &lt;em&gt;another&lt;/em&gt; IP just to host a second website?&lt;/p&gt;
&lt;p&gt;Luckily, &lt;strong&gt;nope&lt;/strong&gt;!
We can use a reverse proxy, such as Caddy.
What a reverse proxy does, is listen in the stead of the website application on port &lt;code&gt;443&lt;/code&gt;.
When it receives a request, it first looks at the metadata of the request (HTTP Headers) and sees what website it is destined for.
Once it learns this information, it can internally redirect this request to the website application, which has now been configured to listen on some other IP and port, such as &lt;code&gt;localhost:8080&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In this example above, we are just redirecting the request along the VPS’s internal network (localhost).
But nothing stops us from sending the request to a whole different server!
This is where a VPN comes in handy.&lt;/p&gt;
&lt;p&gt;If I can put my homelab and my VPS on the same network somehow, I can relay the requests from my VPS into my homelab.
Putting these two disparate devices on the same network is precisely what VPNs are for!
I can run a VPN serve on my VPS, then connect to it on my homelab server.
Each device now gets &lt;em&gt;another&lt;/em&gt; IP such as &lt;code&gt;10.10.10.1&lt;/code&gt; and &lt;code&gt;10.10.10.2&lt;/code&gt; (IP address that start with “10” are private IP address, meaning the can’t be routed through the public internet, but I can create them without asking anybody).&lt;/p&gt;
&lt;p&gt;Now instead of the reverse proxy relaying the incoming request to &lt;code&gt;localhost:8080&lt;/code&gt;, it can relay it to &lt;code&gt;10.10.10.2:8080&lt;/code&gt;, which is in my homelab.
Now all the compute is happening in the homelab, decreasing the load on the public server&lt;sup&gt;&lt;a href=&quot;#user-content-fn-load&quot; id=&quot;user-content-fnref-load&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;This was all to get IPv4 IPs working, but what about IPv6?
Luckily, my ISP gives me a large (/56) block of publicly routable IPv6 addresses (4.7e21 addresses).
The whole problem we’ve been describing up until now revolve around the fact that we ran out of IPv4 addresses.
This is why IPv6 is so great!
For just a standard residential plan my ISP gives me more &lt;em&gt;publicly routable&lt;/em&gt; IPs than I could ever hope to use!
This means that if the incoming connection is on IPv6, I can skip all that VPS/VPN trouble and just go straight to my home’s router, where it then gets routed directly to the machine it’s looking for!
Nice and simple!
The only downside is that bad ISPs (such as
&lt;a href=&quot;https://www.reddit.com/r/TDSFiber/comments/11dj8qs/does_anyone_with_tds_fiber_have_ipv6_service/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;TDS&lt;/a&gt;, SHAME!)
don’t give their customers IPv6 addresses, so not everybody can use this approach.
Thus, we still have to bootstrap IPv4 into the situation with the VPS/VPN approach.&lt;/p&gt;
&lt;h2 id=&quot;another-possible-ipv4-solution&quot;&gt;Another Possible IPv4 Solution&lt;/h2&gt;
&lt;p&gt;Besides running your own VPS you could always use something such as a Cloudflare tunnel to get
the traffic from the public internet into your private machine.
These work well in my experience but since I still need my VPS for my email server, thus the other way works well for me.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;__V__irtual __P__rivate __S__erver; (part of) a rented computer stuck in a data-center somewhere. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Internet Service Provider. The people who you pay every month to give you an internet connection. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;Virtual Private Network.
A private network (like your home network, where all the devices can talk to each other), that doesn’t exist because of actual wires (virtual). &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-port&quot;&gt;
&lt;p&gt;Ports are a way to have multiple programs all listening for incoming messages on one computer.
In this case, port &lt;code&gt;443&lt;/code&gt; because &lt;code&gt;https&lt;/code&gt; means &lt;code&gt;443&lt;/code&gt;, &lt;code&gt;http&lt;/code&gt; means &lt;code&gt;80&lt;/code&gt;, Minecraft servers use &lt;code&gt;25565&lt;/code&gt;, etc.
You can view a whole list of these conventions &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. &lt;a href=&quot;#user-content-fnref-port&quot; data-footnote-backref aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-load&quot;&gt;
&lt;p&gt;This “load” is very minimal since I’m mostly running static websites, which would probably take less load to run directly on the VPS.
However, for things such as my git server or game servers, there is actual load to offset by putting it on a different computer. &lt;a href=&quot;#user-content-fnref-load&quot; data-footnote-backref aria-label=&quot;Back to reference 5&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>History Channels</title><link>https://oliveratkinson.net/history-channels</link><guid isPermaLink="true">https://oliveratkinson.net/history-channels</guid><description>&lt;p&gt;I’ve been trying to learn more about history to better understand the future&lt;sup&gt;&lt;a href=&quot;#user-content-fn-future&quot; id=&quot;user-content-fnref-future&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.
Seeing as there’s so much to learn, naturally, I was using YouTube for some of it.
But that’s when I noticed something quite odd:&lt;/p&gt;
&lt;p&gt;Channels such as “Mr. Beat” or “CrashCourse” spend so much time trying to “make history fun” that it just makes it more confusing.
Instead of a simple “here is X, it does Y” (which you can definitely spruce up with some stories), they opt for:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Hey kids, look at me, I’m playing a silly character. I’m gonna ‘teach’ you some history because I’m one of those weird history &lt;em&gt;nerds&lt;/em&gt;!”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This attitude, although being quite odd, aligns with what I saw while working at a school.
There is a whole underlying attitude of “learning is dumb, but if we don’t pass theses tests I don’t make money”.
When in reality, learning is just inherently interesting.&lt;/p&gt;
&lt;p&gt;It would probably be for the best if we didn’t indoctrinate children to dislike learning.
If you are making content on history or any other educational subject, don’t lead off with “we are gonna learn, like a bunch of &lt;strong&gt;nerds&lt;/strong&gt;”.
Just teach the subject matter.
If the students want to disparage the content afterwards, that’s their decision.
You don’t need to preemptively disparage it for them.
Elsewise, the students are ingesting the message of “even the adults think this is weird/cringe/nerd stuff”, and internalizing the message: “learning is dumb”.&lt;/p&gt;
&lt;p&gt;This is perhaps the reason why the PBS documentaries are so good.
They take the subject matter, and therefor themselves, seriously.
Not being diminutive of learning as a concept.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-future&quot;&gt;
&lt;p&gt;See Leviathan, Chapter 3, Prudence &amp;amp; Signs &lt;a href=&quot;#user-content-fnref-future&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>Blog</category><category>School</category><author>Oliver Atkinson</author></item><item><title>Corporate-ification of Trad</title><link>https://oliveratkinson.net/corporate-trad</link><guid isPermaLink="true">https://oliveratkinson.net/corporate-trad</guid><description>&lt;div class=&quot;center-me&quot;&gt;&lt;video controls muted autoplay controlslist=&quot;nofullscreen&quot;&gt;&lt;source src=&quot;/corporate-trad.scaled.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;p&gt;Missing support for the mp4 video. (Or it’s missing from the server.)&lt;/p&gt;&lt;/video&gt;&lt;p&gt;(Make sure to watch this Instagram video a friend sent me.)&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Depending on what side of the internet algorithms you are on, you may or may not see videos like this.
Regardless, this is a problem if you are seeing &lt;em&gt;any&lt;/em&gt; sort of “lifestyle” videos.&lt;/p&gt;
&lt;p&gt;On a first glance the video is quite nice.
A quaint house sits on rolling hills covered in grass as a sleepy dog naps on the front porch.
As the video progresses you see the cool breeze flow through the open windows across the rustic furnishings and decorations.
You may even here a chicken in the background.
How nice.&lt;/p&gt;
&lt;p&gt;Or, it would be.
If it wasn’t all fake.
Now, I don’t think this video is fake as in “AI generated”, however it &lt;em&gt;is&lt;/em&gt; fake in the sense of &lt;strong&gt;nobody lives here&lt;/strong&gt;.
Or, if they &lt;em&gt;do&lt;/em&gt; they definitely don’t live &lt;em&gt;like this&lt;/em&gt;.
The quaint decorations make the home look more like a Hobby Lobby isle than a lived-in structure.
Maintaining that level of consistent decoration combined with that level of cleanliness only exists in fake media like this piece.&lt;/p&gt;
&lt;p&gt;Other traits we can infer from the video though we aren’t explicitly told or show, are;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They are off-grid&lt;/li&gt;
&lt;li&gt;Live off the land&lt;/li&gt;
&lt;li&gt;Make their own food (this was shown in another video by them)&lt;/li&gt;
&lt;li&gt;All in all; they are “&lt;strong&gt;Trad&lt;/strong&gt;”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But why does this video exist?
Ostensibly to sell you on the idea of being trad.
This way any old normie that lives in the city with their desk job can look at it and think:
“What a nice life.
When I finally have enough money I will buy some land like that out in the country.
&lt;strong&gt;Then&lt;/strong&gt; I’ll finally be trad and at peace.”&lt;/p&gt;
&lt;p&gt;So the simplified thought sequence is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I get land (like that) -&amp;gt; I will be trad (have peace)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;or even more simplified:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When I own product -&amp;gt; I will change my behavior&lt;sup&gt;&lt;a href=&quot;#user-content-fn-fat&quot; id=&quot;user-content-fnref-fat&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is a product (not unlike &lt;a href=&quot;https://en.wikipedia.org/wiki/Soma_(Brave_New_World)&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;soma&lt;/a&gt;) - distributed to the “masses” to sell them on the idea of being trad.
Giving them something to dream of, without having to provide any actual substance.
In other words, it’s a psyop.&lt;/p&gt;
&lt;h2 id=&quot;ok-sure-its-a-psyop-but-why-is-that-a-problem&quot;&gt;Ok, sure, it’s a psyop, but why is that a problem?&lt;/h2&gt;
&lt;p&gt;It’s a problem because you are now satiated with a dream (hope) that if you *consume product* you will *get better outcome*.
That is a very dangerous train of thought.
It is you relinquishing your agency to some other party.
If you want the “trad life” then you need to start &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Not when you own some land.&lt;/p&gt;
&lt;p&gt;Not once you’ve saved up some money.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-money&quot; id=&quot;user-content-fnref-money&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Not next year.&lt;/p&gt;
&lt;p&gt;Not tomorrow.&lt;/p&gt;
&lt;p&gt;Today.&lt;/p&gt;
&lt;p&gt;If you don’t do it now you will never get to it.
I’d be willing to bet that your “todo” list, whether physical or a note on your phone, has some &lt;em&gt;very&lt;/em&gt; stale items on it.
If you don’t start now it will just become another stale “todo” item.
The whole “being trad” idea, if actually actualized, takes a lot of knowledge and skill.
You need to start learning now.&lt;/p&gt;
&lt;h2 id=&quot;ok-how&quot;&gt;Ok, How?&lt;/h2&gt;
&lt;p&gt;A good first step for getting anything done is get off social media.
If you want to think more in depth about this I wrote about it &lt;a href=&quot;/was-it-worth-it&quot;&gt;back in 2022&lt;/a&gt;.
Now that that’s done:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start small.&lt;/li&gt;
&lt;li&gt;If you fail, start again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Start by&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;making some real food every morning instead of eating pre-made foods like cereal.&lt;/li&gt;
&lt;li&gt;Make some simple bread to go with dinner.&lt;/li&gt;
&lt;li&gt;At your next oil change - do it yourself.&lt;/li&gt;
&lt;li&gt;Anything! You are just trying to build momentum.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Also do please note: that there is &lt;em&gt;&lt;strong&gt;nothing&lt;/strong&gt;&lt;/em&gt; wrong with finding and following YouTube videos to do all this.
You are trying to modify and better your life, not LARP after all.)&lt;/p&gt;
&lt;p&gt;If you are tying to go 0-100 in one week you are basically guaranteed to fail.
So if you ever want to arrive you need to start &lt;strong&gt;small&lt;/strong&gt;, but you also need to start &lt;strong&gt;now&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;ok-but-why&quot;&gt;Ok, but Why?&lt;/h2&gt;
&lt;p&gt;Why do I care, and why should you care?&lt;/p&gt;
&lt;p&gt;I see a video like that and the life it depicts &lt;em&gt;does&lt;/em&gt; look nice.
Me and my wife are somewhat “trad” (we do our own maintenance, and she makes lots of homemade food) but we absolutely don’t &lt;em&gt;own&lt;/em&gt; anything that &lt;em&gt;made us&lt;/em&gt; that way.
At best you could say a series of lifestyle choices which have influenced what we buy as now helped us maintain course.
(Buying cars that are easy to work on, etc.)
But the things you own don’t determine who or what we are.&lt;/p&gt;
&lt;p&gt;Living sustainably like peacefully like this is something I want, and I’m guessing you want, and is something I want &lt;em&gt;for&lt;/em&gt; you.
So it makes me sad to see people being sold a fake dream without being told any of the personal responsibility to get there.&lt;/p&gt;
&lt;p&gt;I would be willing to say that once you have decided that going in this direction is something you want to do, watching videos like this one, that are just pans of someone else’s trad props, is actually detrimental to your success.
Obviously there are instructional videos that are good, but this is just edging you on a lifestyle.
And it is taking the edge off.
I don’t believe that you &lt;em&gt;should&lt;/em&gt; be comfortable now.
If it slightly angers you that simple lives like that have been stolen from you and your descendants, then &lt;strong&gt;good&lt;/strong&gt;.
You need to stay mad to drive yourself into improvement.
If you are comfortable you won’t improve.&lt;/p&gt;
&lt;p&gt;James 1:2-4 says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Consider it all joy, my brothers and sisters, when you encounter various trials,
knowing that the testing of your faith produces endurance.
And let endurance have its perfect result, so that you may be perfect and complete, lacking in nothing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Obviously this is talking about spiritual health, but is it not also true for your physical and mental health?
If you are “in trials”, “angry”, “unhappy”, or “uncomfortable” shouldn’t you harness that feeling to become better?
Consuming products - like this video, or any other product to “solve” any other problem - is just taking the easy way out.
A quick solution to a long-term problem.
The duct-tape fix won’t stay.
But perhaps by the time it’s needs patching again it will be too late to fix it properly.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-fat&quot;&gt;
&lt;p&gt;This is the same marketing scheme we see with weight-loss drugs.
People don’t want to put in the effort to actually make real change, so they buy a product that they think will help them.
Now they are just poor, lazy, and have no initiative.
This is why the Hims ads at the 2026 Superbowl made me so made.
Preying on poor people’s jealousy and lack of initiative to extract even more money from them. &lt;a href=&quot;#user-content-fnref-fat&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-money&quot;&gt;
&lt;p&gt;Be financially responsible lol. But in my experience it’s actually cheaper to be “trad”. &lt;a href=&quot;#user-content-fnref-money&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><category>Blog</category><category>LARPers</category><author>Oliver Atkinson</author></item><item><title>Cron FTW</title><link>https://oliveratkinson.net/cron-ftw</link><guid isPermaLink="true">https://oliveratkinson.net/cron-ftw</guid><description>&lt;p&gt;Linux, being the awesome blank canvas that it is, has lots great things.
But my newest favorite: cron.
By running &lt;code&gt;crontab -e&lt;/code&gt; your crontab will be opened in your &lt;code&gt;$EDITOR&lt;/code&gt;&lt;sup&gt;&lt;a href=&quot;#user-content-fn-editor&quot; id=&quot;user-content-fnref-editor&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.
From here you get to decipher crontab timing logic.
OoO Spooky!
Jokes aside, it’s really not too bad.
The following table outlines how it works:&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cron:&lt;/th&gt;&lt;th&gt;m&lt;/th&gt;&lt;th&gt;h&lt;/th&gt;&lt;th&gt;dom&lt;/th&gt;&lt;th&gt;mon&lt;/th&gt;&lt;th&gt;dow&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;English:&lt;/td&gt;&lt;td&gt;Minute&lt;/td&gt;&lt;td&gt;Hour&lt;/td&gt;&lt;td&gt;Day of month&lt;/td&gt;&lt;td&gt;Month&lt;/td&gt;&lt;td&gt;Day of week&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Value:&lt;/td&gt;&lt;td&gt;0-59&lt;/td&gt;&lt;td&gt;0-24&lt;/td&gt;&lt;td&gt;0-31&lt;/td&gt;&lt;td&gt;0-12&lt;/td&gt;&lt;td&gt;0-6 (0 = Sun)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This means that if your crontab looks like this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0 0 * * * reboot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your computer will reboot at midnight every day.
&lt;a href=&quot;https://crontab.guru/#0_0_*_*_*&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Crontab.guru&lt;/a&gt; makes this really easy to figure out.&lt;/p&gt;
&lt;p&gt;For business tasks, &lt;a href=&quot;https://crontab.guru/#0_0_*_*_1-5&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;here’s a pretty helpful one&lt;/a&gt;.
It also shows off the range feature!&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0 0 * * 1-5 xyz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which translates to: “At midnight, M-F, run xyz”&lt;/p&gt;
&lt;p&gt;It’s probably worth noting that you can do dumb stuff such as:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0 0 31 2 * xyz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which runs on the 31st day of February.&lt;/p&gt;
&lt;p&gt;I recently used this to download a YouTube video, following the creators release schedule, which I would then re-host on a local machine.
I did this because my phone broke, so I had to use an old phone without a sim card in it (I need any phone for work because of 2FA codes.)
But I get my news from a YouTuber.
So this way I could just create a shortcut on my homescreen to the ip where I was re-hosting the video, and download it in the morning while going out the door.
Then I could listen to the downloaded file on my way to work in the car!
Pretty nifty!
So my crontab looked something like this:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0 23 * * 1-6 /usr/bin/download_video&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Read as: At 11p.m., Monday thru Saturday, run the “download_video” script.)&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-editor&quot;&gt;
&lt;p&gt;The variable &lt;code&gt;$EDITOR&lt;/code&gt; is commonly set to &lt;code&gt;nano&lt;/code&gt;, a cli text editor. But you can reassign it to something useful like &lt;code&gt;EDITOR=nvim&lt;/code&gt; in your &lt;code&gt;.bashrc&lt;/code&gt; &lt;a href=&quot;#user-content-fnref-editor&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><category>Blog</category><category>Linux</category><author>Oliver Atkinson</author></item><item><title>Israel&apos;s newest propaganda campaign</title><link>https://oliveratkinson.net/israels-propaganda-targeting-christains</link><guid isPermaLink="true">https://oliveratkinson.net/israels-propaganda-targeting-christains</guid><description>&lt;h1 id=&quot;the-problem&quot;&gt;The problem&lt;/h1&gt;
&lt;p&gt;Israel has - or rather is in the process of - launching one of it’s newest campaigns against America, as outlined &lt;a href=&quot;https://efile.fara.gov/docs/7653-Exhibit-AB-20250927-1.pdf&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;very explicitly in a fara.gov document&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;where&quot;&gt;Where&lt;/h1&gt;
&lt;p&gt;When you read the document you will see that Israel is going to start targeting large figures in Christianity (pg. 65, 76).
Now, it is worth noting that the figures they state as “Possible Christian Celebrity Spokespeople”, I’ve only heard of the sports people.
And I haven’t heard of them &lt;em&gt;because&lt;/em&gt; of their faith, but because they are sports people.
I literally had no clue that Stephen Curry professed Christ.
So I suppose the Christian Spokesperson route I don’t have a lot of faith in, it’s still concerning that Israel is trying to buy/influence American “Christian” figures.&lt;/p&gt;
&lt;p&gt;The more concerning parts are page 68 where they state their goals to hijack large Christian conferences (some notable conferences missing), but even &lt;em&gt;more&lt;/em&gt; than that, they want to hijack Christmas (pg. 69)!&lt;/p&gt;
&lt;p&gt;Of course they want to infiltrate (Christian) colleges but who isn’t going there to spread their ideas, I’m not as mad about that.&lt;/p&gt;
&lt;p&gt;They also have their sights set on normal churches themselves (pg. 58, 63, 72, 81, 84), with pages 34-44&lt;sup&gt;&lt;a href=&quot;#user-content-fn-wrap&quot; id=&quot;user-content-fnref-wrap&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; outlining the targets themselves, with suspected church size.
So if you live in AZ, CO, or CA&lt;sup&gt;&lt;a href=&quot;#user-content-fn-targets&quot; id=&quot;user-content-fnref-targets&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;, you might want to check if your church is in their cross-hairs.
By their own numbers, their “Targeted Population” is &lt;em&gt;&lt;strong&gt;1.4 million&lt;/strong&gt;&lt;/em&gt; church goers (pg. 33).&lt;/p&gt;
&lt;h1 id=&quot;what&quot;&gt;What&lt;/h1&gt;
&lt;p&gt;Page 57 starts the slide deck of just how they plan on infiltrating the American Christian church.
As well as their plans to “Use biblical arguments to highlight the importance of Israel and the Jewish People to Christians”.
Never mind that they don’t believe the Bible, but they are using it as a weapon against those who do!&lt;/p&gt;
&lt;p&gt;Page 59 is where they outline the messages themselves.
Things such as:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;“Question the longstanding policy of a 2-state solution”&lt;/li&gt;
&lt;li&gt;”… many concessions made by Israel in exchange for peace”&lt;/li&gt;
&lt;li&gt;“Christians In Israel and the Birthplace of Jesus Christmas Message” (the weird capitalization is theirs, idk)&lt;/li&gt;
&lt;li&gt;“Education about ongoing activities to protect civilians and maintain moral superiority”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Which sounds a lot like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;“Here is why you should let us do racial cleansing”&lt;/li&gt;
&lt;li&gt;“We are the poor nice guys in this whole thing”&lt;/li&gt;
&lt;li&gt;“Remember that guy who is super important to your religion that we killed? He was born here.”&lt;/li&gt;
&lt;li&gt;“Pretend like we don’t flatten cities, even though we have the ability to do precision strikes.”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Another branch of the execution is the “The 10/7 Experience” (pg. 78).
This seems to be a VR experience / recreation of the 10/7 attack to garner sympathy for Israel.
If they get their larger budget (as mentioned in the finances part of this page) they will have two of these mobile experiences.
The aggravating part of this slide (pg 78) is the last point:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Call to action outside the exhibit using biblical messaging”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;THEY DON’T BELIEVE THE BIBLE. THEY ARE JEWISH.&lt;/strong&gt;
So they are using God’s word as leverage against (perhaps unsuspecting) Christians to garner support for a non-Christian government.
Depending on how you read “do not take the Lord’s name in vain”, they are doing just that&lt;sup&gt;&lt;a href=&quot;#user-content-fn-god&apos;s_name&quot; id=&quot;user-content-fnref-god&apos;s_name&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.
This is basically just (national) Jews egging on Christians&lt;sup&gt;&lt;a href=&quot;#user-content-fn-egging&quot; id=&quot;user-content-fnref-egging&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; by using a distorted version of the Bible to increase support for the Israeli government.&lt;/p&gt;
&lt;h1 id=&quot;how-finances&quot;&gt;How (Finances)&lt;/h1&gt;
&lt;p&gt;Their budget (pg. 12) shows that they are hoping to be operating with a budget of $3.26 million.
And their ideal budget would push them just north of $4 million.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-wrap&quot;&gt;
&lt;p&gt;Really the pages are: 34-53. The table wraps down to the pages 44-53 &lt;a href=&quot;#user-content-fnref-wrap&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-targets&quot;&gt;
&lt;p&gt;TX, UT, WY would also be added to the list of targets if they get their slightly larger budget, as proposed on pg. 12. &lt;a href=&quot;#user-content-fnref-targets&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-god&apos;s_name&quot;&gt;
&lt;p&gt;This might take another post. If I make it I will link it here. This idea is inspired by Charlie Kirk. &lt;a href=&quot;#user-content-fnref-god&apos;s_name&quot; data-footnote-backref aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-egging&quot;&gt;
&lt;p&gt;Not to mention that their companies’ literal name is: “Show Faith by Works, LLC”, making a reference to James 2:14. &lt;a href=&quot;#user-content-fnref-egging&quot; data-footnote-backref aria-label=&quot;Back to reference 4&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate><category>Blog</category><category>Israel</category><category>Propaganda</category><author>Oliver Atkinson</author></item><item><title>Living Water</title><link>https://oliveratkinson.net/living-water</link><guid isPermaLink="true">https://oliveratkinson.net/living-water</guid><description>&lt;hr/&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: This isn’t necessarily super Biblically &lt;em&gt;accurate&lt;/em&gt;, but more of a fun “Bible fan-theory”!
In the future I will do an actual wrteup about hell and the typical misgivings of hell and what it is and isn’t.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr/&gt;
&lt;p&gt;If we were to look at the common hell “experiences”&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; we see some common threads:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hell is hot, really hot&lt;/li&gt;
&lt;li&gt;Hell has no water&lt;/li&gt;
&lt;li&gt;Hell is dark&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These points are built from common stories that circulate the Christian American church,
these are stories that I’ve had told to me or heard as just parts of casual conversation.
However, it is interesting to note “these stories” also lines up with the parable of Lazarus:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;&lt;p&gt;[English NASB] Luke 16:24:&lt;/p&gt;&lt;p&gt;“And he cried out and said, ‘Father Abraham, have mercy on me,
and send Lazarus so that he may dip the tip of his finger in
water and cool off my tongue, for I am in agony in this flame.’&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;This verse reinforces points 1 &amp;amp; 2.
We see that hell is hot, and that there is no water to be found.
Point 3 comes from more of
a Jude 1:6 understanding.&lt;/p&gt;
&lt;p&gt;It could be that these (not literal) depictions of hell are similar to
where unclean spirits go when cast out, as seen here:&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;&lt;p&gt;[English NASB] Matthew 12:43:&lt;/p&gt;&lt;p&gt;“Now when the unclean spirit goes out of a man, it passes through
waterless places seeking rest, and does not find it.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Now, we know that unclean spirits won’t be cast into hell until Judgment day&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.
This could mean that unclean spirits are not cast into hell when they
get cast &lt;em&gt;out&lt;/em&gt;, but chances are they aren’t in Heaven either.
This then means that the unclean spirits, who are in a waterless places, are &lt;em&gt;on earth&lt;/em&gt;.
All of this seems to make the point; “&lt;strong&gt;There are hell-like places on earth&lt;/strong&gt;”
(Hell-like in the common perception of hell, not the literal conditions of a literal place).&lt;/p&gt;
&lt;p&gt;So where are these places at?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;*Insert joke about my least favorite location*&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;*Bonding moment over cut-and-paste jokes that no one likes.*&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My take? They are everywhere.
They literally &lt;strong&gt;ARE&lt;/strong&gt; everywhere, you are in one &lt;strong&gt;right now&lt;/strong&gt;.
So why don’t you feel like the Rich Man in the parable of Lazarus?
Well, if we look at what Jesus calls himself:&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class=&quot;bible&quot;&gt;&lt;p&gt;[English NASB] John 4:10:&lt;/p&gt;&lt;p&gt;Jesus answered and said to her, “If you knew the gift of God, and who it is who
says to you, ‘Give Me a drink,’ you would have asked Him, and He would have
given you living water.”&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The fiery “hell” is being quenched!
You are feeling God &lt;em&gt;right now&lt;/em&gt; in your current “waterless place”.
So now anytime you don’t feel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Like you are burning alive&lt;/li&gt;
&lt;li&gt;Like you would do anything for just a &lt;strong&gt;drop&lt;/strong&gt; of water&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You must be in the presence of God (One of the Trinity, multiple of the Trinity? IDK), because otherwise
you would feel like you are burning and could use just &lt;em&gt;a drop&lt;/em&gt; of water.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Whether or not this is a Biblically accurate take or not aside; it can be a useful model to have
in your head. It leads you towards a posture of gratitude and thanksgiving to God!&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;I put this in quotes not because I think they didn’t happen, but because I’m not sure it wasn’t just a vision of “hell” - not &lt;em&gt;literal&lt;/em&gt; hell &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;This is partialy true, I will need to do a whole write up on demons but Matthew 25:41 says that
&lt;em&gt;in the future&lt;/em&gt; demons will be thrown in into the eternal fire. However we also know that some demons
are chained up right now (Jude 1:6). However we &lt;em&gt;do&lt;/em&gt; know that while they are chained up they haven’t
been judged yet. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;This is mosty likely a misinterpretation and I would assume that Jesus referring to Himself has the
living water here would imply that the living water
is salvation or a “man does not live on bread and water alone” type vibe.
However my interpretation doesn’t apply these constraints. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate><category>Blog</category><category>Bible</category><author>Oliver Atkinson</author></item><item><title>Slippery Slope</title><link>https://oliveratkinson.net/slippery-slope</link><guid isPermaLink="true">https://oliveratkinson.net/slippery-slope</guid><description>&lt;p&gt;We know from Uncle Ted’s &lt;del&gt;manifesto&lt;/del&gt; paper that once bio-enginering children starts, it will quickly become compulsery.
This is because even if modifing your children during development is optional, if the modificaitons can set your children up for a better life, they no longer become optional.&lt;/p&gt;
&lt;p&gt;You can think of it like this theoretical:&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Scenerio: Edutcation your kids is optional&lt;/p&gt;
&lt;p&gt;Person 1: Doesn’t educate kids&lt;/p&gt;
&lt;p&gt;Person 2: Educates kids&lt;/p&gt;
&lt;p&gt;Person 1’s kids: blue collar, making low income, low&lt;sup&gt;&lt;a href=&quot;#user-content-fn-quality&quot; id=&quot;user-content-fnref-quality&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; quality of life&lt;/p&gt;
&lt;p&gt;Person 2’s kids: white color, high income, high&lt;sup&gt;&lt;a href=&quot;#user-content-fn-quality&quot; id=&quot;user-content-fnref-quality-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; quality of life&lt;/p&gt;
&lt;p&gt;So yes educating your kids is “optional”, but any caring parent would educate them.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;We can see this phenomonion appear with things like phones and cars.
Starts off optional, perhaps something for the “upper class” or a cool gadget.
Use is found - see: you can make more money - becomes effecrtly manidory via cultural norms.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id=&quot;short-list-of-non-compulsery-items&quot;&gt;Short list of &lt;del&gt;non&lt;/del&gt; compulsery items&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Phones&lt;/li&gt;
&lt;li&gt;Women in the workforce&lt;/li&gt;
&lt;li&gt;Cars&lt;/li&gt;
&lt;li&gt;Education&lt;/li&gt;
&lt;li&gt;(soon?) genetically modifing offspring?&lt;/li&gt;
&lt;/ul&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-quality&quot;&gt;
&lt;p&gt;How are we going to meausre quality of life (QOL)?
If we use the common perception of QOL more or less more money equals more happy.
Obviously this isn’t directly true as &lt;a href=&quot;https://genius.com/11654444&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jon Bellion puts it&lt;/a&gt;. &lt;a href=&quot;#user-content-fnref-quality&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-quality-2&quot; data-footnote-backref aria-label=&quot;Back to reference 1-2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Mon, 27 Oct 2025 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Video Searching</title><link>https://oliveratkinson.net/embedding-search</link><guid isPermaLink="true">https://oliveratkinson.net/embedding-search</guid><description>&lt;p&gt;This past weekend I created a small python program which can search through a collection of video files using natural (normal) language.
The search will return the path of the video with the timestamp it thinks the described action is taking place.&lt;/p&gt;
&lt;p&gt;For example, I indexed my local copy of The Office.
From this point I was able to search something such as “people doing a fire walk” and it would return “S3E22 - Beach Games.mkv” with the timestamp of 1310s.
If you want to verify this for yourself you can open your copy of The Office, Season 3, Episode 22, and fast forward to roughly 21:45 and you will see that they are doing the fire walk.&lt;/p&gt;
&lt;h2 id=&quot;how-does-it-work&quot;&gt;How does it work?&lt;/h2&gt;
&lt;p&gt;Embedding works by taking input data (like a sentence) and turning it to a vector.
The model this project is using turns the data into vectors that are 2048 dimensions.
For a short example however, we can look at 2 dimension vectors.
Let’s say we have three sentences:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;“I like cars”&lt;/li&gt;
&lt;li&gt;“I love bikes”&lt;/li&gt;
&lt;li&gt;“Trash cans are black”&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We (as humans) can tell that the first two sentences are similar, and the third is very dissimilar.
But how do we let a computer know their similarity?
This is what embedding does.
It would turn the three sentences into vectors that might look like:&lt;/p&gt;
&lt;div class=&quot;center-me&quot;&gt;&lt;img src=&quot;/_astro/example-embeddings.MrH29wni_1wAkrO.webp&quot; alt=&quot;A graph of three multi-part vectors, one and two are next to each other, three is alone&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;600&quot;&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;How the computer goes from data to vector is something I don’t know enough about to write about.
So it will remain a black box for now.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the image we can see that sentence one and two are close to each other, and sentence three is all by it’s self.
Now, by computing the distance between the vectors we get a number that represents &lt;em&gt;how similar&lt;/em&gt; the vectors (sentences) are.&lt;/p&gt;
&lt;p&gt;By using a special embedding model, in this case &lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-VL-Embedding-2B&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Qwen3-VL-Embedding-2B&lt;/a&gt;, I can generate embeddings for video, images, &lt;strong&gt;and&lt;/strong&gt; text.
This is different from typical embedding models which can only embed videos &lt;em&gt;or&lt;/em&gt; images &lt;em&gt;or&lt;/em&gt; text.
Instead of just being able to see the similarity of two sentences, we can now see the similarity of an image to a sentence.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Think; In the image above, red line could be an image, and the blue line could be a sentence.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So now we can see if a sentence is similar (&lt;em&gt;representative&lt;/em&gt;) of a video.&lt;/p&gt;
&lt;p&gt;For several reasons, we don’t want an embedding of the &lt;em&gt;whole&lt;/em&gt; file though.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The embedding would represent the entire movie/show, we want just one scene (or less)&lt;/li&gt;
&lt;li&gt;My hardware can’t embed that much information all at once, it’s not strong enough (not enough VRAM)&lt;/li&gt;
&lt;li&gt;The model doesn’t support that much data all at once&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because of these three reasons I split the video into 10 section chunks and embed each chunk, saving the result in a database alongside the file name, hash, and timestamp.&lt;/p&gt;
&lt;p&gt;Now when the user wants to query all these video chunks, we just generate an embedding (get a vector representation of the search) and compute the distance to each video chunk’s embedding in the database.
We then take the top few closest vectors, and return the corresponding file name and timestamp to the user.&lt;/p&gt;
&lt;h2 id=&quot;program-flow&quot;&gt;Program Flow:&lt;/h2&gt;
&lt;h3 id=&quot;indexing&quot;&gt;Indexing:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Find all video files&lt;/li&gt;
&lt;li&gt;Break video files into 10s chunks&lt;/li&gt;
&lt;li&gt;Feed chunks into embedding model&lt;/li&gt;
&lt;li&gt;Save embedding vector with the file name and timestamp in a database&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;searching-querying&quot;&gt;Searching (Querying):&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Embed the query using the same model&lt;/li&gt;
&lt;li&gt;Compute the distance from the query’s vector to each of the vectors in the database&lt;/li&gt;
&lt;li&gt;Return the data where the vectors were closest&lt;/li&gt;
&lt;/ol&gt;</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>Blog</category><category>AI</category><category>Embedding</category><author>Oliver Atkinson</author></item><item><title>Lightweight Desktop Environment Showdown</title><link>https://oliveratkinson.net/lightweight-desktop-environments</link><guid isPermaLink="true">https://oliveratkinson.net/lightweight-desktop-environments</guid><description>&lt;p&gt;Showdown of the lightweight desktop environments (DEs).&lt;/p&gt;
&lt;p&gt;Our contenders are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;xfce&lt;/li&gt;
&lt;li&gt;Mate&lt;/li&gt;
&lt;li&gt;lxqt&lt;/li&gt;
&lt;li&gt;lxde&lt;/li&gt;
&lt;li&gt;AwesomeWM&lt;/li&gt;
&lt;li&gt;Trinity&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;the-test-bench&quot;&gt;The Test Bench&lt;/h1&gt;
&lt;p&gt;Proxmox virtual machines (VMs) with the following specs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4GB RAM (1333 MT/s, ECC)&lt;/li&gt;
&lt;li&gt;2 CPUs (x86-64-v2-AES) (Intel Xeon CPU E5-2695 v2 @ 2.40GHz)
&lt;ul&gt;
&lt;li&gt;You may note, that the virtual cpus provided by QEMU (the hypervisor Proxmox uses) goes up to &lt;code&gt;x86-64-v4&lt;/code&gt;, but we are using &lt;code&gt;v2&lt;/code&gt;.
This is because the Xeon CPUs we are using are quite old (LGA2011 v2!) and don’t support v3 as &lt;a href=&quot;https://pve.proxmox.com/wiki/Qemu/KVM_Virtual_Machines&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;defined in this document&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Using EndeavourOS (Mercury Neo 2025.03.19) (Based on Arch), fully updated as of 11/7/25.&lt;/li&gt;
&lt;li&gt;Idling on the desktop with a terminal running htop. The terminal is decided by each DE.&lt;/li&gt;
&lt;li&gt;Display resolution: 1920x1080
&lt;ul&gt;
&lt;li&gt;Although I used &lt;code&gt;noVNC&lt;/code&gt; for initial testing (Proxmox’s default viewer), I used SPICE for testing out responsiveness.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Installed on SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why this system?
(Besides the fact that I own it an not something else)
These specs are quite cheap to acquire (my 48 core, 72 GB system was about $120 + parts I already had around) and all these DEs are specifically mentioned as “lightweight”, ie: “for low-spec systems”, which is great for VMs.
Especially VMs that don’t have good graphics capabilities because of the underlying CPU.
I’m not sure if this is because of AVX or what’s the actual instructions my CPUs are missing to be ok at graphics, or if they are just old.&lt;/p&gt;
&lt;h2 id=&quot;what-we-are-tracking&quot;&gt;What we are tracking&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RAM usage&lt;/li&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;Window manager (WM)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;xfce&quot;&gt;xfce&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;RAM: 544M&lt;/li&gt;
&lt;li&gt;CPU:
&lt;ul&gt;
&lt;li&gt;1: 2-4%&lt;/li&gt;
&lt;li&gt;2: 0-1%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WM: X11&lt;/li&gt;
&lt;li&gt;Notes: A little desktop lag, not quite “snappy”, window boarder would draw noticeably before inner window. Start menu much snappier than others.&lt;/li&gt;
&lt;/ul&gt;

&lt;picture&gt;&lt;source srcset=&quot;/_astro/xfce.Wicho_DN_1eQYrm.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/xfce.Wicho_DN_Z1VjueK.png&quot; alt=&quot;Screenshot of the xfce DE&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2052&quot; height=&quot;1280&quot;&gt;&lt;/picture&gt;
&lt;h1 id=&quot;mate&quot;&gt;Mate&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;RAM: 631M&lt;/li&gt;
&lt;li&gt;CPU:
&lt;ul&gt;
&lt;li&gt;1: 0-1%&lt;/li&gt;
&lt;li&gt;2: 2.5-4.5%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WM: X11&lt;/li&gt;
&lt;li&gt;Notes: Slow start menu (similar to others), tho this one feels like there might be a programmed delay between hovering a category and it displaying it, which is dumb if that’s the case. Windows were drawing right away.&lt;/li&gt;
&lt;/ul&gt;

&lt;picture&gt;&lt;source srcset=&quot;/_astro/mate.V8XOcDQp_Z1M5Fgs.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/mate.V8XOcDQp_6TXQm.png&quot; alt=&quot;Screenshot of the mate DE&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2052&quot; height=&quot;1280&quot;&gt;&lt;/picture&gt;
&lt;h1 id=&quot;lxqt&quot;&gt;LXQT&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;RAM: 408M&lt;/li&gt;
&lt;li&gt;CPU:
&lt;ul&gt;
&lt;li&gt;1: 0-1%&lt;/li&gt;
&lt;li&gt;2: 1.3-2%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WM: X11&lt;/li&gt;
&lt;li&gt;Notes: Filemanager was more responsive than xfce, however the “start menu” still lagged a bit behind which menu I had highlighted.&lt;/li&gt;
&lt;/ul&gt;

&lt;picture&gt;&lt;source srcset=&quot;/_astro/lxqt.C0r4oxSH_Z2hDp6M.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/lxqt.C0r4oxSH_ZnCJXX.png&quot; alt=&quot;Screenshot of the lxqt DE&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2052&quot; height=&quot;1280&quot;&gt;&lt;/picture&gt;
&lt;h1 id=&quot;lxde&quot;&gt;LXDE&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;RAM: 417M&lt;/li&gt;
&lt;li&gt;CPU:
&lt;ul&gt;
&lt;li&gt;1: 0-0.7%&lt;/li&gt;
&lt;li&gt;2: 1.3-2.6%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WM: X11&lt;/li&gt;
&lt;li&gt;Notes: Cool Windows XP look, same as others - UI lags behind actions in places like the “start menu”, window boarders draw before window.&lt;/li&gt;
&lt;/ul&gt;

&lt;picture&gt;&lt;source srcset=&quot;/_astro/lxde.B4kf36qT_ZpPHCY.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/lxde.B4kf36qT_ZtgVsO.png&quot; alt=&quot;Screenshot of the lxde DE&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2052&quot; height=&quot;1280&quot;&gt;&lt;/picture&gt;
&lt;hr/&gt;
&lt;h1 id=&quot;des-not-installable-from-the-endeavouros-installer&quot;&gt;DEs not installable from the EndeavourOS installer&lt;/h1&gt;
&lt;h1 id=&quot;awesomewm&quot;&gt;AwesomeWM&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;RAM: 283M&lt;/li&gt;
&lt;li&gt;CPU:
&lt;ul&gt;
&lt;li&gt;1: 0-1.3%&lt;/li&gt;
&lt;li&gt;2: 0.7-1.3%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WM: X11&lt;/li&gt;
&lt;li&gt;Notes: Takes ricing to not look terrible. By far lowest ram/cpu consumption. Incredibly snappy UI, although it’s worth noting there isn’t much UI to be snappy, very minimalist.&lt;/li&gt;
&lt;/ul&gt;

&lt;picture&gt;&lt;source srcset=&quot;/_astro/awesome.DVh29v2G_7YiuX.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/awesome.DVh29v2G_Z2v0Lly.png&quot; alt=&quot;Screenshot of the awesome DE&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2052&quot; height=&quot;1280&quot;&gt;&lt;/picture&gt;
&lt;h1 id=&quot;trinity&quot;&gt;Trinity&lt;/h1&gt;
&lt;p&gt;Couldn’t get to install on Arch - Didn’t want to build from source.&lt;/p&gt;
&lt;hr/&gt;
&lt;h1 id=&quot;what-did-we-learn&quot;&gt;What did we learn?&lt;/h1&gt;
&lt;p&gt;IDK, but it was a fun experiment.&lt;/p&gt;
&lt;p&gt;Perhaps we learned that nobody seems to make a good start menu.
The fastest one was AwesomeWM, but there is barely anything there.
So perhaps everybody else should sacrifice some ram to cache a bit of data for the start menu?&lt;/p&gt;
&lt;p&gt;More or less the winner is AwesomeWM if you want the smallest, fastest DE.
However, it isn’t the &lt;em&gt;most&lt;/em&gt; noob-friendly.&lt;/p&gt;
&lt;p&gt;I like Mate and xfce a lot - xfce might have a bit of a lead on Mate because you can search programs in the start menu.&lt;/p&gt;</description><pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate><category>Blog</category><category>Linux</category><author>Oliver Atkinson</author></item><item><title>The cloud</title><link>https://oliveratkinson.net/the-cloud</link><guid isPermaLink="true">https://oliveratkinson.net/the-cloud</guid><description>&lt;p&gt;The cloud.&lt;/p&gt;
&lt;p&gt;The glorious cloud.
It lets us &lt;a href=&quot;https://news.ycombinator.com/item?id=47791871&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;rack up large bullsh*t bills&lt;/a&gt;,
it makes sure that &lt;a href=&quot;https://learn.microsoft.com/en-us/power-bi/collaborate-share/end-user-subscribe?tabs=creator#requirements&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;we are always in the wrong teir&lt;/a&gt;,
but most importantly, it ensures &lt;del&gt;99.999%&lt;/del&gt; &lt;a href=&quot;https://mrshu.github.io/github-statuses/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;89.81%&lt;/a&gt; uptime.&lt;/p&gt;

&lt;div class=&quot;center-me&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/_astro/github-uptime.Dg0QfaxR_Zv3P3I.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/github-uptime.Dg0QfaxR_Z1gUe0i.png&quot; alt=&quot;Github uptime showing 89%&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1399&quot; height=&quot;624&quot;&gt;&lt;/picture&gt;&lt;/div&gt;
&lt;p&gt;So the cloud sucks, obviously.
But why do we use it?&lt;/p&gt;
&lt;p&gt;There are people with SaaS products who pretend that they will need to be able to automatically scale over-night to 1,000,000 active users (from their normal 10 (because I’m sure you can x100,000 your userbase overnight)).
But these people are, to me, are mythical creatures.
I don’t interact with software devs in my real life (besides myself) but I still get the cloud forced down my throat, even in IT.&lt;/p&gt;
&lt;p&gt;But &lt;em&gt;why&lt;/em&gt;?
The reasons I’ve been given are all made-up.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“It will be easier to maintain” (Until literally anything goes wrong)&lt;/li&gt;
&lt;li&gt;“It’s the future” (Why do we have to band-wagon?)&lt;/li&gt;
&lt;li&gt;“It will be cheaper” (Literally how?)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;on-price&quot;&gt;On price&lt;/h2&gt;
&lt;p&gt;People who say “the cloud is cheaper” are basically always lieing.
The reason they think they &lt;em&gt;aren’t&lt;/em&gt; lieing, is because they are buying enterprise server hardware.
For the uninitiated; the difference between consumer and enterprise hardware, is about a 4x price difference, with a marginal stability increase.
Let’s run a quick example, and pretend you are a small company, less than 500 employees, and need a server to do DHCP, DNS, Active Directory, and perhaps some internal reporting.&lt;/p&gt;
&lt;p&gt;ThinkSystem ST50 V3 Tower Server&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8 Cores @ 2.7 GHz&lt;/li&gt;
&lt;li&gt;16GB DDR5 ECC RAM @ 5600MHz&lt;/li&gt;
&lt;li&gt;2TB 3.5” HDD, 6GB/s&lt;/li&gt;
&lt;li&gt;Cost: &lt;strong&gt;$4310.80&lt;/strong&gt; (they “estimate” that the normal “market value” of this configuration is $10,777.02, for whatever that’s worth.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What does this give you that a $500 PC can’t give you?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPMI&lt;/li&gt;
&lt;li&gt;ECC RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before you can answer the question of “is IPMI and ECC worth $3800?”, you should know what they each are.&lt;/p&gt;
&lt;h3 id=&quot;ipmi&quot;&gt;IPMI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;What: Remote access to the computer, independent of the host operating system (Windows/Linux/BSD).&lt;/li&gt;
&lt;li&gt;Why: If Windows/Linux/etc were to totally freeze up, you can restart the machine remotely, without having to walk over to the machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This same functionality can be replicated for somewhere around &lt;a href=&quot;https://jetkvm.com/products&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;$100&lt;/a&gt;.
But in most cases can just be forgone entirely.&lt;/p&gt;
&lt;h3 id=&quot;ecc-ram&quot;&gt;ECC RAM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;What: Your RAM holds all the information about the processes that are currently running on your computer.
ECC makes sure that all this data doesn’t get corrupted by particles flying through space.
If one of these particles hits the RAM in just the right way, it can cause a bit-flip; a 1 becoming a 0 or vise versa.&lt;/li&gt;
&lt;li&gt;Why: In &lt;em&gt;very&lt;/em&gt; critical or large workloads, such as financial data processing, you need to be &lt;strong&gt;absolutely&lt;/strong&gt; sure that the data your computer is using is what it &lt;em&gt;should&lt;/em&gt; be, and that no numbers changed.
In non-critical workloads (such as the ones we are targeting) a bit-flip can range from changing nothing, to at worst, causing the system to crash.
After this crash you then restart the machine are are good to go as if nothing happened.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some people such as Linus Torvalds (creator of Linux, git, etc) suggests that every computer should have ECC ram, just to increase computer’s stability.
This is probably a reasonable take.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;So we can see that IPMI is pretty useless (for our workload) and ECC is &lt;em&gt;nice&lt;/em&gt; but not &lt;em&gt;required&lt;/em&gt;.
If we were to bump up our budget a little from $500 we could buy some hardware that is a generation or two older, but would have ECC RAM.&lt;/p&gt;
&lt;p&gt;I would hope that any competent IT person already knows all of this information.
So why do they keep spending money on:&lt;/p&gt;
&lt;p&gt;A. Expensive on-prem servers
B. Not cost efficient cloud servers&lt;/p&gt;
&lt;p&gt;To have someone else to blame.
If your internal service goes down, your boss, or someone in a similar high-up position will loudly complain about how there is downtime, and they can’t do anything right now, and that this is all because you wanted to just penny pinch (even though the cost of 30 min of down time is &lt;em&gt;significantly&lt;/em&gt; less than the cost difference between the other options).
So instead of weathering the storm of blame when something goes wrong once a year, all of IT has decided to use fancy hardware.
That way &lt;em&gt;if&lt;/em&gt; something goes wrong, they have successfully covered their ass.
If our product is in the cloud, and the &lt;em&gt;cloud&lt;/em&gt; goes down, then that is an Azure/AWS/DigialOcean problem, and IT can shift the blame to them.
If we run the product locally and it goes down, it’s now IT’s fault.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;So it looks like we spend $1000s/year just to not get blamed &lt;em&gt;if&lt;/em&gt; something were to happen.
What a wonderful use of money.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id=&quot;additional-notes&quot;&gt;Additional Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The costs shown here aren’t even including costs of running bullsh*t software.
IT admins &lt;em&gt;could&lt;/em&gt; be running Inucs or Proxmox, but those are &lt;em&gt;untested&lt;/em&gt; solutions, which is very scary!
&lt;strong&gt;If&lt;/strong&gt; something were to happen then they could get blamed for using untested scary solutions and be chastised that they should’ve gone with the “industry standard”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“Industry Standard” software just means that it is the company who gives the best vibes and makes you feel warm and fuzzy inside when you ask them what they guarantees.
For example; AWS “guaranteed” some absurdly high uptime.
But then they go down multiple times in 2025.
So it was all a lie.
But at least the marketing made us feel good about ourselves!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item><item><title>Don&apos;t Tread on me!</title><link>https://oliveratkinson.net/dont-tread-on-me</link><guid isPermaLink="true">https://oliveratkinson.net/dont-tread-on-me</guid><description>&lt;p&gt;Living in the Montana there are &lt;em&gt;plenty&lt;/em&gt; of “don’t tread on me” (DTOM) flags flying around.
Heck, we even have two different versions as &lt;strong&gt;license plates&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;center-me&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/_astro/1776-Foundation-2023.DJdNKMDi_ZsTQVR.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/1776-Foundation-2023.DJdNKMDi_Z1enfjw.jpg&quot; alt=&quot;More or less the standard flag, as a license plate&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;600&quot;&gt;&lt;/picture&gt;&lt;picture&gt;&lt;source srcset=&quot;/_astro/Montana-Public-Policy-Center-2023.DgT06LAq_DYAXd.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/Montana-Public-Policy-Center-2023.DgT06LAq_2ggQn9.jpg&quot; alt=&quot;The flag with a black color scheme, as a license plate&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;600&quot;&gt;&lt;/picture&gt;&lt;p&gt;MDT’s website:
&lt;a href=&quot;https://mvdmt.gov/portfolio-item/montana-public-policy-center/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Black&lt;/a&gt;
/
&lt;a href=&quot;https://mvdmt.gov/portfolio-item/1776-foundation/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Yellow&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;But what is all this hype about?
Normally DTOM is associated with second amendment ideology.
It is not uncommon to find a DTOM bumper sticker in a constellation of “come and take it” and “home of the free, because of the brave”.
This whole train of thought is basically “if you try to infringe on my rights, I will kill you”, except, their rights are already being infringed any they aren’t doing anything.
These plates are &lt;em&gt;especially&lt;/em&gt; ironic when you realise that the ideology is about fighting the government, but the license plates are approve and distributed… &lt;em&gt;by the government&lt;/em&gt;.
Meaning that this is state “approved” rebellion.
Not unlike in Orwell’s &lt;em&gt;1984&lt;/em&gt; when the “rebellion” is actually a government honeypot operation…&lt;/p&gt;
&lt;p&gt;Not quite sure what their line for “being tread on” is, but it would logically be about 100 years ago.
Around the time of the NFA laws.
These are the laws that regulate the length of the barrel of your gun, don’t allow silencers, and don’t allow you to own fully-automatic guns.
Ostensibly these laws were to combat the mafia, but this didn’t do much.
Turns out criminalizing trivial actives of serial murderers doesn’t change their behavior.
Besides the fact that these laws haven’t changed how much crime is committed, they can all be bypassed if you just pay the government some money.
So basically it’s just a mafia-style extortion.
If it were about crime, they would always be illegal, not just pay walled.&lt;/p&gt;
&lt;p&gt;So perhaps it’s about stopping tyrannical governments?
At this point (2026) we’ve watched Waco Texas, Ruby Ridge, Bryan Malinowski, Kent State Shooting, etc, and none of those were enough to go against the government.
So what will it theoretically take?
In 1770, 5 persons were shot by the standing government.
This was then propagandized into the “Boston Massacre” and used as a catalyst in the Revolutionary War.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I’m not saying that they &lt;em&gt;should&lt;/em&gt; start a revolution, that’s not Christ-like.
But their messaging would imply that they are a standing ready militia to march at the first sign of tyranny.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So what’s the point of all of this?
Perhaps they just need hope that they &lt;em&gt;could&lt;/em&gt; theoretically do something.
So it’s just a dream of agency.
However, we know that they are too fat and happy (“bread and circus” if you will) to start a war.
Or perhaps they &lt;em&gt;are&lt;/em&gt; read and capable, but are just of the normie-class, and are waiting for a &lt;a href=&quot;https://en.wikipedia.org/wiki/Great_man_theory&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Great Man&lt;/a&gt; to appear and call them to arms.&lt;/p&gt;</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><category>Blog</category><category>LARPers</category><author>Oliver Atkinson</author></item><item><title>A.I.&apos;s Insult</title><link>https://oliveratkinson.net/ais-insult</link><guid isPermaLink="true">https://oliveratkinson.net/ais-insult</guid><description>&lt;p&gt;Pretending that consuming A.I. content is anything more than insulting is silly.
Now, I must first point out that A.I., like computers, are &lt;em&gt;tools&lt;/em&gt;.
And I’m perfectly ok with you using whatever tools help you the best.
Obviously I’m not against computers, here we are right now!
I’m writing this on a computer and you are consuming this on a computer.
Tools all around.&lt;/p&gt;
&lt;p&gt;However it’s quite peeving when people hand me a tool as though it’s a final product.&lt;/p&gt;
&lt;h1 id=&quot;ideas&quot;&gt;Ideas&lt;/h1&gt;
&lt;p&gt;Let’s say I ask for a chair and you hand me some planks of wood, a saw, and screwdriver with screws.
Yes, in some odd sense there is a “chair” here, but not in any usable sense.
I have to do all the assembly.
If I wanted to make a chair I would just go and do just that.
I want your final product, not because I won’t ever “build a chair” with you.
But because when asking for a chair, it’s a courtesy to be given a actual, assembled chair.&lt;/p&gt;
&lt;p&gt;This is quite similar to how people are using A.I.
I might ask (wether directly, or an inferred “ask” by trying to view some media) to hear somebody’s opinions.
But if all I am returned is some A.I. slop that I have to piece together, that is unacceptable.
I want &lt;em&gt;your&lt;/em&gt; ideas, not some synthesized text that happenstantially appears as a coherent argument.
Contrarily, when I receive your actual words which you have transcribed into &lt;em&gt;some form&lt;/em&gt; of media, wether that be written or spoken, I am receiving information that has first passed through your brain to judge it for logical continuity and accuracy, and I can trust that my time may now be focused on discussing the meaning of your statements, not making sure that it even makes sense in the first place.
When I ingest A.I.’s content, I am doing all the mental lifting of asserting it’s correctness (I’m assembling the metaphorical chair.)&lt;/p&gt;
&lt;p&gt;Why might I feel so deeply about this?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Well, by making me “assemble the chair” you are quite clearly stating that my time is markedly less valuable than yours.
See, if you valued my time, you would assemble your thoughts clearly then present them to me.
By not doing this you are saying that my “mental compute” is less valuable, so therefor assembling &lt;strong&gt;your&lt;/strong&gt; thoughts should be done in &lt;em&gt;my&lt;/em&gt; head, instead of yours.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You are preying on people who don’t understand their worth.
And here’s a question for you to think about: “If somebody is consuming A.I. content and they don’t realize, is that bad?”
I would answer &lt;strong&gt;yes&lt;/strong&gt;.
Most people are not inherently good users of their own time, so by you synthesizing content with A.I. for them to consume, you are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First stating that consuming their time is an accetpatble practice, instead of encouraging enlightening learning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Second, you are also so unconcerned with their being that it’s not even worth &lt;em&gt;&lt;strong&gt;your&lt;/strong&gt;&lt;/em&gt; time to waste &lt;em&gt;their&lt;/em&gt; time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;art&quot;&gt;Art&lt;/h1&gt;
&lt;p&gt;Super easy example, I’m also no art connoisseur, nevertheless, the Mona Lisa:&lt;/p&gt;
&lt;div class=&quot;center-me&quot;&gt;&lt;picture&gt;&lt;source srcset=&quot;/_astro/Mona_Lisa__by_Leonardo_da_Vinci.BoHmd9oL_2rf1z.webp&quot; type=&quot;image/webp&quot;&gt;&lt;img src=&quot;/_astro/Mona_Lisa__by_Leonardo_da_Vinci.BoHmd9oL_1BA1Bf.jpg&quot; alt=&quot;Leonardo da Vinci&apos;s Mona Lisa&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;330&quot; height=&quot;492&quot;&gt;&lt;/picture&gt;&lt;p&gt;From &lt;a href=&quot;https://en.wikipedia.org/wiki/File:Mona_Lisa,_by_Leonardo_da_Vinci,_from_C2RMF_retouched.jpg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Wikimedia Commons&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Had this been just synthesized by A.I., there would be no point in studying it, besides to make a better A.I. in the future.
(And what for even then? You are pursuing improvement into a valueless endeavour.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-ai-value&quot; id=&quot;user-content-fnref-ai-value&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;)
Had that been the case we would know &lt;strong&gt;absolutely&lt;/strong&gt; that &lt;em&gt;nobody&lt;/em&gt; was thinking &lt;em&gt;anything&lt;/em&gt; when it was created.
It would’ve been manufactured out of thin air and provides little-to-zero value.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-ai-value&quot; id=&quot;user-content-fnref-ai-value-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;However, since we know a real human created this piece of art (we aren’t the History Channel with some alien conspiracies out here (at least not right now)).
We can ponder what the meaning of Mona Lisa’s smile is, or where the bridge in the background is leading to&lt;sup&gt;&lt;a href=&quot;#user-content-fn-hi-res&quot; id=&quot;user-content-fnref-hi-res&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.
If A.I. were to produce some peculiar results we would just chalk it up to “hallucinations” and nothing more.&lt;/p&gt;
&lt;h1 id=&quot;videos&quot;&gt;Videos&lt;/h1&gt;
&lt;p&gt;This whole idea boils down to an idea I had heard discussed when I was studying video editing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Evergreen content”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is content (content meaning basically anything) that perhaps doesn’t have massive disruption right away, but will have a “slow burn” of popularity.
This is to say that people keep coming back to the content.
Perhaps for a forth or fifth view.
Of course you can have evergreen content that is disruptive right away, however, in our attention-span optimized consumerist culture, they are drifting towards mutual exclusivity.&lt;/p&gt;
&lt;p&gt;What is considered “evergreen” might differ from person to person slightly, we all have a different favorite movie, for example.
However, nobody’s favorite movie &lt;em&gt;Marvel movie #319,291&lt;/em&gt; because it’s plot made you think.
Or &lt;em&gt;Mr. Beast’s challenge #991,010,109&lt;/em&gt; because it astutely handled existential themes and ideas.
Those franchises are just cyclical content machines that are only producing content for the sake of wasting time.
Now, you might say that “It’s not wasting time. I’m &lt;em&gt;relaxing&lt;/em&gt;”.
Wrong, you are wasting time.
And I will not waste more of your time proving this, as I &lt;a href=&quot;https://oliveratkinson.net/was-it-worth-it/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;already have an article on it&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;in-conclusion&quot;&gt;In Conclusion&lt;/h1&gt;
&lt;p&gt;Go read something &lt;em&gt;&lt;strong&gt;real&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Go view something &lt;em&gt;&lt;strong&gt;meaningful&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And create something &lt;em&gt;&lt;strong&gt;worthwhile&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-ai-value&quot;&gt;
&lt;p&gt;There &lt;em&gt;are&lt;/em&gt; reasons to have A.I. &lt;strong&gt;like any tool&lt;/strong&gt;.
In my case, image generators are helpful to create a first rough draft of an image, which I then go back and trace and edit until I have something basically new. &lt;a href=&quot;#user-content-fnref-ai-value&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-ai-value-2&quot; data-footnote-backref aria-label=&quot;Back to reference 1-2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-hi-res&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://upload.wikimedia.org/wikipedia/commons/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Link to the high-resolution version&lt;/a&gt; so you can discover for yourself. &lt;a href=&quot;#user-content-fnref-hi-res&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate><category>Blog</category><author>Oliver Atkinson</author></item></channel></rss>