<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>prma</title>
    <link>https://prma.dev/</link>
    <description>Recent content on prma</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>CC v.4</copyright>
    <lastBuildDate>Tue, 06 Feb 2024 13:59:01 +0330</lastBuildDate><atom:link href="https://prma.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Andrew Kelley</title>
      <link>https://prma.dev/person/andrew_kelley/</link>
      <pubDate>Tue, 06 Feb 2024 13:59:01 +0330</pubDate>
      
      <guid>https://prma.dev/person/andrew_kelley/</guid>
      <description>Andrew Kelley is the BDFL of the Zig language. He is also one of my favorite thinkers in the space of software ecosystem. He has writte a lot about enshitification.
Andrew Kelley&amp;rsquo;s blog is the home to many of his writtings.</description>
      <content>&lt;p&gt;Andrew Kelley is the &lt;abbr title=&#34;Benevolent dictator for life&#34;&gt;BDFL&lt;/abbr&gt; of the Zig language.
He is also one of my favorite thinkers in the space of software ecosystem. He has writte a lot about enshitification.&lt;br&gt;
&lt;a href=&#34;https://andrewkelley.me/&#34;&gt;Andrew Kelley&amp;rsquo;s blog&lt;/a&gt; is the home to many of his writtings.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>&#34;Why We Can&#39;t Have Nice Software&#34;</title>
      <link>https://prma.dev/recommendations/why_we_cant_have_nice-software_by_andrew_kelley/</link>
      <pubDate>Tue, 06 Feb 2024 11:53:00 +0330</pubDate>
      
      <guid>https://prma.dev/recommendations/why_we_cant_have_nice-software_by_andrew_kelley/</guid>
      <description>As a young pup in my early twenties, I once held a naively hopeful perspective on those massive entities we call corporations. I foolishly believed that Big-Tech companies actually possessed good intentions. Why would anyone with a choice between a morally satisfying choice and mere pittance of extra profit, go for the latter? Why bear such a guilt for slightly higher profit? So what if Google and Microsoft produced buggy or sub-par products?</description>
      <content>&lt;p&gt;As a young pup in my early twenties, I once held a naively hopeful perspective on those massive entities we call corporations. I  foolishly believed that &lt;em&gt;Big-Tech&lt;/em&gt; companies actually possessed good intentions. Why would anyone with a choice between a morally satisfying choice and mere pittance of extra profit, go for the latter? Why bear such a guilt for slightly higher profit? So what if Google and Microsoft produced buggy or sub-par products? They probably have bad engineers, and slightly unsavory intentions.&lt;/p&gt;
&lt;p&gt;Many years later, and after observing countless fuck ups by corporations, I no longer feel as optimistic about the amount of fault that lies in their intentions as I see perfectly competent software engineers who work in these companies. The hierarchy of these companies incentivizes middle and top-level management to pressure for more and more of these slightly-higher profits. Although the profit may seem proportionally small, it has significant implications for every managerial employee&amp;rsquo;s career.&lt;/p&gt;
&lt;p&gt;Emphasizing the adverse effects of such forces on consumers, &lt;a href=&#34;https://prma.dev/person/andrew_kelley&#34;&gt;Andrew Kelley&lt;/a&gt; published an affectionate essay on his blog, called &lt;a href=&#34;https://andrewkelley.me/post/why-we-cant-have-nice-software.html&#34;&gt;Why We Can&amp;rsquo;t Have Nice Software&lt;/a&gt;, which I highly recommend reading.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Drew Devault</title>
      <link>https://prma.dev/person/drew_devault/</link>
      <pubDate>Wed, 31 Jan 2024 16:57:22 +0330</pubDate>
      
      <guid>https://prma.dev/person/drew_devault/</guid>
      <description>Drew DeVault is a developer, and a blogger. He is famous for creating sway 1, wlroots 2, and SourceHut. He is also developing Hare-lang3 and HeliOS4.
Although I do not agree with his choices with regards to programming languages, in any other instance, I find myself in agreement with him. He is probably the closest thing to a profession role-model that I can point to.
Take a look at Drew DeVault&amp;rsquo;s blog.</description>
      <content>&lt;p&gt;Drew DeVault is a developer, and a blogger. He is famous for creating &lt;code&gt;sway&lt;/code&gt; &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, &lt;code&gt;wlroots&lt;/code&gt; &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, and &lt;a href=&#34;https://sr.ht&#34;&gt;SourceHut&lt;/a&gt;. He is also developing &lt;code&gt;Hare-lang&lt;/code&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; and &lt;code&gt;HeliOS&lt;/code&gt;&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Although I do not agree with his choices with regards to programming languages, in any other instance, I find myself in agreement with him. He is probably the closest thing to a profession &lt;em&gt;role-model&lt;/em&gt; that I can point to.&lt;/p&gt;
&lt;p&gt;Take a look at &lt;a href=&#34;https://drewdevault.com/&#34;&gt;Drew DeVault&amp;rsquo;s blog&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;A Wayland compositor.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;A Wayland compistior library.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;A programming language in the spirit as &lt;code&gt;C&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;An operating system written in &lt;code&gt;Hare&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>git-rebase.io</title>
      <link>https://prma.dev/recommendations/git-rebase-io/</link>
      <pubDate>Wed, 31 Jan 2024 16:02:11 +0330</pubDate>
      
      <guid>https://prma.dev/recommendations/git-rebase-io/</guid>
      <description>Ever since a while back, I started giving a damn about my Git commits and workflow. Before that, I used git mostly as a tool to push my code to GitHub. However, as soon as I began working with Sourcehut and contributing 1 to the Pimalaya project, I found myself caring more and more about each commit and the information contained in them.
Doing so, however, can be impractical without using git rebase.</description>
      <content>&lt;p&gt;Ever since a while back, I started giving a &lt;em&gt;damn&lt;/em&gt; about my Git commits and workflow. Before that, I used &lt;code&gt;git&lt;/code&gt; mostly as a tool to push my code to GitHub. However, as soon as I began working with &lt;a href=&#34;https://sr.ht&#34;&gt;Sourcehut&lt;/a&gt; and contributing &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; to the &lt;a href=&#34;https://pimalaya.org/&#34;&gt;Pimalaya project&lt;/a&gt;, I found myself caring more and more about each commit and the information contained in them.&lt;/p&gt;
&lt;p&gt;Doing so, however, can be impractical without using &lt;code&gt;git rebase&lt;/code&gt;. &lt;code&gt;git rebase&lt;/code&gt; is an amazing tool for organizing and cleaning up commits, as well as organizing a &lt;em&gt;patchset&lt;/em&gt;. However, due to its many functionalities, it can be overwhelming to learn from Stack Overflow or random Google searches or using the &lt;code&gt;--help&lt;/code&gt; flag.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://prma.dev/person/drew_devault&#34;&gt;Drew DeVault&lt;/a&gt; created &lt;a href=&#34;https://git-rebase.io&#34;&gt;git-rebase.io&lt;/a&gt;, which is a great tutorial for learning how to use &lt;code&gt;git rebase -i&lt;/code&gt; properly. I strongly suggest trying to run each command and following along with the tutorial, as they can be more concretely learned when you do.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;He is &lt;a href=&#34;https://lists.sr.ht/~soywod/pimalaya/patches?page=4&amp;amp;search=from%3Ame%40prma.dev&#34;&gt;the patches I send to the pimalaya project&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>Phil Karlton</title>
      <link>https://prma.dev/person/phil_karlton/</link>
      <pubDate>Wed, 10 Jan 2024 16:49:27 +0330</pubDate>
      
      <guid>https://prma.dev/person/phil_karlton/</guid>
      <description>He is a person that this quote has been attributed to:
There two hard problems in programming
Cache invalidation Naming things I declare this quote, the first meme-quote in the history of software-engineering.</description>
      <content>&lt;p&gt;He is a person that this quote has been attributed to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There two hard problems in programming&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cache invalidation&lt;/li&gt;
&lt;li&gt;Naming things&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;I declare this quote, the first meme-quote in the history of software-engineering.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Elon Musk</title>
      <link>https://prma.dev/person/elon_musk/</link>
      <pubDate>Wed, 10 Jan 2024 16:43:43 +0330</pubDate>
      
      <guid>https://prma.dev/person/elon_musk/</guid>
      <description>Elon Musk is a douchebag billionare famous for fucking twitter up, misclaiming that Tesla&amp;rsquo;s auto-driving modes are safe, advertising NFTs and then jumping out of that sinking ship quicker than any one else, and encouraging workers to go back to work during CoViD.
I don&amp;rsquo;t have a positive view of him, as you may have guessed. Fuck that guy.</description>
      <content>&lt;p&gt;Elon Musk is a douchebag billionare famous for fucking twitter up, misclaiming that Tesla&amp;rsquo;s auto-driving modes are safe, advertising NFTs and then jumping out of that sinking ship quicker than any one else, and encouraging workers to go back to work during CoViD.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have a positive view of him, as you may have guessed. Fuck that guy.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Kent Beck</title>
      <link>https://prma.dev/person/kent_beck/</link>
      <pubDate>Wed, 10 Jan 2024 16:32:19 +0330</pubDate>
      
      <guid>https://prma.dev/person/kent_beck/</guid>
      <description>Kent Beck is a software engineer he has been associated with Agile manifesto, Extreme programming, and this quote:
Make it work, Make it right, Make it fast.
Although the staggering amounts of misunderstanding of software community of his work are his true legacy.
Poor guy.</description>
      <content>&lt;p&gt;Kent Beck is a software engineer he has been associated with Agile manifesto, Extreme programming, and this quote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Make it work, Make it right, Make it fast.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Although the staggering amounts of misunderstanding of software community of his work are his true legacy.&lt;/p&gt;
&lt;p&gt;Poor guy.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Daron Acemoglu</title>
      <link>https://prma.dev/person/daron_acemoglu/</link>
      <pubDate>Wed, 10 Jan 2024 16:18:40 +0330</pubDate>
      
      <guid>https://prma.dev/person/daron_acemoglu/</guid>
      <description>Daron Acemoglu is an economist, who authured Why Nations Fail. He has a pretty neat theory about why some nations strive, while others hardly can manage. Have you read or seen Lord of the Rings? Natural resources are like the ring: they give you power, but they also curse your existence. Why? Because natural resources make the power of the authorities, independent from people. 1
I&amp;rsquo;m definite that Daron did not put his complex theory in these terms.</description>
      <content>&lt;p&gt;Daron Acemoglu is an economist, who authured &lt;em&gt;Why Nations Fail&lt;/em&gt;.
He has a pretty neat theory about why some nations strive, while others hardly can manage.
Have you read or seen Lord of the Rings? Natural resources are like the ring: they give you power, but they also curse your existence. Why? Because natural resources make the power of the authorities, independent from people. &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I&amp;rsquo;m definite that Daron did not put his complex theory in these terms. But I think he would have had much more success communicating them if he did.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>Wolfgang Amadeus Mozart</title>
      <link>https://prma.dev/person/mozart/</link>
      <pubDate>Wed, 10 Jan 2024 16:13:25 +0330</pubDate>
      
      <guid>https://prma.dev/person/mozart/</guid>
      <description>Mozart is my favorit classical music composer. His works are energetic, and his Operas are moving. I could only imagine what would have been if he lived more than 35 years!</description>
      <content>&lt;p&gt;Mozart is my favorit classical music composer.
His works are energetic, and his Operas are moving.
I could only imagine what would have been if he lived more than 35 years!&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Johann Sebastian Bach</title>
      <link>https://prma.dev/person/bach/</link>
      <pubDate>Wed, 10 Jan 2024 16:03:47 +0330</pubDate>
      
      <guid>https://prma.dev/person/bach/</guid>
      <description>Bach was a classical music composer 1. Although I generally like his music, I cannot say that I am a big fan.
You can easily count him as The classical music composer as well, since he probably kicked this classical music thing on.&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
      <content>&lt;p&gt;Bach was a classical music composer &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Although I generally like his music, I cannot say that I am a big fan.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;You can easily count him as &lt;em&gt;The&lt;/em&gt; classical music composer as well, since he probably kicked this classical music thing on.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>Britney Jean Spears</title>
      <link>https://prma.dev/person/britney_spears/</link>
      <pubDate>Wed, 10 Jan 2024 15:52:17 +0330</pubDate>
      
      <guid>https://prma.dev/person/britney_spears/</guid>
      <description>She is a singer 1 and a performer. She easily can be counted as a pop-singer. I enjoy her musics, and suggest her Circle album.
At the time of this writing (2024-01-10), there are news of her not returning to the music industry.&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
      <content>&lt;p&gt;She is a singer &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and a performer. She easily can be counted as a pop-singer.
I enjoy her musics, and suggest her Circle album.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;At the time of this writing (2024-01-10), there are news of her not returning to the music industry.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>John Stuart Mill</title>
      <link>https://prma.dev/person/john_stuart_mill/</link>
      <pubDate>Wed, 10 Jan 2024 15:38:47 +0330</pubDate>
      
      <guid>https://prma.dev/person/john_stuart_mill/</guid>
      <description>John Stuart Mill was a Utilitarian philosopher.
Although I count myself a utilitarian, I cannot agree with much of his philosophy, since his version of Utilitarianism included a &amp;ldquo;quality&amp;rdquo; parameter. Which means that he discounted pleasures and pains of beings, based on their quality. Here is quote from him that should make this position clear:
It is better to be a human being dissatisfied than a pig satisfied; better to be Socrates dissatisfied than a fool satisfied.</description>
      <content>&lt;p&gt;John Stuart Mill was a Utilitarian philosopher.&lt;/p&gt;
&lt;p&gt;Although I count myself a utilitarian, I cannot agree with much of his philosophy, since his version of Utilitarianism included a &amp;ldquo;quality&amp;rdquo; parameter. Which means that he discounted pleasures and pains of beings, based on their quality. Here is quote from him that should make this position clear:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is better to be a human being dissatisfied than a pig satisfied; better to be Socrates dissatisfied than a fool satisfied.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Such a pompous ass!&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Jeremy Bentham</title>
      <link>https://prma.dev/person/jeremy_bentham/</link>
      <pubDate>Wed, 10 Jan 2024 15:19:17 +0330</pubDate>
      
      <guid>https://prma.dev/person/jeremy_bentham/</guid>
      <description>Jeremy Bentham is probably 1 the founder of Utilitarianism 2.
I say probably, mostly to account for the fact that his idea is pretty simple, and probably many have followed and advocated for the idea behind utilitarianism with other names.&amp;#160;&amp;#x21a9;&amp;#xfe0e;
Utilitarianism proposes that &amp;ldquo;when given the choice, you should do as such that your actions would result in a world that has the least amount of suffering and the greatest amount of pleasure.</description>
      <content>&lt;p&gt;Jeremy Bentham is probably &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; the founder of Utilitarianism &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I say probably, mostly to account for the fact that his idea is pretty simple, and probably many have followed and advocated for the idea behind utilitarianism with other names.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Utilitarianism proposes that &amp;ldquo;when given the choice, you should do as such that your actions would result in a world that has the least amount of suffering and the greatest amount of pleasure.&amp;rdquo;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>Garrett Hardin</title>
      <link>https://prma.dev/person/garrett_hardin/</link>
      <pubDate>Wed, 10 Jan 2024 14:55:23 +0330</pubDate>
      
      <guid>https://prma.dev/person/garrett_hardin/</guid>
      <description>Garrett Hardin was a rather influential and controversial philosopher and ecologist. My main interest is his articulation of a phenomenon, named The Tragedy of Commons.
I would like to also emphasize that although I like his paper with the same name on this phenomenon, my interest in him ends there.
Notably, he had a pretty disturbing prescriptive view on immigration policies.</description>
      <content>&lt;p&gt;Garrett Hardin was a rather influential and controversial philosopher and ecologist. My main interest is his articulation of a phenomenon, named &lt;em&gt;The Tragedy of Commons&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I would like to also emphasize that although I like his paper with the same name on this phenomenon, my interest in him ends there.&lt;/p&gt;
&lt;p&gt;Notably, he had a pretty disturbing prescriptive view on immigration policies.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>git-send-mail.io</title>
      <link>https://prma.dev/recommendations/git-send-mail/</link>
      <pubDate>Fri, 29 Dec 2023 18:40:31 +0330</pubDate>
      
      <guid>https://prma.dev/recommendations/git-send-mail/</guid>
      <description>Git is an amazing tool, and a massive one at that. Most of us know and agree about that fact. Sure, there are things that use more interesting approaches to the underlying data structure 1, but for the most part, Git offers a world of wonder that no other system has.
As it happens, many developers only use a handful of features of Git, which is a shame, since those features fit much better in a workflow that includes more of Git&amp;rsquo;s features 2.</description>
      <content>&lt;p&gt;Git is an amazing tool, and a massive one at that. Most of us know and agree about that fact.
Sure, there are things that use more interesting approaches to the underlying data structure &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;,
but for the most part, Git offers a world of wonder that no other system has.&lt;/p&gt;
&lt;p&gt;As it happens, many developers only use a handful of features of Git, which is a shame, since those features fit much better in a workflow that includes more of Git&amp;rsquo;s features &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;One such feature is &lt;code&gt;git send-email&lt;/code&gt;, which I have been using recently to contribute to the &lt;a href=&#34;https://pimalaya.org/&#34;&gt;Pimalaya project&lt;/a&gt; &lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;.
This command lets you send a patch-set &lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; via email to someone or a mailing list. This is how &lt;a href=&#34;https://lkml.org/&#34;&gt;Linux Kernel development&lt;/a&gt; is done and how &lt;a href=&#34;https://sr.ht&#34;&gt;SourceHut&lt;/a&gt; &lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; works.&lt;/p&gt;
&lt;p&gt;However, this workflow is foreign to most developers.
&lt;a href=&#34;https://drewdevault.com/&#34;&gt;Drew DeVault&lt;/a&gt; &lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt; created a very nice webpage on &lt;a href=&#34;https://git-send-email.io&#34;&gt;git-send-email&lt;/a&gt;, which guides you through using this rather amazing command.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I&amp;rsquo;m referring to Pijul and Darcs.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;This, of course, is thanks to the mass adoption of GitHub, which, to be frank, offers a workflow that is probably mostly advantageous to absolute beginners in programming and subpar to full-time developers. Although I can see myself being wrong on this point as well.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Probably one of my upcoming recommendations.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;Or &lt;em&gt;a set of commits&lt;/em&gt;, if you will.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;Another one of my upcoming recommendations.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;Drew co-created SourceHut, which should also connect some dots for you as well.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>Guilty Pleasures</title>
      <link>https://prma.dev/posts/guilty_pleasures/</link>
      <pubDate>Tue, 26 Dec 2023 23:27:07 +0330</pubDate>
      
      <guid>https://prma.dev/posts/guilty_pleasures/</guid>
      <description>For a long time, I have been wondering about my guilty pleasures, trying to figure out which pleasure, in particular, I feel guilty about. I think about other people’s answers, looking for things one does not need much practice to enjoy—‘satisfactions of pigs’, as John Stuart Mill would have put it. He famously wrote:
It is better to be a human being dissatisfied than a pig satisfied; better to be Socrates dissatisfied than a fool satisfied.</description>
      <content>&lt;p&gt;For a long time, I have been wondering about my guilty pleasures, trying to figure out which pleasure, in particular, I feel guilty about. I think about other people’s answers, looking for things one does not need much practice to enjoy—‘satisfactions of pigs’, as &lt;a href=&#34;https://prma.dev/person/john_stuart_mill&#34;&gt;John Stuart Mill&lt;/a&gt; would have put it. He famously wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is better to be a human being dissatisfied than a pig satisfied; better to be Socrates dissatisfied than a fool satisfied.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He argued that the quality of pleasures is much more important than their quantity.
Listening to &lt;a href=&#34;https://prma.dev/person/bach&#34;&gt;Bach&lt;/a&gt;, even if it brings little joy to someone, would always trump the manic joy of attending a &lt;a href=&#34;https://prma.dev/person/britney_spears&#34;&gt;Britney Spears&lt;/a&gt; concert.&lt;/p&gt;
&lt;p&gt;However, as it happens, I am not a Millian. I find that argument bogus. I don’t feel any shame about listening to the cheesiest ’80s music and then complimenting that with &lt;a href=&#34;https://prma.dev/person/mozart&#34;&gt;Mozart&lt;/a&gt;’s Requiem.&lt;/p&gt;
&lt;p&gt;Don’t get me wrong. I have a strong sense of guilt. I am a vegan. I help others when I can. And I regularly make life-changing decisions that may not favor my well-being but end up benefiting others. I just have not found many places in my life where guilt and pleasure co-exist.&lt;/p&gt;
&lt;p&gt;I figured that my sense of guilt probably sucks every ounce of pleasure from different activities. That theory seemed shaky, at best.&lt;/p&gt;
&lt;p&gt;Then, just an hour ago, it hit me. I have been looking in the wrong place. My two guilty pleasures? Fine coffee and fine audio equipment. It might sound quite strange to feel guilty about these. But consider this: My ethical stance in life is firmly rooted in &lt;a href=&#34;https://www.utilitarianism.com/hedutil.htm&#34;&gt;Hedonistic Utilitarianism&lt;/a&gt;, which basically means to do whatever it takes to bring the most amount of pleasure and the least amount of suffering to the world. For example, the pleasure I take in eating meat does not surpass the suffering it brings to the animals from which the meat came.&lt;/p&gt;
&lt;p&gt;If I have some amount of money, I should spend it in such a way that it creates the most joy in the world. That surely includes myself, but probably a hungry kid on the street could derive much more pleasure from the same amount of money I am spending on headphones and coffee. For sure, these lavish purchases mostly fall under the mid-range products of a European household. But I live in a third-world country, and even with the salary of a developer, they are still more than most people are willing to pay, here. I am ashamed to admit that I enjoy fine coffees and fine headphones.&lt;/p&gt;
&lt;p&gt;It turns out, I am a proud pig and an ashamed Socrates.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Honk! Honk!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Fake Nuance</title>
      <link>https://prma.dev/posts/fake_nuance/</link>
      <pubDate>Sun, 17 Dec 2023 21:40:24 +0330</pubDate>
      
      <guid>https://prma.dev/posts/fake_nuance/</guid>
      <description>On a daily basis, I express a outrageous opinion about technology. &amp;ldquo;Apple should abandon Swift altogether and use Rust instead of just dancing around this move,&amp;rdquo; I once declared. To the best of my knowledge, that is a fair opinion. If I am a fool for thinking this way, then I am a fool. If, instead, I state that all languages have a good reason for being there and express that Swift is something amazing just to avoid sounding foolish, I will be a silent fool, but a fool nonetheless.</description>
      <content>&lt;p&gt;On a daily basis, I express a outrageous opinion about technology. &amp;ldquo;&lt;q class=&#34;text-italic&#34;&gt;Apple should abandon Swift altogether and use Rust instead of just dancing around this move,&lt;/q&gt;&amp;rdquo; I once declared. To the best of my knowledge, that is a fair opinion. If I am a fool for thinking this way, then I am a fool. If, instead, I state that all languages have a good reason for being there and express that Swift is something amazing just to avoid sounding foolish, I will be a silent fool, but a fool nonetheless.&lt;/p&gt;
&lt;p&gt;At least when my foolishness is expressed, some good Samaritan or an offended opposer might add nuance to my opinions and make me a wiser person than I currently am. In five years, I will be wiser, while the person who chooses to sound wise when they are not will still be a fool.&lt;/p&gt;
&lt;p&gt;Taking the fool-forever-road is so ingrained in our polite and technical manner that we don&amp;rsquo;t think about it much. A rather obvious example of this is when we respond with &amp;ldquo;It depends&amp;rdquo; to any technical question. My friend, if you don&amp;rsquo;t know how to answer the question of &amp;ldquo;what it depends on&amp;rdquo; clearly, you are not being nuanced; you are just a fool like the inquirer of the question, hoping that your intuition comes to your rescue when you are held at gunpoint for a decision.&lt;/p&gt;
&lt;p&gt;Be a fool once in a while; it is much better than being one all the time.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>SOLID is a premature optimization</title>
      <link>https://prma.dev/daily/solid-premature-optimization/</link>
      <pubDate>Mon, 04 Dec 2023 14:04:34 +0330</pubDate>
      
      <guid>https://prma.dev/daily/solid-premature-optimization/</guid>
      <description>Honestly, the primary challenge I encountered with complex codebases originated from adhering to SOLID principles. Surprisingly, they appeared to turn the straightforward task of making any changes into a Herculean feat. Introducing numerous cumbersome abstractions also took a toll on performance.
Talk about actual premature optimizations!
I much prefer something like CUPID principles. More information on CUPID</description>
      <content>&lt;p&gt;Honestly, the primary challenge I encountered with complex codebases originated from adhering to &lt;abbr
  title=&#34;Single responsibility, Open-closed, Liskov substitution, Interface segregation, Dependency inversion&#34; tabindex=&#34;0&#34;&gt;SOLID&lt;/abbr&gt; principles. Surprisingly, they appeared to turn the straightforward task of making any changes into a Herculean feat. Introducing numerous cumbersome abstractions also took a toll on performance.&lt;/p&gt;
&lt;p&gt;Talk about actual premature optimizations!&lt;/p&gt;
&lt;p&gt;I much prefer something like &lt;abbr
  title=&#34;Composable, Unix philosophy, Predictable, Idiomatic, Domain-based&#34; tabindex=&#34;0&#34;&gt;CUPID&lt;/abbr&gt; principles. &lt;a href=&#34;https://cupid.dev/&#34;&gt;More information on CUPID&lt;/a&gt;&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Git For Persistence Layer</title>
      <link>https://prma.dev/daily/git-for-persistence-layer/</link>
      <pubDate>Mon, 04 Dec 2023 11:48:21 +0330</pubDate>
      
      <guid>https://prma.dev/daily/git-for-persistence-layer/</guid>
      <description>I&amp;rsquo;m entertaining with the idea of making a personal webserver that uses git instead of a database. Yet i don&amp;rsquo;t have any idea how well such a thing would work. More importantly, I&amp;rsquo;m not sure about the API. Perhaps instead of using the standard REST, I could use Telegram or Matrix instead of creating a whole front end.</description>
      <content>&lt;p&gt;I&amp;rsquo;m entertaining with the idea of making a personal webserver that uses git instead of a database. Yet i don&amp;rsquo;t have any idea how well such a thing would work. More importantly, I&amp;rsquo;m not sure about the API. Perhaps instead of using the standard REST, I could use Telegram or Matrix instead of creating a whole front end.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Holidays For Rustaceans</title>
      <link>https://prma.dev/daily/holidays_for_rustaceans/</link>
      <pubDate>Mon, 04 Dec 2023 11:41:06 +0330</pubDate>
      
      <guid>https://prma.dev/daily/holidays_for_rustaceans/</guid>
      <description>For Rust developers, the passion stems from a combination of 10% performance, safety, and tooling. The remaining 90% is the bliss of holidays free from on-call disruptions.</description>
      <content>&lt;p&gt;For Rust developers, the passion stems from a combination of 10% performance, safety, and tooling. The remaining 90% is the bliss of holidays free from on-call disruptions.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Uses</title>
      <link>https://prma.dev/uses/</link>
      <pubDate>Wed, 08 Nov 2023 13:08:00 +0330</pubDate>
      
      <guid>https://prma.dev/uses/</guid>
      <description>Softwares These are the softwares that I use.
Low Opacity means that it is used as a fallback option.
NixOS as OS for Desktop Foot as Terminal for Desktop Wezterm as Terminal for Desktop note Much heavier than foot. Uses a lot of ram and is not as stable. But works well as a fall back. Helix as Text Editor for Desktop Neovim as Text Editor for Desktop Fuzzel as Application Launcher for Desktop i3status-rust as Status Bar for Desktop note For SwayWM Waybar as Status Bar for Desktop note for RiverWM SwayWM as Window Manager for Desktop RiverWM as Window Manager for Desktop note I love river, but it lacks stability and documentation around working well with systemd.</description>
      <content>&lt;div&gt;
  &lt;h2&gt;Softwares&lt;/h2&gt;
  &lt;p&gt;These are the softwares that I use.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;span class=&#34;opacity-50&#34;&gt;Low Opacity&lt;/span&gt; means that it is used as a fallback option.&lt;/p&gt;
&lt;dl&gt;
  
  
  &lt;dt id=&#34;nixos&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://nixos.org&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;NixOS&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;OS&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;foot&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://codeberg.org/dnkl/foot&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Foot&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Terminal&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;wezterm&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://wezfurlong.org/wezterm/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Wezterm&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Terminal&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Much heavier than foot. Uses a lot of ram and is not as stable. But works well as a fall back.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;helix&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://github.com/helix-editor/helix&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Helix&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Text Editor&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;neovim&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://github.com/neovim/neovim&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Neovim&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Text Editor&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;fuzzel&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://codeberg.org/dnkl/fuzzel&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Fuzzel&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Application Launcher&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;i3status-rust&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://github.com/greshake/i3status-rust&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;i3status-rust&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Status Bar&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;For SwayWM&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;waybar&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://github.com/Alexays/Waybar&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Waybar&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Status Bar&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;for RiverWM&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;swaywm&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://swaywm.org/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;SwayWM&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Window Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;riverwm&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://github.com/riverwm/river&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;RiverWM&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Window Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I love river, but it lacks stability and documentation around working well with systemd.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;firefox&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://www.mozilla.org/en-US/firefox/new/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Firefox&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Browser&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;tmux&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://github.com/tmux/tmux/wiki&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Tmux&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Terminal Session Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;It works really great. But I cannot say that I love the UX.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;zellij&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://zellij.dev/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Zellij&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Terminal Session Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;It is much less mature than Tmux. But it is getting there. Offers much better defaults.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;yazi&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://yazi-rs.github.io/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Yazi&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;File Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;New and immature. But I like it.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;nnn&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://github.com/jarun/nnn&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;nnn&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;File Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Reliable, fast and sane. However, there are some condecention in the tone of its maintainers.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;lf&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://github.com/gokcehan/lf&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;lf&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;File Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Delightfully good. Which uses a client-server model. However, it will need a lot of configurations.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;fish&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://github.com/fish-shell/fish-shell&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Fish&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Interactive Shell&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;For interactive use. It is also getting faster and faster everyday.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;nushell&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://www.nushell.sh/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Nushell&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Interactive Shell&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I have high hopes for this one, but it still has a lot missing.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;zsh&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://www.zsh.org/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Zsh&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Interactive Shell&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Works well. But it takes a lot of work to be usable for me.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;android&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://www.android.com/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Android&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;OS&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;SmartPhone&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I absolutely hate both android and iOS.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;kiwi&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://kiwibrowser.com/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Kiwi&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Browser&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;SmartPhone&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;sourcehut&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://sr.ht/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;SourceHut&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Code Forge&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Web&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Definitely much less bull-shit driven than others. It is well decentralized and uses git the way it was intended to. This blog is also hosted there.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;codeberg&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://codeberg.org/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Codeberg&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Code Forge&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Web&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Good enough. But not as still adheres to the GitHub-way of interaction.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;github&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://github.com/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Github&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Code Forge&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Web&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Mostly because everyone assumes it.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;kagi&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://kagi.com/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Kagi&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Search Engine&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Web&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;feedbin&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://feedbin.com/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Feedbin&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Feed Reader&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Web&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;hugo&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://gohugo.io/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Hugo&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Static Site Generator&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Everything&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;This blog is made powered by Hugo.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;migadu&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://migadu.com/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Migadu&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Email&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Everything&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;This is probably the best service for email, if you have a domain name for it.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;protonmail&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://proton.me/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;ProtonMail&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Email&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Everything&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;pass&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://www.passwordstore.org&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Pass&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Password Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Linux&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I love this one, but it is far from multiplatform.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;proton_pass&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://proton.me/pass&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Proton Pass&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Password Manager&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Everything&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I started with Bitwarden, but it UX was absolutely horrible.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;fosstodon&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://fosstodon.org&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Fosstodon&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Micro-blogging&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;web&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;rust&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://www.rust-lang.org/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Rust&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Programming Language&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Everything&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I use it for everything, from back-ends, to quick scripts. Though the last one is counter intuitive.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;go&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://go.dev/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Go&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Programming Language&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Everything&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;My first programming language. Simple. But not as reliable as I like. A lot of calls because of nil pointers on my weekends.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;matrix&#34; class=&#34; pt-5&#34;&gt;&lt;a href=&#34;https://matrix.org&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Matrix&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Chatting&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Everything&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Buggy clients and weird protocols. Still, I wished I could use XMPP instead.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;telegram&#34; class=&#34;opacity-50 pt-5&#34;&gt;&lt;a href=&#34;https://telegram.org/&#34;
      class=&#34;bg-black p-5 text-white font-black&#34;&gt;Telegram&lt;/a&gt;&lt;/dt&gt;
  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2 p-5 &#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Chatting&lt;/dd&gt;
      &lt;dt&gt;for&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Everything&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Centralized. But most of my friends are on it. Also, the applications are magnificent.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
&lt;/dl&gt;

&lt;div&gt;
  &lt;h2&gt;Hardware&lt;/h2&gt;
  &lt;p&gt;These are the Hardwares that I use.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;span class=&#34;opacity-50&#34;&gt;Low Opacity&lt;/span&gt; means that it is used as a fallback option.&lt;/p&gt;
&lt;dl&gt;
  
  
  &lt;dt id=&#34;dell_xps_13_7390&#34; class=&#34; pt-5&#34;&gt;&lt;a class=&#34;inv p-5 font-black&#34;
      href=&#34;https://www.dell.com/en-us/shop/cty/pdp/spd/xps-13-7390-laptop&#34;&gt;Dell XPS 13 7390&lt;/a&gt;
  &lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Desktop&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I love this thing. I got it second hand. It is fast and it is light. The Full HD monitor is just beautiful and the keyboard is excellent. Also, I am not pained with proprietory drivers, at every corner.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;kz_zs10_pro_x&#34; class=&#34; pt-5&#34;&gt;&lt;a class=&#34;inv p-5 font-black&#34;
      href=&#34;https://kz-audio.com/kz-zs10-pro-x.html&#34;&gt;KZ ZS10 PRO X&lt;/a&gt;
  &lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Earphone&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Amazing clarity of sound. I absolutely love this pair.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt id=&#34;redmi_note_10_pro_max&#34; class=&#34; pt-5&#34;&gt;&lt;a class=&#34;inv p-5 font-black&#34;
      href=&#34;https://www.mi.com/in/redmi-note-10-pro-max/&#34;&gt;Redmi Note 10 Pro Max&lt;/a&gt;
  &lt;/dt&gt;
  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;SmartPhone&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I hate it. Xiaomi has started enshitifying it, adding adds and removing options to remove their so called enhancements, at every update. I hate it.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
&lt;/dl&gt;
&lt;div&gt;
  &lt;h2&gt;Miscellaneous&lt;/h2&gt;
  &lt;p&gt;The rest of things that I use.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;span class=&#34;opacity-50&#34;&gt;Low Opacity&lt;/span&gt; means that it is used as a fallback option.&lt;/p&gt;
&lt;dl&gt;
  
  
  &lt;dt class=&#34;&#34; id=&#34;monaspace&#34;
    class=&#34; pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://monaspace.githubnext.com/&#34;&gt;Monaspace&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;TypeFace&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Excellent superfamily of fonts. I mainly use Argon for non-italic, and Radon for the italic text.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34; opacity-50 &#34; id=&#34;lotion&#34;
    class=&#34; opacity-50  pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://font.nina.coffee/&#34;&gt;Lotion&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;TypeFace&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Works great. But a bit limiting.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34; opacity-50 &#34; id=&#34;maple_mono&#34;
    class=&#34; opacity-50  pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://github.com/subframe7536/maple-font&#34;&gt;Maple mono&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;TypeFace&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34;&#34; id=&#34;catppuccin&#34;
    class=&#34; pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://github.com/catppuccin/&#34;&gt;Catppuccin&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;ColorScheme&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Not the best thing ever, but has a good support range. And consistency is important to me.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34; opacity-50 &#34; id=&#34;rosepine&#34;
    class=&#34; opacity-50  pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://rosepinetheme.com/&#34;&gt;RosePine&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;ColorScheme&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I love the look much better than Catppuccin, especially on older monitors with less contrast. But hues lack a bit.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34;&#34; id=&#34;perma&#34;
    class=&#34; pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://prma.dev/posts/call-me-perma/&#34;&gt;Perma&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Name&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Not given, nor legal. But I strongly prefer it.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34; opacity-50 &#34; id=&#34;amirhossein&#34;
    class=&#34; opacity-50  pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;&#34;&gt;Amirhossein&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Name&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Legal. Given. Use it if you must. But I prefer Perma.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34;&#34; id=&#34;they_them&#34;
    class=&#34; pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://en.pronouns.page/are/they/them&#34;&gt;They/Them&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Pronouns&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I don&amp;#39;t mind if you use any other pronouns. I will respect yours. But I wished language was gender-neutral.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34;&#34; id=&#34;english&#34;
    class=&#34; pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://en.wikipedia.org/wiki/English_language&#34;&gt;English&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Spoken Language&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I journal in it, I work with it, I read with it. I prefer it.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34; opacity-50 &#34; id=&#34;farsi&#34;
    class=&#34; opacity-50  pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://en.wikipedia.org/wiki/Persian_language&#34;&gt;Farsi&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Spoken Language&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;My Mother Language. I am not crazy about it, though.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34; opacity-50 &#34; id=&#34;german&#34;
    class=&#34; opacity-50  pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://en.wikipedia.org/wiki/German_language&#34;&gt;German&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34; opacity-50 &#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Spoken Language&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I am very begginer in it. A1. But I am actively learning it.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
  
  &lt;dt class=&#34;&#34; id=&#34;metric&#34;
    class=&#34; pt-5&#34;&gt;&lt;a class=&#34;bg-black p-5 text-white font-black&#34;
      href=&#34;https://en.wikipedia.org/wiki/Metric_system&#34;&gt;Metric&lt;/a&gt;
  &lt;/dt&gt;

  &lt;dd class=&#34;&#34;&gt;
    &lt;dl class=&#34;border-l-2  p-5&#34;&gt;
      &lt;dt&gt;as&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;Measurement standard&lt;/dd&gt;
      
      &lt;dt&gt;note&lt;/dt&gt;
      &lt;dd class=&#34;px-5 font-bold&#34;&gt;I mean, it makes sense.&lt;/dd&gt;
      
    &lt;/dl&gt;
  &lt;/dd&gt;
  
&lt;/dl&gt;
</content>
    </item>
    
    <item>
      <title>Popularization of The Wrong Thing</title>
      <link>https://prma.dev/posts/popularization-of-the-wrong-thing/</link>
      <pubDate>Sun, 05 Nov 2023 18:11:55 +0330</pubDate>
      
      <guid>https://prma.dev/posts/popularization-of-the-wrong-thing/</guid>
      <description>There are people who proudly declare:
I used to like X, but then it became popular, so I don&amp;rsquo;t like it anymore.
I fucking hate these people. What a bunch of douchebags. Do you consider yourself superior to others?
However, there are circumstances where I believe that this perspective is valid and can be seen as a positive stance to take.
The Adventurer There is a group of people who enjoy uncovering unknown valleys, experiencing them, and staying committed until they reach a more popular stage.</description>
      <content>&lt;p&gt;There are people who proudly declare:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I used to like X, but then it became popular, so I don&amp;rsquo;t like it anymore.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I fucking hate these people. What a bunch of douchebags. Do you consider yourself superior to others?&lt;/p&gt;
&lt;p&gt;However, there are circumstances where I believe that this perspective is valid and can be seen as a positive stance to take.&lt;/p&gt;
&lt;h2 id=&#34;the-adventurer&#34;&gt;The Adventurer&lt;/h2&gt;
&lt;p&gt;There is a group of people who enjoy uncovering unknown valleys, experiencing them, and staying committed until they reach a more popular stage. They relish the thrill of discovery and take pleasure in popularizing things.&lt;/p&gt;
&lt;p&gt;One such group is comprised of individuals who embrace emerging programming languages, with &lt;a class=&#34;language&#34; href=&#34;https://ziglang.org/&#34;&gt;Zig&lt;/a&gt;
 and &lt;a class=&#34;language&#34; href=&#34;https://nim-lang.org/&#34;&gt;Nim&lt;/a&gt;
 serving as good examples. Some of them thrive in the startup scene, where they are comfortable taking risks and making decisions that have a tangible impact. However, in a more stable environment, when things become mainstream, their services are no longer required. Their advocacy and contributions are graciously acknowledged, and they happily move on to the next cutting-edge endeavor—a clean break.&lt;/p&gt;
&lt;h2 id=&#34;the-adventurers-friend&#34;&gt;The Adventurer&amp;rsquo;s Friend&lt;/h2&gt;
&lt;p&gt;Similar to the first group, there are individuals who relish spending time in less mainstream communities. It&amp;rsquo;s true that you can always find individuals with egotistical tendencies in these non-mainstream groups, as they seek to exert authority over others. However, there are also truly brilliant people who are dedicated to their craft, and they are both driven by their passion and drive the development of their crafts. You might encounter them later on as they become giants in their fields, but at that point they may become too preoccupied to engage with people they don&amp;rsquo;t already know.&lt;/p&gt;
&lt;p&gt;These communities are incredibly dynamic and enjoyable. Your actions can influence the trajectory of the entire community&amp;rsquo;s existence.&lt;/p&gt;
&lt;h2 id=&#34;the-misunderstood&#34;&gt;The Misunderstood&lt;/h2&gt;
&lt;p&gt;The reason for this post is that I&amp;rsquo;ve recently found myself in this group.&lt;/p&gt;
&lt;p&gt;If you delve into any modern art history book, you&amp;rsquo;ll encounter fascinating descriptions of abstract art. Its intended message is simple, in contrast to figurative art, which aims to depict tangible subjects. Abstract art seeks to convey emotions without adhering to reality, much like instrumental music. The history of abstract art is marked by experimentation and truly impressive works, both technically and emotionally.&lt;/p&gt;
&lt;p&gt;However, if you search for abstract art on most art trading websites or social media, what you&amp;rsquo;ll discover is a type of decorative art. It experiments with various elements but often lacks novelty. Nevertheless, it can add exceptional charm to your hallway&amp;rsquo;s wall. This is a valid art form that enriches the world. However, for those seeking experimental abstract art that conveys emotions like hatred or sorrow, it&amp;rsquo;s increasingly challenging to find it because the more popular usage of the term &amp;lsquo;abstract art&amp;rsquo; leans toward the decorative.&lt;/p&gt;
&lt;p&gt;However, what recently placed me in this group was not the above. Instead, it was a few years ago when I fell in love with a genre of music called &lt;abbr
  title=&#34;Low-Fidelty&#34; tabindex=&#34;0&#34;&gt;Lo-Fi&lt;/abbr&gt;. &lt;abbr
  title=&#34;Low-Fidelty&#34; tabindex=&#34;0&#34;&gt;Lo-Fi&lt;/abbr&gt; music is a genre with a nostalgic approach to music, incorporating background noises from phonographs, sound clips from old movies, and yet embracing contemporary techniques. Apps like Loffee perfectly capture this kind of music for me.&lt;/p&gt;
&lt;p&gt;Unfortunately, over the past couple of years, &lt;abbr
  title=&#34;Low-Fidelty&#34; tabindex=&#34;0&#34;&gt;Lo-Fi&lt;/abbr&gt; has been used interchangeably with chill-hop ambient music. Most people use it as background music during their focus sessions, and you might hear it in coffee shops and YouTube videos. The famous Lofi Girl YouTube channel also features music that I can only describe as ambient chill-hop. If you search for &lt;abbr
  title=&#34;Low-Fidelty&#34; tabindex=&#34;0&#34;&gt;Lo-Fi&lt;/abbr&gt; music, you&amp;rsquo;ll predominantly find that genre, which saddens me because I spend hours searching for music in my favorite genre, only to encounter ambient music.&lt;/p&gt;
&lt;h2 id=&#34;dear-readers&#34;&gt;Dear Readers&amp;hellip;&lt;/h2&gt;
&lt;p&gt;The reason for my post is to ask if you are aware of any good sources for the &lt;abbr
  title=&#34;Low-Fidelty&#34; tabindex=&#34;0&#34;&gt;Lo-Fi&lt;/abbr&gt; music I&amp;rsquo;m searching for. If you do, please reach out to me.&lt;/p&gt;
&lt;p&gt;If, by chance, I discover a reliable source, I will update this post below this line.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Diversity Quotas</title>
      <link>https://prma.dev/daily/diversity-quotas/</link>
      <pubDate>Sat, 04 Nov 2023 15:01:33 +0330</pubDate>
      
      <guid>https://prma.dev/daily/diversity-quotas/</guid>
      <description>Honestly, I cannot say that diversity quotas are radical feminism; or in any terms extreme. Especially since they are implemented in societies that have endured thousands of years of cultural, institutional, and governmental oppression of women and minorities, which, we have yet to witness significant progress in achieving true equality for these oppressed groups.
Equal opportunity does not entail placing the food on top of the trees and then asserting that the whale just didn&amp;rsquo;t take it while the chimp did.</description>
      <content>&lt;p&gt;Honestly, I cannot say that diversity quotas are &lt;em&gt;radical&lt;/em&gt; feminism; or in any terms extreme. Especially since they are implemented in societies that have endured thousands of years of cultural, institutional, and governmental oppression of women and minorities, which, we have yet to witness significant progress in achieving true equality for these oppressed groups.&lt;/p&gt;
&lt;p&gt;Equal opportunity does not entail placing the food on top of the trees and then asserting that the whale just didn&amp;rsquo;t take it while the chimp did.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Python And NixOS</title>
      <link>https://prma.dev/daily/python_and_nixos/</link>
      <pubDate>Thu, 02 Nov 2023 11:03:07 +0330</pubDate>
      
      <guid>https://prma.dev/daily/python_and_nixos/</guid>
      <description>The problems surrounding Python programs on NixOS seem never-ending. I often have to refrain from installing most Python programs. On each update, another one of them breaks during installation – either their tests don&amp;rsquo;t pass, or their dependencies fail in some way.
And to be honest, I give the benefit of the doubt to NixOS, seeing its result with other languages, and knowing what I know about pip.</description>
      <content>&lt;p&gt;The problems surrounding &lt;a class=&#34;language&#34; href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt;
 programs on NixOS seem never-ending.
I often have to refrain from installing most &lt;a class=&#34;language&#34; href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt;
 programs.
On each update, another one of them breaks during installation – either their tests don&amp;rsquo;t pass, or their dependencies fail in some way.&lt;/p&gt;
&lt;p&gt;And to be honest, I give the benefit of the doubt to NixOS, seeing its result with other languages, and knowing what I know about pip.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Test of 10x Developer</title>
      <link>https://prma.dev/daily/test-of-10x-developers/</link>
      <pubDate>Mon, 16 Oct 2023 23:10:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/test-of-10x-developers/</guid>
      <description>The true test of 10x developer is that you put two of them together, each debugging each others code, then you if they kept their 10x status, they are the true 10x developer. My guess would be that their population will reduce to less than that of unicorns&#39;.</description>
      <content>&lt;p&gt;The true test of 10x developer is that you put two of them together, each debugging each others code, then you if they kept their 10x status, they are the true 10x developer.
My guess would be that their population will reduce to less than that of unicorns&#39;.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Usage Restriction of Software Licenses</title>
      <link>https://prma.dev/daily/usage-restriction-software-licences/</link>
      <pubDate>Mon, 16 Oct 2023 23:05:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/usage-restriction-software-licences/</guid>
      <description>Please think twice before saying, usage restriction is good because you might want to prevent someone from using your tool for war, crime, etc.
Like, you know that a poorly enforced license won&amp;rsquo;t deter a person in that situation from using your software, right?
There are probably better arguments for including usage restrictions in a software license; this one is a terrible one.</description>
      <content>&lt;p&gt;Please think twice before saying, &lt;q&gt;usage restriction is good because you might want to prevent someone from using your tool for war, crime, etc.&lt;/q&gt;&lt;/p&gt;
&lt;p&gt;Like, you know that a poorly enforced license won&amp;rsquo;t deter a person in that situation from using your software, right?&lt;/p&gt;
&lt;p&gt;There are probably better arguments for including usage restrictions in a software license; this one is a terrible one.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Centralization Around GitHub</title>
      <link>https://prma.dev/daily/github-centralization/</link>
      <pubDate>Mon, 16 Oct 2023 23:04:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/github-centralization/</guid>
      <description>I find the situation around GitHub centralization distressing. And this extreme relience on GitHub is worrying. Maybe in time things change. But the moment I find a job and thus don&amp;rsquo;t need to keep my repos on GitHub anymore, I would like to move to a more federated forge. Codeberg seems like the closest option. I will just simply mirror my commits to GitHub for the time being, slowly retiring them when I&amp;rsquo;m sure that codeberg remotes have the necessary configurations and flows that are needed.</description>
      <content>&lt;p&gt;I find the situation around GitHub centralization distressing.
And this extreme relience on GitHub is worrying.
Maybe in time things change.
But the moment I find a job and thus don&amp;rsquo;t need to keep my repos on GitHub anymore, I would like to move to a more federated forge.
Codeberg seems like the closest option.
I will just simply mirror my commits to GitHub for the time being, slowly retiring them when I&amp;rsquo;m sure that codeberg remotes have the necessary configurations and flows that are needed.
I don&amp;rsquo;t think i can retire my account though. Every place I worked or want to work, are using GitHub.
I cannot but worry about the same amount of enshitification that twitter and reddit has taken, to also come for GitHub.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>I hate Jira</title>
      <link>https://prma.dev/daily/i-hate-jira/</link>
      <pubDate>Mon, 16 Oct 2023 23:04:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/i-hate-jira/</guid>
      <description>I absolutely hate Jira. It is when you spend hours of valuable time, prioritizing tasks that take less time doing than setting them on Jira.</description>
      <content>&lt;p&gt;I absolutely hate Jira. It is when you spend hours of valuable time, prioritizing tasks that take less time doing than setting them on Jira.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>O&#39;Reilly Book Covers</title>
      <link>https://prma.dev/daily/oreilly-book-covers/</link>
      <pubDate>Mon, 16 Oct 2023 23:04:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/oreilly-book-covers/</guid>
      <description>There is a retired burned out offended wild life photographer out there responsible for the O&amp;rsquo;Reilly&amp;rsquo;s book covers, after they were told &amp;ldquo;Your a photographer, that&amp;rsquo;s the same thing as graphic designer, give us 500 book covers, here is $1.&amp;rdquo;</description>
      <content>&lt;p&gt;There is a retired burned out offended wild life photographer out there responsible for the O&amp;rsquo;Reilly&amp;rsquo;s book covers, after they were told &amp;ldquo;Your a photographer, that&amp;rsquo;s the same thing as graphic designer, give us 500 book covers, here is $1.&amp;rdquo;&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Older, Better Technologies</title>
      <link>https://prma.dev/daily/older-better-technologies/</link>
      <pubDate>Mon, 16 Oct 2023 23:04:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/older-better-technologies/</guid>
      <description>It is very illuminating to see that using older style technologies, may lead to better experience. This just goes to show that many of the features and complexity and progress are not for people, but for profit of a few. That, of course, is a wild speculation of the highest order.</description>
      <content>&lt;p&gt;It is very illuminating to see that using older style technologies, may lead to better experience.
This just goes to show that many of the features and complexity and progress are not &lt;em&gt;for people&lt;/em&gt;, but for profit of a few.
That, of course, is a wild speculation of the highest order.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Prototyping in Software development</title>
      <link>https://prma.dev/daily/prototyping-software-development/</link>
      <pubDate>Mon, 16 Oct 2023 23:04:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/prototyping-software-development/</guid>
      <description>I think when you are proposing a fast prototyping phase in programming, you should he able to answer these questions:
What don&amp;rsquo;t we know that we hope to find out with this prototype?
Why is this the best approach for finding the answer to that question.
When is the prototype going to be deleted?
If you cannot answer to these questions, what you are proposing is not a prototype, it is prototype quality end product.</description>
      <content>&lt;p&gt;I think when you are proposing a fast prototyping phase in programming, you should he able to answer these questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;What don&amp;rsquo;t we know that we hope to find out with this prototype?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why is this the best approach for finding the answer to that question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When is the prototype going to be deleted?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you cannot answer to these questions, what you are proposing is not a prototype, it is prototype quality end product. A knock off, if you will. A bad practice distilled.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Rust Skills Transferability</title>
      <link>https://prma.dev/daily/rust-skills-transferability/</link>
      <pubDate>Mon, 16 Oct 2023 23:04:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/rust-skills-transferability/</guid>
      <description>While the skills learned in Rust , like working with the borrow checker, may seem limited to Rust itself, the claim of their intransferability is somewhat overstated. Understanding the borrow checker is specific to languages using it, but the approaches it encourages are typically advanced and valued by experienced engineers. And often, it is evidenced by the patterns that are simplest to implement. The obvious exception to that is unwrap() and expect().</description>
      <content>&lt;p&gt;While the skills learned in &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
, like working with the &lt;em&gt;borrow checker&lt;/em&gt;, may seem limited to &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 itself, the claim of their intransferability is somewhat overstated. Understanding the borrow checker is specific to languages using it, but the approaches it encourages are typically advanced and valued by experienced engineers.
And often, it is evidenced by the patterns that are simplest to implement.
The obvious exception to that is &lt;code&gt;unwrap()&lt;/code&gt; and &lt;code&gt;expect()&lt;/code&gt;. Even though the ? operator is an step towards simplifying that process, it is undeniable that the hassel of creating and managing errors is not simpler than the extra 8 characters introduced by the &lt;code&gt;.unwrap()&lt;/code&gt;&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Rust&#39;s Productivity</title>
      <link>https://prma.dev/daily/rust-productivity/</link>
      <pubDate>Mon, 16 Oct 2023 23:04:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/rust-productivity/</guid>
      <description>I think the best way to characterize Rust &amp;rsquo;s productivity, is to put it on a quality axis.
If you want low quality code (prototyping, etc) rust is much less productive than the alternative.
For medium level of quality, Rust is similar to others.
For high quality code, Rust is much more productive than any alternatives.
Quality is intentionally vague, to encapsulate performance, leanness, documentation, and security.</description>
      <content>&lt;p&gt;I think the best way to characterize &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
&amp;rsquo;s productivity, is to put it on a quality axis.&lt;/p&gt;
&lt;p&gt;If you want low quality code (prototyping, etc) rust is much less productive than the alternative.&lt;/p&gt;
&lt;p&gt;For medium level of quality, &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 is similar to others.&lt;/p&gt;
&lt;p&gt;For high quality code, &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 is much more productive than any alternatives.&lt;/p&gt;
&lt;p&gt;Quality is intentionally vague, to encapsulate performance, leanness, documentation, and security.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Dynamic Linking is the Wrong solution</title>
      <link>https://prma.dev/daily/dynamic-linking-the-wrong-solution/</link>
      <pubDate>Mon, 16 Oct 2023 23:03:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/dynamic-linking-the-wrong-solution/</guid>
      <description>Dynamic linking for the reason of security is the wrong solution, only propagating the problem of language and application developers to the downstream package distrobuters. It is basically saying, yeah, I wrote this package with this language and dependencies, but you will be the one paying for my choice of technology. Of course, down stream people also shouldn&amp;rsquo;t have accommodated these softwares. Except they did and now, there are multitudes of ecosystems operating this way.</description>
      <content>&lt;p&gt;Dynamic linking for the reason of security is the wrong solution, only propagating the problem of language and application developers to the downstream package distrobuters.
It is basically saying, yeah, I wrote this package with this language and dependencies, but you will be the one paying for my choice of technology.
Of course, down stream people also shouldn&amp;rsquo;t have accommodated these softwares. Except they did and now, there are multitudes of ecosystems operating this way.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>ADHD not Being Real</title>
      <link>https://prma.dev/daily/adhd-not-real/</link>
      <pubDate>Mon, 16 Oct 2023 19:39:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/adhd-not-real/</guid>
      <description>ADHD is not real. It is just unmotivated kids needing more structure. &amp;ndash; Some lady today
Therefore:
Cancer is not real. It is just overly horny cells needing to chill the fuck down. &amp;ndash; Probably the same lady, assuming no double standards</description>
      <content>&lt;blockquote&gt;
&lt;p&gt;&lt;abbr
  title=&#34;Attention-Deficit/Hyperactivity Disorder&#34; tabindex=&#34;0&#34;&gt;ADHD&lt;/abbr&gt; is not real.
It is just unmotivated kids needing more structure.
&amp;ndash; Some lady today&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Therefore:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cancer is not real.
It is just overly horny cells needing to chill the fuck down.
&amp;ndash; Probably the same lady, assuming no double standards&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </item>
    
    <item>
      <title>Missing Rust Blogpost</title>
      <link>https://prma.dev/daily/missing-rust-post/</link>
      <pubDate>Mon, 16 Oct 2023 18:57:00 +0330</pubDate>
      
      <guid>https://prma.dev/daily/missing-rust-post/</guid>
      <description>There is a blog post missing in the Rust sphere: How to not obssess over performance gain and improve changeability of Rust applications.
In other words, imagin that you want move a function used in one file to another. How would you do that in under ten minutes?</description>
      <content>&lt;p&gt;There is a blog post missing in the Rust sphere:
&lt;em&gt;How to not obssess over performance gain and improve changeability of &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 applications.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In other words, imagin that you want move a function used in one file to another.
How would you do that in under ten minutes?&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>ME</title>
      <link>https://prma.dev/about/</link>
      <pubDate>Mon, 09 Oct 2023 16:43:00 +0330</pubDate>
      
      <guid>https://prma.dev/about/</guid>
      <description>In this vast world, teeming with approximately 8 billion human beings, I, too, find myself among their ranks, a singular entity in the tapestry of humanity.
Through my intellectual journey, I have delved into the realms of architecture and cognitive science, exploring the intricate connections between our built environment and the workings of the human mind. However, amidst this exploration, my fascination with computing remained unwavering, beckoning me towards a path where I finally discovered my true calling as a developer.</description>
      <content>&lt;p&gt;In this vast world, teeming with approximately 8 billion human beings, I, too, find myself among their ranks, a singular entity in the tapestry of humanity.&lt;/p&gt;
&lt;p&gt;Through my intellectual journey, I have delved into the realms of architecture and cognitive science, exploring the intricate connections between our built environment and the workings of the human mind. However, amidst this exploration, my fascination with computing remained unwavering, beckoning me towards a path where I finally discovered my true calling as a developer.&lt;/p&gt;
&lt;h2 id=&#34;name-wise&#34;&gt;Name-wise&lt;/h2&gt;
&lt;p&gt;You can call me &lt;span class=&#34;person p-nickname&#34;&gt;Perma&lt;/span&gt;. My legal name is &lt;span class=&#34;person p-name p-given-name&#34;&gt;AmirHossein Alesheikh&lt;/span&gt;. I don&amp;rsquo;t mind either, but I prefer &lt;span class=&#34;person p-nickname&#34;&gt;Perma&lt;/span&gt;. Read &lt;a href=&#34;../../posts/call-me-perma&#34;&gt;Call Me Perma&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;You can use any pronouns, I don&amp;rsquo;t mind any of them, I don&amp;rsquo;t identify with any of genders, anyways. But it will be nice if you could make it clear to me which one you have chosen.&lt;/p&gt;
&lt;h2 id=&#34;job-wise&#34;&gt;Job-wise&lt;/h2&gt;
&lt;p&gt;As a back-end developer, my expertise lies in utilizing languages like &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 and &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 to build the foundational components of software systems.&lt;/p&gt;
&lt;p&gt;I predominantly focus on developing the back-end of back-ends, ensuring the smooth functioning and interconnectivity of various subsystems.&lt;/p&gt;
&lt;p&gt;Additionally, I also engage in system programming, working with low-level components and infrastructure to ensure optimal performance and reliability.&lt;/p&gt;
&lt;h2 id=&#34;tech-wise&#34;&gt;Tech-wise&lt;/h2&gt;
&lt;p&gt;Since the tender age of 5, my eyes have been fixated on computer screens, even during those moments when they lay dormant. The hours I&amp;rsquo;ve devoted to sitting behind desktop computers far exceed the time I&amp;rsquo;ve dedicated to restful slumber. Throughout my life, I proudly embrace the label of a &lt;em&gt;bona fide&lt;/em&gt; textbook nerd, finding immense joy and fascination in the pages of educational literature. In fact, my favorite genre of books happens to be none other than textbooks themselves.&lt;/p&gt;
&lt;h2 id=&#34;advocacy&#34;&gt;Advocacy&lt;/h2&gt;
&lt;p&gt;For over 15 years, I have actively engaged in the realm of free software advocacy, passionately advocating for the principles of openness and accessibility. It&amp;rsquo;s safe to say that I find myself firmly planted in the far-left corner of political stereotypes, unapologetically embracing a feminist perspective, advocating for veganism and animal rights, and actively participating in environmentalism. While there are other aspects of my beliefs, such as my alignment with &lt;a href=&#34;https://www.lesswrong.com/tag/rationalist-movement&#34;&gt;rationalism&lt;/a&gt;, utilitarianism, and consciousness idealism, I won&amp;rsquo;t delve into those topics and burden you with excessive details.&lt;/p&gt;
&lt;h2 id=&#34;me-in-the-wild&#34;&gt;Me, in the wild&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https:fosstodon.org/@prma&#34;&gt;Fosstodon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https:codeberg.org/prma&#34;&gt;Codeberg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https:sr.ht/~prma&#34;&gt;sr.ht&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https:github.com/prmadev&#34;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https:linkedin.com/in/prmadev&#34;&gt;Linkedin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;faq&#34;&gt;FAQ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What time is it?&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s your dogs name?&lt;/li&gt;
&lt;li&gt;Is your dog friendly?&lt;/li&gt;
&lt;li&gt;Is it your turn to cook lunch or mine?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yeah, I hear these questions quit frequently!&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Now</title>
      <link>https://prma.dev/now/</link>
      <pubDate>Mon, 09 Oct 2023 16:43:00 +0330</pubDate>
      
      <guid>https://prma.dev/now/</guid>
      <description>This page informs you about what I&amp;rsquo;m currently focused on. Read more about the concept of now page. Making the backend of asanbilit.ir This is an airplane-ticketing system. It has an extremely complex back-end, comprised of many microservices which uses gRPC, RabbitMQ+ProtoBuf, REST, and SOAP APIs, extensively. It has a complex caching system, works with over 20 external APIs, and incorporates RedisDB, MongoDB and PostgreSQL. It also incorporates, Macaroon tokens.</description>
      <content>&lt;div class=&#34;note&#34;&gt;
  &lt;div&gt;This page informs you about what I&amp;rsquo;m currently focused on. Read more about &lt;a href=&#34;https://nownownow.com/about&#34;&gt;the concept of now page&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;making-the-backend-of-asanbilitir&#34;&gt;Making the backend of asanbilit.ir&lt;/h2&gt;
&lt;p&gt;This is an airplane-ticketing system. It has an extremely complex back-end, comprised of many microservices which uses &lt;abbr
  title=&#34;gRPC Remote Procedure Call&#34; tabindex=&#34;0&#34;&gt;gRPC&lt;/abbr&gt;, RabbitMQ+&lt;abbr
  title=&#34;Protocol Buffer&#34; tabindex=&#34;0&#34;&gt;ProtoBuf&lt;/abbr&gt;, &lt;abbr
  title=&#34;Representational State Transfer&#34; tabindex=&#34;0&#34;&gt;REST&lt;/abbr&gt;, and &lt;abbr
  title=&#34;Simple Object Access Protocol&#34; tabindex=&#34;0&#34;&gt;SOAP&lt;/abbr&gt; &lt;abbr
   title=&#34;Application Programming Interface&#34; tabindex=&#34;0&#34;&gt;API&lt;/abbr&gt;s, extensively. It has a complex caching system, works with over 20 external &lt;abbr
  title=&#34;Application Programming Interface&#34; tabindex=&#34;0&#34;&gt;API&lt;/abbr&gt;s, and incorporates RedisDB, MongoDB and PostgreSQL. It also incorporates, Macaroon tokens. That&amp;rsquo;s a lot of &lt;em&gt;cool&lt;/em&gt; technologies. Any other system that has such an architecture, is probably over engineered. I can gurantee that this one is under-engineered, at this point.&lt;/p&gt;
&lt;p&gt;This is an airplane-ticketing system. It has an extremely complex back-end, comprised of many microservices that utilize &lt;abbr
  title=&#34;gRPC Remote Procedure Call&#34; tabindex=&#34;0&#34;&gt;gRPC&lt;/abbr&gt;, RabbitMQ with &lt;abbr
  title=&#34;Protocol Buffer&#34; tabindex=&#34;0&#34;&gt;ProtoBuf&lt;/abbr&gt;, &lt;abbr
  title=&#34;Representational State Transfer&#34; tabindex=&#34;0&#34;&gt;REST&lt;/abbr&gt;, and &lt;abbr
  title=&#34;Simple Object Access Protocol&#34; tabindex=&#34;0&#34;&gt;SOAP&lt;/abbr&gt; &lt;abbr
   title=&#34;Application Programming Interface&#34; tabindex=&#34;0&#34;&gt;API&lt;/abbr&gt;s extensively. The system features a complex caching system, interacts with with over 20 external &lt;abbr
  title=&#34;Application Programming Interface&#34; tabindex=&#34;0&#34;&gt;API&lt;/abbr&gt;s, and integrates RedisDB, MongoDB, and PostgreSQL. Additionally, It also incorporates Macaroon tokens. That&amp;rsquo;s a lot of &lt;em&gt;cool&lt;/em&gt; technologies. Any other system with such an architecture is probably over-engineered. I can guarantee that, at this point, this one is under-engineered.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been part of a three-person team, likely serving as the co-architect of this system. So, yes, I&amp;rsquo;ve had to code every aspect of these technologies. And let me tell you, it was quite a challenging experience! :D&lt;/p&gt;
&lt;h2 id=&#34;making-prmait&#34;&gt;Making prmait&lt;/h2&gt;
&lt;p&gt;I have created a rust-binary as a kind of glorified all-encompassing script.
&lt;a href=&#34;https://sr.ht/~prma/prmait/&#34;&gt;The code for prmait&lt;/a&gt; is hosted on &lt;a href=&#34;https://sr.ht/&#34;&gt;sourcehut&lt;/a&gt; which is my current favorite code-forge.&lt;/p&gt;
&lt;p&gt;Currently, prmait has these functionalities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Journal management of my dreams.&lt;/li&gt;
&lt;li&gt;Task manager that is tailored to my needs.&lt;/li&gt;
&lt;li&gt;Commits and pushes every change to the above.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/riverwm/river&#34;&gt;RiverWM&lt;/a&gt;&amp;rsquo;s startup script.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During this, to make it nicer for myself, I had to create a very small parser, and an &lt;a href=&#34;https://en.wikipedia.org/wiki/Effect_system&#34;&gt;effect-system&lt;/a&gt;.
I have other functionalities in mind that I have not yet started working on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Combining thte task manager and journal manager, to make a sort &lt;a href=&#34;https://orgmode.org/&#34;&gt;org-mode&lt;/a&gt;-ish &lt;a href=&#34;https://bulletjournal.com/&#34;&gt;bullet journal&lt;/a&gt; for myself, where task schedules and notes live together.&lt;/li&gt;
&lt;li&gt;Create a syndication port, where I put some text, and it makes a &lt;a href=&#34;https://prma.dev/daily&#34;&gt;daily blog&lt;/a&gt; post here, and make another post on &lt;a href=&#34;https://fosstodon.org&#34;&gt;Fosstodon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a parser for a &lt;a href=&#34;https://joeyh.name/code/moreutils/&#34;&gt;vidir&lt;/a&gt; style interface for bulk editing of tasks and journal entries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve developed a Rust binary as a glorified, all-encompassing script. You can find the code for &lt;a href=&#34;https://sr.ht/~prma/prmait/&#34;&gt;prmait&lt;/a&gt; hosted on &lt;a href=&#34;https://sr.ht/&#34;&gt;sourcehut&lt;/a&gt;, my current favorite code forge.&lt;/p&gt;
&lt;p&gt;At present, prmait encompasses the following functionalities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A journaling system.&lt;/li&gt;
&lt;li&gt;A task manager tailored to my needs.&lt;/li&gt;
&lt;li&gt;Automatic commits and pushes for every change mentioned above.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/riverwm/river&#34;&gt;RiverWM&lt;/a&gt;&amp;rsquo;s startup script.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Throughout this process, to enhance the experience for myself, I had to create a very small parser and an &lt;a href=&#34;https://en.wikipedia.org/wiki/Effect_system&#34;&gt;effect system&lt;/a&gt;. I have other functionalities in mind that I haven&amp;rsquo;t started working on yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Combining the task manager and journal manager to create a &lt;a href=&#34;https://bulletjournal.com/&#34;&gt;bullet journal&lt;/a&gt;-ish &lt;a href=&#34;https://orgmode.org/&#34;&gt;org-mode&lt;/a&gt; for myself, where task schedules and notes coexist.&lt;/li&gt;
&lt;li&gt;Developing a syndication port that takes entered text, generates a &lt;a href=&#34;https://prma.dev/daily&#34;&gt;daily blog&lt;/a&gt; post here, and publishes another post on &lt;a href=&#34;https://fosstodon.org&#34;&gt;Fosstodon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Creating a parser for a &lt;a href=&#34;https://joeyh.name/code/moreutils/&#34;&gt;vidir&lt;/a&gt; style interface for bulk editing of tasks and journal entries.&lt;/li&gt;
&lt;/ul&gt;
</content>
    </item>
    
    <item>
      <title>The Tragedy of The Tech-Stacks</title>
      <link>https://prma.dev/posts/tragedy_of_the_tech_stacks/</link>
      <pubDate>Fri, 11 Aug 2023 12:38:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/tragedy_of_the_tech_stacks/</guid>
      <description>Back in 1958, there was this thinker named Garrett Hardin who kicked off his well-known piece titled &amp;ldquo;The Tragedy of the Commons&amp;rdquo; in the following way:
At the end of a thoughtful article on the future of nuclear war, Weisner and York concluded that &amp;ldquo;Both sides of the arms race are &amp;hellip; confronted by the dillema of steadily increasing military power and steadily decreasing natonal security. It is our considered our professional judgment that this delimma has not professional technical solution.</description>
      <content>&lt;p&gt;Back in 1958, there was this thinker named  &lt;a href=&#34;https://prma.dev/person/garrett_hardin&#34;&gt;Garrett Hardin&lt;/a&gt; who kicked off his well-known piece titled &amp;ldquo;The Tragedy of the Commons&amp;rdquo; in the following way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At the end of a thoughtful article on the future of nuclear war, Weisner and York concluded that &amp;ldquo;Both sides of the arms race are &amp;hellip; confronted by the dillema of steadily increasing military power and steadily decreasing natonal security. It is our considered our professional judgment that this delimma has not professional technical solution. If the great powers continue to look for solutions in the area of science and technology only, the result will be to worsen the situation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then, &lt;a href=&#34;https://prma.dev/person/garrett_hardin&#34;&gt;Hardin&lt;/a&gt; goes on to rattle the foundations by delving into a colossal issue - the challenge of population expansion. He breaks it down by saying that when you have a shared resource, and each individual aims to squeeze out the most benefit for themselves, the result is a harm inflicted upon everyone, even the very ones taking those actions.&lt;/p&gt;
&lt;p&gt;Now, picture this famous analogy. Imagine a stretch of grassland, claimed by three farmers. Each of them brings their cow out to graze on it daily. Sounds reasonable, right? But then, one fortunate farmer&amp;rsquo;s cow becomes pregnant. This stroke of luck leaves him with two cows, effectively doubling his profits. Observing this triumph, the other farmers follow suit, diving into a spree of buying and breeding cows, aiming to maximize their individual gains. However, this frenzy leads to a rampant grazing that leaves the grassland bare and barren. Ultimately, the once lush grass disappears, and the insatiable appetite of the voracious cows brings about their own starvation. In the end, all the farmers are left with no cows, their initial wealth transformed into a state even worse than before.&lt;/p&gt;
&lt;p&gt;He coins it as the &amp;ldquo;tragedy of the commons.&amp;rdquo; I prefer to see it as a powerful representation of what often dampens the enjoyment across the software terrain for every key player involved: the user, the developer, the &lt;abbr
  title=&#34;Chief Executive Officer&#34; tabindex=&#34;0&#34;&gt;CEO&lt;/abbr&gt;, and the investor.&lt;/p&gt;
&lt;p&gt;How meta!&lt;/p&gt;
&lt;h2 id=&#34;the-clever-one-the-frustrated-one-and-the-scared-one&#34;&gt;The Clever One, The Frustrated One and The Scared One&lt;/h2&gt;
&lt;p&gt;Now, let&amp;rsquo;s meet a familiar figure, the one we often encounter, the embodiment of many developers out there. We&amp;rsquo;ll give her a name: Sarah. Sarah&amp;rsquo;s eager to dive into a fresh technology - one that could potentially elevate her current position. So, how does she tackle this? She begins by exploring a domain, and within that, she sets her sights on a specific technology. Let&amp;rsquo;s designate this domain as something imaginary, to prevent any inadvertent offense. How about we refer to it as &amp;ldquo;Front-End Development&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;For Front-End Sarah finds out a few different contenders in the field. She asks herself, what could the industry be thirsty for? The naive answer she arrives at, is &amp;ldquo;the most reliable one, the one that is the pleasure to develop and the one that has the most advantages&amp;rdquo;. Oh, Sarah, you impractical idealistic perfectionist, you!&lt;/p&gt;
&lt;p&gt;Now, delving into the realm of Front-End, Sarah stumbles upon a handful of potential contenders. She ponders, what might the industry truly crave? Her initial, somewhat naive response is, &amp;ldquo;The most dependable option, the one that brings joy to the development process, and the one that boasts numerous advantages.&amp;rdquo; Oh Sarah, you, impractical, idealistic, perfectionist you!&lt;/p&gt;
&lt;p&gt;Armed with these benchmarks, she opts for the &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 language (yet another mythical being). She proceeds to dive into &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
, driven by her enthusiasm. However, curiosity gets the better of her, and she sneakily glances at the job listings on LinkedIn. To her astonishment, she discovers a mere trio of job opportunities for &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
. This baffles her, leading her to question the accuracy of her initial language assessment.&lt;/p&gt;
&lt;p&gt;Seeking insight, she turns to Tom, an exceptional 
 she&amp;rsquo;s acquainted with, to discuss whether &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 lives up to its hype. Much to Sarah&amp;rsquo;s astonishment, Tom echoes her initial convictions regarding &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
. He affirms that, indeed, &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 proves to be an exceptional language, boasting enduring dependability, a well-established ecosystem, and a delightful development journey.&lt;/p&gt;
&lt;p&gt;Sarah, now even more puzzled than before, directs her confusion towards Tom, questioning whether he&amp;rsquo;s in the process of recruiting &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 developers. Once again, Tom&amp;rsquo;s response is resolute: &amp;ldquo;Absolutely not! Where could I possibly locate a pool of &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
-savvy developers? However, we&amp;rsquo;re actively seeking out &lt;abbr class=&#34;language&#34; title=&#34;JS&#34;&gt;&lt;a href=&#34;https://ecma-international.org/publications-and-standards/standards/ecma-262/&#34;&gt;JavaScript&lt;/a&gt;&lt;/abbr&gt;
 experts!&amp;rdquo; (once more, a language name sufficiently distanced from any existing real-world instances).&lt;/p&gt;
&lt;p&gt;After a brief moment of contemplation, Sarah bursts out, &lt;q&gt; What about me?&lt;/q&gt;&lt;/p&gt;
&lt;p&gt;Tom responds with a shake of his head, stating, &amp;ldquo;Oh, that wouldn&amp;rsquo;t work. You see, for any given application, we require a team of 20 individuals to consistently handle maintenance and bug fixes. Where on earth would we come across 20 &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 developers?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Well, shouldn&amp;rsquo;t &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 apps theoretically require significantly less maintenance, given the multitude of bugs that are caught during the initial development stages?&amp;rdquo; Sarah counters silently within her mind. An idea begins to form, one she opts to keep to herself, &amp;ldquo;Ah, so maintaining a delicate codebase might indicate a higher demand for fresh &lt;abbr class=&#34;language&#34; title=&#34;JS&#34;&gt;&lt;a href=&#34;https://ecma-international.org/publications-and-standards/standards/ecma-262/&#34;&gt;JavaScript&lt;/a&gt;&lt;/abbr&gt;
 developers - implying enhanced job security!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Feeling rather clever, she decides to validate her hunch by perusing the (imaginary) yellow pages, named Glassdoor. And lo and behold, an endless scroll unveils a plethora of distinct job listings, all centered around &lt;abbr class=&#34;language&#34; title=&#34;JS&#34;&gt;&lt;a href=&#34;https://ecma-international.org/publications-and-standards/standards/ecma-262/&#34;&gt;JavaScript&lt;/a&gt;&lt;/abbr&gt;
.&lt;/p&gt;
&lt;p&gt;Well, Sarah learns &lt;abbr class=&#34;language&#34; title=&#34;JS&#34;&gt;&lt;a href=&#34;https://ecma-international.org/publications-and-standards/standards/ecma-262/&#34;&gt;JavaScript&lt;/a&gt;&lt;/abbr&gt;
 and all her beliefs gets validated, she becomes a very wealthy engineer, with a great job security, with each company she enters trying to keep her, year-after-yer, while other companies trying to persuade her by higher and higher offers. Or at least that was the boring version of this post that did not start with the word &amp;ldquo;tragedy&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Instead, she uncovers that her counterparts, much like herself, had also been quite &lt;em&gt;clever&lt;/em&gt;. A multitude of newcomers gravitated towards the language flaunting the highest job listings. Each job opening faced a surplus of around a hundred contenders. The &amp;ldquo;victor,&amp;rdquo; so to speak, emerges as the individual boasting the most qualifications and the most modest salary expectation. Or should we even label them as victors, considering that the instant they dare to dream a little bigger, a fresh job listing crops up, promptly displacing them with the next eager contender.&lt;/p&gt;
&lt;p&gt;Tom, our trusty 
, worn out from the cycle of on-boarding one low-budget, novice developer after another, vents his frustrations to the 
. The 
 engages in discussions with the investors, who share the same dissatisfaction due to their profits being eroded by an inefficient workforce. They call upon the 
 to devise a remedy for this predicament.&lt;/p&gt;
&lt;p&gt;The 
 returns with a strategy to shift from 
 to &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 technology. The investors, content with the proposal, take a brief pause to deliberate. A few days later, they rejoin the conversation, expressing a notable apprehension. &amp;ldquo;&lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 is practically unheard of! None of our rivals employ this language. That&amp;rsquo;s a substantial gamble we&amp;rsquo;re not prepared to take!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Arash, the &lt;abbr
  title=&#34;Chief Executive Officer&#34; tabindex=&#34;0&#34;&gt;CEO&lt;/abbr&gt;, &lt;abbr
  title=&#34;Chief Technology Officer&#34; tabindex=&#34;0&#34;&gt;CTO&lt;/abbr&gt;, &lt;abbr
  title=&#34;Chief Financial Officer&#34; tabindex=&#34;0&#34;&gt;CFO&lt;/abbr&gt;, Product Manager, and the visionary founder of a fledgling startup, confronts the very same imaginative quandary of selecting a technology stack. Given the inherent high-stakes nature of startups, Arash adopts a prudent approach by examining the practices of more established corporations, such as those overseen by individuals like Tom in his role as &lt;abbr
  title=&#34;Chief Technology Officer&#34; tabindex=&#34;0&#34;&gt;CTO&lt;/abbr&gt;, in order to identify a tried-and-true trajectory.&lt;/p&gt;
&lt;h2 id=&#34;the-lose-lose-lose-situation&#34;&gt;The Lose-Lose-Lose situation&lt;/h2&gt;
&lt;p&gt;At every juncture, every individual optimized their decisions for personal gain. At each instance, a superior option was presented, and they acknowledged the benefits it offered. Nevertheless, they settled for the inferior alternative (for the sake of avoiding any unnecessary debate, let&amp;rsquo;s refrain from mentioning that the hypothetical lesser choice was &lt;abbr
  title=&#34;Sorry I have not defined this abbreviation. Can you please report this to me with my email?&#34; tabindex=&#34;0&#34;&gt;JavaScript&lt;/abbr&gt;, naturally). As a result, each person finds themselves in a less advantageous position than if they had collectively embraced the superior alternative. This impact ripples beyond individuals, extending to the entire ecosystem, hindered by the precarious edifice of abstractions left behind by the swiftly growing number of predecessors.&lt;/p&gt;
&lt;p&gt;So, why did they all fall short of enhancing their own lives and the lives of others? Was it the technology&amp;rsquo;s flaw? Or did the ecosystem falter? You&amp;rsquo;re astute enough to deduce the answer; after all, you had the wit to discern the languages I implicitly referred to in my hypothetical scenarios.&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;The Solution&lt;/h2&gt;
&lt;p&gt;I must admit, I&amp;rsquo;m uncertain. The nuclear arsenal continues to expand, even though the era of the Cold War has long passed. Thankfully, our world hasn&amp;rsquo;t been ravaged by nuclear conflict. Rather, it&amp;rsquo;s the interplay of mutually assured destruction and the realization by the leaders of those two nations that not embracing an alternative risk could lead to dire consequences. This, at least, has placed us in a relatively improved state.&lt;/p&gt;
&lt;p&gt;Simultaneously, we find ourselves grappling with &lt;a href=&#34;https://prma.dev/person/garrett_hardin&#34;&gt;Garrett Hardin&lt;/a&gt;&amp;rsquo;s preoccupation &amp;ndash; the persistent challenges of overpopulation and looming environmental catastrophes. Evidently, the far-reaching peril of not embracing an alternative is of such extended duration that it transcends the immediate concerns of the very generation opting against alternatives. The burden of their choices is instead borne by their descendants: &lt;q&gt;Fuck those brats.&lt;/q&gt;&lt;/p&gt;
&lt;p&gt;In the world of software, the tempo is notably faster, the stakes less dire compared to earlier circumstances, and the individuals engaged are often more honest than politicians and notably smarter than the average voter.&lt;/p&gt;
&lt;p&gt;However, the remedy doesn&amp;rsquo;t entail adhering to an oddly precise series
of ritualistic maneuvers. It&amp;rsquo;s a more daunting challenge. Just as
&lt;a href=&#34;https://prma.dev/person/garrett_hardin&#34;&gt;Garrett Hardin&lt;/a&gt; titled his article, the solution remains much the same:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The population problem has no technical solution; it requires a fundamental extension of in morality.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;I know! The gastly claim of &lt;q&gt;to improve developer experience we first should grow an ethical sense&lt;/q&gt;, seems absurd. Yet I see no specifically little amount of gradual change, where at least some one on the whole chain did not bite the bullet and risk it.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Call Me Perma</title>
      <link>https://prma.dev/posts/call-me-perma/</link>
      <pubDate>Wed, 09 Aug 2023 12:31:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/call-me-perma/</guid>
      <description>I find myself seated in the passenger&amp;rsquo;s seat of my mother&amp;rsquo;s car, as we make our way to an appointment with an educational psychologist. A sense of confusion and concern lingers within me, stemming from my mother&amp;rsquo;s sudden and puzzling reaction to my C-graded report card. The journey passes quietly, and we arrive at the specialist&amp;rsquo;s office without exchanging a word, leaving me still uncertain about the purpose of our visit.</description>
      <content>&lt;p&gt;I find myself seated in the passenger&amp;rsquo;s seat of my mother&amp;rsquo;s car, as we make our way to an appointment with an educational psychologist. A sense of confusion and concern lingers within me, stemming from my mother&amp;rsquo;s sudden and puzzling reaction to my C-graded report card. The journey passes quietly, and we arrive at the specialist&amp;rsquo;s office without exchanging a word, leaving me still uncertain about the purpose of our visit.&lt;/p&gt;
&lt;p&gt;The psychologist initiates our session by administering a series of aptitude and intelligence tests appropriate for my age. Throughout the process, my mother&amp;rsquo;s keen gaze remains fixed on me, intensifying my nerves. Eventually, the psychologist validates my mother&amp;rsquo;s suspicions, revealing that my intellectual capabilities far exceed those of my peers. This revelation prompts my mother to shed light on the purpose of our enigmatic expedition: &lt;q&gt; You see, you are not stupid, you are actually very smart, you just lack self-esteem!&lt;/q&gt; Was that truly the root of the issue? While self-esteem was a factor in my unhappniess, I couldn&amp;rsquo;t help but feel that my lack of effort had deeper origins.&lt;/p&gt;
&lt;p&gt;Oh, but this wasn&amp;rsquo;t the first round of this comical saga. You see, on previous occasions, my dear mother would strategically place a glass of water right between us, like a cosmic prop. And what was the grand purpose behind this visual spectacle, you might ask? Well, it was her way of nudging me into a philosophical monologue about that very glass. In simple terms: &lt;q&gt;Hey, kiddo, you&amp;rsquo;ve got a shortage of optimism; you&amp;rsquo;re the sort who tends to spot the half-empty glass in life.&lt;/q&gt;&lt;/p&gt;
&lt;p&gt;And then we have my dear old dad, the master of responsibility training. He had this grand plan to shape my character, using internships as his secret weapon. &lt;q&gt;Off you go, my young apprentice!&lt;/q&gt; he&amp;rsquo;d exclaim, nudging me into one vocational adventure after another. His hidden message? &lt;q&gt;Kid, I&amp;rsquo;m passing down the sacred skill of handling responsibilities!&lt;/q&gt; Ah, the age-old dance of parental strategy.&lt;/p&gt;
&lt;p&gt;And there you have it, my childhood summed up, right from the time those kindergarten teachers began their chorus of complaints about my apparent &amp;ldquo;refusal&amp;rdquo; to embrace the songs that my peers had effortlessly committed to memory months before.&lt;/p&gt;
&lt;p&gt;As the days went by, I began to adopt a personal mantra: &lt;q&gt;I&amp;rsquo;m the poster child for laziness, the embodiment of irresponsibility, with motivation and vision nowhere to be found.&lt;/q&gt; Oddly enough, despite knowing full well the significance of education and being genuinely captivated by the realms of science and math, my actions seemed to tell a different story altogether. It&amp;rsquo;s as if I was presenting evidence that contradicted my own beliefs. Perhaps deep down, I questioned my care for my parents, struggled to find motivation, or maybe I secretly aspired to master the art of freeloadery.&lt;/p&gt;
&lt;p&gt;The haze of doubt began to lift when I embarked on an &lt;abbr
  title=&#34;Attention-Deficit/Hyperactivity Disorder&#34; tabindex=&#34;0&#34;&gt;ADHD&lt;/abbr&gt; medication journey, and lo and behold, I experienced the novel sensation of being able to sit down and read a paragraph without my mind spiraling into chaos. It was like finally playing a video game where you no longer wonder if you&amp;rsquo;re in control of that character&amp;rsquo;s movements or not. My epiphany was quite the reverse: &amp;ldquo;Oh, wait a minute, I can indeed make decisions and stick with them?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Let me tell you, this realization was liberating, to put it mildly. Suddenly, I had the capacity to invest time in the very things that had ignited my curiosity.&lt;/p&gt;
&lt;p&gt;&lt;abbr
  title=&#34;Attention-Deficit/Hyperactivity Disorder&#34; tabindex=&#34;0&#34;&gt;ADHD&lt;/abbr&gt; has had a profound impact on  my life since childhood. One revelation that became clear after seeking medication was the extent to which I had surrendered agency and intentionality.&lt;/p&gt;
&lt;p&gt;My existence had been defined by reactivity, with a noticeable absence of honed decision-making skills. I found myself in a state of passivity, or even worse, mere reactivity. Nonetheless, I consistently strived to reclaim it.&lt;/p&gt;
&lt;h2 id=&#34;recent-victories&#34;&gt;Recent Victories&lt;/h2&gt;
&lt;p&gt;Over the past few years, I&amp;rsquo;ve encountered an almost comically disproportionate share of misfortune and have found myself under substantial duress. Yet, I&amp;rsquo;ve navigated my way through these challenges.&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t delve into the specifics of these misfortunes, although those in my social circles can attest to their unusual frequency.&lt;/p&gt;
&lt;p&gt;However, I can share that I&amp;rsquo;ve achieved several noteworthy milestones during this time span: acquiring programming skills, entering the workforce, entering marriage, and most recently, opting to unofficially change my name.&lt;/p&gt;
&lt;p&gt;Formally, I remain &lt;em&gt;Amirhossein&lt;/em&gt;, and I&amp;rsquo;m content should anyone choose to continue addressing me as such-I hold no animosity toward it. Nevertheless, it inadequately captures the depth of my identity.&lt;/p&gt;
&lt;h2 id=&#34;bb76b9&#34;&gt;Amirhossein and Perma&lt;/h2&gt;
&lt;p&gt;The name Amirhossein is a composite of two Arabic names, Amir and Hossein, both of which carry two meanings. As for the firsts of these meanings, Amir translates to &amp;ldquo;prince,&amp;rdquo; while Hossein signifies &amp;ldquo;Good-junior.&amp;rdquo; The amalgamation results in the interpretation of &amp;ldquo;Junior Good Prince.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;However, I find myself at a loss when attempting to establish a personal connection with any aspect of this interpretation of this name. This brings us to its secondary and perhaps more intended connotation.&lt;/p&gt;
&lt;p&gt;In Shia Islam, there exists a concept akin to Christianity&amp;rsquo;s sainthood, known as &amp;ldquo;&lt;dfn&gt;Imam&lt;/dfn&gt;&amp;rdquo;. However, these Imams are asserted to be leaders of the Islamic community. The first of these figures holds the title &lt;em&gt;Amir-al-momenin&lt;/em&gt;, or the &amp;ldquo;prince of the faithful&amp;rdquo;, commonly abbreviated as Amir. The third Imam, the second son of the first, was named &lt;em&gt;Hossein&lt;/em&gt; . Both individuals deviate significantly from pacifism.&lt;/p&gt;
&lt;p&gt;While these historical and linguistic connections hold merit, I must underscore a significant twist: since the age of 15, I have consciously disavowed Islam and theism in their entirety.&lt;/p&gt;
&lt;p&gt;I find &amp;ldquo;&lt;a href=&#34;https://prma.dev/about&#34;&gt;Perma&lt;/a&gt;&amp;rdquo; to be a more fitting option, resonating more harmoniously with my ears. Moreover, it aligns with certain themes and passions that hold significance in my life. It closely aligns with the ethos underpinning this blog. I&amp;rsquo;m captivated by the philosophy of the &lt;em&gt;PermaCulture&lt;/em&gt; and &lt;em&gt;PermaComputing&lt;/em&gt; movements-albeit not necessarily their current implementations. My fascination lies in harmonizing with the world rather than coercing it to conform to my presence. Moreover, the notion of leaving a lasting imprint on the world holds a special allure for me. However, this yearning leans more toward the aesthetic realm rather than being rooted in &lt;em&gt;utilitarian&lt;/em&gt; aspirations.&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;ve known me previously, you might have observed my recent shifts in usernames, emails, and name. Across the internet, I&amp;rsquo;ve opted for &lt;code&gt;Prma&lt;/code&gt; instead of the more direct &lt;code&gt;Perma&lt;/code&gt;, as the latter is frequently claimed or could serve other entities more fittingly.&lt;/p&gt;
&lt;p&gt;However, this change isn&amp;rsquo;t indicative of a complete unveiling of my authentic self. Thus, referring to me by my previous name isn&amp;rsquo;t as insensitive as the act of deadnaming. Rather, this transition signifies the inception of a renewed chapter, one marked by heightened purpose and intention.&lt;/p&gt;
&lt;p&gt;While I do prefer and hope for the usage of &lt;em&gt;Perma&lt;/em&gt; moving forward, I&amp;rsquo;m entirely at ease if you choose otherwise. Your decision in this regard is genuinely respected.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Dishonesty of Optimizing for Developer Time</title>
      <link>https://prma.dev/posts/dishonesty_of_optimizing_for_developers_time/</link>
      <pubDate>Mon, 31 Jul 2023 12:24:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/dishonesty_of_optimizing_for_developers_time/</guid>
      <description>Intro Based on some individuals&amp;rsquo; viewpoints, they emphasize optimizing for developer time or productivity as their main priority, rather than giving top precedence to aspects such as performance, robustness, or correctness.
The Thesis Their argument revolves around the idea that developers&amp;rsquo; time is more valuable and expensive than server resources. They often use phrases like &amp;ldquo;You can always refactor,&amp;rdquo; &amp;ldquo;You can always optimize for performance,&amp;rdquo; or &amp;ldquo;We will fix bugs later on&amp;rdquo; to support their viewpoint.</description>
      <content>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;Based on some individuals&amp;rsquo; viewpoints, they emphasize optimizing for developer time or productivity as their main priority, rather than giving top precedence to aspects such as performance, robustness, or correctness.&lt;/p&gt;
&lt;h2 id=&#34;the-thesis&#34;&gt;The Thesis&lt;/h2&gt;
&lt;p&gt;Their argument revolves around the idea that developers&amp;rsquo; time is more valuable and expensive than server resources. They often use phrases like &amp;ldquo;You can always refactor,&amp;rdquo; &amp;ldquo;You can always optimize for performance,&amp;rdquo; or &amp;ldquo;We will fix bugs later on&amp;rdquo; to support their viewpoint. While this perspective may be considered ingenious, it is contingent on proper planning, weighing the trade-offs, and actually acting upon those decisions.&lt;/p&gt;
&lt;h2 id=&#34;my-antithesis&#34;&gt;My Antithesis&lt;/h2&gt;
&lt;p&gt;However, if this were genuinely the case, more substantial effort would have been invested in refactoring or choosing a more rigorous language than &lt;abbr class=&#34;language&#34; title=&#34;JS&#34;&gt;&lt;a href=&#34;https://ecma-international.org/publications-and-standards/standards/ecma-262/&#34;&gt;JavaScript&lt;/a&gt;&lt;/abbr&gt;
, for example, a language that can significantly boost performance in the long run.&lt;/p&gt;
&lt;p&gt;Fixing bugs in backends written in &lt;abbr class=&#34;language&#34; title=&#34;JS&#34;&gt;&lt;a href=&#34;https://ecma-international.org/publications-and-standards/standards/ecma-262/&#34;&gt;JavaScript&lt;/a&gt;&lt;/abbr&gt;
, &lt;abbr class=&#34;language&#34; title=&#34;PHP: Hypertext Preprocessor&#34;&gt;&lt;a href=&#34;https://www.php.net/&#34;&gt;PHP&lt;/a&gt;&lt;/abbr&gt;
, or &lt;a class=&#34;language&#34; href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt;
 is certainly feasible, but adding performance improvements can become challenging, if not improbable. More meticulous programming tools automate the process of finding and fixing even the most elusive bugs and come with significant performance optimizations. The ability to make well-founded assumptions about the program allows for better optimization.&lt;/p&gt;
&lt;p&gt;This approach often leads to a situation where future engineers, tasked with rewriting the &lt;abbr
  title=&#34;Minimum Viable Product&#34; tabindex=&#34;0&#34;&gt;MVP&lt;/abbr&gt; program in a more scalable language, face an archeological rediscovery process.&lt;/p&gt;
&lt;p&gt;So, if they are not genuinely optimizing for shorter development time, what are they doing?&lt;/p&gt;
&lt;h2 id=&#34;lifting-the-veil-the-actual-thesis&#34;&gt;Lifting The Veil: The Actual Thesis&lt;/h2&gt;
&lt;p&gt;It appears that they prioritize short-term gains over achieving greater long-term goals.&lt;/p&gt;
&lt;p&gt;A language like &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
, while providing benefits like enhanced safety and reliability, requires significantly more time to produce a binary or &lt;abbr
  title=&#34;Application Programming Interface&#34; tabindex=&#34;0&#34;&gt;API&lt;/abbr&gt;s. The manual labor of finding bugs is taken over by the compiler and the language&amp;rsquo;s semantics. If the focus is on developer productivity, then this automation is naturally desirable. However, what one truly desires to convey is &amp;ldquo;I have this feature, even though it may have some bugs and performance issues, I have it nonetheless.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;the-synthesis&#34;&gt;The Synthesis&lt;/h2&gt;
&lt;p&gt;That may be a positively good idea for trying the market to see if there is any for that specific idea, for most software developements though, the actual intention is not experimentation, as the novelty of product and bussiness plan do not warrant a need for experimentaion. rather, having something to sell, as fast as possible. That&amp;rsquo;s for start ups. Where there is both legitimate and illegitimate short-termism. But more established enterprises may have this pairing as well. While there are A/B experimentaions going on, trying different approaches to see which works, middle management might also like the addition of another achievement in their yearly reports.&lt;/p&gt;
&lt;p&gt;A rapid way to discern whether it falls under the category of experimentation/prototyping or an &lt;abbr
  title=&#34;Minimum Viable Product&#34; tabindex=&#34;0&#34;&gt;MVP&lt;/abbr&gt;/achievement-oriented project is to examine whether there is a notably extended period allocated for the program&amp;rsquo;s rewrite compared to its initial development phase.&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;Similar to many phenomena, short-termism can indeed have legitimate applications. The reluctance of many to embrace this term is rooted in its improper and illegitimate uses.&lt;/p&gt;
&lt;p&gt;Certainly, there are well-intentioned individuals who advocate for developer productivity. However, those with ample experience will acknowledge that long-term developer productivity is not synonymous with low-overhead development, and, more often than not, these two objectives are incompatible.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Criteria For Choosing Tools</title>
      <link>https://prma.dev/posts/criteria-for-choosing-tools/</link>
      <pubDate>Sat, 29 Jul 2023 12:14:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/criteria-for-choosing-tools/</guid>
      <description>Intro The web is utterly fucked. But anyone with some resources resources at hand and curiosity at heart and intentional tool selection can have a decent experience.
The Reasons The web&amp;rsquo;s lamentable state can be attributed to several factors. Allow me to enumerate them concisely for clarity:
Bloated beyond reason. Plagued with incessant ads. Prioritizing feature over bug fixes, if addressed at all. Designed to cater to journalists and advertisers, neglecting your needs.</description>
      <content>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;The web is utterly fucked. But anyone with some resources resources at hand and curiosity at heart and intentional tool selection can have a decent experience.&lt;/p&gt;
&lt;h2 id=&#34;the-reasons&#34;&gt;The Reasons&lt;/h2&gt;
&lt;p&gt;The web&amp;rsquo;s lamentable state can be attributed to several factors. Allow me to enumerate them concisely for clarity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bloated beyond reason.&lt;/li&gt;
&lt;li&gt;Plagued with incessant ads.&lt;/li&gt;
&lt;li&gt;Prioritizing feature over bug fixes, if addressed at all.&lt;/li&gt;
&lt;li&gt;Designed to cater to journalists and advertisers, neglecting your needs.&lt;/li&gt;
&lt;li&gt;Imposing confinement and isolation upon you.&lt;/li&gt;
&lt;li&gt;Failing to empower users like yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;a-brief-digression&#34;&gt;A Brief Digression&lt;/h3&gt;
&lt;p&gt;The final point warrants further elaboration.&lt;/p&gt;
&lt;p&gt;The internet is, in fact, a tool. It is &lt;em&gt;something&lt;/em&gt; that is made to help &lt;em&gt;someone&lt;/em&gt; achieve &lt;em&gt;some goal&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The captivating world of &lt;em&gt;Web 2.0&lt;/em&gt; and &lt;em&gt;Social Media&lt;/em&gt; (the somethings) - initially promising to empower people (the someones), granting them enriched social connections (the some goal). A promising start, indeed, leaving many with pleasant experiences during the inception of Web 2.0.&lt;/p&gt;
&lt;p&gt;But, alas, as time went by, the very incentives that drove these Social Media companies veered them off their intended course. They embarked on a divergent path, straying from their professed mission, and now, Web 2.0 primarily serves as a platform to amplify the voices of journalists and celebrities (the actual someones), propelling them towards greater fame and recognition (the actual some goals).&lt;/p&gt;
&lt;p&gt;The driving force behind these shifts? The ever-persistent quest for revenue from advertisers, pushing them to create content that captures maximum engagement. The more captivating, the more lucrative.&lt;/p&gt;
&lt;p&gt;Regrettably, the landscape has birthed what I would call the &amp;ldquo;four horsemen of reactionary engagement&amp;rdquo;: the doomsday, super political reporter; the enraging, populist racist politician; the trolling, impulsive &lt;abbr
  title=&#34;Chief Executive Officer&#34; tabindex=&#34;0&#34;&gt;CEO&lt;/abbr&gt;; and the drama-driven, vacuous celebrity.&lt;/p&gt;
&lt;p&gt;In a nutshell, it appears you&amp;rsquo;ve been played for a fool. Social media&amp;rsquo;s purported aim of empowering you is nothing but a delusion.&lt;/p&gt;
&lt;h2 id=&#34;go-empower-yourself&#34;&gt;Go Empower yourself&lt;/h2&gt;
&lt;p&gt;Before you proceed, there&amp;rsquo;s a prerequisite to address: overcoming the fear of missing out. Now, how one achieves this is not within my scope to divulge, but I can assist you in understanding why these fears are unfounded.&lt;/p&gt;
&lt;p&gt;Consider this: Have you truly missed out on anything of genuine importance? Reflect on whether the latest controversial statement from Donald Trump has genuinely altered the course of your life. And if it did, was Twitter (or whatever they dub it these days) truly the sole or optimal medium for receiving such information?&lt;/p&gt;
&lt;p&gt;Even in Iran, where official channels are notorious for propagating falsehoods, Twitter appears to be excessive. For me, friends and private messages reliably convey essential information. And indeed, individuals might spend considerable time on Twitter, but isn&amp;rsquo;t the fundamental pledge of social media the relay of information? If that need is already being fulfilled through other means, what purpose does Twitter truly serve?&lt;/p&gt;
&lt;p&gt;If you find yourself fortunate enough to reside in a country with trustworthy official channels, and your well-being hinges on crucial information like hurricane alerts, rest assured that dedicated services cater specifically to such needs. Similarly, if you derive pleasure from reading news articles, I suggest identifying the authors whose work you value and following them directly. However, if these activities do not align with your interests, then quite frankly, you have no real necessity for engaging with this &amp;ldquo;stuff.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Oh, my friend, let me share with you a sobering truth about these companies - they&amp;rsquo;re akin to emotionally abusive partners, manipulating you into believing you&amp;rsquo;re nothing without them. They demean you, calling you stupid and incapable of managing your life without their presence. They cunningly weave a narrative of how your life is all thanks to them, that your friendships exist solely because of their benevolence.&lt;/p&gt;
&lt;p&gt;But don&amp;rsquo;t be fooled by their deceiving ways. They mangle your interactions, force-feeding you ads and utter nonsense, all while claiming it&amp;rsquo;s an act of love. And when their misdeeds come to light, they stage a grand spectacle of apologies and vows to change, only to strike back even harder later on.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to break free from this toxic cycle. I know it&amp;rsquo;s daunting, and fear may grip your heart initially, but liberate yourself from their clutches. You will discover a life far better than you ever imagined. You deserve more than this relentless manipulation. Embrace the freedom that awaits, my dear friend.&lt;/p&gt;
&lt;h2 id=&#34;how-to-find-a-good-tool&#34;&gt;How to find a good tool&lt;/h2&gt;
&lt;h3 id=&#34;step-one-find-the-low-hanging-fruits&#34;&gt;Step One: Find The Low Hanging Fruits&lt;/h3&gt;
&lt;p&gt;You stand at the precipice of transformation, ready to change your life for the better. The first step is to identify the areas in your life that require attention. What needs are you seeking to fulfill? And upon which inadequate services are you currently relying?&lt;/p&gt;
&lt;p&gt;In my case, I sought:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A steady flow of lightweight information.&lt;/li&gt;
&lt;li&gt;Daily interactions with fellow enthusiasts akin to myself.&lt;/li&gt;
&lt;li&gt;A means to uncover specific data.&lt;/li&gt;
&lt;li&gt;A reliable way to send emails.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For too long, I depended on subpar sources to meet these needs. For the first two, I found myself reliant on Twitter, Instagram, Reddit, and Google News. As for the third and fourth requirements, I resorted to Google&amp;rsquo;s services. However, all of these platforms consistently fell short and inflicted undue stress upon me.&lt;/p&gt;
&lt;h3 id=&#34;step-two-find-effective-replacements&#34;&gt;Step Two: Find Effective Replacements&lt;/h3&gt;
&lt;p&gt;In my earlier post I have mentioned that I already have replaced most of these services with better ones. But I have not mentioned what constitutes an effective solution.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;../web-experience-makeover&#34;&gt;my previous post&lt;/a&gt;, I alluded to having replaced many of these services with superior alternatives. However, I haven&amp;rsquo;t delved into what exactly makes a solution effective.&lt;/p&gt;
&lt;p&gt;Allow me to outline the criteria and guiding principles for an empowering tool:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It should not cause you any harm.&lt;/li&gt;
&lt;li&gt;It should not lock you in.&lt;/li&gt;
&lt;li&gt;It should not feel frugal.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, let me delve into the rationale behind these criteria:&lt;/p&gt;
&lt;h4 id=&#34;1-dot-it-should-not-cause-you-more-harm-than-good&#34;&gt;1. It should not cause you more harm than good&lt;/h4&gt;
&lt;p&gt;If a tool causes more harm than good, why persist in using it at all?&lt;/p&gt;
&lt;p&gt;To safeguard your interests, ensure that the tool operates with transparency. Platforms that intentionally harm users are less inclined to be forthcoming about their inner workings. Opt for open-source and audited software, provided you trust the incentives and capabilities of the auditors, as this fosters transparency.&lt;/p&gt;
&lt;p&gt;Moreover, it is crucial to align the incentives of the tool&amp;rsquo;s creators with your own. While there will always be some degree of misalignment, not all cases are equal. Selling or renting software may incentivize developers to plan for obsolescence, sell incomplete products, or enforce lock-ins. Yet, these misalignments are overshadowed by the egregious discrepancies inherent in ad-driven models.&lt;/p&gt;
&lt;h4 id=&#34;2-dot-it-should-not-lock-you-in&#34;&gt;2. It should not lock you in&lt;/h4&gt;
&lt;p&gt;Indeed, the peril of being locked into a tool becomes evident when the company&amp;rsquo;s incentives undergo a shift. I experienced this firsthand in 2015 when I was a loyal Evernote user with a premium subscription, trusting it with all my valuable information. However, when Evernote decided to drop right-to-left language support crucial for the Middle Eastern languages, my pleas for assistance fell on deaf ears. They deemed the region unworthy of attention, leaving me stranded and unable to utilize my data effectively.&lt;/p&gt;
&lt;p&gt;The true pain emerged when I attempted to export my information and realized I was trapped in their ecosystem. They held my notes hostage, providing them back only in a non-standard format through XML or JSON files. This, my friends, was the dreaded lock-in, and I had to endure a labyrinthine journey of manual extraction to break free.&lt;/p&gt;
&lt;p&gt;To avoid such a predicament, one essential question should be posed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Will it be more difficult for me to switch to a competitor once I&amp;rsquo;ve fully adopted this service compared to my current situation before using it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the service retains your data and only offers it back in a non-standard format, it becomes significantly more challenging to transition to a competitor after investing your notes into the first service. Be vigilant and consider the implications before getting entangled in such situations.&lt;/p&gt;
&lt;h4 id=&#34;3-dot-it-should-not-feel-frugal-dot&#34;&gt;3. It should not feel frugal.&lt;/h4&gt;
&lt;p&gt;Let us keep in mind the essence of this endeavor: to enhance the quality of our lives. Undoubtedly, there are noble causes that may necessitate adopting a certain level of frugality, as was the case for me with animal rights, which amusingly led me to embrace veganism.&lt;/p&gt;
&lt;p&gt;However, advocating for these causes demands energy, and it might inadvertently lead to isolation. We must acknowledge that not everything can or should be a constant battle. The purpose of utilizing these tools is to improve our lives, not to make them more arduous.&lt;/p&gt;
&lt;p&gt;If safeguarding your privacy to the utmost extreme is your goal, then by all means, employ complex passwords for each site and commit them to memory. Nevertheless, we must be mindful that our fighting energy is finite. Thus, it becomes essential to prioritize and channel our limited energy toward the most urgent and meaningful issues that truly resonate with our hearts.&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;You are on the right path, and I believe in you wholeheartedly! Trust me, I&amp;rsquo;ve been through this journey myself, and it turned out to be a delightful and straightforward experience. Take heart, for you can certainly achieve it too! Keep going, and you&amp;rsquo;ll soon realize how much better and easier life becomes. You&amp;rsquo;ve got this!&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Giving My Exprience of Web a Makeover</title>
      <link>https://prma.dev/posts/web-experience-makeover/</link>
      <pubDate>Wed, 19 Jul 2023 12:04:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/web-experience-makeover/</guid>
      <description>Back in the good old days, I found myself drawn to the wonders of the internet, captivated by its virtual world, teeming with individuals who resonated with me, people I admired, or at least aspired to emulate. The communication channels of that era felt more personal, more akin to a lively conversation passed on through word of mouth.
More of Those Days In those youthful days, I&amp;rsquo;d eagerly scour the web for words that piqued the interests of my teenage self, and with a simple search, Google would present me with a treasure trove of blogs authored by kindred spirits.</description>
      <content>&lt;p&gt;Back in the good old days, I found myself drawn to the wonders of the internet, captivated by its virtual world, teeming with individuals who resonated with me, people I admired, or at least aspired to emulate. The communication channels of that era felt more personal, more akin to a lively conversation passed on through word of mouth.&lt;/p&gt;
&lt;h2 id=&#34;more-of-those-days&#34;&gt;More of Those Days&lt;/h2&gt;
&lt;p&gt;In those youthful days, I&amp;rsquo;d eagerly scour the web for words that piqued the interests of my teenage self, and with a simple search, Google would present me with a treasure trove of blogs authored by kindred spirits. I&amp;rsquo;d venture into the realms of Twitter, FriendFeed, Facebook, Orkut, and the myriad other social platforms, spending precious moments escaping the painful realities of feeling marginalized by my parents, teachers, and peers at school.&lt;/p&gt;
&lt;p&gt;The internet of that era held a special place in my heart; it offered solace and kinship. Even though I may not have been as popular as some within those social circles, I cherished engaging in conversations within a vibrant crowd of amazing individuals, the very ones I admired deeply.&lt;/p&gt;
&lt;p&gt;As time marched on, many of the cherished online spaces I once loved fell by the wayside, while others morphed into monstrous entities, becoming tools of ostracization. Although I personally may not have been the target of such mistreatment, I could discern the toxic environment that fostered and emboldened bullies.&lt;/p&gt;
&lt;p&gt;Even the search engines, once a source of discovery and connection, began to falter. Each passing day brought forth an ever-increasing deluge of hyper-&lt;abbr
  title=&#34;Search Engine Optimization&#34; tabindex=&#34;0&#34;&gt;SEO&lt;/abbr&gt;-optimized, meaningless content and tech-centric sites merely driven by profit, overtaking the slots that were once reserved for passionate individuals with independent blogs.&lt;/p&gt;
&lt;p&gt;As the landscape transformed, I gradually came to terms with the nostalgic allure of those bygone days, realizing that it had become a remnant of the lost innocence of the early internet or clouded by my own flawed perception of what truly transpired.&lt;/p&gt;
&lt;p&gt;The sense of desperation that had gripped me started to crumble when &lt;a href=&#34;https://prma.dev/person/elon_musk&#34;&gt;Elon Musk&lt;/a&gt;&amp;rsquo;s actions on Twitter triggered a disillusionment, pushing me to reconsider Fosstodon-an open-source social platform. And oh, what a fortuitous decision that turned out to be. It was as if I had stumbled upon the early days of FriendFeed, where genuine exchange of information thrived, embodying the very essence of the social web I yearned for.&lt;/p&gt;
&lt;p&gt;But a part of me questioned this fortunate discovery. Could it merely be a chance occurrence, a fluke in the otherwise distorted realm of human-generated nonsense? I grappled with doubts.&lt;/p&gt;
&lt;p&gt;Then, as if destiny had a hand in it, the second revelation struck-a website called Kagi, delivering yet another blow to the illusion I had held onto. The cracks in my previous beliefs widened, challenging me to confront the harsh realities of the digital landscape.&lt;/p&gt;
&lt;p&gt;Kagi, an unconventional paid search engine, piqued my curiosity, prompting me to give it a try. What unfolded before my eyes left me astounded-a screen brimming with blog posts dedicated to the concept of &lt;em&gt;PermaComputing&lt;/em&gt; occupied the very first page of results. In that moment, it dawned on me that the beloved world of independent blogging, which I had presumed to be on life support, had not faded away as I had believed. Instead, it thrived, resilient and as potent as ever. It was the so-called social media platforms and search engines, the very entities I had placed my trust in, that had ultimately let me down, betraying the internet I held dear.&lt;/p&gt;
&lt;p&gt;The illusion that once clouded my perception had dissipated into thin air.&lt;/p&gt;
&lt;p&gt;Determined to instigate a change, I took my first footsteps in the path full of transformations. I am currently in the midst of that process, but I have successfully identified the type of experience I desire. I have pinpointed a few readily available opportunities and have taken proactive measures to secure them for myself.&lt;/p&gt;
&lt;p&gt;Foremost, I yearn for an authentic perspective of the internet-a genuine representation of the collective human experience rather than a mere showcase of the glossiest and most superficial elements. To fulfill this aspiration, I sought out a suitable search engine, and as I mentioned earlier, I found my answer in Kagi-it aligns perfectly with my vision.&lt;/p&gt;
&lt;p&gt;Furthermore, I crave a steady stream of thoughtful and sincere content. To achieve this, I turned to an &lt;abbr
  title=&#34;Realy Simple Syndication&#34; tabindex=&#34;0&#34;&gt;RSS&lt;/abbr&gt; aggregator to curate and deliver such material to me consistently. Feedbin emerged as the ideal choice, serving as the conduit for fulfilling my appetite for meaningful discourse.&lt;/p&gt;
&lt;p&gt;I discovered another low-hanging fruit on my path towards a more fulfilling online experience-a social website optimized for community rather than being driven solely by journalists. This gem came in the form of Mastodon.&lt;/p&gt;
&lt;p&gt;In my quest for a trustworthy email service that respects my privacy and shields me from the relentless influx of spammers, I received a recommendation for ProtonMail. Taking heed of the suggestion, I made the switch and, so far, I find it to be a satisfactory choice.
&lt;details class=&#34;card&#34;&gt;
  &lt;summary&gt;Update at &lt;time&gt;2023-11-14&lt;/time&gt; &lt;/summary&gt;
  &lt;p class=&#34;pl-10&#34;&gt;I am using Migadu these days.&lt;/p&gt;
&lt;/details&gt;&lt;/p&gt;
&lt;p&gt;You may have noticed that out of the four aforementioned solutions, three are paid services. Additionally, two of them are closed-sourced, while one-the email service-poses the risk of vendor lock-in. Although this may not be the ideal scenario, I weighed my options against a set of criteria that I had established. In the end, these choices emerged as the better alternatives, despite their limitations.&lt;/p&gt;
&lt;p&gt;However, I realize that this post has already grown quite lengthy, and the criteria I employed deserve a &lt;a href=&#34;../criteria-for-choosing-tools&#34;&gt;more thorough elaboration&lt;/a&gt;. Therefore, I will save their exploration for a future post, where I can delve deeper into these ideas deserving of greater attention.&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;At present, I find immense joy in my renewed online experience-a sense of tranquility and refuge washes over me whenever I delve into the internet. I wholeheartedly urge you, dear reader, who may be experiencing similar frustrations to those of my past self, to take a moment and reevaluate your internet usage. There is a strong possibility that the internet can be a much more pleasant and gratifying space than what you might be feeling at this moment. I know this to be true because I am living it right now. Embrace the journey of exploring better alternatives and reclaim the joy in your online interactions.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>HTML, The Programming Language</title>
      <link>https://prma.dev/posts/html_the_programming_language/</link>
      <pubDate>Sat, 24 Jun 2023 11:50:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/html_the_programming_language/</guid>
      <description>The eternal dispute over whether HTML counts as a proper programming language seems to bring out the best and worst of our community&amp;rsquo;s collective rational faculties. A veritable feast of half-baked attempts to define away the problem by appealing to whatever convenient characteristics the speaker happens upon, combined with a sprinkling of more serious thinkers seeking some grand philosophical theory to explain it all. But don&amp;rsquo;t get your hopes up - you won&amp;rsquo;t find any silver bullet solutions here folks.</description>
      <content>&lt;p&gt;The eternal dispute over whether &lt;abbr class=&#34;language&#34; title=&#34;Hyper-Text Markup Language&#34;&gt;&lt;a href=&#34;https://html.spec.whatwg.org/&#34;&gt;HTML&lt;/a&gt;&lt;/abbr&gt;
 counts as a proper programming language seems to bring out the best and worst of our community&amp;rsquo;s collective rational faculties. A veritable feast of half-baked attempts to define away the problem by appealing to whatever convenient characteristics the speaker happens upon, combined with a sprinkling of more serious thinkers seeking some grand philosophical theory to explain it all. But don&amp;rsquo;t get your hopes up - you won&amp;rsquo;t find any silver bullet solutions here folks. Just a parade of armchair theoreticians grasping blindly for some sense of clarity amidst the fog of poorly thought out positions. So gather &amp;lsquo;round, listen up, and prepare yourself for another round of pointless squabbling. The fun is just beginning!&lt;/p&gt;
&lt;h2 id=&#34;the-loops-and-the-features&#34;&gt;The Loops And The Features&lt;/h2&gt;
&lt;p&gt;Individuals frequently endeavor to delineate programming languages by differentiating them from &lt;abbr class=&#34;language&#34; title=&#34;Hyper-Text Markup Language&#34;&gt;&lt;a href=&#34;https://html.spec.whatwg.org/&#34;&gt;HTML&lt;/a&gt;&lt;/abbr&gt;
, contending that a programming language possesses specified traits. Traits that might encompass looping structures, conditional statements, or even compilations. Alas, these efforts are founded upon retrospective comprehension - reliant on past personal observations of what constitutes a programming language. This flawed methodology, inherently, undermines the legitimacy of their claims inasmuch as they concurrently explore discrepancies between what is deemed not to be a programming language. A circular argument ensues, lacking genuineness, and thus futile in supporting the allegation that &lt;abbr class=&#34;language&#34; title=&#34;Hyper-Text Markup Language&#34;&gt;&lt;a href=&#34;https://html.spec.whatwg.org/&#34;&gt;HTML&lt;/a&gt;&lt;/abbr&gt;
 lacks programming language attributes.&lt;/p&gt;
&lt;p&gt;Alright, listen up! Let&amp;rsquo;s say I&amp;rsquo;m dead set on accusing Tom of being a thieving scoundrel while vehemently asserting that Amanda is as innocent as can be. To make my case, I start off by drawing a sharp contrast between Tom and Amanda. Then, after much contemplation, I concoct a ridiculously specific definition of a thief: &amp;ldquo;Anyone who happens to be a man in his sixties with an academic background in History.&amp;rdquo; Can you believe that? Now, picture this - imagine we go ahead and convict every poor soul who fits this outrageous description. Well, I&amp;rsquo;ll tell you right now, that&amp;rsquo;s a load of nonsense! It simply won&amp;rsquo;t fly, and anyone with half a brain can see how utterly flawed and impractical that notion is.&lt;/p&gt;
&lt;h2 id=&#34;the-turing-completeness&#34;&gt;The Turing Completeness&lt;/h2&gt;
&lt;p&gt;Now, let me tell you about those folks who prefer a more unified approach when it comes to defining something, like a programming language. They often rely on axioms, you know, those fundamental principles that serve as the bedrock of reasoning. One of the most famous examples is the notion of &lt;em&gt;Turing completeness&lt;/em&gt; being the ultimate defining factor. At first glance, it may not seem problematic. But here&amp;rsquo;s the burning question: Why on earth would we go down that route?&lt;/p&gt;
&lt;p&gt;Think about it. We create distinctions in definitions to aid us in effectively communicating a concept amongst ourselves. As far as I know, most programmers couldn&amp;rsquo;t care less about whether a programming language can perform every single computation imaginable in theory. No, sir! Instead, they value the practical aspects like ease of use and reliability when it comes to solving a specific set of problems. So, how in the world would that earlier theoretical claim serve us in our day-to-day tasks? It&amp;rsquo;s a real head-scratcher, especially when you consider that such a filter would let languages like brainfuck and whitespace pass through, while disregarding &lt;em&gt;total&lt;/em&gt; programming languages that could actually lead to more robust and dependable software.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the kicker - some people actually advocate for this madness. They&amp;rsquo;ve come up with a seemingly cohesive definition of a programming language, but their motivations for choosing that definition are nothing more than an afterthought. As a result, their definitions are utterly useless, or at the very least, useless to those who couldn&amp;rsquo;t care less about denigrating a language. Can you believe it? What a ridiculous state of affairs!&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;Now, let me be clear, my intention here is not to rally behind &lt;abbr class=&#34;language&#34; title=&#34;Hyper-Text Markup Language&#34;&gt;&lt;a href=&#34;https://html.spec.whatwg.org/&#34;&gt;HTML&lt;/a&gt;&lt;/abbr&gt;
 and extol its virtues. Instead, I aim to shed light on our incessant desire to bestow added significance upon the definition of our work. And, quite frankly, I implore you to put an end to it. You see, a programming language can possess capabilities or be lacking in them, and a programmer may be focused on orchestrating the flow of information or on its presentation. We come in all shapes and forms, each with our unique approaches. Attempting to establish some sort of gatekeeping mechanism in this endeavor will only result in programmers overlooking the fact that they may just require &lt;abbr class=&#34;language&#34; title=&#34;Hyper-Text Markup Language&#34;&gt;&lt;a href=&#34;https://html.spec.whatwg.org/&#34;&gt;HTML&lt;/a&gt;&lt;/abbr&gt;
 and &lt;abbr class=&#34;language&#34; title=&#34;Casscading Style Sheet&#34;&gt;&lt;a href=&#34;https://www.w3.org/TR/CSS/#css&#34;&gt;CSS&lt;/a&gt;&lt;/abbr&gt;
 to fulfill their job requirements. This, in turn, contributes to the sorry state of the web-bloated and disheartening.&lt;/p&gt;
&lt;p&gt;Let us cherish our roles as creators and refrain from placing undue emphasis on the definition of our jobs, but rather, let us focus on the outcomes we produce. After all, we are all creators and problem-solvers at heart.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Consider Developer&#39;s Snack</title>
      <link>https://prma.dev/posts/consider_developers_snack/</link>
      <pubDate>Wed, 21 Jun 2023 11:43:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/consider_developers_snack/</guid>
      <description>Intro During my early 20s, I found myself immersed in the world of sustainable architecture as an architecture student. Engaging in various workshops centered around this field, one particular experience stands out as a monumental turning point in my life. It was a workshop conducted by a renowned professor in Iran, where I gained valuable insights. Within this workshop, we collectively brainstormed strategies to harness heat sources for a four-member family&amp;rsquo;s house, aiming to optimize its thermal efficiency.</description>
      <content>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;During my early 20s, I found myself immersed in the world of sustainable architecture as an architecture student. Engaging in various workshops centered around this field, one particular experience stands out as a monumental turning point in my life. It was a workshop conducted by a renowned professor in Iran, where I gained valuable insights.
Within this workshop, we collectively brainstormed strategies to harness heat sources for a four-member family&amp;rsquo;s house, aiming to optimize its thermal efficiency. We considered a range of possibilities, including solar and geothermal heat, as well as the heat generated by the kitchen oven. However, there was one significant heat source that eluded our attention, as pointed out persistently by the professor.&lt;/p&gt;
&lt;p&gt;Eventually, he provided us with a clue: &amp;ldquo;You seem to have overlooked four 37-degree Celsius heaters.&amp;rdquo; It dawned on us that we had forgotten to factor in the heat generated by the family members themselves. Their body heat, a natural source of warmth, had slipped our minds entirely.&lt;/p&gt;
&lt;p&gt;Reflecting on a more recent occurrence, a certain paper began circulating, comparing the energy usage footprint of different programming languages. Yet, I couldn&amp;rsquo;t help but notice that the discussions surrounding this paper overlooked a crucial aspect-it solely measured the energy footprint at one specific point in the application&amp;rsquo;s lifecycle.&lt;/p&gt;
&lt;p&gt;It is essential to recognize that the energy usage of a programming language extends beyond a mere snapshot analysis. To truly grasp the overall impact, we must consider the entire lifecycle of the application, accounting for factors such as development, deployment, maintenance, and eventual retirement. Only then can we gain a comprehensive understanding of the energy implications associated with different programming languages.&lt;/p&gt;
&lt;h2 id=&#34;the-paper-as-the-thread-we-pull&#34;&gt;The Paper, As The Thread We Pull&lt;/h2&gt;
&lt;p&gt;The paper, titled &amp;ldquo;Energy Efficiency Across Programming Languages,&amp;rdquo; delves into the exploration of various problems and their corresponding solutions, which are implemented across multiple programming languages. The researchers conducted an analysis of the electricity consumption associated with each implementation. In essence, the primary focus of the study revolves around determining the relative energy efficiency of different programming languages, with &lt;a class=&#34;language&#34; href=&#34;https://www.iso.org/standard/74528.html&#34;&gt;C&lt;/a&gt;
 emerging as the most efficient and serving as the benchmark for measurement.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;C      | 01.00 | ▓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Rust   | 01.03 | ▓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Java   | 01.98 | ▓▓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Python | 75.88 | ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Perl   | 79.58 | ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These results carry considerable weight, although it is essential to address a common misconception surrounding their implications. Contrary to popular belief, these findings do not unequivocally assert that a &lt;a class=&#34;language&#34; href=&#34;https://www.iso.org/standard/74528.html&#34;&gt;C&lt;/a&gt;
 program is inherently more environmentally sustainable than its &lt;dfn&gt;Java&lt;/dfn&gt; counterpart.&lt;/p&gt;
&lt;h2 id=&#34;consider-the-snack&#34;&gt;Consider The Snack&lt;/h2&gt;
&lt;p&gt;In the field of sustainability literature, there exists a concept known as &lt;dfn&gt;Life-Cycle Assessment&lt;/dfn&gt;. &lt;abbr
  title=&#34;Life-Cycle Assessment&#34; tabindex=&#34;0&#34;&gt;LCA&lt;/abbr&gt; involves evaluating the environmental impact of a product throughout its entire life cycle, encompassing aspects such as raw material extraction, manufacturing, and disposal or recycling.&lt;/p&gt;
&lt;p&gt;When applying this concept to the assessment of software life cycles, we realize that there are several significant factors that have been overlooked. Allow me to provide some insights on these important considerations.&lt;/p&gt;
&lt;p&gt;Firstly, the authors of the paper have primarily focused on the runtime of a specific set of problems. This means that their applications follow a sequence of starting up, solving the given problem, and then exiting. Consequently, the results obtained are biased towards programming languages that excel at efficient startup and shutdown processes. However, this perspective fails to account for the behavior of servers and long-running processes. Servers, for instance, typically start up once per day or even less frequently and spend extended periods in the computational phase. If a programming language is efficient during the initial startup but requires frequent restarts during runtime, this crucial aspect is overlooked.&lt;/p&gt;
&lt;p&gt;But we shouldn&amp;rsquo;t stop there. Another aspect to consider is compilation. While &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 is indeed an impressive language, its compilation process is significantly more resource-intensive compared to &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
. &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 yields highly efficient binaries, but the energy expended during the compilation process is also considerably higher.&lt;/p&gt;
&lt;p&gt;Furthermore, the improved quality of &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
&amp;rsquo;s compiled binaries becomes relevant when we consider the potential presence of bugs and the subsequent need for recompilation. More permissive compilers may result in programs with a higher likelihood of bugs, necessitating additional rounds of debugging, fixing, and retesting. It&amp;rsquo;s important to acknowledge that this discussion goes beyond the developer&amp;rsquo;s running computer and includes factors such as sustenance needs, energy consumption to support their biological functioning during the process of bug fixing, and the overall impact on the environment.&lt;/p&gt;
&lt;p&gt;Additionally, the continuous deployment or release cycles, repackaging efforts, and the use of &lt;abbr
  title=&#34;Continues Integration&#34; tabindex=&#34;0&#34;&gt;CI&lt;/abbr&gt;/&lt;abbr
  title=&#34;Continues Delivery&#34; tabindex=&#34;0&#34;&gt;CD&lt;/abbr&gt; practices all contribute to the &lt;em&gt;ecological footprint&lt;/em&gt;. Recompilation for each platform targeted, as well as the network costs associated with distributing binaries or source code to different endpoints, also significantly impact the environment.&lt;/p&gt;
&lt;p&gt;The problem of compatibility further compounds the issue. Programming languages with runtimes shipped separately from the package, such as &lt;a class=&#34;language&#34; href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt;
, &lt;a class=&#34;language&#34; href=&#34;https://lua.org/&#34;&gt;Lua&lt;/a&gt;
, and other scripting or &lt;abbr
  title=&#34;Just-In-Time [compilation]&#34; tabindex=&#34;0&#34;&gt;JIT&lt;/abbr&gt; languages, as well as those based on virtual machines like &lt;abbr
  title=&#34;Java Virtual Machine&#34; tabindex=&#34;0&#34;&gt;JVM&lt;/abbr&gt;, often require reprogramming or the inclusion of older runtime versions when breaking changes occur. This adds to the complexity and environmental impact of software development and packaging.&lt;/p&gt;
&lt;p&gt;Furthermore, poorly designed programs can accumulate significant technical debt over time, resulting in rewriting. Although the language and toolchain themselves may not directly cause this, the ecosystem surrounding languages like &lt;abbr class=&#34;language&#34; title=&#34;JS&#34;&gt;&lt;a href=&#34;https://ecma-international.org/publications-and-standards/standards/ecma-262/&#34;&gt;JavaScript&lt;/a&gt;&lt;/abbr&gt;
, &lt;abbr class=&#34;language&#34; title=&#34;PHP: Hypertext Preprocessor&#34;&gt;&lt;a href=&#34;https://www.php.net/&#34;&gt;PHP&lt;/a&gt;&lt;/abbr&gt;
, and &lt;a class=&#34;language&#34; href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt;
   tends to encourage short-term thinking. In contrast, languages like &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
, &lt;a class=&#34;language&#34; href=&#34;https://www.iso.org/standard/74528.html&#34;&gt;C&lt;/a&gt;
, &lt;a class=&#34;language&#34; href=&#34;https://fortran-lang.org/&#34;&gt;Fortran&lt;/a&gt;
, and others that focus on system-level development promote long-term support and are home to projects that have thrived for several decades.&lt;/p&gt;
&lt;p&gt;Moreover, the variability in usage patterns must be taken into account. While languages like &lt;a class=&#34;language&#34; href=&#34;https://www.iso.org/standard/74528.html&#34;&gt;C&lt;/a&gt;
  and &lt;abbr class=&#34;language&#34; title=&#34;C&amp;#43;&amp;#43;&#34;&gt;&lt;a href=&#34;https://isocpp.org/&#34;&gt;Cpp&lt;/a&gt;&lt;/abbr&gt;
 require substantial energy for compilation across different platforms, languages such as &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
, &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
, and &lt;a class=&#34;language&#34; href=&#34;https://www.java.com&#34;&gt;Java&lt;/a&gt;
 mitigate the duplication of energy required to support multiple platforms within a single application.&lt;/p&gt;
&lt;p&gt;Finally, we must consider the energy expended in the development, maintenance, and support of programming languages. Languages like &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 offer remarkable expressive capabilities, not merely due to better timing or superior thinking but also as a result of extensive collaborative efforts. Conversely, languages like &lt;a class=&#34;language&#34; href=&#34;https://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;
 undergo minimal changes over time.&lt;/p&gt;
&lt;p&gt;It is worth emphasizing that the energy required to learn a language, the environmental consequences of mistakes made during coding (e.g., unintentionally sending a million requests to thousands to different servers), variations in energy usage among developers from different countries, and the decreasing lifespan of hardware are all factors that contribute to the overall consideration.&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;The crux of the matter is that complexity pervades these considerations, demanding our thoughtful attention and appropriate mitigation for each aspect. Failing to acknowledge and address each facet places us at risk of optimizing solely for one element while sacrificing the other to the extent of rendering our efforts absurd.&lt;/p&gt;
&lt;p&gt;It is important to note that I have deliberately omitted discussions about post-harm mitigation. Our focus has been on reducing harm itself. Exploring the costs associated with bootstrapping and averting catastrophic scenarios would expand beyond the scope of this essay.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>FLOSS For Software Longevity</title>
      <link>https://prma.dev/posts/floss_for_longevity/</link>
      <pubDate>Wed, 14 Jun 2023 11:26:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/floss_for_longevity/</guid>
      <description>Free/Libre and Open Source Software (FLOSS) is a captivating realm within software development. What makes FLOSS particularly intriguing is its deviation from conventional business goals, leading to planned longevity and a distinct approach to sustainability.
Reasons Let us delve into the unique qualities of FLOSS and the factors that contribute to its better suitability for longevity.
The longevity of the FLOSS business model serves it well The common business models are better suited for short-term goals.</description>
      <content>&lt;p&gt;Free/Libre and Open Source Software (&lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt;) is a captivating realm within software development. What makes &lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt; particularly intriguing is its deviation from conventional business goals, leading to planned longevity and a distinct approach to sustainability.&lt;/p&gt;
&lt;h2 id=&#34;reasons&#34;&gt;Reasons&lt;/h2&gt;
&lt;p&gt;Let us delve into the unique qualities of &lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt; and the factors that contribute to its better suitability for longevity.&lt;/p&gt;
&lt;h3 id=&#34;the-longevity-of-the-business-model-serves-it-well&#34;&gt;The longevity of the &lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt; business model serves it well&lt;/h3&gt;
&lt;p&gt;The common business models are better suited for short-term goals. There are two major approaches: selling or renting.&lt;/p&gt;
&lt;p&gt;Small to mid-sized software companies predominantly prioritize the sale of their products. The concept of product longevity, while acknowledged as necessary, assumes a secondary role rather than being a central objective. Its primary function lies in establishing trust among consumers. Once the initial excitement surrounding the launch of a new and captivating product subsides, these companies swiftly shift their attention to the next innovation. The success of marketing these novel products heavily relies on users&amp;rsquo; fear of missing out and the perceived loss of functionality associated with the previous iteration. Unfortunately, this often leads to the inclusion of unnecessary features, deliberate planning for obsolescence, and resistance against the right to repair. In this cycle, longevity takes a backseat as the perpetual replacement of one product with another takes precedence.&lt;/p&gt;
&lt;p&gt;Conversely, larger companies place a premium on the rental model for software. Instead of users owning the software outright, they opt for subscription-based payment models for continuous usage. One might assume that these companies would prioritize stability to retain their subscribers. However, practical implementation often takes a different route. These companies rely on monopolistic tactics, such as acquiring competitors or launching extensive marketing campaigns to stifle new entrants. In cases where competition persists, they resort to content exclusivity, coercing users to purchase their product alongside competitors&amp;rsquo; offerings. Consequently, users find themselves utilizing these products for prolonged periods not due to their exceptional quality, but rather because they perceive limited alternative options. The subscription model may make sense when paying for a service, but it doesn&amp;rsquo;t align with current software development. Paying subscription for developing and bug-fix of a product is simply paying for the privilege of using an incomplete version of a product.&lt;/p&gt;
&lt;p&gt;In contrast, companies adopting a pay-for-enterprise-support model for open-source products, such as Canonical and Red Hat, exhibit commendable practices. Their primary emphasis lies on longevity. If the software is functioning adequately, their tasks are straightforward, eliminating the need to address the same issue repeatedly for each client. Longevity serves as both their evidence and modus operandi. They provide support for software that has already weathered numerous instabilities. They employ different development stages, such as alpha, unstable, stable, and long-term releases. These features can subsequently be passed on to other distributions with more robust objectives, such as REHL.&lt;/p&gt;
&lt;p&gt;Although these companies may impose charges for bug fixes, their underlying offering revolves around selling stability and longevity (think &lt;em&gt;Ubuntu Pro&lt;/em&gt;). This approach is not driven solely by inherent benevolence but rather stems from a lack of alternatives. They are unable to monopolize a product that can be cloned, forked, and utilized to initiate independent ventures. Nor can they vend software that others can fork, enhance, and sell at higher prices or even distribute for free. Their sole viable course of action entails creating a product that strikes a balance, avoiding both excessive limitations that render it futile and excessive complexity that complicates support.&lt;/p&gt;
&lt;p&gt;However, business is just one piece of the puzzle.&lt;/p&gt;
&lt;h3 id=&#34;engineers-prioritize-quality-over-quantity&#34;&gt;&lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt; engineers prioritize quality over quantity&lt;/h3&gt;
&lt;p&gt;As we discussed, most businesses prioritize product quality only until it reaches a level sufficient for selling.&lt;/p&gt;
&lt;p&gt;This often leads to engineers being pushed and encouraged to develop faster, sacrificing quality and stability when it hinders &amp;ldquo;beating the competition to market.&amp;rdquo; I&amp;rsquo;m sure I&amp;rsquo;m not alone in feeling dissatisfied with creating instant legacy products and leaving behind a trail of subpar, useless software. It leaves no room for pride in one&amp;rsquo;s work.&lt;/p&gt;
&lt;p&gt;As a result, engineers who value quality find satisfaction in other avenues, such as personal projects or contributing to libraries and tools they use themselves.&lt;/p&gt;
&lt;p&gt;The dynamics of development in these situations differ. Open-source software often lacks the same level of resources, making maintainability a crucial concern. Allowing technical debt to accumulate in a project one maintains can result in paying a hefty price, even in a short period. The more users a project has, the more the burden of technical debt becomes apparent-quite the opposite of the industry&amp;rsquo;s &amp;ldquo;move broken things, fast&amp;rdquo; mentality.&lt;/p&gt;
&lt;p&gt;Consequently, successful open-source products tend to have meticulous and uncompromising maintainers.&lt;/p&gt;
&lt;p&gt;Another important aspect to consider is that open-source software greatly enhances one&amp;rsquo;s resume. Similar to a resume, open-source projects showcase an individual&amp;rsquo;s best work. They are like first dates, where you present yourself at your best. Consequently, open-source projects motivate developers to create their finest code and documentation.&lt;/p&gt;
&lt;p&gt;Furthermore, transparency is a vital aspect of open-source projects. Engaging in dubious practices, such as intrusive telemetry, can agitate the surrounding community.&lt;/p&gt;
&lt;p&gt;In summary, there are four main reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The cost of maintainability&lt;/li&gt;
&lt;li&gt;The positive impact on one&amp;rsquo;s resume&lt;/li&gt;
&lt;li&gt;Counteracting the lack of satisfaction caused by lower quality software in daily work&lt;/li&gt;
&lt;li&gt;Embracing transparency&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;exhibits-a-greater-degree-of-diversity-dot&#34;&gt;&lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt; exhibits a greater degree of diversity.&lt;/h3&gt;
&lt;p&gt;When it comes to a biological ecosystem, its resilience stems from the diversity of its members. Let&amp;rsquo;s imagine a scenario involving a moth that feeds on maple tree branches. In a jungle filled with maple trees, the moth can feast and reproduce endlessly. However, there&amp;rsquo;s a twist.&lt;/p&gt;
&lt;p&gt;Around 10% of the maple trees have developed a variation of their membrane that is toxic to the moth, purely by chance. Now, if the moth tries to feed on these trees, it has a 1 in 10 chance of being fatally poisoned. If there were only a single moth, it would be the end of its lineage. However, imagine a population of 100 moths, and 10% of them have accidentally developed immunity. These &amp;ldquo;super moths&amp;rdquo; may be larger and more resistant to the trees, but they are also more visible to predators like birds. And so, the cycle continues.&lt;/p&gt;
&lt;p&gt;The diversity of approaches within a biological ecosystem is crucial. In the context of biological beings, the exchange of random sets of genes through sexual reproduction likely emerged as a means to enhance resilience. Microbes that prey on others, on the other hand, face a more challenging situation, as the result.&lt;/p&gt;
&lt;p&gt;These advantageous mechanisms resulting from diversity are also present in the software ecosystem.&lt;/p&gt;
&lt;p&gt;The needs and threats faced by a server differ from those faced by a German student&amp;rsquo;s laptop. While Linux is ubiquitous in the open-source desktop realm, there are numerous slightly different Linux distributions available. These variations encompass different themes, preinstalled applications, package managers, and even packaging architecture models. Additionally, there are kernels compiled with different flags and versions.&lt;/p&gt;
&lt;p&gt;Given this remarkable diversity, it comes as little astonishment that Microsoft&amp;rsquo;s ardent campaign during the 2000s against the comparably youthful, less cohesive, and resource-limited Linux met with abysmal failure. Strikingly, in a twist of events, Microsoft has lately unveiled its very own Linux distribution and dedicated years to crafting the Windows Subsystem for Linux.&lt;/p&gt;
&lt;p&gt;To the proprietary realm, an ecosystem characterized by the development, redesign, and forking of diverse products, yielding a multitude of solutions, may appear inherently inefficient. Yet, from the perspective of permaculture and PermaComputing, such an ecosystem manifests as nothing short of utopia.&lt;/p&gt;
&lt;h3 id=&#34;demonstrates-a-higher-level-of-robustness&#34;&gt;&lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt; demonstrates a higher level of robustness&lt;/h3&gt;
&lt;p&gt;&lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt; transcends being a mere generator of independent variations that begin anew each time. It represents a system where progress builds upon existing foundations, with each subsequent layer amplifying the importance of the underlying ones. Irrespective of how many stories above the ground one ascends, the ground level remains a paramount concern if its integrity is jeopardized. Prominent examples of this phenomenon can be observed in projects like curl, the kernel, and OpenSSL. Although these initiatives were initially initiated by individuals, they have evolved into integral components of numerous other undertakings. The driving force compelling many individuals to contribute to these projects stems from the realization that the cost of abstaining from participation would be significantly greater.&lt;/p&gt;
&lt;p&gt;However, it is important to recognize that this process is not always pleasant. Consider the immense pressure on OpenSSL developers. If they were to become overwhelmed and exhausted like many other open-source maintainers, the consequences could be significant.&lt;/p&gt;
&lt;p&gt;Yet, when such challenges arise (and they do), we all become aware of them. We sense the danger and collectively strive to find solutions. This is in stark contrast to the situation when a proprietary software developer abandons a company. Until a replacement is found, users are left unaware and vulnerable to potential security threats posed by malicious hackers.&lt;/p&gt;
&lt;p&gt;Thanks to this collective effort and attention to robustness, many foundational open-source software programs have remained the best tools for the job even after decades of use.&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;Now, esteemed reader, I trust you comprehend the rationale behind why individuals with a penchant for enduring solutions find the realm of &lt;abbr
  title=&#34;Free/Libre and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FLOSS&lt;/abbr&gt; far more fertile than its alternatives.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Go Vs Rust readability</title>
      <link>https://prma.dev/posts/go_vs_rust_readability/</link>
      <pubDate>Fri, 14 Apr 2023 23:49:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/go_vs_rust_readability/</guid>
      <description>Traditionally speaking, Go and Rust are not direct competitors on many fronts. Each take different trade-offs. But more often than not, you might need to choose one over the other. It is compared in the niche the other fails. Like low-level system development, which Rust easily rules. Or maybe dev-ops tooling which Go is easily good at it.
However, there are many overlaps in their use case. Think high-performance web-servers. In those spaces, we should compare other things.</description>
      <content>&lt;p&gt;Traditionally speaking, &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 and &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 are not direct competitors on many fronts. Each take different trade-offs. But more often than not, you might need to choose one over the other. It is compared in the niche the other fails. Like low-level system development, which &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 easily rules. Or maybe dev-ops tooling which &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 is easily good at it.&lt;/p&gt;
&lt;p&gt;However, there are many overlaps in their use case. Think high-performance web-servers. In those spaces, we should compare other things. Like readability and maintainability of language. In this post, I want to share my thoughts on readability.&lt;/p&gt;
&lt;h2 id=&#34;tl-dr&#34;&gt;Tl;DR&lt;/h2&gt;
&lt;p&gt;&lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 is not less maintainable than &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 because &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 is less readable.&lt;/p&gt;
&lt;h2 id=&#34;what-i-do-not-disagree-with&#34;&gt;What I do not disagree with&lt;/h2&gt;
&lt;p&gt;Just to be clear, although I&amp;rsquo;m making a case for &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 and arguing that readability should not be as much concern, I would like to make clear that I&amp;rsquo;m not arguing against these common-sense statements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 is more readable.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 has less overhead for people with no previous experience with language.&lt;/li&gt;
&lt;li&gt;Readability is generally what you want.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;why-readability-is-good&#34;&gt;Why readability is good&lt;/h2&gt;
&lt;p&gt;English is more readable than any programming language. However, readability is not the only measure that we are using for chosing a language.&lt;/p&gt;
&lt;p&gt;Readability and clearity are not inherently good, rather it is a proxy for something else we value: A readable code helps us understand the flow of information in order to &lt;strong&gt;understand its logic&lt;/strong&gt;, &lt;strong&gt;capture its bugs&lt;/strong&gt; and &lt;strong&gt;extend it&lt;/strong&gt;, easier. A line of code is read in many situations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I want to find out how a piece of code can give rise to a specific runtime bug.&lt;/li&gt;
&lt;li&gt;I want to audit it to see if it exposes any specific vulnerability, data-race, etc.&lt;/li&gt;
&lt;li&gt;I want to add features to it, and I want to know where and how I should plug the new functionality to.&lt;/li&gt;
&lt;li&gt;I want to make a code more robust, document it and make it more available for other people by refactoring it.&lt;/li&gt;
&lt;li&gt;I want to review the code of my colleague to see if a set of fresh eyes could capture a new bug, or an inconsistent styling with the rest of the codebase.&lt;/li&gt;
&lt;li&gt;I want to understand what a code base does. Maybe I&amp;rsquo;m trying to see if a  software is spying on me, or maybe I&amp;rsquo;m trying to understand the way it calculated my taxes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These are all noble pursuits. And in all these cases, readability is vital in preventing disasters and better experience in onboarding others.
&lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
&amp;rsquo;s readability is probably one of its best features. At my current and previous jobs, I have had to jump into different code bases with different levels of legacy and problematic codebases where junior developers with no-idea of idiomatic ways of coding &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 left their projects without any context for the next developer.
Such low quality codes should take forever for one to decode. However, because of the beautifully simple syntax of &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
, I could start to be productive and sending PRs in less than a day. Have you seen a codebase where all the back-end code was coded by a narcissistic lone-wolf meth-addict? Well, I have, and it&amp;rsquo;s an absolute shit-show. Yet, I committed my first edits in 3 hours. &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 is excellent at that. And I can understand how a huge tech company with very quick employee turn-over can give rise to such language. Kudos to the &lt;a class=&#34;language&#34; href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt;
 team.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Moving in Rust is Pure</title>
      <link>https://prma.dev/posts/moving_is_pure/</link>
      <pubDate>Sun, 09 Apr 2023 10:44:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/moving_is_pure/</guid>
      <description>The act of moving arguments within Rust &amp;rsquo;s functions serves as a compelling means to uphold the purity of the function. By embracing this practice, we ensure that the function operates on unique ownership of its inputs, preserving the integrity and immutability of data, which are fundamental tenets of functional programming.
Moving a Variable to a Function in Rust Doesn&amp;rsquo;t Make It Impure So as an introduction, if you don&amp;rsquo;t know Rust .</description>
      <content>&lt;p&gt;The act of moving arguments within &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
&amp;rsquo;s functions serves as a compelling means to uphold the &lt;em&gt;purity&lt;/em&gt; of the function. By embracing this practice, we ensure that the function operates on unique ownership of its inputs, preserving the integrity and &lt;em&gt;immutability&lt;/em&gt; of data, which are fundamental tenets of &lt;em&gt;functional programming&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;moving-a-variable-to-a-function-in-doesn-t-make-it-impure&#34;&gt;Moving a Variable to a Function in &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 Doesn&amp;rsquo;t Make It Impure&lt;/h2&gt;
&lt;p&gt;So as an introduction, if you don&amp;rsquo;t know &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;In &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
, we have this concept of &lt;em&gt;moving&lt;/em&gt; variables. It is like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//  A variable is made.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; a_variable = some_value;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// It moves into this function.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;_ = a_function_that_takes_ownership(a_variable);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// We cannot use a_variable anymore! So, we cannot do this!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; b_variable = a_variable;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now I consider &lt;code&gt;a_function_that_takes_ownership&lt;/code&gt; to be a &lt;em&gt;pure function&lt;/em&gt;. However, it raises a possible confusion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Doesn&amp;rsquo;t a_function_that_takes_ownership change the state of the outer function? Isn&amp;rsquo;t that a side effect?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I argue that it doesn&amp;rsquo;t. Here is why: a function is not a function call. Ok. let&amp;rsquo;s visualize it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ________outer_function_______
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--in-&amp;gt;|       __inner_f___        |-out-&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      | -in-&amp;gt; |          | -out-&amp;gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      |       ------------        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      -----------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So we have two functions. One outer, and one inner.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each function should have inputs and an output.&lt;/li&gt;
&lt;li&gt;Other than their outputs, they should not change anything outside their function space.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If these conditions are not met, our function is not &lt;em&gt;pure&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&#34;step-1&#34;&gt;Step 1&lt;/h3&gt;
&lt;p&gt;Now consider a variable &lt;code&gt;[V]&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      _____________________________
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----&amp;gt;| [v]   ____________        |-----&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      | ----&amp;gt; |          | -----&amp;gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      |       ------------        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      -----------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-2&#34;&gt;Step 2&lt;/h3&gt;
&lt;p&gt;With our outer function, we create a function call for the inner function.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      _____________________________
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----&amp;gt;|       ____________        |-----&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      | [v]-&amp;gt; |          | -----&amp;gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      |       ------------        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      -----------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-3&#34;&gt;Step 3&lt;/h3&gt;
&lt;p&gt;It is no longer in the state space of the outer function. The inner function takes &lt;em&gt;ownership&lt;/em&gt; of it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      _____________________________
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-----&amp;gt;|       ____________        |-----&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      | ----&amp;gt; |   [v]    | -----&amp;gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      |       ------------        |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      -----------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Semantically, for the outer function &lt;code&gt;[v]&lt;/code&gt; was used in the function call and then dropped. Which does not violate our rules. For the inner function, it just got an input and returns an output. So it makes sematic sense.&lt;/p&gt;
&lt;p&gt;In practice, it also makes the same guarantees as any other &lt;em&gt;pure function&lt;/em&gt;: - No null pointers. - No &lt;em&gt;mutable state&lt;/em&gt;. - No &lt;em&gt;side effects&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If the caller &lt;code&gt;.clone()&lt;/code&gt; our value and make a copy of it and pass that to the inner function, it provides us with no other guarantees, other than more memory usage and slightly longer code.&lt;/p&gt;
&lt;h2 id=&#34;why-does-it-matter&#34;&gt;Why does it matter?&lt;/h2&gt;
&lt;p&gt;Well, Honestly, it doesn&amp;rsquo;t. I just had to decide if in a &lt;em&gt;pure function&lt;/em&gt; I can consume a self, if I want to make it a &lt;em&gt;pure function&lt;/em&gt;, considering that I cannot make it &lt;em&gt;const&lt;/em&gt;. This was my thinking output. Now you are the outer function.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Pure Rust</title>
      <link>https://prma.dev/posts/pure_rust/</link>
      <pubDate>Sat, 25 Mar 2023 22:36:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/pure_rust/</guid>
      <description>If you are not familiar with Functional Programming FP, you are in for a ride. I will try to explain FP in more practical terms.
A definition to work with FP is a declarative way of writing a program that consists mostly of pure functions that operate on and produce immutable data. That was many other unfamiliar words. Let&amp;rsquo;s make it concrete.
Making it more concrete Here is a function in Rust that we will work on:</description>
      <content>&lt;p&gt;If you are not familiar with Functional Programming &lt;abbr
  title=&#34;Functional Programming&#34; tabindex=&#34;0&#34;&gt;FP&lt;/abbr&gt;, you are in for a ride.
I will try to explain &lt;abbr
  title=&#34;Functional Programming&#34; tabindex=&#34;0&#34;&gt;FP&lt;/abbr&gt; in more practical terms.&lt;/p&gt;
&lt;h2 id=&#34;a-definition-to-work-with&#34;&gt;A definition to work with&lt;/h2&gt;
&lt;p&gt;&lt;abbr
  title=&#34;Functional Programming&#34; tabindex=&#34;0&#34;&gt;FP&lt;/abbr&gt; is a &lt;dfn&gt;declarative&lt;/dfn&gt; way of writing a program that consists mostly of &lt;em&gt;pure functions&lt;/em&gt; that operate on and produce &lt;em&gt;immutable data&lt;/em&gt;.
That was many other unfamiliar words. Let&amp;rsquo;s make it concrete.&lt;/p&gt;
&lt;h2 id=&#34;making-it-more-concrete&#34;&gt;Making it more concrete&lt;/h2&gt;
&lt;p&gt;Here is a function in &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
 that we will work on:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// Calling `calculate_my_lateness` seems like magic.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// We don&amp;#39;t know how it calculates it, and why it is doing that.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; status: &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  calculate_my_lateness(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; status);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// This sometimes crashes and sometimes, it does not.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;  assert_eq!(status, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// The point of this function is to tell us if we are late
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// Ask yourself, how would you write a test for such a function?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;calculate_my_lateness&lt;/span&gt;(status: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; current_time = std::time::SystemTime::now();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; expected_time = std::time::SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    status = current_time &amp;lt;= date_time;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, let&amp;rsquo;s make it &lt;em&gt;pure&lt;/em&gt; and while we are at it, we introduce &lt;em&gt;pure functions&lt;/em&gt; and some principles as well.&lt;/p&gt;
&lt;h3 id=&#34;pure-functions-return-at-least-one-output&#34;&gt;Pure functions return at least one output&lt;/h3&gt;
&lt;p&gt;That means that if you have a function named &lt;code&gt;some_function&lt;/code&gt;, you will have at least one argument &lt;code&gt;some_input&lt;/code&gt; and it will return at least one output &lt;code&gt;some_output&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;some_function&lt;/span&gt;(some_input) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;some_output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Why do we do this? When we are calling a function, we are expecting &lt;span class=&#34;underline&#34;&gt;something&lt;/span&gt; to happen.
In &lt;abbr
  title=&#34;Functional Programming&#34; tabindex=&#34;0&#34;&gt;FP&lt;/abbr&gt; world, the only acceptable &lt;em&gt;something&lt;/em&gt; is an output argument.
A lack of output is &lt;em&gt;symptomatic&lt;/em&gt; of one of these two unacceptable situations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Our function does nothing&lt;/strong&gt;. In which case, why are we even bothering to write it at all?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Our function is doing a side effect&lt;/strong&gt;. Which means that it is changing something other than what is inside the function.
These functions don&amp;rsquo;t let us know or control what they are doing inside, without making us look at the source code.
We will get back to this throughout this post.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Please note the emphasis on &lt;em&gt;symptomatic&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s make it return the output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; status: &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; output = calculate_my_lateness(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; status);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//--^^^^^^------------ we have an output now
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  assert_eq!(output, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//---------^^^^^^----- which we use here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;calculate_my_lateness&lt;/span&gt;(status: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//-notice that we are returning something--^^^^--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; current_time = std::time::SystemTime::now();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; expected_time = std::time::SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    status = current_time &amp;lt;= date_time;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    status &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// &amp;lt;- what we are returning
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;pure-functions-don-t-mutate-state&#34;&gt;Pure functions don&amp;rsquo;t mutate state&lt;/h3&gt;
&lt;p&gt;As I mentioned before, a function does something when it returns something and changes the state of something outside itself.
We call that a &lt;dfn&gt;side-effect&lt;/dfn&gt;.
You may have noticed that our function takes a mutable variable of type &lt;code&gt;bool&lt;/code&gt; and changes it.
In our first iteration of the function, we needed it. But now, we grew out of it. So let&amp;rsquo;s just delete it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// let mut status: bool;  &amp;lt;- we don&amp;#39;t need this
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; output = calculate_my_lateness();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//--------------------------------^ we don&amp;#39;t need to take status any more
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  assert_eq!(output, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;calculate_my_lateness&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//------------------^^- we don&amp;#39;t need to take a mutable variable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; current_time = std::time::SystemTime::now();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; expected_time = std::time::SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current_time &amp;lt;= date_time &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//  &amp;lt;- what we are returning
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now isn&amp;rsquo;t this better? When I call &lt;code&gt;calculate_my_lateness()&lt;/code&gt;
I&amp;rsquo;m not worried about the function changing anything it&amp;rsquo;s not supposed to anymore.
Let&amp;rsquo;s move on.&lt;/p&gt;
&lt;h3 id=&#34;pure-functions-return-output-only-based-on-their-argument&#34;&gt;Pure functions return output only based on their argument&lt;/h3&gt;
&lt;p&gt;Which means that when I call &lt;code&gt;calculate_my_lateness()&lt;/code&gt;, I should not expect it to do something different each time I run it.
Why is that? There are two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Transparency&lt;/strong&gt;: You should know what parameters change the output of a function, without needing to reading the function body.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing&lt;/strong&gt;: It is hell of a lot easier to test a function that you can just control without needing to change the time of your computer. Won&amp;rsquo;t you say?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let&amp;rsquo;s do it in two steps this time.&lt;/p&gt;
&lt;h4 id=&#34;step-one-don-t-use-global-variables&#34;&gt;Step one: Don&amp;rsquo;t use global variables&lt;/h4&gt;
&lt;p&gt;you may have noticed &lt;code&gt;SOME_SPECIFIED_TIME&lt;/code&gt;.
This is a variable we use to make a &lt;code&gt;SystemTime&lt;/code&gt; which we compare current time with to know if we are late or not.
The problem here is these two:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We need to write a new function, each time we have a new meeting.&lt;/li&gt;
&lt;li&gt;We also don&amp;rsquo;t know what time current time is being compared to, unless we first read the function, and then find out what it uses as &lt;code&gt;SOME_SPECIFIED_TIME&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;!--listend--&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; output = calculate_my_lateness(SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//---------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// now the caller is supposed to provide the time
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  assert_eq!(output, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;calculate_my_lateness&lt;/span&gt;(late_as_of: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//-------------------^^^^^^^^^^^^^^^^^^^^^^-----------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; current_time = std::time::SystemTime::now();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current_time &amp;lt;= late_as_of
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;step-two-don-t-use-functions-with-side-effects-inside-your-function&#34;&gt;Step Two: don&amp;rsquo;t use functions with side effects inside your function&lt;/h4&gt;
&lt;p&gt;Imagine that you have a non-alcoholic drink, if you add another non-alcoholic drink to it, it is still non-alcoholic.
But if you add an alcoholic drink to it, it will not remain non-alcoholic anymore.
A pure function is only pure, if all the functions that are being called in it, are pure.
And &lt;code&gt;std::time:SystemTime::now()&lt;/code&gt; is definitely not pure.
Now, at some point we need to get the current time, but we don&amp;rsquo;t need to do that where it is hidden from the caller.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; output = calculate_my_lateness(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   SystemTime::now(),&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//&amp;lt;------ we provide the time
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;  );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  assert_eq!(output, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;calculate_my_lateness&lt;/span&gt;(late_as_of: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;, target_time: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt; ) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//-------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^-----------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    target_time &amp;lt;= late_as_of
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now the nice thing here is that we can easily test this function now!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// main and calculate_my_lateness are not shown here. Don&amp;#39;t be alarmed.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[cfg(test)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;tests&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;super&lt;/span&gt;::calculate_my_lateness;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; std::time::SystemTime;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[test]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;being_late_works&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; res = calculate_my_lateness(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;A_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;A_TIME_THAT_IS_AFTER_LATE_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        assert_eq!(res, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[test]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;being_early_works&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; res = calculate_my_lateness(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;A_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;A_TIME_THAT_IS_BEFORE_LATE_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        assert_eq!(res, &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Imagine doing this with the first function!&lt;/p&gt;
&lt;h4 id=&#34;one-more-step&#34;&gt;One more step&lt;/h4&gt;
&lt;p&gt;OK, I lied&amp;hellip; Somewhat. Have you noticed the one glaring, lack of transparency and control here?
It&amp;rsquo;s the &lt;code&gt;&amp;lt;=&lt;/code&gt;. You may need to read the function here, if you have this simple question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I call the function exactly, at the precise moment that I specified to be &lt;code&gt;late_as_of&lt;/code&gt;, will return true, or false?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, not answering this question using the function signature,won&amp;rsquo;t make my function less pure,but still, it is a much nicer experience for the caller to be able to rely on their IDE&amp;rsquo;s autocomplete to tell them what happens.But how the hell should we do that? Easy! We take a comparator function as input!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; output = calculate_my_lateness(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   SystemTime::now(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   |late, target| target &amp;gt; late, &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// here the caller passes the function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;                                                 &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// you can also provide a few different functions yourself to make it easier for the caller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;  );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  assert_eq!(output, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;calculate_my_lateness&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    late_as_of: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    target_time: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    comparer: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;fn&lt;/span&gt;(SystemTime, SystemTime) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;, &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// magic happens here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    comparer(late_as_of, target_time)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now the caller is providing us we have everything we need. We did not hide one single thing.&lt;/p&gt;
&lt;h3 id=&#34;isn-t-this-just-more-work-for-caller&#34;&gt;Isn&amp;rsquo;t this just more work for caller?&lt;/h3&gt;
&lt;p&gt;Well, yes. Yes, it is&amp;hellip; if calling functions without understanding them is the only work that the caller of our function is doing.
Otherwise, our caller knows everything they need using their language server, can change everything they need, have the assurance of our tests and don&amp;rsquo;t need to crawl through our source code, and they will face much fewer bugs where they don&amp;rsquo;t know where it came from.
It may seem unnecessary for this simple function, but imagine much more complex functions.&lt;/p&gt;
&lt;h2 id=&#34;making-things-nicer-a-spicy-problem&#34;&gt;Making things nicer: A spicy problem&lt;/h2&gt;
&lt;p&gt;So we have all this power and transparency.
But the elephant is in it room: We have a very shitty &lt;abbr
  title=&#34;Application Programming Interface&#34; tabindex=&#34;0&#34;&gt;API&lt;/abbr&gt;.
Let&amp;rsquo;s make it nicer using a technique called &lt;dfn&gt;currying&lt;/dfn&gt; (hence the &amp;ldquo;spicy&amp;rdquo; pun).
What it means is: as well as taking functions as argument, we can return functions.
That way, our &lt;code&gt;calculate_my_lateness&lt;/code&gt; function can become a function-maker.
Let me make it more concrete.&lt;/p&gt;
&lt;h3 id=&#34;consider-the-use-case&#34;&gt;Consider the use case&lt;/h3&gt;
&lt;p&gt;Let us suppose that we want to find time in our list of times that is not late.
Currently, we have to call the whole function, repeatedly, and include every argument.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// we are in main, don&amp;#39;t be alarmed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; output_time1 = calculate_my_lateness(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;FIRST_TIME&lt;/span&gt;), &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//&amp;lt;------ we provide the time
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    |late, target| target &amp;gt; late,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; output_time2 = calculate_my_lateness(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SECOND_TIME&lt;/span&gt;), &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//&amp;lt;------ we provide the time
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    |late, target| target &amp;gt; late,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; output_time3 = calculate_my_lateness(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;THIRD_TIME&lt;/span&gt;), &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//&amp;lt;------ we provide the time
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    |late, target| target &amp;gt; late,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// etc...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is not great.
Here, We can just make a function that only takes our target time.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;calculate_my_lateness&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    late_as_of: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// target_time: SystemTime &amp;lt;------------ we don&amp;#39;t need to take this argument anymore
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    comparer: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;fn&lt;/span&gt;(late_as_of: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;, target_time: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;fn&lt;/span&gt;(target_time: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---- notice that we are now returning a function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    |target_time: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SystemTime&lt;/span&gt;| -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt; { comparer(target_time, late_as_of) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//^^^^^^^^^^^^^^^^^^^^^^           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//         |                this is where the calculation of lateness happens
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// we are taking target time here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You might ask, &amp;ldquo;well, how does this help?&amp;rdquo;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// we are in  main
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// now our late_before_time_x is not of type bool,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// rather it is of type Fn(SystemTime) -&amp;gt; bool
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; late_before_time_x = calculate_my_lateness(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SystemTime::from(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SOME_SPECIFIED_TIME&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    |late, target| target &amp;gt; late,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// So we can just:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; first_result = late_before_time_x(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;FIRST_TIME&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; second_result = late_before_time_x(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;SECOND_TIME&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; third_result = late_before_time_x(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;THIRD_TIME&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// ...much less boilerplate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;why-const-just-won-t-do&#34;&gt;Why &lt;code&gt;const&lt;/code&gt; just won&amp;rsquo;t do&lt;/h3&gt;
&lt;p&gt;Veteran rustaceans among the readers of this blog might ask: &amp;ldquo;why not just use &lt;code&gt;const&lt;/code&gt; to mark that functions are pure?&amp;rdquo;
Well dear veteran, if you can make a function &lt;code&gt;const&lt;/code&gt;, do every one a favor and actually do it.
In fact, I regularly use &lt;code&gt;clippy::missing_const_for_fn&lt;/code&gt; lint and suggest you to use it as well.
But that does not guarantee that our functions are pure, or that every pure function can be &lt;code&gt;const&lt;/code&gt;.
Here are my reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;const&lt;/code&gt; functions can take &lt;code&gt;&amp;amp;mut something&lt;/code&gt; as their arguments. Taking mutable references is definitely not very pure-function-y.&lt;/li&gt;
&lt;li&gt;You cannot &lt;code&gt;const&lt;/code&gt; trait methods in stable &lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
, as of now. And considering that every function call inside a &lt;code&gt;const&lt;/code&gt; function should be &lt;code&gt;const&lt;/code&gt; as well, you are extremely limited, without any reasons that have to do with pure functions.&lt;/li&gt;
&lt;li&gt;Many libraries don&amp;rsquo;t to use &lt;code&gt;const&lt;/code&gt; on the functions that are &lt;code&gt;const&lt;/code&gt;. Again, limitation without pureness reasons.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;making-things-declarative&#34;&gt;Making things declarative&lt;/h2&gt;
&lt;p&gt;There is this often repeated old joke that says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There two hard problems in programming&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cache invalidation&lt;/li&gt;
&lt;li&gt;Naming things&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;ndash; &lt;a href=&#34;https://prma.dev/person/phil_karlton&#34;&gt;Phil Karlton&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And here we are concerned with the second one.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;imperative&lt;/strong&gt; universe, we usually name our functions using &lt;em&gt;verbs&lt;/em&gt;. Think &lt;code&gt;calculate_my_lateness&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;declarative&lt;/strong&gt; universe we are concerned with our output, we use &lt;em&gt;nouns&lt;/em&gt;. Think &lt;code&gt;lateness_calculator&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes the intent of our function clear.
How it is implemented under-the-hood is not what matters to the caller.
They only care about what they get out of it.
If you now are thinking that you cared about that part before, consider the things that we just can answer by seeing the arguments that our function takes.
We don&amp;rsquo;t need to rely on our function name anymore to tell use how the function is calculating lateness.
We only need to know what it&amp;rsquo;s intention is.&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;In this post, I just preferred to focus on the heart of &lt;abbr
  title=&#34;Functional Programming&#34; tabindex=&#34;0&#34;&gt;FP&lt;/abbr&gt;: &lt;em&gt;pure declarative functions&lt;/em&gt;.
However, functional programming brings with it a set of extremely useful tools, patterns, etc. most well known are &lt;em&gt;iterators&lt;/em&gt;, &lt;em&gt;maps&lt;/em&gt;, &lt;em&gt;folds&lt;/em&gt;, &lt;em&gt;filters&lt;/em&gt;, etc.
Honestly, they are well explained in other resources. My only suggestion would be to check out &lt;a href=&#34;https://docs.rs/itertools/latest/itertools/&#34;&gt;itertools&lt;/a&gt; crate.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Hachyderm or Fosstodon</title>
      <link>https://prma.dev/posts/hachyderm_or_fosstodon/</link>
      <pubDate>Fri, 25 Nov 2022 22:17:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/hachyderm_or_fosstodon/</guid>
      <description>Ever since I have moved to the mastodon platform after the great twitter migration. I was curious about two main instances. One being Fosstodon, an instance oriented around FOSS, another being Hachyderm, an instance that introduces itself as social media for technical professionals.
Eventualy, I decided to go with Fosstodon, as I liked what I was seeing there more. But I couldn&amp;rsquo;t put my finger on what it was that I liked more about Fosstodon, even though many of my favorite people resided on Hachyderm, the instance owner of the Hachyderm herself, being one examples.</description>
      <content>&lt;p&gt;Ever since I have moved to the mastodon platform after &lt;em&gt;the great twitter migration&lt;/em&gt;. I was curious about two main instances.
One being &lt;a href=&#34;https://fosstodon.org&#34;&gt;Fosstodon&lt;/a&gt;, an instance oriented around  &lt;abbr
  title=&#34;Free and Open Source Software&#34; tabindex=&#34;0&#34;&gt;FOSS&lt;/abbr&gt;, another being &lt;a href=&#34;https://hachyderm.io&#34;&gt;Hachyderm&lt;/a&gt;, an instance that introduces itself as social media for technical professionals.&lt;/p&gt;
&lt;p&gt;Eventualy, I decided to go with Fosstodon, as I liked what I was seeing there more.
But I couldn&amp;rsquo;t put my finger on what it was that I liked more about Fosstodon, even though many of my favorite people resided on Hachyderm, the instance owner of the Hachyderm herself, being one examples.&lt;/p&gt;
&lt;h2 id=&#34;initial-theories&#34;&gt;Initial Theories&lt;/h2&gt;
&lt;p&gt;Initially I thought Hachyderm was more business-oriented. It seemed that people on Hachyderm were more interested about talking about broader technologies like &lt;em&gt;kubernetes&lt;/em&gt; and &lt;em&gt;docker&lt;/em&gt;, while at the same time there was a lot of talk about codes and &lt;em&gt;programming practices&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I thought maybe all the programmers on Hachyderm are working with more proprietory and enterprise solutions and as such they were less likely to share details of their daily programming.&lt;/p&gt;
&lt;p&gt;But that theory didn&amp;rsquo;t hold true, as there was as much toots in my timeline on Fosstodon about bussiness related stuff as there was on Hachyderm.&lt;/p&gt;
&lt;p&gt;Until last night that I realized that maybe what I was seeing was the difference of ideas between operations interested people vs people involved in developing software. And as a backend-developer, I could see more relevant content from the development side.&lt;/p&gt;
&lt;p&gt;So I set to examine my assumptions.
Like a good &lt;a href=&#34;https://www.lesswrong.com/tag/bayes-theorem&#34;&gt;Bayesian&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;apis-searches-and-methods&#34;&gt;APIs, Searches and Methods&lt;/h2&gt;
&lt;p&gt;to start with, I looked into different websites that could help me search per-instance results.
That way I could search differnet keywords in each instance and compare the results.
However I could not find such a thing. Every search engine I tried lacked the ability of filtering by instance.&lt;/p&gt;
&lt;p&gt;After that, I looked into the Mastodon &lt;abbr
  title=&#34;Application Programming Interface&#34; tabindex=&#34;0&#34;&gt;API&lt;/abbr&gt;s myself.
Long-story short, I found &lt;a href=&#34;https://docs.joinmastodon.org/methods/timelines/#tag&#34;&gt;timeline API&lt;/a&gt; to be particularly useful:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;GET&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;/api/v1/timelines/tag/:hashtag&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;HTTP&lt;/span&gt;/1.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using this I could get a list of toots in &lt;abbr
  title=&#34;JavaScript Object Notation&#34; tabindex=&#34;0&#34;&gt;JSON&lt;/abbr&gt; format that had specific hashtags.
And then filter those results to only get the actual url.
I used &lt;code&gt;curl&lt;/code&gt; to make &lt;abbr
  title=&#34;Application Programming Interface&#34; tabindex=&#34;0&#34;&gt;API&lt;/abbr&gt; requests and &lt;code&gt;jq&lt;/code&gt; to filter-out the keys I was not interested in.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/container?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then, I had to filter out results that were not from Hachyderm or Fosstodon. And Sort each
For filtering 
 was perfect, and then for sorting the &lt;code&gt;sort&lt;/code&gt; command is good enough.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;awk &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;/fosstodon|hachyderm/ {print $0}&amp;#39;&lt;/span&gt; hash.json | sort &amp;gt; res-ops
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I just had to come up with a few keywords that I could associate more with operations and a few for development.&lt;/p&gt;
&lt;div class=&#34;note&#34;&gt;
&lt;p&gt;As you may have noticed, my methodoloy is hardly scientific and and extremly relient on subjective definitions.
My goal was to find a good-enough-for-my-decision result. Not anything more.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I ended up with these words on differnt sides:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operations&lt;/th&gt;
&lt;th&gt;Development&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;td&gt;Refactor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montioring&lt;/td&gt;
&lt;td&gt;Debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;Greenfield&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container&lt;/td&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;td&gt;Compiler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deploy&lt;/td&gt;
&lt;td&gt;Interpreter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Baremetal&lt;/td&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vm&lt;/td&gt;
&lt;td&gt;Ide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin&lt;/td&gt;
&lt;td&gt;Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;DesignPatterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_&lt;/td&gt;
&lt;td&gt;LSP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_&lt;/td&gt;
&lt;td&gt;&lt;a class=&#34;language&#34; href=&#34;https://nodejs.org/en&#34;&gt;NodeJS&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_&lt;/td&gt;
&lt;td&gt;&lt;a class=&#34;language&#34; href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_&lt;/td&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The differnece in their numbers are not important to us, only the proportions of the results of each may be relevant.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;The eventual code looks like this.&lt;/summary&gt;
&lt;div class=&#34;details&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#! /usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# this part gives us a file with results of the OPs-related keywords&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/kubernetes?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/docker?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/container?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/operations?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/terraform?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/deploy?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/baremetal?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/vm?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/monitoring?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/admin?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/server?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;awk &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;/fosstodon|hachyderm/ {print $0}&amp;#39;&lt;/span&gt; hash.json | sort &amp;gt; res-ops &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# this part gives us a file with results of the Devs-related keywords&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/develop?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/refactor?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/greenfield?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/framework?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/compiler?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/interpreter?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/testing?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/ide?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/library?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/development?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/designpatterns?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/lsp?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/nodejs?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/rust?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/auth?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;https://hachyderm.io/api/v1/timelines/tag/debuggin?&amp;amp;limit=1000&amp;#39;&lt;/span&gt; | jq &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;.[].url&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; hash.json &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;awk &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;/fosstodon|hachyderm/ {print $0}&amp;#39;&lt;/span&gt; hash.json | sort &amp;gt; res-develop &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm hash.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&#34;the-result&#34;&gt;The Result&lt;/h2&gt;
&lt;p&gt;On the ops query we have &lt;code&gt;32&lt;/code&gt; toots from Fosstodon and &lt;code&gt;44&lt;/code&gt; toots from Hachyderm.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Fosstodon ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hachyderm ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So far Hachyderm seems to have more activity with Operations related hashtags.
On the other hand it could be that people on Hachyderm are generally more talkative than Fosstodon about every part of the stack.
So let&amp;rsquo;s hold development as the control.&lt;/p&gt;
&lt;p&gt;On the development queries we have &lt;code&gt;49&lt;/code&gt; results from Fosstodon and &lt;code&gt;24&lt;/code&gt; results from Hachyderm.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Fosstodon ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hachyderm ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That seems like an staggering differece. &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id=&#34;dear-reader&#34;&gt;Dear Reader&lt;/h2&gt;
&lt;p&gt;I have no idea why this difference is so harsh. But for my purposes I have enough information to update my beliefs to make a decision for now that satisfies my accuracy-requirements for this decision.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Staggering differences are often a sign of a weak research. So take this part with a grain of salt.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
    </item>
    
    <item>
      <title>Power Structure of Social Networks</title>
      <link>https://prma.dev/posts/power-structure-of-social-networks/</link>
      <pubDate>Wed, 16 Nov 2022 00:08:00 +0330</pubDate>
      
      <guid>https://prma.dev/posts/power-structure-of-social-networks/</guid>
      <description>Why do some nations fail and rise so quickly? The answer to this questions has a surprisingly relevant answer to the recent migrations from a Twitter to Mastodon.
Power Centrality Basically the idea is that:
In any system of governance the authority is constrained to the resources it has available. And for the authority to make a change, it has to answer to the resource providers. Given a set interdependent institutions one could form check-and-balance system.</description>
      <content>&lt;p&gt;Why do some nations fail and rise so quickly?
The answer to this questions has a surprisingly relevant answer to the recent migrations from a Twitter to Mastodon.&lt;/p&gt;
&lt;h2 id=&#34;power-centrality&#34;&gt;Power Centrality&lt;/h2&gt;
&lt;p&gt;Basically the idea is that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In any system of governance the authority is constrained to the resources it has available.&lt;/li&gt;
&lt;li&gt;And for the authority to make a change, it has to answer to the resource providers.&lt;/li&gt;
&lt;li&gt;Given a set interdependent institutions one could form check-and-balance system.&lt;/li&gt;
&lt;li&gt;If the dependence is not formed in a way that is biased towards zero-sum relationships the authority thrives.&lt;/li&gt;
&lt;li&gt;For the society to thrive it should be considered an institution on it&amp;rsquo;s own.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let&amp;rsquo;s make a few different forms of government considering the rule&amp;rsquo;s I just discussed.&lt;/p&gt;
&lt;p class=&#34;note&#34;&gt;
As dependence on involvement of people only comes when governments want more power and cannot retain the resources necessary from the land, High Natural-Resources and High People-involvement tend to be mutually exclusive.
&lt;/p&gt;
&lt;h2 id=&#34;high-centrality-high-natural-resources-low-people-involvement&#34;&gt;High Centrality, High Natural-Resources, Low People-involvement&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s imagine a dictatorship on a land with rich natural resources. Dictatorship is an strongly centralized form of government. As such, the dictator does not have any dependencies. You might think that the government does need its people. But most of the time, such dictatorship has all that it needs from the naturally available resources.&lt;/p&gt;
&lt;p&gt;The dictator does not have to answer to anyone, and they have all the means necessary to make rapid changes, good or bad. The whole of the nation rise and fall quickly. The civic progression does not accumulate in time and only will be there while the dictator let it to be.&lt;/p&gt;
&lt;p&gt;The government does not need people uniting, form a danger to the government. Such authorities are highly motivated to bring social conflict, such as racism. Which may even lead to genocide by members of the society.&lt;/p&gt;
&lt;p class=&#34;example&#34;&gt;
Think of Middle-east with it&#39;s rich natural oil.
&lt;/p&gt;
&lt;h2 id=&#34;high-centrality-low-natural-resources-low-people-involvement&#34;&gt;High Centrality, Low Natural-Resources, Low People-involvement&lt;/h2&gt;
&lt;p&gt;Now, let&amp;rsquo;s imagine a dictatorship on a land with no natural resources, and no inclination to involve people.&lt;/p&gt;
&lt;p&gt;Such a nation will not flourish. The dictator is extremely constrained in its power.&lt;/p&gt;
&lt;p&gt;It has no validity among its people. As such it is unsuccessful in enforcing any law, good or bad. Such a nation sees lots and lots of &lt;em&gt;coup d&amp;rsquo;états&lt;/em&gt;. The authority is more alike a warlord.&lt;/p&gt;
&lt;p class=&#34;example&#34;&gt;
Think of Central African nations.
&lt;/p&gt;
&lt;h2 id=&#34;high-centrality-low-natural-resources-high-people-involvement&#34;&gt;High centrality, Low Natural-Resources, High People-involvement&lt;/h2&gt;
&lt;p&gt;Such a dictatorship, is a highly populist government. The dictator threats people as the main form of resource. Such nations can rise quickly. But before too long, the authority will figure out that he only needs society&amp;rsquo;s approval, but not its growth. And if you need approval, there is no quicker and better way than a common enemy. As such, such nations become too hostile to other nations. And may end-up using genocide as a means of keeping the country united.&lt;/p&gt;
&lt;p class=&#34;example&#34;&gt;
Think of Germany during the Hitler era.
&lt;/p&gt;
&lt;h2 id=&#34;low-centrality-high-natural-resources-low-people-involvement&#34;&gt;Low Centrality, High Natural-Resources, Low People-involvement&lt;/h2&gt;
&lt;p&gt;Such a nation looks great from the outside, but inside? It is polarized to say the least. These nations, just like any other nation with Low-Centrality is stable. The is formed by a group of institutions which keep each other in check. But alas, what good is it, if it is not for people?&lt;/p&gt;
&lt;p&gt;Such governments end up becoming extremely rich. But because people are not required for the government to perform, most of what the government is doing is providing value for the few that can provide them the resources they need.&lt;/p&gt;
&lt;p&gt;Such governments nations are subject to low progression in the civic laws, are extremely hard to change, and form strong bonds with few entities. As people are seen as a barrier, government&amp;rsquo;s like this tend to have a lot of controversial and theatrical surfaces, but end-up deciding things behind closed doors.&lt;/p&gt;
&lt;p class=&#34;example&#34;&gt;
Think of USA during recent years, as it managed to put a huge people&#39;s involvement.
&lt;/p&gt;
&lt;h2 id=&#34;low-centrality-low-natural-resources-low-people-involvement&#34;&gt;Low Centrality, Low Natural-Resources, Low People-involvement&lt;/h2&gt;
&lt;p&gt;These governments are stable, but irrelevant. They fail to bring order, or protection for their people. And they don&amp;rsquo;t provide any infrastructural benefits the society.&lt;/p&gt;
&lt;p class=&#34;example&#34;&gt;
Think of Afghanistan Right after USA army left it.
&lt;/p&gt;
&lt;h2 id=&#34;low-centrality-low-natural-resources-high-people-involvement&#34;&gt;Low Centrality, Low Natural-Resources, High People-involvement&lt;/h2&gt;
&lt;p&gt;This, at least for now, seems to be some what the better of them all, but with some caveats. These governments are highly stable, and highly motivated by providing value to the people. They accumulate wealth and culture overtime. They are, also, resilient to hostile neighbours and bad actors. These societies tend to look good on the outside, but much better on the inside.&lt;/p&gt;
&lt;p&gt;However, such governments are only weak to adapt to any radical changes, as the changes only happen when the people will it to happen. That means that these societies tend not to be the leaders or experimenters of different sorts of progress. However, they may end up reaching the top of the leader board in time.&lt;/p&gt;
&lt;p class=&#34;example&#34;&gt;
Think of Germany, today.
&lt;/p&gt;
&lt;h2 id=&#34;how-does-it-relate-to-the-twitter-and-fediverse-and-dot-dot-dot&#34;&gt;How does it relate to the Twitter and Fediverse and &amp;hellip;?&lt;/h2&gt;
&lt;p&gt;Well, there is a analogy to be made here.&lt;/p&gt;
&lt;p&gt;We can see the body(s) that runs, maintains, develop and moderate a social network as a form of a government. The users as the people and society.
And the way that the proverbial social-network governments are being funded as the determining factor of people&amp;rsquo;s involvement in governance.&lt;/p&gt;
&lt;p&gt;In that regard we can think of Twitter, Facebook as highly concentrated. Considering that their power is immensely related to the number of users they have, we may be tempted to see them as somewhat of high in involvement of people.
but in actuality, people do not need to be actually participating in governing such a system. As they are the product, and the value comes from external means. That means that the users ended up being the natural resource of the land that is being sold for resources to the external actors.&lt;/p&gt;
&lt;p&gt;As such we end up with both exploitation of the users and their lack of ownership of their own data.&lt;/p&gt;
&lt;h2 id=&#34;so-what-can-be-the-solution&#34;&gt;So, what can be the solution?&lt;/h2&gt;
&lt;p&gt;Considering how unfortunate this situation is, there has always been a few different alternatives. Let&amp;rsquo;s just review them.&lt;/p&gt;
&lt;p&gt;There are systems that don&amp;rsquo;t count users as product, but as the customer. Such services, though small have a better record of listening to users.&lt;/p&gt;
&lt;p&gt;However, as any centralized system, they are unstable, they remain small, and to keep users, they resort to vendor lock-ins. They also resort advertisement instead of increasing real value. Think of apple with its anti-advertisement campaigns against Microsoft.&lt;/p&gt;
&lt;p&gt;Another solution might be highly centralized systems without any sort of resources. These tend to be highly volatile and fast to disappear.&lt;/p&gt;
&lt;p&gt;So, decentralization might be the way to go.&lt;/p&gt;
&lt;p&gt;As low-centrality but highly-resourcefulness goes, I can only think of mailing groups. Mailing groups stand on the shoulders of mail providers.&lt;/p&gt;
&lt;p&gt;Decentralized as mailing is, the ecosystem overwhelmingly is provided by a few company that their main products are again, people.
As discussed earlier, such systems tend to not have much progress. At least, not for the non-governing bodies. And indeed, that has been true.
Mailing and mailing groups is as user friendly and featureful as they have been 15 years ago.&lt;/p&gt;
&lt;p&gt;Which makes us resort to our last option. Low centrality and High involvement of people. Such a system has been the model for open-source development. Where the governance is highly motivated to help the people the same time as the people are highly motivated to help the governance.
Such a model has ended up being extended into forms of social governance. Where users fund their instances, help development and do volunteer moderations. And indeed, again, the parallel is not surprising: These systems tend not to have the greatest of the starts, but they end up enduring, and becoming more resilient.&lt;/p&gt;
&lt;p&gt;Mastodon, Pixelfed and other federated, open-sourced social networks, operate in such a model. And I like to think of people moving from Twitter to Mastodon as realizing that they matter and can should be more.&lt;/p&gt;
&lt;h2 id=&#34;credit&#34;&gt;Credit&lt;/h2&gt;
&lt;p&gt;This work is highly inspired and heavily reliant on &lt;a href=&#34;https://prma.dev/person/daron_acemoglu&#34;&gt;Daron Acemoglu&lt;/a&gt;&amp;rsquo;s fantastic book, &lt;em&gt;Why Nations Fail&lt;/em&gt;. A must read.&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
