<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title></title>
      <link>https://hitblast.fun</link>
      <description></description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://hitblast.fun/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Thu, 12 Mar 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>is AI expensive on us?</title>
          <pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate>
          <author>hitblast</author>
          <link>https://hitblast.fun/blog/is-ai-expensive-on-us/</link>
          <guid>https://hitblast.fun/blog/is-ai-expensive-on-us/</guid>
          <description xml:base="https://hitblast.fun/blog/is-ai-expensive-on-us/">&lt;p&gt;Had a nice day; did some investigation on the code of a Minecraft launcher project I&#39;m currently contributing to, and, guess what?&lt;/p&gt;
&lt;p&gt;I got bombed by AI doom-and-gloom content again.&lt;/p&gt;
&lt;p&gt;(did I go a bit fast on the description of the whole topic of- this entire blog entry there?)&lt;/p&gt;
&lt;p&gt;Anyways, well, it was only two videos which I watched, one after another. I&#39;ll quickly hyperlink those down here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://youtu.be/FGDM92QYa60?si=O9xkEuU0zgNASVSy&quot;&gt;&quot;It Begins: An AI Tried to Escape the Lab&quot;&lt;/a&gt; (more recent)&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://youtu.be/wDBy2bUICQY?si=qVUyb3IS_ySjsVkB&quot;&gt;&quot;This Will Be My Most Disliked Video On YouTube&quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of the videos are by &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.youtube.com/@AISpecies&quot;&gt;Species | Documenting AGI&lt;/a&gt;, and I quite appreciate the length and effort the content has. What I don&#39;t really appreciate about these are, is leaving the audience with cliffhangers.&lt;/p&gt;
&lt;p&gt;Don&#39;t get me wrong but, I hate cliffhangers which feel more like a delayed but consistent jolt in your mindset, rather than consistent,
balanced-out surprises which could pique your interest but at the same time, provide you with a sense of plateau.&lt;/p&gt;
&lt;p&gt;I have seen this pattern emerge with AI-related YouTube doomers which I&#39;m seeming coming across more nowadays, really, and I kind of not like the trajectory of it.&lt;/p&gt;
&lt;p&gt;In a world where software quality is substantially declining by folds of ten, every, single, day, in my opinion, AI is probably one of the things which I believe humanity really needs to regulate in general. If you ask me personally, I&#39;d not be surprised by how delusional the community has become over time with all these Qwen, GPT, LLaMa, Grok or even Claude (especially Claude) models overriding their sense of judgement.&lt;/p&gt;
&lt;p&gt;There used to be a time where software was insanely predictable, and even though I&#39;m nowhere near in the same grounds as the top researchers in this field to say this, but, we&#39;ve quite lost that predictability with the new tools we&#39;re seeing emerge lately. Now don&#39;t get me wrong again, but, I&#39;m quite frustrated by LinkedIn people screaming about the hype they&#39;re unknowingly flueing, full-steam, with those em-dashes you hate (&quot;—&quot; &amp;lt;- this).&lt;/p&gt;
&lt;p&gt;We&#39;ve lost originality in music, and I don&#39;t think its unjustified for me to say this. I had to quit Spotify because of the amount of saturation I was getting from all the repeated AI music plus my playlist which has been degenerating itself through all the recommendations I get.&lt;/p&gt;
&lt;p&gt;I think it&#39;d be pretty sad if you told someone from the 1900s that we&#39;ve now lost originality, &lt;em&gt;in music&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And,&lt;/p&gt;
&lt;p&gt;We&#39;ve lost originality in all the creatives. Yes, I&#39;d count programming in it as well - programmers usually don&#39;t count themselves as creatives anyway other than an elite few but oh well... I also stumbled upon someone&#39;s comment in a random video I was watching, and I perfectly like their analogy:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Using AI for art and calling yourself an artist is literally the same as ordering food from a restaurant and calling yourself a chef for that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On an even more serious note, someone had said this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By giving AI, you&#39;ve effectively granted stupid people to be egotistical about the creativity they don&#39;t have.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I, personally, like predictability. I, personally, also think that even if I had graduated from linguistics, I wouldn&#39;t just fire up Claude Code one day and decided that I want to be a programming languages designer and design an entire language without guilt in my head - that I&#39;m skipping the cognition required to make that very object exist, without depending on external audit.&lt;/p&gt;
&lt;p&gt;Have we really degraded that much?&lt;/p&gt;
&lt;p&gt;Earlier this week, I was in a conversation with one of my friends on Discord - he&#39;s probably three years senior, but it very much surprises me that CS majors in my country don&#39;t know the fundamentals for building a simple web-based WireGuard/OpenVPN client. They just vibecoded the entire thing, with Antigravity, while not taking agency of their code, and calling it a day.&lt;/p&gt;
&lt;p&gt;Now if you really like these tools, I&#39;d not blame you. They&#39;re excellent at &lt;em&gt;some&lt;/em&gt; things in particular. But guess what they&#39;re not excellent in?&lt;/p&gt;
&lt;p&gt;Keeping your cognition alive.&lt;/p&gt;
&lt;p&gt;The very same predictability we were promised in the early stages of development, is being stolen from us, explicitly.&lt;/p&gt;
&lt;p&gt;Traditional algorithms are playing catch-up with all of this as well. One moment, I see a video on whether engineers are becoming dumber in my feed, the other moment I see some typical CEO ramp up their product saying it &quot;doesn&#39;t hamper engineers&quot;. I usually tune into YouTube for some wholesome content that I want to watch (yes, the typical videos in which people comment &quot;this is what YouTube is made for&quot;), and it turns into an unpleasant experience within mere seconds of logging in.&lt;/p&gt;
&lt;p&gt;Judge for yourself and I&#39;d like to know where you find the predictable human interlace in this.&lt;/p&gt;
&lt;p&gt;Software used to have QA. Even Anthropic&#39;s own deployments don&#39;t pass three nines nowadays. Are we really in for this deploy-and-break style too? Amidst all of this?&lt;/p&gt;
&lt;p&gt;Rust&#39;s core motives are awesome. Do you know what&#39;s not awesome? People proudly naming their 0-1 employees LinkedIn/GitHub organization after a Rust acronym and pushing AI slop as it engulfs more of the corporate-controlled minds which are already pretty bullish on a tech we don&#39;t fully understand the effects of.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Phew..&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Well, I don&#39;t know how well of a content-defined chugging of hate towards the world we&#39;re headed for I did right there, but I&#39;d just like to ask you two, simple questions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is AI really expensive on us?&lt;/li&gt;
&lt;li&gt;Is it too late to pull the plug?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;As much of a satire I want this blog entry to be, it breaks my mind even more to think that it isn&#39;t.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>christmas eve, and a battle to create a time capsule</title>
          <pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate>
          <author>hitblast</author>
          <link>https://hitblast.fun/blog/building-a-time-capsule/</link>
          <guid>https://hitblast.fun/blog/building-a-time-capsule/</guid>
          <description xml:base="https://hitblast.fun/blog/building-a-time-capsule/">&lt;blockquote&gt;
&lt;p&gt;foreshadowing: this is future me looking back at this post, and feel like I skipped a lot of code explanations which would&#39;ve been a great addition. regardless, this was written within a strict timeframe so, hopefully you&#39;ll grant my mistakes while reading :3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;During the afternoon of 25th December, I was just casually hopping around Discord in search of what to do. I randomly joined a voice channel on my Minecraft team&#39;s server, and one of my friends also (luckily) hopped in. &amp;lt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/Itsmemonzu&quot;&gt;@Itsmemonzu&lt;/a&gt;&amp;gt;, turns out, was also looking for something to do; and a second friend joined to aid him with his idea shortage.&lt;/p&gt;
&lt;p&gt;Previously, his urge led him to install &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://zed.dev&quot;&gt;Zed&lt;/a&gt; on his beefy machine (after I told him about how it uses the GPU for rendering his code), and somehow all of a sudden he wanted to do all-things Zed only. The second friend, in the meantime, suggested him that he makes a &lt;em&gt;time capsule program&lt;/em&gt;. I&#39;ll return to this in a bit.&lt;/p&gt;
&lt;p&gt;Now as a matter of fact, the size-to-functionality ratio of his previous applications were pretty unrealistic - say, 64 megabytes for doing a GET request to the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://mcsrvstat.us/&quot;&gt;Minecraft Server Status API&lt;/a&gt;, and after he himself recognizing the problem, my futile attempts to motivate him back to use C# for his desktop apps were all turning to vain. He eventually turned to &lt;em&gt;Python&lt;/em&gt; for this one.&lt;/p&gt;
&lt;p&gt;Then suddenly he had asked - &quot;how about we do a programming challenge over this?&quot;&lt;/p&gt;
&lt;p&gt;Hmm, not a bad idea!&lt;/p&gt;
&lt;p&gt;I hadn&#39;t had a programming battle with someone ever since the prehistoric days of HackSquad 2022, so doing this was going to be fun, and Monzu&#39;s learning nature was also going to be interesting to analyze within the challenge. We eventually agreed on a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Different stacks. Obviously. He&#39;d be using &lt;strong&gt;Python&lt;/strong&gt; while I&#39;ll do the same program in &lt;strong&gt;Rust&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;We&#39;d both be using a shared algorithm for determining (but this has some lore to it, so be alert while reading).&lt;/li&gt;
&lt;li&gt;We&#39;d have to finish it within the Christmas Eve - a fully working copy of our projects, that is.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ll be attaching more context along the way with this entry. Till then, the game was officially on for both of us!&lt;/p&gt;
&lt;h3 id=&quot;intermediate-planning&quot;&gt;intermediate planning&lt;/h3&gt;
&lt;p&gt;We were connected to the same Podium VC we initialized with for the entirety of the challenge, and while talking, we both discussed some common frameworks for our programs:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;His stack&lt;/th&gt;&lt;th&gt;My stack&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Good old Python as usual.&lt;/td&gt;&lt;td&gt;Rust for me.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/Textualize/rich&quot;&gt;Rich&lt;/a&gt; frameworks. Great for TUI/UX. He wanted his CLI to be fully interactive.&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/clap-rs/clap&quot;&gt;clap&lt;/a&gt; for me since I didn&#39;t want my iteration to be interactive at all for saving some time.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://tinydb.readthedocs.io/en/latest/index.html&quot;&gt;TinyDB&lt;/a&gt; as the database, since he was already fluent enough working with JSON tokens.&lt;/td&gt;&lt;td&gt;I wanted to build my own database for the work, hence I&#39;ll be creating &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/cornelli/blob/master/src/core/database.rs&quot;&gt;ChristmasDB&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Now let&#39;s discuss the initial concept of a &lt;em&gt;time capsule&lt;/em&gt;. As our friend Rem had described it, a time capsule is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;A program that saves a text and keeps it away, and finally returns it after a certain time.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&#39;s a bit of my thinking process:&lt;/p&gt;
&lt;p&gt;My first thoughts after seeing his idea was - bootstrapping such a simple concept into a CLI and not making others bored would be a difficult task. I had to think of something which Monzu wasn&#39;t planning about. I&#39;d have to ensure two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make the code &lt;em&gt;insanely&lt;/em&gt; simple to use. That&#39;d consume more of &quot;my&quot; time, but it&#39;d ensure that the entire thing works on all the three major desktop platforms I&#39;d be targeting.&lt;/li&gt;
&lt;li&gt;I&#39;d have to wrap everything in just the &lt;code&gt;ChristmasDB&lt;/code&gt; layer so that commands are only hardcoded iterations of the stuff I want to do.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, based on what I heard from Monzu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;He wanted to use the least amount of commands so that his CLI was fully usable by just the press of a few keys (except for typing the actual text).&lt;/li&gt;
&lt;li&gt;He also wanted to take advantage of Python&#39;s dynamically-typed ecosystem to reduce code as much as possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, based off of the sentence Rem had told us, we&#39;d have to create a way to actually &quot;put the text away from the user&quot;, so that it is not accessible before the time the user allocates, so we&#39;d need a way to &lt;strong&gt;encrypt the text&lt;/strong&gt; and make it undetectable without some sort of deciphering mechanism.&lt;/p&gt;
&lt;h3 id=&quot;ignition&quot;&gt;ignition&lt;/h3&gt;
&lt;p&gt;We had started by discussing about the common stuff at first. He (and eventually I too) had decided to call each input of the user a &quot;capsule&quot;, which had the following fields attached to it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The actual text, but ciphered.&lt;/li&gt;
&lt;li&gt;The datetime indicating the exact moment the text was ciphered away.&lt;/li&gt;
&lt;li&gt;The lifetime of the text. Things can&#39;t be permanent, just as in life.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;He first thought of running a background job to give real-time insight of the datetime to the program, but I had a simpler solution in mind since spawning workers for a project like this was blatant overengineering. So, seeing him mess up his core analogy of the program we were about to make, we decided to share our algorithm. It was pretty simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The program would &lt;em&gt;only&lt;/em&gt; work when executed - not in the background, so that&#39;s one axed thing.&lt;/li&gt;
&lt;li&gt;Since we&#39;re already tracking two time-tracing fields (2 and 3 above), it&#39;d be very easy to calculate &lt;code&gt;future_time&lt;/code&gt; (in this case, the approximate time when a particular capsule should be unlocked). This would work by incrementing the user&#39;s given duration as a timedelta to the time when the capsule was created.&lt;/li&gt;
&lt;li&gt;If the user wanted to check whether a capsule was unlockable, it&#39;d just check a condition: &lt;code&gt;if (future_time &amp;lt; present_time) {... # do unlock stuff}&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;monzu-s-route-algorithm&quot;&gt;monzu&#39;s route (algorithm)&lt;/h3&gt;
&lt;p&gt;After all of the yapping about the initial brainstorm phase, we were finally ready to start working. While I was entirely focused on the &lt;code&gt;ChristmasDB&lt;/code&gt; layer, Monzu was honestly making some pretty good strides. He had started off by creating his input layer which was composed of numbers, and occasionally, some text. Primitive in nature, but works.&lt;/p&gt;
&lt;p&gt;He was also streaming for me to help with some of his stuff so I had a sneak peek at his input strategy:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Create a capsule (1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Check for unlockable capsules (2)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Unlock capsule (3); Your choice (1/2/3/exit):&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Turns out he was going all-bland on the CLI, leaving the opportunity to simplify things a little. I didn&#39;t know whether this was going to change for the lifetime of the challenge, but we&#39;d see shortly.&lt;/p&gt;
&lt;p&gt;I also asked him regarding his backend logic and whatnot. He was busy handling &lt;code&gt;timedelta&lt;/code&gt; and &lt;code&gt;datetime&lt;/code&gt; objects with his TinyDB instance. Inspecting some of his &quot;last&quot; code that was uploaded to GitHub, I can see some remnants which I&#39;m bound to explain in this blog:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# P.S.: My indentation got wrecked copy-pasting this snippet.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;    elif&lt;/span&gt;&lt;span&gt; action&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt; &amp;quot;3&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;[white][bold]Which capsule do you want to unlock?[/][/]&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        num&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;        # Check current time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        now_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; datetime&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;().&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;        # Accessing JSON Data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        parse&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; database&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        unlock_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(parse[num][&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;time_limit&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/Itsmemonzu/Shomoy/blob/fa69132a001c2d3f3b2c7371c847c562a01bc725/main.py#L91C8-L99C58&quot;&gt;(online snippet&#39;s here)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ll provide some entirely personal comments from here onwards (and some sweet, sweet lore).&lt;/p&gt;
&lt;p&gt;Going into the snippet, I could do nothing but get flabbergasted by the inconventional naming conventions (even though the code&#39;s working perfectly). The unreliable parsing from &lt;code&gt;parse[num][&quot;time_limit&quot;]&lt;/code&gt; might also seem a little vague at first, since there isn&#39;t a strict schema being enforced due to Python&#39;s core json implementation being dynamic in nature.&lt;/p&gt;
&lt;p&gt;As a matter of fact, during the primary (and late-game) stages, Monzu himself ended up parsing the &lt;code&gt;time_limit&lt;/code&gt; field as integers rather than &lt;code&gt;datetime&lt;/code&gt; instances, and even when he did end up parsing correctly, he passed &lt;code&gt;datetime&lt;/code&gt; objects directly into the schema for reflecting back. &lt;em&gt;*confused Monzu noises in the background wondering why it ain&#39;t behaving like Rust*&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As of the shared algorithm we were talking about implementing, his way of implementation was, again, using the &lt;code&gt;time_limit&lt;/code&gt; field. The snippet is this:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;def&lt;/span&gt;&lt;span&gt; checkCapsule():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    now_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; datetime&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;().&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;    # full database init here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;    # I removed all comments except this one&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    parse&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; database&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;    for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;,&lt;/span&gt;&lt;span&gt; unlock&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; in&lt;/span&gt;&lt;span&gt; enumerate&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(parse, start&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        unlock_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(parse[i][&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;time_limit&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; now_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span&gt; unlock_time&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            print&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;[green][bold]You can now unlock your Capsule No.&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; + f&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt; 1}&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; now_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; unlock_time&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            print&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;                &amp;quot;[red][bold]Your capsule No.[/][/]&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;                + f&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt; 1}&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt; [red][bold]is not unlockable yet.[/][/]&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;            )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/Itsmemonzu/Shomoy/blob/fa69132a001c2d3f3b2c7371c847c562a01bc725/main.py#L27-L43&quot;&gt;(online snippet&#39;s here)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For some weird reason, he ended up implementing the same algorithm twice in two different places. I mean, okay, that&#39;s why &lt;em&gt;functions&lt;/em&gt; exist. But, have a look yourself:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;    elif&lt;/span&gt;&lt;span&gt; action&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt; &amp;quot;2&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        checkCapsule&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;  # implements check&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        time&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;    elif&lt;/span&gt;&lt;span&gt; action&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt; &amp;quot;3&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;[white][bold]Which capsule do you want to unlock?[/][/]&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        num&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;  # de-facto inputs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        now_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; datetime&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;().&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        parse&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; database&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        unlock_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(parse[num][&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;time_limit&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;  # recall here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; now_time&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span&gt; unlock_time&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;  # also recall here&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/Itsmemonzu/Shomoy/blob/fa69132a001c2d3f3b2c7371c847c562a01bc725/main.py#L88-L100&quot;&gt;(online snippet&#39;s here)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I hope you clearly see the minor details I&#39;ve pointed out in front of you. The code works nicely, no comments regarding that. But, it&#39;d just break with one algorithmic change (saying just for the name of explanation).&lt;/p&gt;
&lt;h3 id=&quot;my-route-algorithm&quot;&gt;my route (algorithm)&lt;/h3&gt;
&lt;p&gt;Now, not to brag or anything about code - in fact I actually write pretty bad Rust, and considering the fact that other, more knowledgable people use the stack with lifetime specifiers, generics and whatnot for simple data parsing like this, I truly am new to this. However, I took a different approach to the same problem he took upon.&lt;/p&gt;
&lt;p&gt;He still hadn&#39;t handled the encryption layer, but I picked the good old &lt;code&gt;AES&lt;/code&gt; encryption method as my staple. I was also learning about its implementation at the same time since I had never implemented it to date on a CLI project. Within the &lt;code&gt;ChristmasDB&lt;/code&gt; layer, I also implemented a few functions which did the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One function for comparing &lt;code&gt;now_time&lt;/code&gt; and &lt;code&gt;future_time&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;One for generating a new &lt;code&gt;ChristmasDB&lt;/code&gt; instance with a user-defined &lt;code&gt;password&lt;/code&gt;. This would generate a &lt;code&gt;[0u8; 32]&lt;/code&gt; key unique to the particular password.&lt;/li&gt;
&lt;li&gt;One function for generating a new capsule from a given text. This one did the following in order:
&lt;ol&gt;
&lt;li&gt;Prepare the cipher. This includes generating a new &lt;code&gt;iv&lt;/code&gt; for each text powered by &lt;code&gt;rand::rngs::OsRng&lt;/code&gt;, which&#39;d later be used to create a cipher by attaching with the &lt;code&gt;key&lt;/code&gt; created beforehand.&lt;/li&gt;
&lt;li&gt;Applying a keystream to the text so that it gets ciphered.&lt;/li&gt;
&lt;li&gt;Store it within a &lt;code&gt;capsules&lt;/code&gt; variable within the store.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;One for autosaving the database, since I&#39;m too lazy to setup manual CRUD operations along the way. I&#39;d use &lt;code&gt;autosave()&lt;/code&gt; after the inner logic of the &lt;code&gt;add_new_capsule()&lt;/code&gt; and &lt;code&gt;remove()&lt;/code&gt; commands to write the instance to disk automatically.&lt;/li&gt;
&lt;li&gt;One for decrypting a &lt;code&gt;Capsule&lt;/code&gt; object (yes, I used structs for capsules too).&lt;/li&gt;
&lt;li&gt;And finally, one to remove a capsule instance from the store.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code is too long for me to include here, so I&#39;ll just include the primary algorithms here. Rest will be linked.&lt;/p&gt;
&lt;p&gt;For checking whether a &lt;code&gt;Capsule&lt;/code&gt; should be deciphered, the &lt;code&gt;is_awaiting_decryption()&lt;/code&gt; method had been implemented by me as such:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;// yes I used serde for the whole store&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;// that too in JSON&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#[derive(Deserialize, Serialize, Clone, PartialEq)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;pub struct&lt;/span&gt;&lt;span&gt; Capsule {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    data&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;:&lt;/span&gt;&lt;span&gt; Vec&amp;lt;u8&amp;gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    nonce&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;:&lt;/span&gt;&lt;span&gt; [u8;&lt;/span&gt;&lt;span style=&quot;color: #F8F8F8;&quot;&gt; 16&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    should_be_kept_for&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;:&lt;/span&gt;&lt;span&gt; Duration,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    time_added&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;:&lt;/span&gt;&lt;span&gt; NaiveDateTime,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;impl&lt;/span&gt;&lt;span&gt; Capsule {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;    pub fn&lt;/span&gt;&lt;span&gt; is_awaiting_decryption(&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self)&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&amp;lt;bool&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;        // This uses NaiveDateTime from the `chrono` crate.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;        if let&lt;/span&gt;&lt;span&gt; Some(future)&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; self&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;time_added&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;checked_add_signed(self&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;should_be_kept_for) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            Ok(future&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; Local&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;::&lt;/span&gt;&lt;span&gt;now()&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;naive_local())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            bail!(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;Duration overflow when computing unlock time.&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I will also include the &lt;code&gt;decrypt()&lt;/code&gt; function for you to have a sneak peek:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;    pub fn&lt;/span&gt;&lt;span&gt; decrypt(&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self, cap&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;: &amp;amp;&lt;/span&gt;&lt;span&gt;Capsule)&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Result&amp;lt;(String, usize)&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;        let mut&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; cap&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;clone();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;        // AES 256 in CTR mode; this is just a type-override from the `ctr` crate.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;        let mut&lt;/span&gt;&lt;span&gt; cipher&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; Aes256Ctr&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;::&lt;/span&gt;&lt;span&gt;new(&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;into(),&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;cap&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;nonce&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;into());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;        // Apparently applying keystreams twice reverses the encryption.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        cipher&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;apply_keystream(&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;&amp;amp;mut&lt;/span&gt;&lt;span&gt; data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;        // Improper parsing handled since keystreams can be improperly applied,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;        // given that the user has provided a wrong password.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;        let&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; String&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;::&lt;/span&gt;&lt;span&gt;from_utf8(data)&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;.&lt;/span&gt;&lt;span&gt;context(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;Invalid UTF-8, possibly a faulty password?&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;        let&lt;/span&gt;&lt;span&gt; idx&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; self&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;            .&lt;/span&gt;&lt;span&gt;capsules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;            .&lt;/span&gt;&lt;span&gt;iter()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;            .&lt;/span&gt;&lt;span&gt;position(&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;|&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;|&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; ==&lt;/span&gt;&lt;span&gt; cap)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;            .&lt;/span&gt;&lt;span&gt;context(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;Capsule not found! Did you delete it manually? :suspicious_eyes:&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;?&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Ok((text, idx))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/cornelli/blob/master/src/core/database.rs&quot;&gt;(get the full ChristmasDB snippet here)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I had a lot of fun making this work.&lt;/p&gt;
&lt;p&gt;Returning to the original lore, I also implemented &lt;code&gt;CORNELLI_PASS&lt;/code&gt; as an environment variable through which the user would apply to set a password. I looked at Monzu&#39;s iteration, and I couldn&#39;t find a password. Seems like he stole the password side of things from the user and entirely put it on the hands of his own program; which is, I don&#39;t know whether to call clever, but the solution kind of works, but then again it becomes pointless.&lt;/p&gt;
&lt;p&gt;Oh and, I&#39;d only create &lt;em&gt;two&lt;/em&gt; commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;keep &quot;anytext&quot; &amp;lt;duration&amp;gt;&lt;/code&gt;: &lt;em&gt;Keeps&lt;/em&gt; a capsule and keeps it away till the set duration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mailbox&lt;/code&gt;: Gives you a surprise Stardew Valley-style view at the messages you&#39;re meant to see at the moment, probably left by your past self.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;two-new-interfaces&quot;&gt;two new interfaces&lt;/h3&gt;
&lt;p&gt;I was kind of envious of his implementation, for that he managed to at least get a primitive solution up and running that fast. I was being very lazy to pass a mutable string variable to an &lt;code&gt;io::stdin()&lt;/code&gt; call, so much so that I had to compensate with even harder &lt;code&gt;clap&lt;/code&gt; arguments.&lt;/p&gt;
&lt;p&gt;Anyhow, I had previously created &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/rust-cli-template&quot;&gt;rust-cli-template&lt;/a&gt; for my personal projects, so that came in handy. I had just cloned and deleted the &lt;code&gt;.git&lt;/code&gt; folder to gain a headstart. This was &lt;em&gt;before&lt;/em&gt; all of the algorithmic lore described above. By now, Monzu was getting into the encryption part of things, and I was just starting off with the UX.&lt;/p&gt;
&lt;p&gt;I implemented the storymode-like interface for &lt;code&gt;mailbox&lt;/code&gt;. Also, something different had also started happening while I was doing that.&lt;/p&gt;
&lt;p&gt;By the time they had joined, it was almost 6 hours that Monzu and I were talking in the channel for, and they found us in completely different states. I had spend a ludicrous amount of time optimizing the database, so I was pretty much clear for UX. I had also yoinked the duration-parsing (&lt;code&gt;1h2m1s&lt;/code&gt;-style) from &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/trimsec&quot;&gt;trimsec&lt;/a&gt; to get some boost. On the other hand, Monzu was only just getting into duration parsing. Frantically enough, he started seeking help from both furti and wolverton regarding some other topics.&lt;/p&gt;
&lt;p&gt;Wait, aren&#39;t they supposed to be judges?&lt;/p&gt;
&lt;p&gt;Anyways, he had also asked me about duration-parsing beforehand. At first we concluded that only doing it by the day would be cheap enough for the project, but upon looking at the actual problem, neither programs would&#39;ve been able to track the correct decryption time if we had done that, so I skipped over the simplification idea. Turns out, Monzu didn&#39;t get the clarification and he had implemented a days-only parser.&lt;/p&gt;
&lt;p&gt;I was seeing an unreasonable amount of panic within - I bet he could&#39;ve &lt;em&gt;hardened his runtime for comfort&lt;/em&gt; (no pun intended).&lt;/p&gt;
&lt;p&gt;He ended up adding a positional parsing method for the duration (&lt;code&gt;x hours, x minutes, x seconds&lt;/code&gt;, non-comma-separated). Having a look at his source, we can see exactly that alongside his self-password mechanism:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;          # Parse key from key.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;           with&lt;/span&gt;&lt;span&gt; open&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(keyFile,&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt; &amp;quot;rb&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; as&lt;/span&gt;&lt;span&gt; keyFile&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               readKey&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; keyFile&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               f&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; Fernet&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(readKey)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;           message&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;encrypt&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;().&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;           user_input&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; input&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;Set time limit: (i.e 2 50 30 (day/hour/minute)) &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;           days&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;,&lt;/span&gt;&lt;span&gt; hours&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;,&lt;/span&gt;&lt;span&gt; minutes&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; map&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;, user_input.&lt;/span&gt;&lt;span&gt;split&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;           time_limit&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; =&lt;/span&gt;&lt;span&gt; datetime&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; +&lt;/span&gt;&lt;span&gt; timedelta&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;               days&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;days, hours&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;hours, minutes&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;minutes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;           )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;           if&lt;/span&gt;&lt;span&gt; isinstance&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(time_limit, datetime):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               database&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;.&lt;/span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;                   {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;                       &amp;quot;message&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(message),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;                       &amp;quot;time_limit&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;: time_limit.&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;                       &amp;quot;current_time&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #79B8FF;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(datetime.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;()),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;                   }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;               )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               print&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;[red][bold]Your message has been capsulized!&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/Itsmemonzu/Shomoy/blob/fa69132a001c2d3f3b2c7371c847c562a01bc725/main.py#L66C12-L85C1&quot;&gt;(original snippet&#39;s here)&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;a-chaotic-release&quot;&gt;a chaotic release&lt;/h3&gt;
&lt;p&gt;Seeing Monzu&#39;s unreasonable panic, furti gave him an additional 10 minutes (which ended up scaling to 30 minutes since Monzu was ignoring that). We also saw some late-game failures in his code. Remember the &lt;code&gt;datetime&lt;/code&gt; and &lt;code&gt;timedelta&lt;/code&gt; objects we were talking about? Turns out he was parsing them wrong again, and this time he was fully yelling in the voice channel.&lt;/p&gt;
&lt;p&gt;This isn&#39;t supposed to be a Monzu-rant blog entry, but he quite literally realized that &lt;code&gt;datetime&lt;/code&gt; and &lt;code&gt;timedelta&lt;/code&gt; were distinct data types and not derivations of language primitives. Quite fun.&lt;/p&gt;
&lt;p&gt;We had another bit of coding leftover. Monzu was closing in on the finish line, and I was already finished, looking for further polishing ideas. I even tried downloading the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://open.spotify.com/track/2q2Z2A0Mt8AsWyQEdB6wuu&quot;&gt;Stardew Valley Overture&lt;/a&gt; soundtrack just for the demo for presenting the &lt;code&gt;mailbox&lt;/code&gt; command, but ultimately that didn&#39;t turn out well, so I scrapped the idea.&lt;/p&gt;
&lt;p&gt;Once Monzu was finished, we were counting down for the CI builds. He was pretty much off with the Python interpreter and the &lt;code&gt;pyinstaller&lt;/code&gt; library for packaging. My builds actually failed once since I had kept the old bin names from where I had gotten the workflows (one of my previous projects), so I had to restart it with freshly. After that, we both submitted.&lt;/p&gt;
&lt;p&gt;And then, we made both of the projects public.&lt;/p&gt;
&lt;p&gt;I released the repository with the name &quot;cornelli&quot;, and Monzu released his by the name &quot;Shomoy&quot;, which means &quot;time&quot; in Bengali.&lt;/p&gt;
&lt;p&gt;Both furti and wolverton were checking out our repositories. My project was first tried out by wolverton, which he cleared without hesitation (and also gave me a nice rating, thanks wolverton if you&#39;re reading this). While reading the documentation, he had also asked for some alignment with the setup procedure, since I didn&#39;t include the particular setup procedure for PowerShell/&lt;code&gt;cmd&lt;/code&gt;, and setting &lt;code&gt;CORNELLI_PASS&lt;/code&gt; failed inside that particular Windows environment. I&#39;m pretty glad I could fix that by just changing &lt;code&gt;export&lt;/code&gt; to &lt;code&gt;set&lt;/code&gt; inside the command.&lt;/p&gt;
&lt;p&gt;As of Monzu, his road was a little bit rocky. The primary issue being him not including a sort of &quot;dependency lockfile&quot; in his project, ultimately leading to furti and wolverton running the following command to install the three dependencies:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; pip install rich cryptography tinydb&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After some iterations, wolverton (watching my stream) and I managed to get his application running.&lt;/p&gt;
&lt;p&gt;I won&#39;t take the courtesy of the overall review. That goes to the judges.&lt;/p&gt;
&lt;p&gt;Wolverton had left a massive review for both of the projects. He rated in four categories: documentation, installation, the actual program and overall. On the contrary, furti left a huge almost-40-minute review on both of the projects, which is private so I won&#39;t be sharing it here.&lt;/p&gt;
&lt;h3 id=&quot;verdict-by-the-judges&quot;&gt;verdict by the judges&lt;/h3&gt;
&lt;p&gt;Even though the overall result was biasing towards different things, both Monzu and I faced criticism and questions for our design choices. For example, the &lt;code&gt;CORNELLI_PASS&lt;/code&gt; pattern I was using got questioned by furti since in the v1 release, it wasn&#39;t behaving well at all for some mailbox entries. We ended up fixing it later on.&lt;/p&gt;
&lt;p&gt;On the flip side, Monzu faced criticism for the following things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Providing no lockfile.&lt;/li&gt;
&lt;li&gt;Providing zero documentation (he actually erased his &lt;code&gt;README.md&lt;/code&gt; while force-pushing without prior knowledge).&lt;/li&gt;
&lt;li&gt;Changing the codebase at the time of the review and telling judges to download the latest source.&lt;/li&gt;
&lt;li&gt;Having several dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;~~&lt;/p&gt;
&lt;p&gt;And with that, we got ourselves two new projects.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/cornelli&quot;&gt;cornelli&lt;/a&gt;: Write to your future self.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/Itsmemonzu/Shomoy&quot;&gt;Shomoy&lt;/a&gt;: A time capsule for your terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;m very thankful that I had agreed to do this challenge, as this was close to a teeny-tiny hackathon for both of us. Hmm, maybe I could continue this with my friends?&lt;/p&gt;
&lt;p&gt;Till then, thanks for reading this entry &amp;lt;3 signing off.&lt;/p&gt;
</description>
      </item>
      <item>
          <title>the art of believing that life&#39;s &quot;fixable&quot;</title>
          <pubDate>Fri, 14 Nov 2025 00:00:00 +0000</pubDate>
          <author>hitblast</author>
          <link>https://hitblast.fun/blog/life-is-fixable/</link>
          <guid>https://hitblast.fun/blog/life-is-fixable/</guid>
          <description xml:base="https://hitblast.fun/blog/life-is-fixable/">&lt;p&gt;So, today, I was looking at that one building from our balcony, which is seen the tallest, and is especially beautiful during the sunsets. I was thinking about numerous stuff and suddenly that one thing felt beautiful - and I found myself, thinking in mind, maybe there&#39;s an intergalactic space, or less likely, a star, sitting at exactly the angle I was looking at the building in.&lt;/p&gt;
&lt;p&gt;Regardless.&lt;/p&gt;
&lt;p&gt;That&#39;s one of the many random thoughts I have during the day, and even though at that moment I felt like maybe I could write a book extending my glossary of thoughts about just that one building. But that&#39;d be useless, wouldn&#39;t it? Who likes to continuously yap about a building. Rather, I thought perhaps let&#39;s extend it into something which I can actually write about in my blog.&lt;/p&gt;
&lt;p&gt;Speaking of extending - I actually learnt how to extend a &lt;code&gt;HashMap&lt;/code&gt; when I was working on &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/machlit/defaults-rs&quot;&gt;defaults-rs&lt;/a&gt; for my Mac tooling/apps company. It&#39;s fairly easy -&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prepare the existing hashmap, or maybe if you&#39;re in a function, get a mutable reference to it, so assuming if the variable was &lt;code&gt;some_map&lt;/code&gt;, you&#39;d have to do: &lt;code&gt;fn merge(&amp;amp;mut some_map) -&amp;gt; HashMap&amp;lt;String, PrefValue&amp;gt; {...}&lt;/code&gt; (here &lt;code&gt;PrefValue&lt;/code&gt; is the enum used for separating types in a CoreFoundation value).&lt;/li&gt;
&lt;li&gt;Prepare the &lt;em&gt;other&lt;/em&gt; hashmap. That&#39;s what I&#39;d do &lt;em&gt;inside&lt;/em&gt; the function.&lt;/li&gt;
&lt;li&gt;Call: &lt;code&gt;some_map.extend(new_map.clone())&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I just wrote a raw representation of what I&#39;d do in Rust (that I learnt today). I don&#39;t even know if this would make &lt;code&gt;clippy&lt;/code&gt; happy, but you get the point. I like sharing, and I don&#39;t know, maybe you like reading :D or do you? :eyes:&lt;/p&gt;
&lt;p&gt;~~&lt;/p&gt;
&lt;p&gt;The thing that I actually wanted to share through this is, &lt;strong&gt;the lack of open talk&lt;/strong&gt;, and I&#39;m very much afraid at how its scaling better than AI data centers nowadays. Researchers suggest that loneliness is at peak during these times, and yet people buy subscriptions to talk to their favorite custom characters/avatars &quot;powered by AI&quot; (well maybe I don&#39;t know, maybe transformer models are simply feeling more understanding than humans nowadays? I&#39;m no one to judge).&lt;/p&gt;
&lt;p&gt;I actually find it kind of frustrating that we are literally surrounded by people around us - and yet we feel so lonely, and that so many people are suffering from the same issue but no one is willing to give up their attention-seeking machines to stabilize their dopamine economy. The world&#39;s simply not like that anymore.&lt;/p&gt;
&lt;p&gt;Or, is it?&lt;/p&gt;
&lt;p&gt;Quitting my phone has been fairly easy so far. I&#39;m studying for entrance, and even then sometimes I get attracted by my laptop to do some programming on the open-core organization I&#39;m trying to establish. Maybe it&#39;s a good thing - maybe it&#39;s not. But regardless, I have found myself to be much more attracted to work when I&#39;m not using my phone. Programming feels like a craft - and genuinely I think those AI gurus who are generalizing the attention economy and spreading false-positives on LinkedIn about how AI is giving them x%+ gains are simply missing the point of cognitive debt in a spectacular fashion. And, I think it doesn&#39;t just apply to programming, it applies to all means of life.&lt;/p&gt;
&lt;p&gt;Let me remind you that these are the same algorithms which feed on your data for their survival and keep you engaged. Maybe you won&#39;t even find a toddler nowadays who wouldn&#39;t eat without TikTok sitting right in front of his underdeveloped eyes.&lt;/p&gt;
&lt;p&gt;Anyways,&lt;/p&gt;
&lt;p&gt;Let&#39;s return to &lt;strong&gt;open-talk&lt;/strong&gt;. What happens after you &lt;em&gt;do&lt;/em&gt; leave your phone for good?&lt;/p&gt;
&lt;p&gt;I mean this article surely wasn&#39;t about phones or AI or even that hashmap merger I previously mentioned. I&#39;m just trying to get you on flow with my thoughts of the preface here - it&#39;s just harder to explain without it. Open-talk is significantly undervalued in our society. In a world where you can get your answers from a non-emotional reasoning artifact, its generally costly to do so. But it does preserve one critical aspect. Organic conversations.&lt;/p&gt;
&lt;p&gt;Maybe you get your answers slow. Maybe its generally fuzzier, and even conflicting in some cases due to a second ideology being involved during the conversation, but you eventually share pieces of you which you otherwise couldn&#39;t. Not even to a chatbot - your conscious simply won&#39;t allow for it.&lt;/p&gt;
&lt;p&gt;Maybe I got that part covered. Let&#39;s talk about a different aspect.&lt;/p&gt;
&lt;p&gt;How about, umm... &lt;strong&gt;enforcement of thoughts&lt;/strong&gt;? Okay this one&#39;s good..&lt;/p&gt;
&lt;p&gt;I&#39;d like to believe in the fact that most problems we think of everyday, including the overestimation of goals, are created by just us. We simply overcalculate things we have not even reached. I&#39;d also like to believe that this is a clear indication of escalated overthinking. I mean, most people don&#39;t even get to start that one initiative they thought was groundbreaking, just because they had enforced the thought in their neural pathways that it simply was too far-reaching.&lt;/p&gt;
&lt;p&gt;My take? You have no risk of failure (except its something different which I&#39;m not covering here), so there&#39;s no risk in trying to succeed in something. Enforcement will only get you so far - and possibly even lock you into your own demise.&lt;/p&gt;
&lt;p&gt;I think I&#39;ve covered this aspect too, let&#39;s cover a different one.&lt;/p&gt;
&lt;p&gt;Umm..&lt;/p&gt;
&lt;p&gt;Well, let&#39;s talk about something else for now.&lt;/p&gt;
&lt;p&gt;I&#39;ve written this blog entry without too much markdown because it gives me the creative liberty/space I need for my brain to stretch the vocabularies out into something meaningful. I got this habit from minimalizing my desktop setup. I&#39;ve done the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plain window management (caps-lock as the &lt;strong&gt;hyper key&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Very minimal Neovim (although I&#39;ve been writing stuff in Zed which is specifically for programming). I do love to keep the raw completions and LSP just in case I do decide to write some code, though.&lt;/li&gt;
&lt;li&gt;Tried to translate formal gibberish into casual manuals when I&#39;m writing my GitHub READMEs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, what minimalism actually did to me is, I&#39;ve started to do my conversations in a more straightforward way, which leaves pathways and some additional working memory on my brain open if I decide to add some creative salt. What this does is - it gives you the raw &lt;strong&gt;open-talk&lt;/strong&gt; feel, but instead now its generated by you, which is kind of self-healing in a way.&lt;/p&gt;
&lt;p&gt;It also elevates the liberty you wish to have in your creations or probably even your thoughts. The Internet&#39;s so much of a simplified and generalized nonsensical wasteland nowadays that we&#39;re often forced to believe that there&#39;s only one or two ways of presenting something. Let it be our personal blogs, or even our posts on social media.&lt;/p&gt;
&lt;p&gt;~~&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Social media engagement&lt;/strong&gt; is also a big aspect of loneliness, which many people don&#39;t want to leave. I mean, leaving wouldn&#39;t be an ideal advice in this case, rather, what you can try is &quot;desensitizing&quot; your social media.&lt;/p&gt;
&lt;p&gt;I regularly talk in places with E2E encryption enabled. One cool option is WhatsApp - but with the crazy amount of data Meta ingests from these platforms, there&#39;s no wonder why I get insanely accurate advertisements on its child platform Instagram. So I ditched both of them, rooted for something that only me and my personal contacts can use. In the process, I have also deactivated a bunch of other social medias in favor of more desensitized ones like BlueSky and Mastodon.&lt;/p&gt;
&lt;p&gt;What it really gave me is, I got the transparency to show up not just in my projects, but also in my social profiles. It helps me present the originality I really want to produce, and hopefully you will too.&lt;/p&gt;
&lt;p&gt;Have some real conversations. With the people you love.&lt;/p&gt;
&lt;p&gt;~~&lt;/p&gt;
&lt;p&gt;Keeping faith in the fact that life&#39;s fixable is what I believe to be a genuine form of mental art. I don&#39;t think its too much to yap about, but life actually fixes itself if you just allow the small, incremental changes to happen. What I really meant by representing these three tiny aspects is that, even though the descriptions might be regulated to small terms, these issues actually add up, and often scale to millions of people. It&#39;s like we&#39;re at the brink of selling melancholy, quite literally.&lt;/p&gt;
&lt;p&gt;But, by displaying these aspects, I also wanted to share my take on how they can easily be removed.&lt;/p&gt;
&lt;p&gt;That&#39;s a lot of yapping. See you next time!&lt;/p&gt;
</description>
      </item>
      <item>
          <title>my fish shell experience, and why I might not need it</title>
          <pubDate>Sun, 25 May 2025 00:00:00 +0000</pubDate>
          <author>hitblast</author>
          <link>https://hitblast.fun/blog/my-fish-shell-experience/</link>
          <guid>https://hitblast.fun/blog/my-fish-shell-experience/</guid>
          <description xml:base="https://hitblast.fun/blog/my-fish-shell-experience/">&lt;h3 id=&quot;a-misleading-title&quot;&gt;a misleading title&lt;/h3&gt;
&lt;p&gt;Well, fish is indeed a good shell (I&#39;m not foreshadowing at all, totally... maybe?) for those who prefer scripting in a simple language, and some modern features like on-the-fly autocompletion and more. And, at the time of writing
this entry, I&#39;m still using fish on my Mac.&lt;/p&gt;
&lt;p&gt;I&#39;ve been an avid bash user for over 5 years now, and
although I switched to zsh during my first transitional period into macOS, the urge to write automated
scripts for solving other tasks and doing mundane tasks really brought me back to bash.&lt;/p&gt;
&lt;p&gt;However, as many people jump in to oxidize their toolchain and generally every set of software they use,
I decided to give some oxidized tools a try as well (by &quot;oxidized&quot; I&#39;m referring to apps/tools written in Rust). And, the trend isn&#39;t really new!
I&#39;ve been using Rust-based tools for quite a while, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/ajeetdsouza/zoxide&quot;&gt;zoxide&lt;/a&gt; - a replacement for &lt;code&gt;cd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/eza-community/eza&quot;&gt;eza&lt;/a&gt; - a replacement for &lt;code&gt;ls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jdx/mise&quot;&gt;mise&lt;/a&gt; - my personal favorite; a replacement for &lt;code&gt;asdf&lt;/code&gt; for managing toolchains
... and many others&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And in the process of using them, I have actually created some of my own, simple tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/cutler&quot;&gt;cutler&lt;/a&gt; for automating my macOS setup, acting as a replacement for manual scripting&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/hookman&quot;&gt;hookman&lt;/a&gt; for writing git hooks with TOML files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rust is really an awesome language for the developers of the 21st century in my opinion. It&#39;s safer, faster than most
languages and the compiler really helps out at even the silliest of optimization mismatches.&lt;/p&gt;
&lt;h3 id=&quot;does-it-deliver&quot;&gt;does it deliver?&lt;/h3&gt;
&lt;p&gt;Thing is, it does.&lt;/p&gt;
&lt;p&gt;Rust&#39;s speed along with its concurrency features, if coupled with &lt;code&gt;tokio&lt;/code&gt; for async, or &lt;code&gt;rayon&lt;/code&gt; for multithreading, can
lead to major performance bumps which can also be seen in literal desktop apps too! The edge CLIs deliver over desktop apps is
that, it&#39;s just a lot more fun (and significantly faster) in terms of I/O and general throughput if you&#39;re a terminal
fanboy.&lt;/p&gt;
&lt;p&gt;So, after judging all of this, I decided to give a Rust-based shell a try.&lt;/p&gt;
&lt;h3 id=&quot;getting-my-hands-dirty&quot;&gt;getting my hands dirty&lt;/h3&gt;
&lt;p&gt;I installed the shell with this command:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; install fish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# add to shell entries and init&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; sh -c&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt; &amp;#39;echo /opt/homebrew/bin/fish &amp;gt;&amp;gt; /etc/shells&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;chsh&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; -s /opt/homebrew/bin/fish&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now my first impressions with the shell was, &lt;strong&gt;&quot;How in the world is it fetching completion data without me even needing
to put a config file?&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I honestly got surprised with the out-of-the-box experience of fish. It automatically sets up autocompletion. Though,
I ran into a few difficulties at first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My &lt;strong&gt;typing speed&lt;/strong&gt; wasn&#39;t really syncing with the completions (a crucial detail we&#39;ll get back to later on).&lt;/li&gt;
&lt;li&gt;I still needed to setup vim keybindings with fish later on since I&#39;m used to having &lt;code&gt;h j k l&lt;/code&gt; for moving around.&lt;/li&gt;
&lt;li&gt;All of the commands showed up perfectly during auto-suggestions, &lt;em&gt;but they didn&#39;t work.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;solving-the-config-crisis&quot;&gt;solving the config crisis&lt;/h3&gt;
&lt;p&gt;So, after running into the difficulties, I had to figure out how to configure fish on my laptop. I have a dotfiles
repository which &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/dotfiles&quot;&gt;you can find here&lt;/a&gt;, or in the homepage of this website. I use this
repository to keep all of my desktop configuration in place.&lt;/p&gt;
&lt;p&gt;According to the documentation, the config file should reside in the following directory:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$HOME/.config/fish/config.fish&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I had to go to the dotfiles directory manually and create the file after undoing my symlinks to the home directory:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; dot&lt;/span&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;  # zoxide coming into play&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stow&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; -D . -t ~&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; -p .config/fish/config.fish&lt;/span&gt;&lt;span style=&quot;color: #BBBBBB;&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; touch&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; .config/fish/config.fish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# redoing the symlinks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stow&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; . -t ~&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, the first difficulty I ran into here was that, I actually didn&#39;t think fish would initialize the config file itself,
so creating the file manually with my editor threw an error. So, I had to run stow with the &lt;code&gt;--adopt&lt;/code&gt; flag in order to fetch
the generated config:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stow&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; . -t ~ --adopt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I have a handy LLM setup going on my primary editor, &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt;, which I sometimes use to write shell scripts
and automate the process of writing repeated data. So, I figured, why not just pull up a model to solve the configuration
crisis?&lt;/p&gt;
&lt;p&gt;I had two files to essentially migrate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/dotfiles/blob/102b6ed9d42dfbad4ecf379a0110bf8f386e505a/.bash_profile.old&quot;&gt;Reference&lt;/a&gt;) The &lt;code&gt;.bash_profile&lt;/code&gt; file for variable initializations and &lt;code&gt;PATH&lt;/code&gt; mods, and&lt;/li&gt;
&lt;li&gt;(&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/hitblast/dotfiles/blob/102b6ed9d42dfbad4ecf379a0110bf8f386e505a/.bashrc.old&quot;&gt;Reference&lt;/a&gt;) The &lt;code&gt;.bashrc&lt;/code&gt; file for program initializations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essentially, the &lt;code&gt;config.fish&lt;/code&gt; can do both at the same time, so I needed to merge them. I quickly told my model to
present me a migrated example, and it sent me this:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;fish&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ~/.config/fish/config.fish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# 1) Environment variables&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# TERM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set -x TERM xterm-256color&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Load Homebrew environment (PATH, PKG_CONFIG_PATH, etc.)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;eval (brew shellenv)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Add any local bin directory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set -x PATH $HOME/.local/bin $PATH&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# 2) Aliases &amp;amp; functions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Aliases in Fish are really just functions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; cat;    bat $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; ls;     eza --icons=never -l $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; lz;     lazygit $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; lzy;    lazygit $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ... other aliases&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Convert your bundleid() helper:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; bundleid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    osascript -e&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt; &amp;quot;id of app \&amp;quot;$argv[1]\&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# 3) Third‐party tools initialization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# cutler (macOS preferences)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;eval (cutler status --prompt)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# mise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;eval (/opt/homebrew/bin/mise activate fish)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# fzf: load key bindings &amp;amp; completion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Adjust path if yours is elsewhere&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;source&lt;/span&gt;&lt;span&gt; /opt/homebrew/opt/fzf/shell/key-bindings.fish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;source&lt;/span&gt;&lt;span&gt; /opt/homebrew/opt/fzf/shell/completion.fish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# starship prompt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;eval (starship init fish)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# zoxide&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;eval (zoxide init fish)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# any other per‐shell init can go here&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Already, I could see a few conflicts from my own eyes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fish isn&#39;t really a POSIX-compliant shell, meaning that syntactical differences are common. But here, I was seeing way too many &quot;similarities&quot;.&lt;/li&gt;
&lt;li&gt;fish mostly doesn&#39;t really need completion setup, and I had to have a look at what it was initializing for &lt;code&gt;fzf&lt;/code&gt; and other programs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nonetheless, I copied the config the AI had generated and pasted it in &lt;code&gt;config.fish&lt;/code&gt;, and oh boy there were errors.&lt;/p&gt;
&lt;p&gt;The syntactical differences really came to play in this case. Statements like &lt;code&gt;eval&lt;/code&gt; aren&#39;t really necessary when
it comes to using fish. I can do something like:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;fish&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;starship init fish |&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; source&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;... to replace the following:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;eval (starship&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; init fish&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, I got to work, and eventually after completing the migration of both files, I got an end result which looks like this
in my current dotfiles:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;fish&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ~/.config/fish/config.fish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# 1) Environment variables&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Disable greetings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set fish_greeting &lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Editor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set -x EDITOR nvim&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set -x VISUAL nvim&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Currently, Ghostty isn&amp;#39;t that recognized of a terminal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# So, set to xterm-256color for support during ssh sessions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set -x TERM xterm-256color&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Disable Homebrew auto update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set -x HOMEBREW_NO_AUTO_UPDATE 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Load Homebrew environment (PATH, PKG_CONFIG_PATH, etc.)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/opt/homebrew/bin/brew shellenv |&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; source&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# Add any local bin directory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set -x PATH $HOME/.local/bin $PATH&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# 2) Aliases &amp;amp; functions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; cat;    bat $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; ls;     eza --icons=never -l $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; lz;     lazygit $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; lzy;    lazygit $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; lazy;   lazygit $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; mactop; sudo mactop --color white $argv; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; updateall&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    brew update; &lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;and&lt;/span&gt;&lt;span&gt; brew upgrade&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    mise upgrade&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    uv tool upgrade --all&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;function&lt;/span&gt;&lt;span&gt; bundleid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    osascript -e&lt;/span&gt;&lt;span style=&quot;color: #FFAB70;&quot;&gt; &amp;quot;id of app \&amp;quot;$argv[1]\&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F97583;&quot;&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# 3) Third‐party tools initialization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# ————————————————————————————————&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# cutler&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cutler status --prompt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# mise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mise activate fish |&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; source&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# starship prompt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;starship init fish |&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; source&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# zoxide&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;zoxide init --cmd cd fish |&lt;/span&gt;&lt;span style=&quot;color: #F97583;&quot;&gt; source&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This was after probably thirty minutes of debugging of the config file. I am pretty satisfied with how it turned, now moving on...&lt;/p&gt;
&lt;h3 id=&quot;getting-them-keybinds-running&quot;&gt;getting them keybinds running&lt;/h3&gt;
&lt;p&gt;In my original &lt;code&gt;.bashrc&lt;/code&gt; file, I did this to enable &lt;code&gt;h j k l&lt;/code&gt; and other Vim keybindings:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set&lt;/span&gt;&lt;span style=&quot;color: #9DB1C5;&quot;&gt; -o vi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It was pretty easy to set up. But, given that fish&#39;s community is comparatively smaller than that of bash&#39;s, I had to
Google around for quite a while until I found this:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #B392F0; background-color: #1F1F1F;&quot; &gt;&lt;code data-lang=&quot;fish&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #6B737C;&quot;&gt;# had to run this command&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fish_vi_key_bindings&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running this command would essentially modify &lt;code&gt;~/.config/fish/fish_variables&lt;/code&gt; to include the Vim keybindings option. And now I could
finally use it like I use bash!&lt;/p&gt;
&lt;h3 id=&quot;the-lovely-things-about-fish&quot;&gt;the lovely things about fish&lt;/h3&gt;
&lt;p&gt;I&#39;ve noticed a couple of major pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Vim keybindings are more precise. In bash, I would struggle with doing edits to my commands in &lt;code&gt;NORMAL&lt;/code&gt; mode. This doesn&#39;t happen on fish, and I can easily perform the required edits without messing up my texts.&lt;/li&gt;
&lt;li&gt;The default prompt is customizable in an intuitive way, so my need for &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://starship.rs&quot;&gt;starship&lt;/a&gt; was essentially gone (though I am still using it).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugins.&lt;/strong&gt; I&#39;m yet to try these but I&#39;m seeing positive reviews everywhere.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the hipsters out there, fish can actually be an excellent choice for manipulating data within shell, and just using it for general shell commands can also be a delightful experience.&lt;/p&gt;
&lt;h3 id=&quot;and-the-cons-for-me&quot;&gt;and, the cons for me&lt;/h3&gt;
&lt;p&gt;Okay so, remember how I mentioned my typing speed early on in this entry? Well..&lt;/p&gt;
&lt;p&gt;Typing around 130-150wpm obsoletes the need for an autocompletion setup, assuming you have a muscle memory for typing
commands, which I essentially do. I use shell commands &lt;em&gt;everywhere&lt;/em&gt;, from self-hosting services on cloud to
&lt;code&gt;ssh&lt;/code&gt;-ing into other devices. And after years of typing commands, autocompletion is a feature which has essentially been
&quot;wiped out&quot; of my memory. Why need an autocomplete if your brain does it for you?&lt;/p&gt;
&lt;p&gt;And, typing in such speeds only makes the command appear as flickers on your screen. This alone renders my use case for fish virtually &quot;useless&quot;,
except when I really need to see some documentation for a command without typing &lt;code&gt;man &amp;lt;command&amp;gt;&lt;/code&gt; or &lt;code&gt;brew help &amp;lt;command&amp;gt;&lt;/code&gt;, though I prefer the latter more.&lt;/p&gt;
&lt;p&gt;Also, since fish is not POSIX-compliant, I can&#39;t run shell scripts which derive from zsh or bash. It would also probably
result in me losing my muscle memory in bash over time, which would result in a major con for me since I write a lot of
CI/CD pipeline code for deploying my applications.&lt;/p&gt;
&lt;p&gt;Finally, fish, for the most part, &lt;strong&gt;is slower than bash&lt;/strong&gt;. This might come as a surprise, but bash uses C as its primary source
language and can often deliver the fastest, no-bloat terminal experience. However, since we spend most of our time inside
terminal applications and not shells, it should not be that big of a deal.&lt;/p&gt;
&lt;p&gt;~~&lt;/p&gt;
&lt;p&gt;Depending on your personal scope of usage, fish can be a really great alternative to bash. I personally find bash &quot;enough&quot; for the things
I do - run code, do light data manipulation and just generally enjoy the terminal side of things. It may be different for
other people, but at the end of the day, it&#39;s your &quot;personal preference&quot; which makes you choose the perfect combination of
workflows to go with.&lt;/p&gt;
</description>
      </item>
    </channel>
</rss>
