<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hossein Naghdbishi</title><link>https://hossein.me/</link><description>Recent content on Hossein Naghdbishi</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 19 Mar 2026 13:06:02 +0330</lastBuildDate><atom:link href="https://hossein.me/index.xml" rel="self" type="application/rss+xml"/><item><title>How to copy text from remote server to clipboard?</title><link>https://hossein.me/quicknotes/copy-from-remote-server-to-clipboard/</link><pubDate>Thu, 19 Mar 2026 13:06:02 +0330</pubDate><guid>https://hossein.me/quicknotes/copy-from-remote-server-to-clipboard/</guid><description>&lt;p&gt;
First define this bash function:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Add to remote ~/.bashrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;clip&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Read from stdin, encode to base64 (disable wrapping with -w 0), &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# and wrap in the OSC 52 escape sequence.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local b64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b64&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;cat | base64 -w 0&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; printf &lt;span style="color:#e6db74"&gt;&amp;#34;\033]52;c;%s\a&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$b64&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;or for fish:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function clip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; # Read from stdin, encode to base64, and save to a local variable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; set -l b64 (cat | base64 -w 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; # Output the OSC 52 sequence directly to the terminal
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; printf &amp;#34;\033]52;c;%s\a&amp;#34; &amp;#34;$b64&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Then you can easily run:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat file.txt | clip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Note that if you use tmux you should allow clipboard:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set-clipboard on&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>How to Allocate swap in GNU/Linux?</title><link>https://hossein.me/quicknotes/falloc-swap-gnulinux/</link><pubDate>Thu, 19 Feb 2026 14:17:41 +0330</pubDate><guid>https://hossein.me/quicknotes/falloc-swap-gnulinux/</guid><description>&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -euo pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SIZE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1G&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# To be determined by the user: either B or G&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SWAP_ADDR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/swapfile&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FSTAB&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/etc/fstab&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;UID&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; -ne &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Must run as root&amp;#34;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SWAP_ADDR&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Swapfile already exists&amp;#34;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Allocating &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SIZE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; at &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SWAP_ADDR&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fallocate -l &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SIZE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SWAP_ADDR&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Setting permissions...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod &lt;span style="color:#ae81ff"&gt;600&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SWAP_ADDR&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Enabling swap...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkswap &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SWAP_ADDR&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;swapon &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SWAP_ADDR&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; grep -qF &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;SWAP_ADDR&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$FSTAB&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Entry already present&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Adding the entry to &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;FSTAB&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; printf &lt;span style="color:#e6db74"&gt;&amp;#34;%s\t\tnone\t\tswap\t\trkswap\t0\t0\n&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$SWAP_ADDR&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$FSTAB&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Added.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Current status:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;swapon --show&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>NixOS Python Packages that Depend on C shared libraries</title><link>https://hossein.me/quicknotes/nixos-python-pip-libc/</link><pubDate>Wed, 18 Feb 2026 15:48:27 +0330</pubDate><guid>https://hossein.me/quicknotes/nixos-python-pip-libc/</guid><description>&lt;p&gt;
If you see this error:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Importing the numpy C-extensions failed. This error can happen for
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;many reasons, often due to issues with your setup or how NumPy was
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;installed.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;We have compiled some common reasons and troubleshooting tips at:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; https://numpy.org/devdocs/user/troubleshooting-importerror.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Please note and check the following:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * The Python version is: Python 3.13 from &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * The NumPy version is: &amp;#34;2.4.2&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;and make sure that they are the versions you expect.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Please carefully study the information and documentation linked above.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;This is unlikely to be a NumPy issue but will be caused by a bad install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;or environment on your machine.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Original error was: libstdc++.so.6: cannot open shared object file: No such file or directory&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Install appimage-run and then run this:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export LD_LIBRARY_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/nix/store/vfsghxsap24k8gcg4z4dbp42av6hdbr0-appimage-run-fhsenv-rootfs/usr/lib64&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>مانع</title><link>https://hossein.me/posts/fa/resistence/</link><pubDate>Sun, 15 Feb 2026 15:58:31 +0330</pubDate><guid>https://hossein.me/posts/fa/resistence/</guid><description>&lt;p&gt;
مثالی که در مورد کارهای سخت در قوانینم نوشتم اینه:‌«کارهای سخت مثل دوش آب سردن، بعد از ۵ ثانیه‌ی اول انجامشون آسون میشه». من اصولا دوش آب سرد می‌گیرم،‌ یعنی جهت شیر آب همیشه به صورت تمام و کمال به سمت آب سرده مگر اینکه سرماخورده باشم. امروز بعد چند مدت دوش با آب گرم به علت سرماخوردگی، برگشتم به آب سرد. نکته اینجا بود که چون از این عادت فاصله گرفته بودم، انجامش برام سخت‌تر از پیش بود. از خودم می‌پرسیدم که اصلا این کار چه ضرورتی داره؟‌ آیا لازمه به خودم سختی بدم در حالی که زندگیم در نقاط دیگه‌اش به اندازهٔ کافی سختی داره؟ سعی داشتم خودم رو منصرف کنم. از طرفی عمیقا تردید داشتم که بتونم واقعا دوش آب سرد بگیرم. می‌دونستم که بارها این کار رو کردم، زیر آب‌های سرد خوابگاه یا آب‌های خیلی سرد خونه دووم اورده بودم، از پنج ثانیه تا مدت‌های طولانی و چندین دقیقه، ولی باز هم به طرز عجیبی به خودم شک داشتم. نکنه چون مدتیه فاصله گرفتم دیگه نمی‌تونم دوش آب سرد بگیرم؟
در عین حال قانون همیشگیم رو به خودم یادآوری کردم: «فقط ۵ ثانیه میرم زیر دوش آب سرد و دیگه نمیرم.» ۵ ثانیه رفتم و سخت بود، بعد از ۵ ثانیه از زیر آب خودم رو کنار کشیدم. با این حال همون ۵ ثانیه بهم شهامت داد و تردید رو کنار گذاشتم. توی این شستشو هم مثل بقیهٔ حمام‌رفتن‌های قبل از سرماخوردگیم، از آب گرم هیچ استفاده‌ای نکردم.
حالا تمام این‌ها رو ننوشتم که روایت شستن خودم رو بازگو کنم، نوشتم که از «مانع» یا اون چیزی که خارجی‌ها بهش مقاومت یا Resistance می‌گن بگم. وقتی داشتم با یکی درمورد اهمال‌کاری و انجام‌دادن‌ کارهای با اولویت پایین می‌گفتم، اون به چیزهایی مثل ترس از شکست، ترس از شکستن تجسم خود بی‌نقص، گفتن اینکه «من تمام تلاشم رو نکردم پس این من نیستم که خفن نیست بلکه فقط نمیخواستم و تلاش نکردم» اشاره می‌کرد. نکته اینجا بود که من مدت‌هاست هیچ‌وقت هیچ‌کدوم رو با صدای بلند به خودم نگفتم. مطمئن نبودم که آیا درست میگه یا نه چون هیچ مدرکی از این افکار در من نبود. بعد به اون مانع و سد ذهنی قبل از رفتن زیر دوش آب سرد فکر کردم. توی لحظاتی که آدم مردده که بره زیر دوش آب سرد یا نه، ذهن خالیِ خالیه. هیچ اثری از فکر درش نیست. فقط بدوی‌ترین احساساتن که توی زمان‌هایی که ذهنت خالیه، تردید داری و نزدیک آب سردی فریاد می‌زنن رفتن زیر دوش آب سرد دردناکه. حتی ذهن هم خودش تصویرسازی می‌کنه برات که اگر بری زیر دوش آب سرد و آب بریزه روی پشتت قطره قطره‌اش قراره اذیت کنه. هیچ کدوم از این احساسات تبدیل به فکر نمی‌شن، خیلی قبل‌تر از اون برات یک مانع می‌سازن. اینکه بری رمزگشایی کنی که چه احساساتی برات مانع میسازن با خودته،‌ ولی خبر خوب اینه که راه حل معلومه: کافیه پنج ثانیه به هر طریقی که شده خودت رو بندازی توی دل ترست.&lt;/p&gt;</description></item><item><title>ترجمهٔ فارسی Todo Cambia</title><link>https://hossein.me/posts/fa/todo-cambia-persian-translation/</link><pubDate>Tue, 20 Jan 2026 00:19:29 +0330</pubDate><guid>https://hossein.me/posts/fa/todo-cambia-persian-translation/</guid><description>&lt;p&gt;
یک آهنگ بسیار زیبای اسپانیایی هست که توی ذهنم پخش میشه و دوست دارم براتون ترجمه‌اش کنم. ممکنه براتون سوال شه آیا اسپانیایی بلدم؟ جواب اینه که نه D:&lt;/p&gt;
&lt;p&gt;
Cambia lo superficial
آنچه سطحی است دگرگون می‌شود
Cambia también lo profundo
آنچه عمیق است نیز دگرگون می‌شود
Cambia el modo de pensar
شیوه تفکر آدم‌ها عوض می‌شود
Cambia todo en este mundo
همهٔ موجودات دنیا تغییر می‌کنند&lt;/p&gt;
&lt;p&gt;
Cambia el clima con los años
آب و هوا با گذر سال‌ها تغییر می‌کند
Cambia el pastor su rebaño
چوپان گله‌اش را تغییر می‌دهد
Y así como todo cambia
و از آنجایی که همه چیز باید تغییر کند
Que yo cambie no es extraño
اینکه من تغییر کنم عجیب نیست&lt;/p&gt;
&lt;p&gt;
Cambia el más fino brillante
زیباترین درخشش تغییر می‌کند
De mano en mano su brillo
هنگامی که از دستی به دستی دیگر می‌رود
Cambia el nido el pajarillo
پرندهٔ کوچک لانه‌اش را تغییر می‌دهد
Cambia el sentir un amante
احساسات یک عاشق هم تغییر می‌کند
Cambia el rumbo el caminante
رَه‌رو مسیرش را تغییر می‌دهد
Aunque esto le cause daño
اگرچه ممکن است برایش آسیب‌زا باشد
Y así como todo cambia
و از آنجایی که همه چیز باید تغییر کند
Que yo cambie no es extraño
اینکه من تغییر کنم عجیب نیست&lt;/p&gt;
&lt;p&gt;
Cambia, todo cambia
تغییر می‌کند، همه چیز تغییر می‌کند
Cambia, todo cambia
تغییر می‌کند، همه چیز تغییر می‌کند
Cambia, todo cambia
تغییر می‌کند، همه چیز تغییر می‌کند
Cambia, todo cambia
تغییر می‌کند، همه چیز تغییر می‌کند
Cambia el sol en su carrera
خورشید در مسیر خود تغییر می‌کند
Cuando la noche subsiste
وقتی که شب پایدار می‌ماند
Cambia la planta y se viste
گیاه تغییر می‌کند و جامه‌ی
De verde en la primavera
سبز رنگ بهاری‌اش را از تن به در می‌کند&lt;/p&gt;
&lt;p&gt;
Cambia el pelaje la fiera
پوستین حیوانات تغییر می‌کند
Cambia el cabello el anciano
موی افراد سالخورده نیز؛
Y así como todo cambia
و از آنجایی که همه چیز باید تغییر کند
Que yo cambie no es extraño
اینکه من تغییر کنم عجیب نیست&lt;/p&gt;
&lt;p&gt;
Pero no cambia mi amor
اما عشق من تغییر نمی‌کند
Por más lejos que me encuentre
هرچقدر هم که به دوردست‌ها سفر کرده باشم
Ni el recuerdo ni el dolor
 نه خاطره و نه دردِ
De mi pueblo y de mi gente
هم‌وطنانم و دیارم تغییری نمی‌کنند
Lo que cambió ayer
آنچه دیروز تغییر کرد
Tendrá que cambiar mañana
باید فردا نیز تغییر کند
Así como cambio yo
همان‌طور که من تغییر می‌کنم
En esta tierra lejana
در این سرزمین دور&lt;/p&gt;</description></item><item><title>منابع اینترانت ایران</title><link>https://hossein.me/quicknotes/iranian-intranet-resources/</link><pubDate>Wed, 07 Jan 2026 20:27:21 +0330</pubDate><guid>https://hossein.me/quicknotes/iranian-intranet-resources/</guid><description>
&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
DNS
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ریشه (فقط ریشه):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I: &lt;code class="verbatim"&gt;192.36.148.17&lt;/code&gt; &lt;code class="verbatim"&gt;2001:7fe::53&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;K: &lt;code class="verbatim"&gt;193.0.14.129&lt;/code&gt; &lt;code class="verbatim"&gt;2001:7fd::1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;زیرساخت:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;217.218.127.127&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;217.218.155.155&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;وزارت ارتباطات:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;10.202.10.10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;10.202.10.11&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;مبین‌نت&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;10.202.10.10&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;10.44.8.8&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;آسیاتک&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;185.51.200.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;185.51.200.3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;شاتل&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;91.239.100.100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;89.233.43.71&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;همراه اول&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;208.67.220.200&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;208.67.222.222&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ایرانسل&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;109.69.8.51&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;74.82.42.42&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.127.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.127.105
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.127.106
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.155.105
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.155.105
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.155.106
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.0.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.96.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.192.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.128.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.224.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.64.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.160.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.157.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.72.194
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.185.239.133
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.185.239.134
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.185.239.136
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.185.239.137
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.185.239.138
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.185.239.139
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.103.5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;78.38.23.216
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;85.185.6.3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.132.88
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.133.21
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;80.191.209.105
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;80.191.40.41
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;93.115.231.100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;95.80.184.184
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.109.74.85
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.164.73.148
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.164.73.180
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.250.200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.250.201
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.250.202
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.64.179.89
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;194.60.210.66
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.145.112.38
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.145.112.39
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;89.144.144.144
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.219.187.3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.200.200.200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.186.242.161
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;78.39.101.186
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.229.29.214
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.229.29.215
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.23.131.73
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;37.156.29.27
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.130.180.120
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.113.59.253
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.47.37.35
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.47.37.92
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;79.175.176.42
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;80.75.5.100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.234.221
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;194.36.174.161
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;78.38.122.12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;85.185.85.6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;80.191.233.17
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;80.191.233.33
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.127.127
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;217.218.155.155
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;213.176.123.5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.187.84.15
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;194.225.62.80
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;92.42.49.43
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.128.139.128
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.128.139.139
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.51.200.10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.51.200.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.51.200.50
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.51.200.6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.161.112.33
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.161.112.34
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.161.112.38
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.24.234.34
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.24.234.35
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.24.234.37
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;94.139.190.190
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;81.163.3.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;81.163.3.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;45.159.151.220
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;82.99.202.164
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;91.98.124.109
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;91.98.64.222
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;82.99.242.155
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;91.99.101.12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;91.99.96.158
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.55.225.25
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.55.226.26
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.53.143.3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;81.91.144.190
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;37.19.90.62
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;37.19.90.65
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;91.245.229.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;91.245.229.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;94.183.42.232
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;188.158.158.158
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;188.159.159.159
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.20.163.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;95.38.61.50
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.188.166.22
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.160.211.66
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;178.22.122.100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.98.113.113
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.98.114.114
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.98.115.135
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;37.156.145.18
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;37.156.145.21
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;37.156.145.229
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;77.238.109.196
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.81.41.81
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.202.100.100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.202.100.101
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.202.100.102
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.202.100.99
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.202.122.222
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;46.224.1.42
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;46.224.1.43
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.24.200.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.24.200.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.24.200.3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;31.24.200.4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;178.215.3.142
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;78.38.117.206
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;85.185.67.235
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;171.22.26.14
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.8.173.236
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;78.157.40.157
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;78.157.40.158
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;194.225.125.12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;194.225.152.10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;194.225.73.141
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.11.70.174
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.83.197.154
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;85.185.157.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.231.182.126
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.97.117.187
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.189.44.44
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.188.21.130
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;81.91.144.116
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;87.107.110.108
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;37.32.5.60
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;46.245.89.51
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;185.143.235.253
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;212.80.20.243
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;212.80.20.244&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
To open google&amp;#39;s services if google is whitelisted:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 content-autofill.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 android.clients.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 www.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 calendar.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 mail.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 gmail.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 accounts.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 www.google-analytics.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 colab.research.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 ssl.gstatic.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 fonts.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 appsgenaiserver-pa.clients6.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 feedback-pa.clients6.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 www.google-analytics.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 appsgrowthpromo-pa.clients6.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 meet.turns.goog.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 meet.turns.goog
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 meet.turns.google
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 signaler-pa.clients6.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 lh3.googleusercontent.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 fonts.gstatic.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 onepick-opensocial.googleusercontent.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 www.gstatic.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 www.googletagmanager.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 clients1.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 clients2.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 clients3.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 clients4.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 clients5.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 clients6.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 ogads-pa.clients6.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 optimizationguide-pa.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 play.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 apis.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 hangouts.clients6.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 meetings.clients6.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 ogs.google.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 meetings.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 meet.google.com 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 lh3.googleusercontent.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;216.239.38.120 gemini.google.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-2" class="outline-2"&gt;
&lt;h2 id="headline-2"&gt;
Mirrors
&lt;/h2&gt;
&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;
&lt;div id="outline-container-headline-3" class="outline-3"&gt;
&lt;h3 id="headline-3"&gt;
Programming Languages
&lt;/h3&gt;
&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;
&lt;div id="outline-container-headline-4" class="outline-4"&gt;
&lt;h4 id="headline-4"&gt;
Rust
&lt;/h4&gt;
&lt;div id="outline-text-headline-4" class="outline-text-4"&gt;
&lt;p&gt;&lt;a href="https://index.rust-meetup.ir/"&gt;https://index.rust-meetup.ir/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>proxychains-ng Alternative</title><link>https://hossein.me/quicknotes/proxychains-alternative/</link><pubDate>Mon, 05 Jan 2026 01:32:24 +0330</pubDate><guid>https://hossein.me/quicknotes/proxychains-alternative/</guid><description>&lt;p&gt;
Use Tor project&amp;#39;s &lt;a href="https://blog.torproject.org/introducing-oniux-tor-isolation-using-linux-namespaces/"&gt;oniux&lt;/a&gt; instead (maybe in the future, it hasn&amp;#39;t worked for me yet)&lt;/p&gt;</description></item><item><title>Poor Man's VPN: How to Use Reverse SSH for Quick NAT Traversal</title><link>https://hossein.me/posts/en/poor-mans-vpn-autossh/</link><pubDate>Sat, 03 Jan 2026 23:53:49 +0330</pubDate><guid>https://hossein.me/posts/en/poor-mans-vpn-autossh/</guid><description>&lt;p&gt;
Suppose you want to connect from PC &lt;em&gt;A&lt;/em&gt; to PC &lt;em&gt;B&lt;/em&gt;, and neither have a pubilc IP. How can you do that? One way is to use &lt;a href="https://github.com/rustonbsd/iroh-ssh"&gt;iroh-ssh&lt;/a&gt;, it&amp;#39;s neat but currently they don&amp;#39;t support custom relays so it&amp;#39;s a deadend in more restricted networks. But if you own a VPS, you can actually can connect these two.&lt;/p&gt;
&lt;p&gt;
Assuming you have installed &lt;code class="verbatim"&gt;autossh&lt;/code&gt; on &lt;em&gt;B&lt;/em&gt;, create a systemd service on it as well &lt;code class="verbatim"&gt;/etc/systemd/system/autossh-ssh.service&lt;/code&gt;:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description=AutoSSH Service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;After=network.target
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User=user
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Environment=AUTOSSH_GATETIME=0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ExecStart=/usr/bin/autossh -M 0 -N -o &amp;#34;ServerAliveInterval 30&amp;#34; -o &amp;#34;ServerAliveCountMax 10&amp;#34; -o &amp;#34;ExitOnForwardFailure yes&amp;#34; -o &amp;#34;AddressFamily inet&amp;#34; -o &amp;#34;TCPKeepAlive no&amp;#34; -R localhost:REMOTE_SSH_PORT_ON_VPS:localhost:SSH_PORT_OF_B -i YOUR_KEY_ADDRESS USER@VPS -p VPS_SSH_PORT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RestartSec=5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;KillMode=process # Ensure child processes are not killed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WantedBy=multi-user.target&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Then enable it using &lt;code class="verbatim"&gt;sudo systemctl enable autossh-ssh&lt;/code&gt;. Now it will always keep a connection to your VPS and expose its SSH port on your VPS&amp;#39;s &lt;code class="verbatim"&gt;localhost:REMOTE_SSH_PORT_ON_VPS&lt;/code&gt; (localhost can be changed to your VPS&amp;#39;s static IP if that&amp;#39;s what you need). Now you can connect to &lt;em&gt;B&lt;/em&gt; on your VPS.&lt;/p&gt;
&lt;p&gt;
If you need &lt;em&gt;B&lt;/em&gt;&amp;#39;s SSH port on &lt;em&gt;A&lt;/em&gt;, you have to port forward: &lt;code class="verbatim"&gt;ssh user@VPS_IP -p VP_SSH_PORT -L localhost:REMOTE_SSH_PORT_ON_A:localhost:REMOTE_SSH_PORT_ON_VPS&lt;/code&gt;, which means you can connect to &lt;em&gt;B&lt;/em&gt; from &lt;em&gt;A&lt;/em&gt;: &lt;code class="verbatim"&gt;ssh user@localhost -P REMOTE_SSH_PORT_ON_A&lt;/code&gt;.
Q.E.D!&lt;/p&gt;
&lt;p&gt;
Side note: If for whatever reason you can&amp;#39;t connect to &lt;em&gt;B&lt;/em&gt;, then go to your VPS, kill the SSH that is responsible for the &lt;code class="verbatim"&gt;REMOTE_SSH_PORT_ON_VPS&lt;/code&gt;. After some time &lt;em&gt;B&lt;/em&gt; will create a fresh connection which has a better likelihood of good connection.&lt;/p&gt;
&lt;p&gt;
Side note: If you own a VPS maybe you&amp;#39;re not so poor monetarily but rather temporarily, since you don&amp;#39;t have time to deal with Wireguard and so on.&lt;/p&gt;
&lt;p&gt;
Update: Just use &lt;a href="https://yggdrasil-network.github.io/"&gt;yggdrasil&lt;/a&gt; instead.&lt;/p&gt;</description></item><item><title>Bluetooth Audio Troubleshooting in Linux</title><link>https://hossein.me/quicknotes/bluetooth-troubleshoot-linux-log/</link><pubDate>Fri, 02 Jan 2026 01:41:43 +0330</pubDate><guid>https://hossein.me/quicknotes/bluetooth-troubleshoot-linux-log/</guid><description>&lt;p&gt;
Assuming you use pipewire:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;journalctl --user -f -u pipewire -u wireplumber&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;pw-top&lt;/code&gt; (look for error column) &lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;btmgmt --index 0 info&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;btmon&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;journalctl -u bluetooth&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From &lt;a href="https://linuxmusicians.com/viewtopic.php?t=25768"&gt;here&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;pw-metadata -n settings 0 clock.force-rate &amp;lt;samplerate&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;pw-metadata -n settings 0 clock.force-quantum &amp;lt;buffersize&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Confirm the actuall sample rate and buffer size? &lt;code class="verbatim"&gt;pw-metadata -n settings&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kernel related:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;sudo dmesg | grep -i blue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;lsmod | grep bt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;modinfo -p btusb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;grep . /sys/module/btusb/parameters/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;lsusb | grep -i blue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>پسوند «یک» در فارسی، و «وک» در نیشابوری</title><link>https://hossein.me/posts/fa/ique-suffix-in-nishapuri-language/</link><pubDate>Sat, 20 Dec 2025 19:55:18 +0330</pubDate><guid>https://hossein.me/posts/fa/ique-suffix-in-nishapuri-language/</guid><description>&lt;p&gt;
توی گویش نیشابوری یک پسوند هست که در فارسی اونقدر پررنگ نیست. اونم «ـوک» ه تلفظشم مثل ok در took توی انگلیسیه تقریبا. توی فارسی معادلش ـیک ه. مثلا شما تار/نزد رو دارید بعد ازش تاریک/نزدیک رو می‌گیرید. جوری که توی وب خوندم خود این پسوند از فارسی میانه میاد و با ique مثل تکنولوژیک فرانسوی هم‌ریشه است.&lt;/p&gt;
&lt;p&gt;
خلاصه با همین پسوند که توی فارسی مرده، میشه خیلی چیزا ساخت. پسوند ـی برای ساخت صفت از اسم توی خیلی جاها جواب نمیده. سر همین مثلا پیشنهاد دادن به‌جای گرفتن «بیضوی» از بیضی و «هذلولوی» از هذلولی بگیم «بیضیک» و «هذلولیک». یک سری کلمه‌های خوشگل و باکلاس هم میشه ساخت با این پسوند، مثل «دانشیک» به‌معنی علمی.&lt;/p&gt;
&lt;p&gt;
توی گویش نیشابوری هم چندین تا کلمه هست که ساختشون جالبه.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;پیر -&amp;gt; پیروک (پیرمانند مثلا پوستی که چروکیده باشه)&lt;/li&gt;
&lt;li&gt;باد -&amp;gt; بَدوک (کسی که پرباده، پر از فخرفروشیه)&lt;/li&gt;
&lt;li&gt;جیغ -&amp;gt; جیغوک (کسی که زیاد فریاد میزنه)&lt;/li&gt;
&lt;li&gt;ترسو -&amp;gt; تُرسُنوک (کسی که زیاد می‌ترسه)&lt;/li&gt;
&lt;li&gt;پورچَنه (پرچانه) -&amp;gt; پورچُنوک (کسی که زیاد حرف میزنه)&lt;/li&gt;
&lt;li&gt;چرب -&amp;gt; چوربوک (صفت ظرفای چرب)&lt;/li&gt;
&lt;li&gt;چسبنده -&amp;gt; چُسبُندُنوک (نوچ، چسب‌مانند)&lt;/li&gt;
&lt;li&gt;زرد &amp;gt; زردوک (بیمار)&lt;/li&gt;
&lt;li&gt;گوز -&amp;gt; گَوزوک (گوزو 😁) / چس -&amp;gt; چسّوک (به همین معنی)&lt;/li&gt;
&lt;li&gt;ریخ (فضولات انسانی) -&amp;gt; ریخوک (آنکه زیاد بریند)&lt;/li&gt;
&lt;li&gt;خیل (آب دماغ) -&amp;gt; خیلّوک (کسی که آب دماغش میزنه بیرون)&lt;/li&gt;
&lt;li&gt;عَل‌لُ‌توک (یعنی مریض نمیدونم از چی ساخته شده، احتمالا از علیل میاد)&lt;/li&gt;
&lt;li&gt;لپوک (هندونه یا خربزه رسیده)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;حدس‌های بی‌ربط خودم:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;چوب‌جیک (پرنده‌ای که روی چوب جیک‌جیک می‌کند) بدهد چوب‌جیغک که بدهد -&amp;gt; چغوک (گنجشک)&lt;/li&gt;
&lt;li&gt;ناز -&amp;gt; نَزوک (که بدهد همون نازک فارسی)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ایدهٔ وبسایت: اگر کسی حال داشت می‌تونه بهم پیام بده خرد خرد و در درازمدت با هم یک سایت بسازیم برای گردآوری لهجه‌های مختلف ایران.&lt;/p&gt;</description></item><item><title>PWN Cheatsheet</title><link>https://hossein.me/posts/en/pwn-cheatsheet/</link><pubDate>Sun, 16 Nov 2025 23:30:51 +0330</pubDate><guid>https://hossein.me/posts/en/pwn-cheatsheet/</guid><description>
&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
x86_64 Assembly
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;%rax&lt;/code&gt; is a reference to &lt;code class="verbatim"&gt;rax&lt;/code&gt; register.&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;$0x4&lt;/code&gt; is a constant.&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;0(%esp)&lt;/code&gt; or &lt;code class="verbatim"&gt;(%esp)&lt;/code&gt; is the value loaded from the memory address that is stored in &lt;code class="verbatim"&gt;%esp&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;12(%esp)&lt;/code&gt; dereferences memory 12 bytes above the address contained in ESP&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class="verbatim"&gt;mov A,B&lt;/code&gt;, B is changed to become A. A&amp;#39;s value is -&amp;gt; put into B.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is AT&amp;amp;T x86 syntax (what GDB uses). In this syntax the destination register comes last. In RISC-V assembly the opposite is true.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;push A&lt;/code&gt; adds &lt;code class="verbatim"&gt;A&lt;/code&gt; as the last element of the stack, decreases the value of &lt;code class="verbatim"&gt;rsp/esp&lt;/code&gt; by one word (since the stack grows from high to low).&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;pop rax/eax&lt;/code&gt; removes the last element of the stack, copies into &lt;code class="verbatim"&gt;rax/eax&lt;/code&gt; increases the value of &lt;code class="verbatim"&gt;rsp/esp&lt;/code&gt; by one word (since the stack grows from high to low).&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;jmp&lt;/code&gt; is equivalent to &lt;code class="verbatim"&gt;mov rip, target_address&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;call&lt;/code&gt; is equivalent to &lt;code class="verbatim"&gt;push rip(old return address)&lt;/code&gt; and &lt;code class="verbatim"&gt;jmp dst_func.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;ret&lt;/code&gt; is equivalent to &lt;code class="verbatim"&gt;pop rip(old return address)&lt;/code&gt; which is &lt;code class="verbatim"&gt;jmp src_func&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because stack grows from high addresses to low addresses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;sub $8,%rsp&lt;/code&gt; increases stack size.&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;add $8,%rsp&lt;/code&gt; decreases stack size.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-2" class="outline-2"&gt;
&lt;h2 id="headline-2"&gt;
Stack
&lt;/h2&gt;
&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;
&lt;div id="outline-container-headline-3" class="outline-3"&gt;
&lt;h3 id="headline-3"&gt;
Stack
&lt;/h3&gt;
&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;
&lt;img src="https://hossein.me/images/stack.svg" alt="This figure shows the memory layout created by C." title="/images/stack.svg" style="height:100%;width:100%;"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-4" class="outline-3"&gt;
&lt;h3 id="headline-4"&gt;
Backgroud
&lt;/h3&gt;
&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;
&lt;ul&gt;
&lt;li&gt;Each byte is 8 bits.&lt;/li&gt;
&lt;li&gt;Each word is 4 bytes in 32-bit systems and 8 bytes in 64-bit systems.&lt;/li&gt;
&lt;li&gt;Each register can store one word.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-5" class="outline-3"&gt;
&lt;h3 id="headline-5"&gt;
Registers
&lt;/h3&gt;
&lt;div id="outline-text-headline-5" class="outline-text-3"&gt;
&lt;div id="outline-container-headline-6" class="outline-4"&gt;
&lt;h4 id="headline-6"&gt;
Pointing to the code section
&lt;/h4&gt;
&lt;div id="outline-text-headline-6" class="outline-text-4"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;rip/eip&lt;/code&gt; is the instruction pointer, and it stores the address of the machine instruction currently being executed (code section). In RISC-V, this register is called the PC (program counter).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-7" class="outline-4"&gt;
&lt;h4 id="headline-7"&gt;
Pointing to the stack section
&lt;/h4&gt;
&lt;div id="outline-text-headline-7" class="outline-text-4"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;rbp/ebp&lt;/code&gt; is the base pointer, and it stores the address of the base of the current stack frame. In RISC-V systems, this register is called the FP (frame pointer).&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;rsp/esp&lt;/code&gt; is the stack pointer, and it stores the address of the last element of the current stack frame. In RISC-V, this register is called the SP (stack pointer).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-8" class="outline-4"&gt;
&lt;h4 id="headline-8"&gt;
General Purpose Registers
&lt;/h4&gt;
&lt;div id="outline-text-headline-8" class="outline-text-4"&gt;
&lt;ul&gt;
&lt;li&gt;16 general purpose registers in 64-bit systems: &lt;code class="verbatim"&gt;RAX&lt;/code&gt;, &lt;code class="verbatim"&gt;RBX&lt;/code&gt;, &lt;code class="verbatim"&gt;RCX&lt;/code&gt;, &lt;code class="verbatim"&gt;RDX&lt;/code&gt;, &lt;code class="verbatim"&gt;RSI&lt;/code&gt;, &lt;code class="verbatim"&gt;RDI&lt;/code&gt; and &lt;code class="verbatim"&gt;R8&lt;/code&gt; to &lt;code class="verbatim"&gt;R15&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;6 general puprose registers in 32-bit systems: &lt;code class="verbatim"&gt;EAX&lt;/code&gt;, &lt;code class="verbatim"&gt;EBX&lt;/code&gt;, &lt;code class="verbatim"&gt;ECX&lt;/code&gt;, &lt;code class="verbatim"&gt;EDX&lt;/code&gt;, &lt;code class="verbatim"&gt;ESI&lt;/code&gt;, &lt;code class="verbatim"&gt;EDI&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style="height:80%;width:50%; text-align:center; margin:auto;"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Argument&lt;/th&gt;
&lt;th&gt;Register (64-bit)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arg 1&lt;/td&gt;
&lt;td&gt;%rdi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arg 2&lt;/td&gt;
&lt;td&gt;%rsi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arg 3&lt;/td&gt;
&lt;td&gt;%rdx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arg 4&lt;/td&gt;
&lt;td&gt;%rcx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arg 5&lt;/td&gt;
&lt;td&gt;%r8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arg 6&lt;/td&gt;
&lt;td&gt;%r9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-9" class="outline-3"&gt;
&lt;h3 id="headline-9"&gt;
Little Endian or Big Endian
&lt;/h3&gt;
&lt;div id="outline-text-headline-9" class="outline-text-3"&gt;
&lt;ul&gt;
&lt;li&gt;Address numbers point to bytes.&lt;/li&gt;
&lt;li&gt;Using little endian &lt;code class="verbatim"&gt;0x44332211&lt;/code&gt; will be stored like &lt;code class="verbatim"&gt;0x11 0x22 0x33 0x44&lt;/code&gt; in memory, meaning that the most signifcant byte has the highest address number (the memory starts from &lt;code class="verbatim"&gt;0x0&lt;/code&gt; to &lt;code class="verbatim"&gt;0x3&lt;/code&gt;, and &lt;code class="verbatim"&gt;0x44&lt;/code&gt; is stored at &lt;code class="verbatim"&gt;0x3&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-10" class="outline-2"&gt;
&lt;h2 id="headline-10"&gt;
Function Call in x86
&lt;/h2&gt;
&lt;div id="outline-text-headline-10" class="outline-text-2"&gt;
&lt;p alt="This figure shows the memory layout created by C, after the function foo below is called (almost)." style="height:100%;width:100%;"&gt;&lt;img src="https://hossein.me/images/stack-func-call.svg" alt="/images/stack-func-call.svg" title="/images/stack-func-call.svg"/&gt;
See the photos in &lt;a href="https://textbook.cs161.org/memory-safety/x86.html"&gt;UC Berkeley&amp;#39;s CS161 Textbook&lt;/a&gt; &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Function args are pushed into the stack. (or onto the general registers such as &lt;code class="verbatim"&gt;rdi&lt;/code&gt;, &lt;code class="verbatim"&gt;rsi&lt;/code&gt;, &lt;code class="verbatim"&gt;rdx&lt;/code&gt;, &lt;code class="verbatim"&gt;rcx&lt;/code&gt; if SysV x86-64)&lt;/li&gt;
&lt;li&gt;Return address (old &lt;code class="verbatim"&gt;rip&lt;/code&gt;) is pushed into the stack. &lt;/li&gt;
&lt;li&gt;Function jump happens (&lt;code class="verbatim"&gt;rip&lt;/code&gt; = new &lt;code class="verbatim"&gt;rip&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The new function pushes old &lt;code class="verbatim"&gt;rbp&lt;/code&gt; onto the stack.&lt;/li&gt;
&lt;li&gt;Previous frame&amp;#39;s &lt;code class="verbatim"&gt;rbp&lt;/code&gt; becomes the current &lt;code class="verbatim"&gt;rsp&lt;/code&gt; (old function&amp;#39;s last element is the new functions bottom)&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;rsp&lt;/code&gt; is grown to fit the new function.&lt;/li&gt;
&lt;li&gt;The new function does whatever it does&lt;/li&gt;
&lt;li&gt;At the end of the new function&amp;#39;s run, we are at its &lt;code class="verbatim"&gt;rbp&lt;/code&gt;, which is the old one&amp;#39;s &lt;code class="verbatim"&gt;rsp&lt;/code&gt;. Previous frame&amp;#39;s &lt;code class="verbatim"&gt;rsp&lt;/code&gt; is the present frame&amp;#39;s &lt;code class="verbatim"&gt;rbp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Old &lt;code class="verbatim"&gt;rbp&lt;/code&gt; is poped back.&lt;/li&gt;
&lt;li&gt;Old &lt;code class="verbatim"&gt;rip&lt;/code&gt; is poped back.&lt;/li&gt;
&lt;li&gt;Decrease the size of the stack by the size of args.&lt;/li&gt;
&lt;/ol&gt;
&lt;div id="outline-container-headline-11" class="outline-3"&gt;
&lt;h3 id="headline-11"&gt;
Example C code
&lt;/h3&gt;
&lt;div id="outline-text-headline-11" class="outline-text-3"&gt;
&lt;div class="src src-c"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; bar[&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which gives the following assembly:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0000000000001129 &amp;lt;foo&amp;gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1129:	55 	push %rbp // Step 4. RBP is saved on the stack right below RIP (saved in the previous step).
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 112a:	48 89 e5 	mov %rsp,%rbp // Step 5. The new stack base is the previous stack pointer.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 112d:	89 7d ec 	mov %edi,-0x14(%rbp) // Foo saves first arg into its own stack to free up %edi 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1130:	89 75 e8 	mov %esi,-0x18(%rbp) // Foo saves second arg into its own stack to free up %esi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1133:	90 	nop // Alignment, could be Step 6. =sub $N, %rsp= &amp;amp; Step. 7 if our function involved anything.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // Since Step. 6 didn&amp;#39;t take place, rsp didn&amp;#39;t change.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // therefore =mov %rsp, %rbp= (Step 8) is not run either.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // We could change this behavior using gcc flag -mno-red-zone
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1134:	5d 	pop %rbp // Step 9. Old RBP is restored
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1135:	c3 	ret // == pop %rip which is Step 10. Old RIP is restored
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // Step 11. doesn&amp;#39;t happen since in the x86-64 ABI, since the caller
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // passed arguments in registers, there is nothing on the stack for
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // the caller to clean up
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0000000000001136 &amp;lt;main&amp;gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1136:	55 	push %rbp // This is step 4 since main is not the starting function and is being called from _start
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1137:	48 89 e5 	mov %rsp,%rbp // this is also step 5 but we don&amp;#39;t analyze main.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 113a:	be 02 00 00 00 	mov $0x2,%esi // Step 1. Saving args (from right to left): 2 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 113f:	bf 01 00 00 00 	mov $0x1,%edi // Step 1. Saving args (from right to left): 1 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1144:	e8 e0 ff ff ff 	call 1129 &amp;lt;foo&amp;gt; // Step 2. RIP is pushed on the stack. Step 3. RIP is changed to the func address of foo (00001129).
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1149:	b8 00 00 00 00 	mov $0x0,%eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 114e:	5d 	pop %rbp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 114f:	c3 	ret&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-12" class="outline-2"&gt;
&lt;h2 id="headline-12"&gt;
Binary Background Check
&lt;/h2&gt;
&lt;div id="outline-text-headline-12" class="outline-text-2"&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check security properties (NX bit, dynamic vs static)&lt;/td&gt;
&lt;td&gt;&lt;code class="verbatim"&gt;rabin2 -I a.out&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List functions imported from shared libraries&lt;/td&gt;
&lt;td&gt;&lt;code class="verbatim"&gt;rabin2 -i a.out&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Find functions likely written by the programmer&lt;/td&gt;
&lt;td&gt;&lt;code class="verbatim"&gt;rabin2 -qs a.out&lt;/code&gt; piped to &lt;code class="verbatim"&gt;grep -ve imp -e &amp;#39; 0 &amp;#39;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Find strings&lt;/td&gt;
&lt;td&gt;&lt;code class="verbatim"&gt;strings a.out&lt;/code&gt; or (better) &lt;code class="verbatim"&gt;rabin2 -z split&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-13" class="outline-2"&gt;
&lt;h2 id="headline-13"&gt;
Return Oriented Programming
&lt;/h2&gt;
&lt;div id="outline-text-headline-13" class="outline-text-2"&gt;
&lt;div id="outline-container-headline-14" class="outline-3"&gt;
&lt;h3 id="headline-14"&gt;
Finding ROPs
&lt;/h3&gt;
&lt;div id="outline-text-headline-14" class="outline-text-3"&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;With ROPGadget:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ROPgadget --binary libc.so.6 --only &lt;span style="color:#e6db74"&gt;&amp;#34;add|jmp&amp;#34;&lt;/span&gt; &amp;gt; output &lt;span style="color:#75715e"&gt;# in case you&amp;#39;re looking for add followed by jump for example, otherwise remove&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat output | grep &lt;span style="color:#e6db74"&gt;&amp;#39;add rdi, 0x10 ; jmp rc&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With Ropper:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ropper --file ./libc.so.6 --search &lt;span style="color:#e6db74"&gt;&amp;#34;add rdi, 0x10; jmp rcx&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-15" class="outline-2"&gt;
&lt;h2 id="headline-15"&gt;
Misc
&lt;/h2&gt;
&lt;div id="outline-text-headline-15" class="outline-text-2"&gt;
&lt;ul&gt;
&lt;li&gt;PLT (Procedure Linkage Table): a small trampoline in the binary used for calls to external (dynamically linked) functions. Calls in the code go to func@plt; the PLT entry jumps to the real function address found in the GOT (or invokes the dynamic resolver on first call).&lt;/li&gt;
&lt;li&gt;GOT (Global Offset Table): a writable table of addresses in the binary. Each GOT slot holds the runtime address of a library function (or other dynamic symbol). The dynamic linker/loader fills GOT entries the first time a PLT entry is used (or at load time, depending on RELRO).&lt;/li&gt;
&lt;li&gt;They let the loader resolve and redirect calls to shared-library functions without embedding fixed library addresses in the code (works with ASLR and dynamic linking).&lt;/li&gt;
&lt;/ul&gt;
&lt;div id="outline-container-headline-16" class="outline-3"&gt;
&lt;h3 id="headline-16"&gt;
Memory Alignment
&lt;/h3&gt;
&lt;div id="outline-text-headline-16" class="outline-text-3"&gt;
&lt;ul&gt;
&lt;li&gt;Why it happens: &lt;a href="https://stackoverflow.com/a/381368"&gt;to give data to the CPU/CPU cache in one read instead of two&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-17" class="outline-2"&gt;
&lt;h2 id="headline-17"&gt;
Sources
&lt;/h2&gt;
&lt;div id="outline-text-headline-17" class="outline-text-2"&gt;
&lt;p&gt;Disclaimer: Some of the sentences here are a direct copy of the links below, so I don&amp;#39;t own their copyright. Follow the original sources.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ropemporium.com/guide.html"&gt;https://ropemporium.com/guide.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/7060970/substitutes-for-x86-assembly-call-instruction"&gt;https://stackoverflow.com/questions/7060970/substitutes-for-x86-assembly-call-instruction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://textbook.cs161.org/memory-safety/x86.html#fnref:2"&gt;https://textbook.cs161.org/memory-safety/x86.html#fnref:2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>How To Run Any CLI Program Over a TCP Socket, or How To Run a CTF?</title><link>https://hossein.me/quicknotes/run-cli-apps-over-tcp-sockets/</link><pubDate>Fri, 14 Nov 2025 19:08:32 +0330</pubDate><guid>https://hossein.me/quicknotes/run-cli-apps-over-tcp-sockets/</guid><description>&lt;p&gt;
If you want to run a CTF sometimes you&amp;#39;d like to give telnet access to a program to the participants. How do people do that?&lt;/p&gt;
&lt;p&gt;
Well here&amp;#39;s the gist of it. Run the following docker build file using &lt;code class="verbatim"&gt;docker compose build&lt;/code&gt; and you&amp;#39;ll be done. The binary file &lt;code class="verbatim"&gt;chal&lt;/code&gt;, and &lt;code class="verbatim"&gt;flag.txt&lt;/code&gt; should be in the same directory.&lt;/p&gt;
&lt;div class="src src-dockerfile"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;debian:latest&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ENV&lt;/span&gt; DEBIAN_FRONTEND noninteractive&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; apt-get update -y &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; apt-get install -y socat &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; apt-get clean &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rm -rf /var/lib/apt/lists/*&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; useradd -u &lt;span style="color:#ae81ff"&gt;1001&lt;/span&gt; -d /home/user -s /bin/bash user&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/home/user&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; chall /home/user/&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; flag.txt /home/user/&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; chmod &lt;span style="color:#ae81ff"&gt;111&lt;/span&gt; /home/user/chall&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; chmod &lt;span style="color:#ae81ff"&gt;444&lt;/span&gt; /home/user/flag.txt&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; chmod -R &lt;span style="color:#ae81ff"&gt;555&lt;/span&gt; /home/user&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;EXPOSE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;1337&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ENTRYPOINT&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;socat&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;TCP-LISTEN:1337,reuseaddr,fork,nodelay,su=user&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;EXEC:&amp;#39;timeout 180 ./chall&amp;#39;&amp;#34;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
You could change &lt;code class="verbatim"&gt;./chall&lt;/code&gt; part to &lt;code class="verbatim"&gt;yes&lt;/code&gt; for example and see that any client that connects to that socket over telnet sees a lot of &amp;#34;y&amp;#34;s :)&lt;/p&gt;</description></item><item><title>نظرات خواندنی هکرنیوز درمورد تحریم‌ها بر ایرانیان</title><link>https://hossein.me/posts/fa/irans-sanctions/</link><pubDate>Mon, 27 Oct 2025 16:59:24 +0330</pubDate><guid>https://hossein.me/posts/fa/irans-sanctions/</guid><description>&lt;p&gt;
یک آقای مهربون ایرانی توی اینترنت &lt;a href="https://news.ycombinator.com/item?id=45343108"&gt;درمورد تجربه‌ی تلخ ما ایرانی‌ها زیر تحریم نوشته&lt;/a&gt; و حسابی دیده شده و صحبت شده درموردش. دوست داشتید ببینید.&lt;/p&gt;
&lt;p&gt;
و خب جالبه که ما صدایی نداریم. یعنی بار اوله دارم می‌بینم درمورد اثر تحریم‌ها بر زندگی ایرانی‌های صحبت بشه توی جامعه‌ی فنی خارجی‌ها.&lt;/p&gt;
&lt;p&gt;
بحث خارجی‌ها درمورد تحریم‌ها جالبه ولی خود مطالب دوستمون برای هر ایرانی خاطره است. با این حال چیزی که از خوندنش یاد گرفتم اینه:
تحریم باید با پاسخ HTTP شماره‌ی ۴۵۱ (منع قانونی) گفته بشه نه ۴۰۳ (منع کلی). عدد ۴۵۱ هم از کتاب بسیار معروف «فارنهایت ۴۵۱» میاد که درمورد کتاب‌سوزی و سانسوره :)&lt;/p&gt;
&lt;p&gt;
نظر نمونه:&lt;/p&gt;
&lt;blockquote style="direction:ltr !important; text-align: left !important;"&gt;
&lt;p&gt;The sad part about living in Iran from a technology perspective is you are often blocked from both sides. Often you have to circumvent the government&amp;#39;s aggressive internal firewall and other times you will have to hide your IP from the service providers.&lt;/p&gt;
&lt;p&gt;
On the bright side, your average Iranian grandma can immediately work as a network engineer given the amount of experience she has with VPN protocols.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😂😂😂&lt;/p&gt;</description></item><item><title>How to apply SOCKS5 proxy for docker pull?</title><link>https://hossein.me/quicknotes/docker-socks5-proxy-howto/</link><pubDate>Sun, 26 Oct 2025 17:06:24 +0330</pubDate><guid>https://hossein.me/quicknotes/docker-socks5-proxy-howto/</guid><description>&lt;p&gt;
First open &lt;code class="verbatim"&gt;/etc/docker/config.json&lt;/code&gt; then add the following data in it:&lt;/p&gt;
&lt;div class="src src-json"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;proxies&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;httpProxy&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;socks5h://127.0.0.1:30808&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;httpsProxy&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;socks5h://127.0.0.1:30808&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;noProxy&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;localhost,127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
After restarting your docker service using &lt;code class="verbatim"&gt;systemctl restart docker&lt;/code&gt; the change will be done.&lt;/p&gt;
&lt;p&gt;
For &lt;code class="verbatim"&gt;docker build&lt;/code&gt; the story is different and you can use the following command to apply it per command, &lt;code class="verbatim"&gt;docker run&lt;/code&gt; example is included too:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker build --build-arg HTTP_PROXY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://127.0.0.1:30808&amp;#34;&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --env HTTP_PROXY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://127.0.0.1:30808&amp;#34;&lt;/span&gt; redis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
If these methods don&amp;#39;t work, you can also do this:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p /etc/systemd/system/docker.service.d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt; /etc/systemd/system/docker.service.d/proxy.conf &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Environment=&amp;#34;HTTP_PROXY=socks5://127.0.0.1:30808&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Environment=&amp;#34;HTTPS_PROXY=socks5://127.0.0.1:30808&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl restart docker docker.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>How to Highlight the Syntax of Code in Anki Flash Cards?</title><link>https://hossein.me/quicknotes/anki-syntax-highlighting/</link><pubDate>Thu, 18 Sep 2025 12:32:52 +0330</pubDate><guid>https://hossein.me/quicknotes/anki-syntax-highlighting/</guid><description>&lt;p&gt;
Are you looking for a way to highlight the syntax of code in your Anki flash cards? Use &lt;a href="https://prismjs.com"&gt;prismjs.com&lt;/a&gt;&amp;#39;s libraries.&lt;/p&gt;
&lt;p&gt;
Here&amp;#39;s a guide: &lt;a href="https://www.ganesshkumar.com/articles/2023-06-10-enhancing-anki-decks-with-prismjs/"&gt;https://www.ganesshkumar.com/articles/2023-06-10-enhancing-anki-decks-with-prismjs/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>مستند پایتون، و زنان در فناوری</title><link>https://hossein.me/posts/fa/python-and-pyladies/</link><pubDate>Wed, 17 Sep 2025 19:26:32 +0330</pubDate><guid>https://hossein.me/posts/fa/python-and-pyladies/</guid><description>&lt;p&gt;
امروز بالاخره وقت کردم و مستند پایتون رو دیدم. مستند جالبیه توضیح میده زبان پایتون چه شکلی به‌وجود اومده و همه‌ی این مسائل.&lt;/p&gt;
&lt;img src="https://esmithy.net/images/pycon-guido.jpg" alt="تصویری از خالق زبان پایتون با یک تی‌شرت که روی آن به انگلیسی نوشته شده است پایتون برای دختران است." title="https://esmithy.net/images/pycon-guido.jpg" style="height:70%;width:90%;"/&gt;
&lt;p&gt;
تصویر برگرفته از &lt;a href="https://esmithy.net/2016/06/01/pycon-2016-day-2/"&gt;اینجا&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
ولی جدا از مسائل تاریخچه‌ای، سه نکته‌ی جالب داشت برام:&lt;/p&gt;
&lt;p&gt;
یکم، خالق پایتون، آقای خیدو فان روسوم در اصل هلندیه و زمانی که زبان رو خلق می‌کنه در هلند زندگی می‌کرده. خودش توی مستند می‌گه که وقتی پایتون رو منتشر کردم ۹۹٪ آدمایی که باهاشون صحبت می‌کردم توی آمریکا بودن پس برای پیشرفت بیشتر مهاجرت کردم به آمریکا.&lt;/p&gt;
&lt;p&gt;
دوم، با اینکه زبان پایتون تا سال ۲۰۱۸ تمامی تصمیماتش توسط شخص آقای خیدو گرفته می‌شده ولی سال ۲۰۱۸ استعفا میده از مقامش و الان تصمیمات زبان پایتون رو یک کمیته‌ی ۵ نفره می‌گیرن که با رای‌گیری انتخاب می‌شن.&lt;/p&gt;
&lt;p&gt;
سوم، یک قسمت مستند که به شخصه برام خیلیییی زیبا بود دیدنش؛ و حکایت از شخصیت بسیار عالی خالق پایتون داره، قسمتی مرتبط با حضور زنان بود. حتما سعی کنید اصلش رو از یوتیوب ببینید (از &lt;a href="https://youtu.be/GfH4QL4VqJ0?t=3329"&gt;این ثانیه&lt;/a&gt;)، یک بخش مستقله و نیازی نیست قبلش رو ببینید. اگر ندیدید، خلاصه‌ی زیر رو بخونید:&lt;/p&gt;
&lt;p&gt;
سازنده‌ی زبان پایتون آقای خیدو فان روسوم، داشته توی گوگل کار می‌کرده (نصف وقتش رو برای توسعه‌ی زبان پایتون میذاشته و نیمی از وقتش رو برای کارهاش در گوگل) که یک روز یک تی‌شرت توی جعبه‌ی پستیش در گوگل می‌گیره که روش نوشته Python is for girls. اون موقع متوجه میشه که چقدر جای زنان توی جامعه‌ی پایتون خالیه و مثلا فقط ۱٪ ارائه‌دهنده‌های کنفرانس پایتون توی سال ۲۰۱۱ خانم بودن. مشکل رو پی می‌گیره و این عدد توی سال ۲۰۱۶ به ۴۰٪ می‌رسه 🚀&lt;/p&gt;
&lt;p&gt;
توی سال ۲۰۱۵ هم آقای خیدو توی ارائه‌اش در کنفرانس پایتون اعلام می‌کنه که هدفش اینه که سال بعدی حداقل دوتا خانم توسعه‌دهندهٔ هسته‌ی پایتون باشن. و حاضره حتی خودش هر هفته وقت بذاره و اون خانم رو آموزش بده. خانمی به اسم ماریتا اونجا بوده و با خودش می‌گه که نه من ارزشش رو ندارم و نمی‌تونم. سال ۲۰۱۶ که دوباره کنفرانس برگزار میشه، خیدو میگه هیچ خانمی اعلام آمادگی نکرده و هنوزم حاضره که اگر خانمی داوطلب بشه آموزش بده. ماریتا داوطلب میشه و یک سال بعدش دسترسی commit به هسته‌ی پایتون می‌گیره 🎉&lt;/p&gt;
&lt;p&gt;
دیدن ویدئو حال و هوایی دیگه داره چون قشنگ میشه استرس و اون احساسات منفی‌ای که باعث می‌شده اون خانم و خانمای دیگه داوطلب نشن برای این کار رو توی چهره‌ی ماریتا خوند.
خلاصه دم آقای خیدو گرم هم بابت زبان پایتون و هم بابت شخصیت بزرگش.&lt;/p&gt;
&lt;p&gt;
و در نهایت هم باید بگم که تازه کشف کردم اسم زبان پایتون از &lt;a href="https://fa.wikipedia.org/wiki/%D9%85%D8%A7%D9%86%D8%AA%DB%8C_%D9%BE%D8%A7%DB%8C%D8%AA%D8%A7%D9%86"&gt;گروه کمدی مانتی‌پایتون&lt;/a&gt; میاد و نه مار پایتون :) ولی بسته‌ی آناکوندا علت نام‌گذاریش اینه که توی حیطه‌ی کلان‌داده است و آناکوندا هم یک مار بزرگه.&lt;/p&gt;
&lt;p&gt;
مطلب زیر هم با اجازه از صاحب متن، &lt;a href="https://t.me/crimson_diary/122"&gt;از این کانال تلگرامی&lt;/a&gt; برداشتم و به نظرم خیلی درسته:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;«چند روز پیش توی محل کار به شوخی صحبت این شد که تیممون (خصوصا بعد از مهاجرت دو تا از دخترهای تیم به خارج از کشور) چقدر مردونه شده و یه مشت انسان مذکر دور هم جمع شدیم و واسه تیم‌سازی حتی می‌تونیم بریم استخر و پارک آبی و خلاصه هی با هم شوخی‌های لوس و بی‌مزه می‌کردیم و هارهار می‌خندیدیم.
.
بعدتر من فکری شدم که چرا دایورسیتی جنسیتی کلا بخش‌های فنی یه دست نیست. نه توی شرکت ما که توی اکثر شرکت‌های Tech اگه دقت کنی، بیشتر نیروهای فنی (و البته مدیریتی) آقا هستند و خانم‌ها توی بخش‌های دیگه مثل HR یا بخش مالی و اداری و … حضور پررنگ‌تری دارن؟&lt;/p&gt;
&lt;p&gt;
این گوشه ذهنتون باشه تا یه چیز دیگه بگم…&lt;/p&gt;
&lt;p&gt;
خیلیا می‌دونن که من قدیم‌ترها سالیان سال توی مدارس تیزهوشان تدریس برنامه‌نویسی می‌کردم و البته توی چند سال اخیر علارغم میل شخصی، فرصت نشده دیگه هیچ‌ مدرسه‌ای برم و صرفا تک و توک پنج‌شنبه جمعه‌ها برای تنوع و حال دل خودم، خصوصی تدریس کردم. تقریبا درصد خیلی زیادی از شاگردهای من پسر بودن. و  به ندرت به دخترها درس می‌دادم. معمولا هم اولیا و خود بچه‌ها از نحوه تدریسم راضی بودن و من هیچ وقت، هیچ جا و به هیچ‌ شکلی، تبلیغی برای کلاسام نداشتم و همگی معرفی خود خونواده ها به همدیگه بوده.&lt;/p&gt;
&lt;p&gt;
منتهی به نظر خودم اقبالی که بین پسرها داشتم، پیش دخترها نداشتم. یعنی از نحوه پیشرفت کلاسم با دخترها کمتر راضی بودم.
این مشکل رو معمولا به این ربط می‌دادم که احتمالا ذهن دخترها آمادگی کمتری برای پیشرفت توی مباحث منطقی و الگوریتمی داره و یحتمل توی جاهای دیگه قوی‌تره. یه درصدی از مشکل رو هم البته کنار گذاشته بودم که چون با پسرها راحت‌تر هستم و البته تجربه خیلی بیشتری دارم، پس خروجی کارم هم در مورد پسرها بهتره و واسه دخترا هنوز قلق کار دستم نیومده!
.
مدت کمیه با یه دختری کلاس دارم. دختر خیلی باهوشی که فرانسه و انگلیسیش عالیه و از جلسه اول هم هوش و استعدادش مشخص بود. منتهی توی این یکی دو ماهی که باهاش کار کرده بودم، هر سری از سختی سوالات و تمرین‌ها شاکی بود و گاهی بود که هی می‌گفت که آٍقا من اینو تقریبا بلد بودم. بعد من می‌گفتم پس چرا هیچ کدی نزدی؟ که معمولا جواب درستی براش نداشت.
امروز پنج‌شنبه تصادفا از روی یکی از draft های کدش فهمیدم که این بشر چیزای خوبی هم می‌نوشته و تا حد خوبی به جواب نزدیک می‌شده و بعد پاکش می‌کرده و همش غر می‌زده که هیچی نمی‌فهمه! و من خیلی شانسی اینو کشف کردم!&lt;/p&gt;
&lt;p&gt;
این اعصابم رو یکم خط‌خطی کرد که چرا باید این مدلی باشه و دختری با این استعداد اعتماد به نفس کافی رو نداشته که اون برنامه نصفه نیمه رو به من نشون بده!
یکم سرچ کردم و یه تدتالک جالبی پیدا کردم که توی پست بعدی خلاصشو و لینکشو می‌ذارم و تقریبا حس می‌کنم تا حد خوبی جواب این مساله همین باشه و برای خودم زیبا و جالب بود.&lt;/p&gt;
&lt;p&gt;
تصویر بالا متعلق به خانومیه به اسم Reshma Saujani که یه خانم آمریکاییه که البته همونطور که از اسمشم مشخصه یکم رگ و ریشه هندی هم داره و زن باکمالاتیه.
کارای زیادی کرده و کله‌اش زیاد باد داشته که حالا ما کاری نداریم. ولی گویا اینم این مشکل شکاف جنیستی رو توی شرکت های فناوری درک کرده و به همین خاطر سال ۲۰۱۲ یه سازمان تاسیس کرده به اسم Girls Who Code. که هدفش این بوده که با آموزش مهارت های برنامه نویسی به دخترا و برگزاری سمینار و کارگاه و کوفت و زهرمار این شکاف رو یکم پر کنه.&lt;/p&gt;
&lt;p&gt;
توی این تدتالکی که ایشون صحبت کرده و من در ادامه لینکشو می‌ذارم، مشخصه طرف مثل من پرحرفه و توی سخنرانیش هم بنده خدا از هر دری یه صحبتی می کنه. ولی یه بخشیش که فوکوس می‌کنه روی این مساله ضعف دخترها توی برنامه نویسی، خیلی جالبه.&lt;/p&gt;
&lt;p&gt;
می گفت که مشکل اصلی اینه که نگاه تربیتی ما به پسرها اینه که باید شجاع بار بیان، ریسک کنن و از اشتباه نترسن. اما برعکس در مورد دخترها نگاه غالب اینه که بی نقص باشن و این ارزش رو براشون بولد می‌کنن.
و به زیبایی می‌گه که خیلیا توی آمریکا نگران کسری بودجه فدرال هستن ولی من نگران کسری شجاعت هستم!&lt;/p&gt;
&lt;p&gt;
و صحبت از یه آزمایش روانشناسی می‌کنه که خیلی سال پیش انجام شده در مورد دانش آموزای کلاس پنجمی که نتیجه‌اش این بوده که دخترهای باهوش خیلی زودتر مساله و چالشی که باهاش درگیر هستن رو رها می‌کنن و هرچی ضریب هوشی‌شون بالاتر، احتمال رها کردن کار هم بیشتره!
برعکس پسرها که کلا حال می‌کنن کار سخت رو باهاش درگیر بشن و ازش انرژی می‌گیرن و تازه وقتی گیر کنن خیلی بیشتر تلاش می‌کنن. چون کلا روحیشون از اول برای ریسک‌پذیری آماده شده برعکس دخترها که به واسطه ارزش بی‌نقص بودن مجبور بودن که همیشه محتاط‌تر باشن.&lt;/p&gt;
&lt;p&gt;
یه جای حرفش هم برای من خیلی جالب بود و شبیه تجربه‌ام توی کلاس خودم بود.
می‌گفت که توی موسسه‌اش یکی از دخترها اومده به معلمش گفته من اصن نمی‌دونم چه دستوری باید بنویسم؟ و معلم هم به صفحش نیگاه کرده و دیده که کلا صفحش خالیه و تصور می کنه که کل زمانی که اون دختر فرصت داشته رو انگار به صفحه خالی زل زده! ولی بعد چندباری دکمه کنترل زد رو می‌زنه و می بینه که دانش آموزش چندین بار برنامه رو نوشته و گاهی خیلی هم به جواب نزدیک شده بوده ولی به خاطر یکی دو تا مشکل کلشو پاک کرده بوده چون جواب دقیق و کامل رو به دست نیاورده بوده. و در واقع ترجیح داده به جای اینکه روندی که توی حل مساله پیش رفته رو نشون بده، هیچ چیزی نشون نده!&lt;/p&gt;
&lt;p&gt;
حتی یه مثال جالبی زده از استاد یه دانشگاه کلمبیا که جاوا تدریس می‌کرده. و می‌گفته که وقتی پسرها توی یه تکلیف به مشکل می‌خوردن، با یه ادبیاتی شبیه اینکه «استاد یه مشکلی توی کد من هست» سوالشونو مطرح می‌کردن. ولی دخترا معمولا اینجوری می‌گفتن که «استاد من یه مشکلی دارم!» و همین هم تفاوت نگاه پسرها و دخترها رو تا یه حدی نشون میده.&lt;/p&gt;
&lt;p&gt;
و خلاصه آخرش زیبا نتیجه گرفته که برای دخترها فقط آموزش برنامه نویسی کافی نیست و باید اون‌قدر شجاعتشون رو زیاد کنیم که از برنامه اشتباه نترسن. از سوال کردن و راهنمایی گرفتن هم نترسن. و اینجوریه که احتمالا به جایگاه واقعیشون توی جامعه نزدیک‌تر بشن.&lt;/p&gt;
&lt;p&gt;
پی‌نوشت:
اگه فرصتشو داشتید فیلم صحبت‌ها رو کامل ببینید چون مثال‌های جالب دیگه ای هم داشت.
.
و در کل اگه دور و برتون توی دوست و آشنا دختر جوونی هست که اول راهه، خیلی خوبه که تشویقش کنید که جسارتشو زیاد کنه. ریسک پذیر باشه و از سوال کردن و نشون دادن مشکلش نترسه. باشد که آینده‌ی بهتری در انتظارش باشه.&lt;/p&gt;
&lt;p&gt;
لینک ویدیوی تدتالک:
&lt;a href="https://www.youtube.com/watch?v=fC9da6eqaqg"&gt;https://www.youtube.com/watch?v=fC9da6eqaqg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
لینک موسسه‌ای که اون خانومه راه انداخته:
&lt;a href="https://girlswhocode.com/"&gt;https://girlswhocode.com/&lt;/a&gt;
»&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>How to fix SVGs for dark mode?</title><link>https://hossein.me/quicknotes/svg-in-dark-mode-fix/</link><pubDate>Tue, 16 Sep 2025 18:30:06 +0330</pubDate><guid>https://hossein.me/quicknotes/svg-in-dark-mode-fix/</guid><description>&lt;p&gt;
This one&amp;#39;s easy. I&amp;#39;m assuming that SVG is imported using an img tag.&lt;/p&gt;
&lt;p&gt;
Open your SVG file in beloved VIM or Emacs&amp;#39;s evil mode.
Do this:&lt;/p&gt;
&lt;div class="src src-vim"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-vim" data-lang="vim"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:%&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/stroke=&amp;#34;rgb(0,0,0)&amp;#34;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;stroke&lt;/span&gt;=&lt;span style="color:#e6db74"&gt;&amp;#34;currentColor&amp;#34;&lt;/span&gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:%&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/fill=&amp;#34;rgb(0,0,0)&amp;#34;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;fill&lt;/span&gt;=&lt;span style="color:#e6db74"&gt;&amp;#34;currentColor&amp;#34;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Or you could just use sed. Anyway, then add&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;style=&amp;#34;background: #ffffff; background-color: light-dark(#ffffff, var(--ge-dark-color, #000000)); color-scheme: light dark;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;to the top of your SVG file in your svg tag, here&amp;#39;s a diff from my own blog&amp;#39;s commits:&lt;/p&gt;
&lt;div class="src src-svg"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-svg" data-lang="svg"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-&lt;span style="color:#f92672"&gt;&amp;lt;svg&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;version=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1.2&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;44.92mm&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;130.98mm&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;viewBox=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0 0 4492 13098&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;preserveAspectRatio=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;xMidYMid&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fill-rule=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;evenodd&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stroke-width=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;28.222&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stroke-linejoin=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;round&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/2000/svg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:ooo=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://xml.openoffice.org/svg/export&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:xlink=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/1999/xlink&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:presentation=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://sun.com/xmlns/staroffice/presentation&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:smil=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/2001/SMIL20/&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:anim=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;urn:oasis:names:tc:opendocument:xmlns:animation:1.0&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:svg=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xml:space=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;preserve&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+&lt;span style="color:#f92672"&gt;&amp;lt;svg&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;style=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;background: #ffffff; background-color: light-dark(#ffffff, var(--ge-dark-color, #000000)); color-scheme: light dark;&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;version=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1.2&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;44.92mm&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;130.98mm&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;viewBox=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0 0 4492 13098&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;preserveAspectRatio=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;xMidYMid&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fill-rule=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;evenodd&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stroke-width=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;28.222&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stroke-linejoin=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;round&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/2000/svg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:ooo=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://xml.openoffice.org/svg/export&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:xlink=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/1999/xlink&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:presentation=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://sun.com/xmlns/staroffice/presentation&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:smil=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/2001/SMIL20/&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:anim=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;urn:oasis:names:tc:opendocument:xmlns:animation:1.0&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:svg=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xml:space=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;preserve&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>باور</title><link>https://hossein.me/posts/fa/believe/</link><pubDate>Thu, 04 Sep 2025 14:48:09 +0330</pubDate><guid>https://hossein.me/posts/fa/believe/</guid><description>
&lt;p&gt;
قسمت اول، یادداشت‌برداری بسیار نامرتب من از &lt;a href="https://en.wikipedia.org/wiki/The_Will_to_Believe"&gt;متن آقای ویلیام جیمز درمورد باوره&lt;/a&gt; و قسمت دوم از مقالهٔ &lt;a href="https://en.wikisource.org/wiki/The_Will_to_Believe_and_Other_Essays_in_Popular_Philosophy/Is_Life_Worth_Living"&gt;ارزش زندگی&lt;/a&gt;ه. برای قسمت دوم &lt;a href="https://reasonandmeaning.com/2015/10/30/william-james-faith-and-the-meaning-of-life"&gt;این متن&lt;/a&gt; خلاصه‌ی زیباتریه.&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
باور بدون مدرک
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;ol&gt;
&lt;li&gt;نمیشه با اراده باور کرد (مثلا که ابراهام لینکلن واقعی نیست یا درد نداریم وقتی چاقو خوردیم)&lt;/li&gt;
&lt;li&gt;با اینکه به بعضی چیزا باور داریم ولی نمیدونیم چرا. احتمالا تاثیر محیط اطرافه. مثلا به ملکول باور داریم چون پرستیژ باورداشتن بهش خوبه. اکثر اوقات باورمون به باور داشتن اطرافیان وابسته است.&lt;/li&gt;
&lt;li&gt;حتی اینکه یک حقیقت وجود داره رو هم نمیشه مطمئن بود (Pyrrhonistic) و برای این بهش باور داریم که جامعه ازمون همایت می‌کنه.&lt;/li&gt;
&lt;li&gt;پس ما به چیزهایی باور نداریم که به کارمون نمیاد. مثلا برای یک نفر مسیحیت به دردش نمیخوره پس بهش باور نداره. اگر یکی بیاد مثلا بگه تله‌پاتی هست ممکنه دانشمندها مسخره‌اش کنن ولی اگر بیاد این رو همراه با یک کاربرد به دانشمندها بگه یا کاری که بتونن باهاش بکنن دانشمندا بهش توجه می‌کنن.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;نتیجه‌گیری «بخش‌های غیرانتلکتی ما، بر باورهای ما اثرگذارند»&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;بعضی از تمایلات و کشش‌ها به سمت بعضی باورها فقط بعد از یک باور رخ میدن مثلا شرط پاسکال اینطوریه که برای یک مسیحی باعث تقویت ایمان میتونه باشه و بسیار باورپذیر ولی برای بقیه نه.&lt;/li&gt;
&lt;li&gt;برای یک شواهدگرا مهم نیست که یک منشا ایده اشتباه بوده یا درست، ‌مهم اینه که آیا مشاهدات بعدیش تاییدش می‌کنن یا نه و ادامه میده به درست بودن اون ایده یا نه. اگر ادامه داد پس برای اون شخص درسته.&lt;/li&gt;
&lt;li&gt;دو شیوه‌ی فکر کردن وجود داره:‌ یکی اینکه باید حقیقت رو پیدا کنیم، یکی اینکه باید از خطا بپرهیزیم. توی عقیده‌ی کسایی که با مسیحیت مخالفن میگن که باید حتما دلایل کافی داشت تا باور کرد و تا مدارک کافی نباشه، باور کردن اشتباهه. این طرز تفکر باعث میشه که انسان به کمتر چیزی باور داشته باشه. ولی اونایی که از خطا پرهیز می‌کنن میتونن حدس‌های زیادی درمورد حقیقت بزنن و باور داشته باشن، و باورهاشون رو در مسیر اگر با مدرک اشتباه بودن مواجه شدن عوض کنن.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;در واقع نویسنده بر این باوره که بهتره از اشتباه نترسید. مثل ژنرالی نباشید که به سربازهاش میگه که نجنگید که زخمی نشید. بهتره رفت و باور داشت اگر غلط بود ضربه دید و بعد باور رو عوض کرد.
هر زمان که فرق بین از دست دادن حقیقت و به‌دست آوردنش مهم نباشه، میتونیم تصمیم بگیریم که تا زمان به دست اوردن مدرک قطعی کلا بیخیال حقیقت شیم تا اقلا فریب نخوریم، توی کار یک قاضی معمولا این شکلیه و تصمیم‌نگرفتن میتونه یک گزینه باشه، یا درمورد روابط انسانی اینکه یک گزینه رو انتخاب کنیم ولی مدام حواسمون به مدارک له و علیهش هم باشه.
علم دقیقا اینطوریه و همیشه هر دو جانب رو به دقت نگاه می‌کنه و بیشتر علاقه‌مند به اینه که بشه به صورت تکنیکی چیزی رو تایید کرد. و قدرتش هم از همین میاد.&lt;/p&gt;
&lt;p&gt;
زمانی که مجبور به انتخاب نیستیم، بهترین شیوه همین شکاک بودنه تا اینکه فریب نخوریم. اما سوال اینه که در زمان‌هایی که باید انتخاب کنیم، آیا عاقلانه است که بی‌عمل باشیم و تا زمانی که مدارک پیدا نشه دست به انتخاب نزنیم؟&lt;/p&gt;
&lt;p&gt;
درمورد سوال‌های اخلاقی، زمانی برای یافتن پاسخ با مدرک وجود نداره، چون علم می‌تونه به ما بگه که «چه چیزی وجود دارد» ولی پاسخ اینکه چه چیزی ارزشمندتره رو نداره. در این موقع ما باید اونطور که پاسکال می‌گه به قلبمون گوش کنیم. (پاسکال: La coeur a ses raisons que la raison ne cannait pas)
اینکه آیا باید باورهای اخلاقی داشته باشیم یا نه با اراده‌ی ما مشخص می‌شه. آیا ترجیحات اخلاقی درستن یا غلط، آیا خوب و بد برای ما فقط تعریف میشه درحالی که در واقعیت امور بی‌تفاوتن؟ تنها با مغز نمیشه تصمیم گرفت. اگر قلب شما نخواد به دنیای اخلاقی باور کنه مغزتون هم نخواهد پذیرفت. مشابه اینکه در زمینه‌ی دانش میشه شکاک بود، در زمینه‌ی اخلاق هم میشه همینطور بود.&lt;/p&gt;
&lt;p&gt;
حالا اگر روابط انسانی رو در نظر بگیریم، مثلا این سوال که آیا از من خوشت میاد یا نه، علاقه هیچ وقت تحقق پیدا نمی‌کنه مگر اینکه حدی از اعتماد رو نشون بدی، (رویکرد اینکه اول باور می‌کنم و سعی می‌کنم با دیدن شواهد بعدی گول نخورم در مقابل رویکرد اینکه اول مدرک بیاد تا باور کنم) اگر منتظر مدارک بمونی عمل نخواهی کرد و علاقه‌ای هم شکل نخواهد گرفت. بنای اکثر گروه‌های اجتماعی هم همین شکلیه. مثلا اگر یک گروه باور داشته باشن که انقلاب میشه میشه و اگر فکر کنن که با بیان انقلاب قطعا سرکوب میشن و صدمه می‌بینن سمت این کار نمیرن.
بنا براین مواردی وجود دارند که «یک حقیقت نمیتونه واقعیت پیدا کنه مگر اینکه از پیش باوری به تحققش وجود داشته باشه» در این حالات «باور به یک حقیقت اون حقیقت رو محقق می‌کنه»
بنابراین برای حقایقی که وابسته به کنش‌های شخصی ماست، ایمان مبتنی بر خواستن، کاملا مجاز و احتمالا بخش جدانشدنی‌ای از زندگیه.
قاعده‌ی فکر کردنی که مرا از باور به برخی حقایقی که ممکن است درست باشند باز بدارد، قاعده‌ی بدی است.
ما حق داریم که با ریسک خودمان، به فرضیاتی که برای ما به‌اندازه‌ی کافی «زنده» و جذاب هستند تا اراده‌ی ما را وسوسه‌کنند، باور داشته باشیم.
اگر ما مطلق‌گرا بودیم(مدعی بودیم که میدانیم و زمانی که قطعا حقیقت را پیدا کرده‌ایم متوجه می‌شویم)، مشکلی نبود که صبر کنیم تا مدارک کافی پیدا شود ولی از آنجایی که مدرک‌گرا هستیم، اگر تعلل کنیم، همانقدری از دست می‌دهیم که اگر باور نکنیم.&lt;/p&gt;
&lt;blockquote style="direction:ltr !important; text-align: left !important;"&gt;
&lt;p&gt;What do you think of yourself? What do you think of the world?… These are questions with which all must deal as it seems good to them. They are riddles of the Sphinx, and in some way or other we must deal with them…. In all important transactions of life we have to take a leap in the dark…. If we decide to leave the riddles unanswered, that is a choice; if we waver in our answer, that, too, is a choice: but whatever choice we make, we make it at our peril. If a man chooses to turn his back altogether on God and the future, no one can prevent him; no one can show beyond reasonable doubt that he is mistaken. If a man thinks otherwise and acts as he thinks, I do not see that any one can prove that he is mistaken. Each must act as he thinks best; and if he is wrong, so much the worse for him. We stand on a mountain pass in the midst of whirling snow and blinding mist, through which we get glimpses now and then of paths which may be deceptive. If we stand still we shall be frozen to death. If we take the wrong road we shall be dashed to pieces. We do not certainly know whether there is any right one. What must we do? &amp;#39;Be strong and of a good courage.&amp;#39; Act for the best, hope for the best, and take what comes…. If death ends all, we cannot meet death better.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-2" class="outline-2"&gt;
&lt;h2 id="headline-2"&gt;
آیا زندگی ارزش زیستن داره؟
&lt;/h2&gt;
&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;
&lt;p&gt;بعضیا دیدگاهشون اونقدر خوش‌بینانه است که زندگیشون جز شادی چیزی نداره، اگر زندگی اینطور باشه سوال اینکه آیا زندگی ارزش زیستن داره بی‌‌معنیه چون خود زندگی به اون اثبات ارزش زیستن. مثلا شعر والت ویتمن اینطوریه سبک دیدگاهش.
حتی اگر چنین دیدگاهی داریم خوبه که زندگی افراد پرغم رو تصور کنیم چون ساخت ما با اون‌ها یکسانه.&lt;/p&gt;
&lt;p&gt;
حالا بیاید انسانی رو تصور کنیم که انقدر بداقبال بوده و پر رنج که جز فکر اینکه هر وقت خواست میتونه زندگی رو پایان بده چیزی تسکینش نمیده، چه چیزی میشه به این شخص گفت تا دوباره بار زندگی رو به دوش بکشه؟
از دید اشخاص دیندار معتقد به قوانین آسونه: باید بگین خدا خودکشی رو منع کرده.
از دید اشخاص دیگه چی؟‌ ویلیام جیمز ادعا می‌کنه که لازمه که باور داشته باشیم (بدون هیچ مدرک و شاهدی) که این اعمال ما در دنیا، اثراتی تا ابد ماندگار دارن و به نتایجی ابدی ختم می‌شن، در این حالت می‌شه در بدترین شرایط هم زیست و خوشحال بود، چون مادامی که هدف نیک بودن، نیکی کردن و زیستن اخلاقی در این دنیا تأمین بشه، زندگی ارزشمند خواهد بود.&lt;/p&gt;
&lt;blockquote style="direction:ltr !important; text-align: left !important;"&gt;
&lt;p&gt;Not a victory is gained, not a deed of faithfulness or courage is done, except upon a maybe; not a service, not a sally of generosity, not a scientific exploration or experiment or text-book, that may not be a mistake. It is only by risking our persons from one hour to another that we live at all. And often enough our faith beforehand in an uncertified result is the only thing that makes the result come true.
Suppose, for example, that I am climbing in the Alps, and have had the ill-luck to work myself into a position from which the only escape is by a terrible leap. Being without similar experience, I have no evidence of my ability to perform it successfully; but hope and confidence in myself make me sure I shall not miss my aim, and nerve my feet to execute what without those subjective emotions would perhaps have been impossible. But suppose that, on the contrary, the emotions of fear and mistrust preponderate; or suppose that, having just read the Ethics of Belief, I feel it would be sinful to act upon an assumption unverified by previous experience,—why, then I shall hesitate so long that at last, exhausted and trembling, and launching myself in a moment of despair, I miss my foothold and roll into the abyss. In this case (and it is one of an immense class) the part of wisdom clearly is to believe what one desires; for the belief is one of the indispensable preliminary conditions of the realization of its object. There are then cases where faith creates its own verification. Believe, and you shall be right, for you shall save yourself; doubt, and you shall again be right, for you shall perish. The only difference is that to believe is greatly to your advantage.&lt;/p&gt;
&lt;p&gt;
For here possibilities, not finished facts, are the realities with which we have actively to deal; and to quote my friend William Salter, of the Philadelphia Ethical Society, &amp;#34;as the essence of courage is to stake one&amp;#39;s life on a possibility, so the essence of faith is to believe that the possibility exists.&amp;#34;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style="direction:ltr !important; text-align: left !important;"&gt;
&lt;p&gt;These, then, are my last words to you: Be not afraid of life. Believe that life is worth living, and your belief will help create the fact. The &amp;#39;scientific proof&amp;#39; that you are right may not be clear before the day of judgment (or some stage of being which that expression may serve to symbolize) is reached. But the faithful fighters of this hour, or the beings that then and there will represent them, may then turn to the faint-hearted, who here decline to go on, with words like those with which Henry IV. greeted the tardy Crillon after a great victory had been gained: &amp;#34;Hang yourself, brave Crillon! we fought at Arques, and you were not there.&amp;#34;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>توصیه‌هایی درمورد انتخاب رشته</title><link>https://hossein.me/posts/fa/choosing-a-major/</link><pubDate>Thu, 04 Sep 2025 14:38:09 +0330</pubDate><guid>https://hossein.me/posts/fa/choosing-a-major/</guid><description>&lt;img src="https://hossein.me/images/jobvision-uni-comparison.jpg" alt="نمودار جاب‌ویژن درباره‌ی میزان رضایت از دانشگاه و سطح حقوق دانشجویان هر دانشگاه" title="/images/jobvision-uni-comparison.jpg"/&gt;
&lt;p&gt;
در باب انتخاب رشته:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;سایت جاب‌ویژن با همکاری گزینه دو &lt;a href="https://jobvision.ir/reports/education-field-selection"&gt;گزارشی&lt;/a&gt; گذاشته از رتبه‌های قبولی، رضایت از دانشگاه و درآمدها، حتما ببینید. مثلا عکس بالا از این گزارش اومده. کلی نمودار جالب قابل تأمل دیگه هم داره.&lt;/li&gt;
&lt;li&gt;سایت «مرکز آمار کار دولت آمریکا» گزارش جامعی داره. توش درمورد پیش‌بینی رشد ۱۰ ساله رشد یک شغل و درآمد میانه‌اش در آمریکا نوشته. مثلا درآمد، پیش‌بینی رشد و … شغلای مرتبط با کامپیوتر &lt;a href="https://www.bls.gov/ooh/Computer-and-Information-Technology/"&gt;اینجا&lt;/a&gt;ست. که در کل دید خوبی هم می‌ده، مثلا مشاغل مرتبط با وب درآمدشون کمتره نسبت به امنیت‌کارها. و پولدارترین‌ها توی آمریکا پزشکن، حتی از خلبان‌ها هم بیشتر در میارن :)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://t.me/Sharif_prm/15526"&gt;ویژه‌نامه شریف&lt;/a&gt; درمورد رشته‌های مختلف این دانشگاه&lt;/li&gt;
&lt;li&gt;یک سری &lt;a href="https://t.me/Qotbnama_Community/21"&gt;کانال تصادفی تلگرامی&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>اعمال تحریم بر دانشگاه شریف توسط گیت‌هاب</title><link>https://hossein.me/posts/fa/github-sharif-sanctions/</link><pubDate>Thu, 04 Sep 2025 14:36:09 +0330</pubDate><guid>https://hossein.me/posts/fa/github-sharif-sanctions/</guid><description>&lt;img src="https://hossein.me/images/sharif-github-sanctions.jpg" alt="تصویری از محیط مرورگر فایرفاکس که در آن گیت‌هاب ایمیل منتهی به @sharif.edu را نمی‌پذیرد" title="/images/sharif-github-sanctions.jpg"/&gt;
&lt;p&gt;
خبر آنکه:
گیت‌هاب ایمیل شریف نمی‌پذیره و نمی‌شه دیگه باهاش حساب دانشجویی ساخت.&lt;/p&gt;
&lt;p&gt;
مدیر عامل گیت‌هاب اخیرا استعفا کرده و الان کنترل گیت‌هاب خیلی بیشتر از قبل دست مایکروسافته. اینه که اگر تا الان به فکر نبودید، بد نیست به جایگزین‌های گیت‌هاب فکر کنید. کلا مخربه که کد نرم‌افزار آزاد بیفته دست یک سکو که خودش آزاد نیست.&lt;/p&gt;
&lt;p&gt;
مثلا &lt;a href="https://codeberg.org"&gt;codeberg.org&lt;/a&gt; جای خوبیه یا &lt;a href="https://framagit.org"&gt;framagit.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
مهاجرت کنید 🚀&lt;/p&gt;</description></item><item><title>حادثهٔ گویآنیا</title><link>https://hossein.me/posts/fa/goiania-accident/</link><pubDate>Thu, 04 Sep 2025 14:33:09 +0330</pubDate><guid>https://hossein.me/posts/fa/goiania-accident/</guid><description>&lt;img src="https://imgs.xkcd.com/comics/cesium.png" alt="یک کمیک xkcd درمورد میگوهای آلوده به مواد رادیواکتیو" title="https://imgs.xkcd.com/comics/cesium.png"/&gt;
&lt;p&gt;
توی برزیل، سال ۱۹۸۴، یک درمانگاه پرتودرمانی منتقل می‌شه به یک مکان جدید. به خاطر دعوای حقوقی درمانگاه و مالک زمین، وسایل پزشکی، توی ساختمون قدیمی رها میشن به امان خدا.
مسئولین درمانگاه میدونستن باید وسایل رادیواکتیو رو خارج کنن، ولی به دستور دادگاه، پلیس نمیذاشته و یک نگهبان هم گذاشتن جلوی در که نه چیزی وارد شه و نه چیزی خارج.&lt;/p&gt;
&lt;p&gt;
خلاصه نزدیک‌های پاییز، نگهبان نرفت نگهبانی بده و موند خونه. دوتا دزد محترم هم رفتن از درمانگاه پرتودرمانی دزدی کردن. وسایل رو گذاشتن توی فرغون! و بردن خونه‌شون تا تیکه‌تیکه کنن و بفروشن.&lt;/p&gt;
&lt;p&gt;
بعد هم که وسایل رو تیکه تیکه کردن دیدن عه چه ماده‌های قشنگی، پودرای خوشگل که از خودشون نور آبی ساطع می‌کنن.
اینا رو هی مالیدن به خودشون و اینور اونور، که آدمای مختلفی مریض شدن. موقع اعلام شدن ماجرا، همه ترسیدن و دولت برزیل مجبور شد جمعا ۱۱۲,۰۰۰ نفر رو معاینه کنه، که ۲۴۹ نفرشون هم به مواد رادیواکتیو آلوده بودن.&lt;/p&gt;
&lt;p&gt;
نتیجه اخلاقی: برای انتخاب محل دزدی هم شیمی دبیرستان لازمه.&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://explainxkcd.com/3131/"&gt;توضیح تصویر&lt;/a&gt;: اخیرا یک سری میگوی یخ‌زده توی اندونزی هم آلوده به مواد رادیواکتیو شدن و FDA درخواست جمع‌آوری‌شون رو داده.&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://en.wikipedia.org/wiki/Goi%C3%A2nia_accident"&gt;منبع&lt;/a&gt;&lt;/p&gt;</description></item><item><title>آزمون دانش شما درمورد رایانامه</title><link>https://hossein.me/posts/fa/email-quiz/</link><pubDate>Thu, 04 Sep 2025 14:32:09 +0330</pubDate><guid>https://hossein.me/posts/fa/email-quiz/</guid><description>&lt;img src="https://hossein.me/images/email-wtf.jpg" alt="یک کمیک xkcd درمورد میگوهای آلوده به مواد رادیواکتیو" title="/images/email-wtf.jpg" style="width:35%;"/&gt;
&lt;p&gt;
اگر میخواید دانشتون رو درمورد RFCهای رایانامه (ایمیل) بسنجید بشتابید.&lt;/p&gt;
&lt;p&gt;
سایت &lt;a href="https://e-mail.wtf"&gt;e-mail.wtf&lt;/a&gt; یک بازیه که ازتون می‌خواد مشخص کنید چه آدرس ایمیلی معتبره، و چه آدرسی نه. آخرشم بهتون امتیاز میده.&lt;/p&gt;
&lt;p&gt;
دلم نمیاد مثال بزنم، پس برید و خودتون رو محک بزنید 😇&lt;/p&gt;
&lt;p&gt;
خودم ۱۱ از ۲۱ شدم، ‌شما چطور؟&lt;/p&gt;</description></item><item><title>How to tunnel all your outgoing traffic using WireGuard, but keep your connection to your VPS</title><link>https://hossein.me/quicknotes/vps-traffic-tunnel/</link><pubDate>Thu, 04 Sep 2025 12:58:17 +0330</pubDate><guid>https://hossein.me/quicknotes/vps-traffic-tunnel/</guid><description>&lt;p&gt;
Add this to your wireguard config:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[Interface]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# under interface add:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PostUp = /etc/wireguard/post-up.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PostDown = /etc/wireguard/post-down.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Fill in the variables and use these AI-written bash scripts, post up:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# This script is executed by WireGuard&amp;#39;s PostUp hook.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# It creates a new routing table and rules to ensure that traffic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# originating from the server&amp;#39;s public IP is routed through the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# public gateway, preserving new and established connections.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Configuration - PLEASE FILL IN THESE VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your server&amp;#39;s public IPv4 address.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example: PUBLIC_IPV4=&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PUBLIC_IPV4&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your server&amp;#39;s public IPv6 address (optional, leave blank if none).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example: PUBLIC_IPV6=&amp;#34;2001:db8::1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PUBLIC_IPV6&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your server&amp;#39;s public-facing network interface.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Find with: ip a | grep &amp;#39;state UP&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example: PUBLIC_INTERFACE=&amp;#34;eth0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PUBLIC_INTERFACE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;eth0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# The gateway for your public IPv4 address.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Find with: ip route | grep default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example: GATEWAY_IPV4=&amp;#34;198.51.100.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GATEWAY_IPV4&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# The gateway for your public IPv6 address (optional, leave blank if none).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Find with: ip -6 route | grep default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example: GATEWAY_IPV6=&amp;#34;2001:db8::ffff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GATEWAY_IPV6&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --- Advanced Configuration ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# A unique ID for the custom routing table. Choose a number between 1 and 252&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# that is not already in use in /etc/iproute2/rt_tables.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TABLE_ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;52&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TABLE_NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;keep_connections&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# The priority for the routing rule. Lower numbers are checked first.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PRIORITY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Script Logic - DO NOT EDIT BELOW THIS LINE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -e &lt;span style="color:#75715e"&gt;# Exit immediately if a command exits with a non-zero status.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;--- [WG PostUp] Maintaining public connectivity ---&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p /etc/iproute2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;touch /etc/iproute2/rt_tables
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Add a named routing table for clarity. This makes it easier to identify its purpose.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ! grep -q &lt;span style="color:#e6db74"&gt;&amp;#34;^\s*&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;\s*&lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;\s*&lt;/span&gt;$&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; /etc/iproute2/rt_tables; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Adding routing table &amp;#39;&lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#39; to /etc/iproute2/rt_tables&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Using tee with sudo to ensure we have permission to write to the file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt; &lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | sudo tee -a /etc/iproute2/rt_tables &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --- Add routes to the custom table ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# These routes define how to send traffic out through the public interface.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# IPv4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV4&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$GATEWAY_IPV4&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Adding IPv4 default route to table &amp;#39;&lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#39;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip route add default via &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$GATEWAY_IPV4&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; dev &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_INTERFACE&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; table &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Skipping IPv4 route configuration (address or gateway not set).&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# IPv6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV6&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$GATEWAY_IPV6&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Adding IPv6 default route to table &amp;#39;&lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#39;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip -6 route add default via &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$GATEWAY_IPV6&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; dev &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_INTERFACE&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; table &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Skipping IPv6 route configuration (address or gateway not set).&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --- Add policy routing rules ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# These rules tell the kernel to use our custom table for any traffic coming *from* the public IP.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# IPv4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV4&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ! ip rule list | grep -q &lt;span style="color:#e6db74"&gt;&amp;#34;from &lt;/span&gt;$PUBLIC_IPV4&lt;span style="color:#e6db74"&gt; lookup &lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Adding IPv4 policy rule...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip rule add from &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV4&lt;span style="color:#e6db74"&gt;/32&amp;#34;&lt;/span&gt; table &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; priority &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PRIORITY&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;IPv4 policy rule already exists.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# IPv6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV6&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ! ip -6 rule list | grep -q &lt;span style="color:#e6db74"&gt;&amp;#34;from &lt;/span&gt;$PUBLIC_IPV6&lt;span style="color:#e6db74"&gt; lookup &lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Adding IPv6 policy rule...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip -6 rule add from &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV6&lt;span style="color:#e6db74"&gt;/128&amp;#34;&lt;/span&gt; table &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; priority &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PRIORITY&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;IPv6 policy rule already exists.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;--- [WG PostUp] Script finished successfully ---&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
post down:&lt;/p&gt;
&lt;div class="src src-bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# This script is executed by WireGuard&amp;#39;s PostDown hook.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# It cleans up the rules and routes created by the PostUp script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# to restore the server&amp;#39;s default routing behavior.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Configuration - MUST MATCH YOUR PostUp SCRIPT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your server&amp;#39;s public IPv4 address.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example: PUBLIC_IPV4=&amp;#34;198.51.100.5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PUBLIC_IPV4&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your server&amp;#39;s public IPv6 address (optional, leave blank if none).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Example: PUBLIC_IPV6=&amp;#34;2001:db8::1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PUBLIC_IPV6&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --- Advanced Configuration ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TABLE_ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;52&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TABLE_NAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;keep_connections&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PRIORITY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Script Logic - DO NOT EDIT BELOW THIS LINE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ==============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -e &lt;span style="color:#75715e"&gt;# Exit immediately if a command exits with a non-zero status.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;--- [WG PreDown] Cleaning up routing rules ---&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --- Remove policy routing rules ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# IPv4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV4&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Use a loop to be safe, in case a rule was added multiple times by mistake.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; ip rule list | grep -q &lt;span style="color:#e6db74"&gt;&amp;#34;from &lt;/span&gt;$PUBLIC_IPV4&lt;span style="color:#e6db74"&gt;.*lookup &lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Removing IPv4 policy rule...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip rule del from &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV4&lt;span style="color:#e6db74"&gt;/32&amp;#34;&lt;/span&gt; table &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; priority &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PRIORITY&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# IPv6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV6&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; ip -6 rule list | grep -q &lt;span style="color:#e6db74"&gt;&amp;#34;from &lt;/span&gt;$PUBLIC_IPV6&lt;span style="color:#e6db74"&gt;.*lookup &lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Removing IPv6 policy rule...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip -6 rule del from &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV6&lt;span style="color:#e6db74"&gt;/128&amp;#34;&lt;/span&gt; table &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; priority &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PRIORITY&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --- Flush the custom routing table ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# This removes the default routes we added to our custom table.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Flushing routing table &amp;#39;&lt;/span&gt;$TABLE_NAME&lt;span style="color:#e6db74"&gt;&amp;#39;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip route flush table &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PUBLIC_IPV6&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip -6 route flush table &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TABLE_ID&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;--- [WG PostDown] Script finished successfully ---&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>How to migrate torrent files from one qBittorrent cilent to another?</title><link>https://hossein.me/quicknotes/qbittorrent-migration/</link><pubDate>Sat, 16 Aug 2025 11:13:49 +0330</pubDate><guid>https://hossein.me/quicknotes/qbittorrent-migration/</guid><description>&lt;p&gt;
I have had this problem where I reinstalled my OS and qBittorrent forgot all about my downloaded torrents. I was facing a brand-new, blank page in qBIttorrent. I could not seed the files I already had. Here&amp;#39;s how I solved it.&lt;/p&gt;
&lt;p&gt;
For me, all files downloaded from torrent go inside a single directory, without any change in their name (except some that have naming conflicts, for those that have conflicting names I create a separate folder and put both of them in it, then I&amp;#39;ll have to change their address manually and my automation doesn&amp;#39;t work). So here&amp;#39;s how I do migration for those that are not exceptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redownload all the .torrent files I have the files for.&lt;/li&gt;
&lt;li&gt;Put all of them in a single directory. Now this directory contains all the .torrent files my qBittorrent client needs.&lt;/li&gt;
&lt;li&gt;Press (Alt + O) inside qBittorrent (or go to Tools -&amp;gt; Preferences inside it).&lt;/li&gt;
&lt;li&gt;From the left pane choose Downloads.&lt;/li&gt;
&lt;li&gt;Under &amp;#34;Saving Management&amp;#34; change the &amp;#34;Default Save Path&amp;#34; to the folder that contains all your downloaded files in a single directory. This is where the actual downloaded files are, not where the .torrent files are. These are two separate directories.&lt;/li&gt;
&lt;li&gt;Now go a little below, look for &amp;#34;Automatically add torrents from:&amp;#34;&lt;/li&gt;
&lt;li&gt;Press &amp;#34;Add&amp;#34; and add your folder that has &lt;em&gt;all your .torrent files&lt;/em&gt; in it, press &amp;#34;OK&amp;#34;, now all your torrents are automatically added to qBittorrent without any hassle, directing it to look at Default Save Path for the files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If all goes well, your qBittorrent will realize that files are already downloaded, if it doesn&amp;#39;t, then you&amp;#39;ve probably made a mistake, or have changed the name of the folders/files.&lt;/p&gt;
&lt;p&gt;
For my method to work, or for any torrent client to realize you&amp;#39;re pointing to an already downloaded file, it&amp;#39;s really important not to change the file/folder names at all. The name in the torrent file and the folders/files on your PC should match. If you have changed the names or have made an arbitrary folder structure, you need to ask AI to write you a python script to reverse your directory structure (for example move everything from A B C D … Z folders back to a single directory) or if you&amp;#39;ve really changed everything, to extract the folder/file names from torrent files and automatically revert them back to normal.&lt;/p&gt;</description></item><item><title>How to Share a Secret: Summary of Shamir's Paper</title><link>https://hossein.me/posts/en/how-to-share-a-secret/</link><pubDate>Mon, 11 Aug 2025 13:15:47 +0330</pubDate><guid>https://hossein.me/posts/en/how-to-share-a-secret/</guid><description>&lt;p&gt;
In his 1979 paper, Adi Shamir explains an ingenious way to share a secret between &lt;code class="verbatim"&gt;n&lt;/code&gt; people, such that only if &lt;code class="verbatim"&gt;k&lt;/code&gt; of them cooperate will the secret be revealed. And that even if &lt;code class="verbatim"&gt;k-1&lt;/code&gt; people cooperated, nothing would be revealed.&lt;/p&gt;
&lt;p&gt;
How it works is simple.
For a polynomial of degree 1 (i.e, $f(x)=a_{1}x+a_{0}$), how many &lt;code class="verbatim"&gt;(x,y)&lt;/code&gt; points do you need to find $a_{1}$ and $a_{0}$? Two. If you had only one point, you could find a relationship between $a_{0}$ and $a_{1}$ but that would be all.
For a polynomial of degree 2 (i.e, $f(x)=a_{2}x^2+a_{1}x+a_{0}$), how many &lt;code class="verbatim"&gt;(x,y)&lt;/code&gt; points do you need to find $a_{2}, a_{1}$ and $a_{0}$? Three. If you had only two points, there would still be an infinite pairs of $a_{2}$, $a_{1}$ and $a_{0}$.&lt;/p&gt;
&lt;p&gt;
Knowing what we know about polynomials, suppose &lt;code class="verbatim"&gt;n&lt;/code&gt; people need to be able to be part of our trusted group, such that if &lt;code class="verbatim"&gt;k&lt;/code&gt; of them cooperated, they could work out the secret.&lt;/p&gt;
&lt;p&gt;
We set $a_{0}$ as our secret. We generate a polynomial of degree &lt;code class="verbatim"&gt;k-1&lt;/code&gt; so there are &lt;code class="verbatim"&gt;k&lt;/code&gt; coefficients and at least &lt;code class="verbatim"&gt;k&lt;/code&gt; points or cooperating members are needed. Except for $a_{0}$ which is our secret, we generate the coefficients ($a_{1}$ to $a_{n}$) randomly. Then we index our &lt;code class="verbatim"&gt;n&lt;/code&gt; members give them each the &lt;code class="verbatim"&gt;f(x)&lt;/code&gt; of their index, so member one gets &lt;code class="verbatim"&gt;f(1)&lt;/code&gt;, member two gets &lt;code class="verbatim"&gt;f(2)&lt;/code&gt; and so on up to member n who gets &lt;code class="verbatim"&gt;f(n)&lt;/code&gt;. Now if any &lt;code class="verbatim"&gt;k&lt;/code&gt; members cooperate, they&amp;#39;ll have the numbers to find out all the coefficients, and work out $a_{0}$. Easy as that. We will also use modulo arithmetic for our polynomial equations so every number is equally likely in it.&lt;/p&gt;</description></item><item><title>مقایسهٔ مدل‌های زبانی بزرگ در ترجمه</title><link>https://hossein.me/quicknotes/comparing-llms-in-english-translation/</link><pubDate>Mon, 11 Aug 2025 00:02:39 +0330</pubDate><guid>https://hossein.me/quicknotes/comparing-llms-in-english-translation/</guid><description>&lt;p&gt;
یکی از دوستان یک هوش مصنوعی معرفی کرد به آدرس z.ai که خواستم امتحانش کنم، برای همون متن همیشگی ترجمه‌ام رو بهش دادم و توی ترجمه افتضاح بود.
متن انگلیسی زیر مربوط به کتاب How We Change ه:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You’re eager to make the change. You know all the ways it will benefit you. Your life will be smoother, happier, more successful; you’ll finally reach that perfect crow pose, lose that beer belly, schedule your time better, finally get out of the house and meet your perfect match, take that long-awaited step into a new career. The change will make you proud, raise your self-esteem, align your life with your values, bring you fulfillment and a sense of accomplishment. So you plan. You set up a daily schedule, enlist the help of a trusted ally, set reminders on your cell phone, buy a journal so you can record your successes. This time, you’re going to do it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;عبارت that perfect crow pose رو اگر ترجمه کنیم «حرکت بی‌نقص کلاغ» اشتباه میشه ترجمه و باید حتما رسوند که منظور در یوگاست چون توی انگلیسی مشخصه pose به یوگا اشاره داره ولی «حرکت» توی فارسی نه.&lt;/li&gt;
&lt;li&gt;کلمه journal فارسیش خوب در نمیاد و خیلی از هوش‌مصنوعی‌ها اشتباه کردن سرش. «دفترچه روزنامه»‌ مثلا اشتباهه و «دفترچه» ترجمه بهتریه و «دفتر یادداشت روزانه»‌ از همه بهتره.&lt;/li&gt;
&lt;li&gt;در آخرین خط: This time, your doing it. اگر به صورت ساده ترجمه بشه به «این دفعه انجامش میدید» اشتباهه چون با اینکه حرف تاییدی توش به کار نرفته تاکید توی انگلیسیش مضمره و حرف تاکیدی باید بیاد، که بعضی از هوش‌مصنوعی‌ها موفق بودن توش.&lt;/li&gt;
&lt;li&gt;هیچ کدوم از هوش مصنوعی‌ها نتونستن ترجمهٔ beer belly که فارسیش میشه شکم عرق‌خوری رو در بیارن متاسفانه و همه نوشتن شکم آبجو. در این بین مدل gpt-4o که شکم عرق‌خوری رو ترجمه کرده شکم啤酒خوار از همه فاجعه‌تر بود. که 啤酒 در چینی میشه آبجو واقعا ولی خب توی ترجمه فارسی جاش نبود‌ :)&lt;/li&gt;
&lt;li&gt;بعضی از هوش‌مصنوعی‌ها اشتباهی proud رو مغرور ترجمه کردن که توی این پاراگراف معنی افتخار داره.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;بخوام امتیاز بدم بهترین ترجمه 🥇برای Gemini 2.5 Pro بود و بعد از اون 🥈 Deepseek و بقیهٔ ترجمه‌ها بابت اشتباهات فاحش ارزش خوندن نداشتن.&lt;/p&gt;
&lt;p&gt;
پاسخ همهٔ هوش مصنوعی‌ها رو &lt;a href="https://telegra.ph/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%D9%85%D8%AF%D9%84%E2%80%8C%D9%87%D8%A7%DB%8C-%D8%B2%D8%A8%D8%A7%D9%86%DB%8C-%D8%A8%D8%B2%D8%B1%DA%AF-%D8%AF%D8%B1-%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%D8%A7%D9%86%DA%AF%D9%84%DB%8C%D8%B3%DB%8C-%D8%A8%D9%87-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-07-28"&gt;اینجا&lt;/a&gt; گذاشتم.&lt;/p&gt;</description></item><item><title>Tail Recursion</title><link>https://hossein.me/posts/en/tail-recursion/</link><pubDate>Sun, 10 Aug 2025 11:18:51 +0330</pubDate><guid>https://hossein.me/posts/en/tail-recursion/</guid><description>
&lt;p&gt;
As nice as recursion is, sometimes our stack may grow too large, causing our program to crash due to running out of stack space. However, some languages support tail call optimization. That is, if you write your function in a way that leaves no need to use the previous stack, the compiler will use the same stack for its job and you&amp;#39;ll never hit the stack overflow problem.&lt;/p&gt;
&lt;p&gt;
For example, here&amp;#39;s a Fibonacci implementation in C.&lt;/p&gt;
&lt;div class="src src-c"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// badfib.C
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Non-tail recursive function for Fibonacci
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fibonacci&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fibonacci&lt;/span&gt;(n &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fibonacci&lt;/span&gt;(n &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Enter a number: &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scanf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;n);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Fibonacci of %d is %d&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, n, &lt;span style="color:#a6e22e"&gt;fibonacci&lt;/span&gt;(n));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;img src="https://hossein.me/images/fibonacci-stack.svg" alt="This figure shows how fibonacci&amp;#39;s 5th term is calculated." title="/images/fibonacci-stack.svg" style="height:100%;width:100%;color:red;"/&gt;
&lt;p&gt;
Using this code, calculating the 5th term (&lt;code class="verbatim"&gt;1,1,2,3,5&lt;/code&gt;) can be done like the picture above. You can see the stack frames grow too long. Each call of the function waits for the return of at least two other function calls, and neither of the first two branches can be calculated until we reach &lt;code class="verbatim"&gt;fibonacci(0)&lt;/code&gt; and &lt;code class="verbatim"&gt;fibonacci(1)&lt;/code&gt;. Since we need to keep track of what two numbers are being added together, we also can&amp;#39;t reduce the amount of data we keep.&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ gcc -O0 badfib.c -o badfib
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ ./badfib
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enter a number: 500000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[1] 43221 segmentation fault (core dumped) ./badfib
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ gcc -O1 badfib.c -o badfib_optimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ ./badfib_optimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enter a number: 500000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[1] 43283 segmentation fault (core dumped) ./badfib_optimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ gcc -O3 badfib.c -o badfib_super_optimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ ./badfib_super_optimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enter a number: 500000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# takes too long :)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
As you can see, no matter the level of optimization, the code doesn&amp;#39;t finish in the way we want it to.&lt;/p&gt;
&lt;p&gt;
Now suppose we refactor our code like this:&lt;/p&gt;
&lt;div class="src src-c"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Tail recursive function for Fibonacci
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fibonacci_tail&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fibonacci_tail&lt;/span&gt;(n &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, b, a &lt;span style="color:#f92672"&gt;+&lt;/span&gt; b);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fibonacci&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fibonacci_tail&lt;/span&gt;(n, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Enter a number: &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scanf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;n);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Fibonacci&amp;#39;s %d term is %d&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, n, &lt;span style="color:#a6e22e"&gt;fibonacci&lt;/span&gt;(n));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here&amp;#39;s how the functions are called:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;fib(5)&lt;/code&gt; : &lt;code class="verbatim"&gt;fib_tail(5, 0, 1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;fib_tail(5,0,1)&lt;/code&gt; : &lt;code class="verbatim"&gt;fib_tail(4,1,1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;fib_tail(4,1,1)&lt;/code&gt; : &lt;code class="verbatim"&gt;fib_tail(3,1,2)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;fib_tail(3,1,2)&lt;/code&gt; : &lt;code class="verbatim"&gt;fib_tail(2,2,3)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;fib_tail(2,2,3)&lt;/code&gt; : &lt;code class="verbatim"&gt;fib_tail(1,3,5)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class="verbatim"&gt;fib_tail(1,3,5)&lt;/code&gt; : &lt;code class="verbatim"&gt;5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or in a nice little picture:&lt;/p&gt;
&lt;img src="https://hossein.me/images/fibonacci-optimized-stack.svg" alt="This figure shows how fibonacci&amp;#39;s 5th term is calculated using the tail recursive optimized code." title="/images/fibonacci-optimized-stack.svg" style="width:35%;"/&gt;
&lt;p&gt;
You may have noticed that this time is no different. It is less messy, sure, but each function still needs to wait for the result of another function so that it can finally return the value and remove its stack. The nice thing about this function, though, is that it &lt;em&gt;can&lt;/em&gt; be optimized. At each turn we&amp;#39;re accumulating the values we need inside two variables, and even if we only keep track of the last function call, we will still have the correct result.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Key idea:&lt;/strong&gt; You can refractor your recursive functions, such that the recursive function call is being done at the end of the function, and the ultimate result that you will return isn&amp;#39;t dependent on anything but the data in the very last function call. Then some languages like C will discard your stack at each new call and will just keep the last function call at each step. This will result in less memory usage and prevention of stack overflow. This is the essence of tail recursion optimization.&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s see if the optimization makes a difference:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ ./fib_tail_unoptimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enter a number: 500000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[1] 42515 segmentation fault (core dumped) ./fib_tail_unoptimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ gcc -O1 fib_tail.c -o fib_tail_optimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ ./fib_tail_optimized
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enter a number: 500000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Fibonacci&amp;#39;s 500000 term is -1975568635&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It did! The answer is incorrect because &lt;code class="verbatim"&gt;int&lt;/code&gt; can&amp;#39;t such a large number, but we didn&amp;#39;t run into a stack overflow segfault either!&lt;/p&gt;
&lt;p&gt;
Not all programming languages support tail recursion optimization though. And you need to know that discarding the stack will make it harder to debug your code because the stack won&amp;#39;t be in its complete form.&lt;/p&gt;
&lt;p&gt;
The moral of the story is that whenever you feel like you&amp;#39;re at risk of stack overflow, go ahead and rewrite your code using an accumulator so that it can be tail optimized, or just use a loop. In the case of relying on an accumulator the compiler should support TCO optimizaiton. If it doesn&amp;#39;t no worries. You could use GOTO (it doesn&amp;#39;t call new functions then, and it&amp;#39;ll reuse the same variables so it&amp;#39;s nice) to use the same stack frame, or write a loop.&lt;/p&gt;
&lt;p&gt;
For example, here&amp;#39;s the Fibonacci function written using a loop, nice and easy:&lt;/p&gt;
&lt;div class="src src-c"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fib&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; term){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(term &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(term &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; term &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, b&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, c&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;term&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; a&lt;span style="color:#f92672"&gt;+&lt;/span&gt;b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; c;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d: %ld&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, c);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; c;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fib&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-headline-1" class="outline-3"&gt;
&lt;h3 id="headline-1"&gt;
Further Reading
&lt;/h3&gt;
&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;
&lt;ul&gt;
&lt;li&gt;Tail Call Optimization in &lt;a href="https://inventwithpython.com/recursion/chapter8.html"&gt;The Recursive Book of Recursion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>How to share Mullvad VPN from Android on all your network?</title><link>https://hossein.me/posts/en/mullvad-termux-android-vpn-share/</link><pubDate>Sat, 02 Aug 2025 20:53:23 +0330</pubDate><guid>https://hossein.me/posts/en/mullvad-termux-android-vpn-share/</guid><description>&lt;p&gt;Suppose you want to share your &lt;a href="https://mullvad.net"&gt;Mullvad VPN&lt;/a&gt; over the network, you&amp;rsquo;re connected to it on your Android phone but not on any other device. How cool would it be if you could share it with other devices? Well you can do that.&lt;/p&gt;
&lt;p&gt;Once you connect to Mullvad VPN on your device, you&amp;rsquo;ll have access to a socks5 proxy on &lt;code&gt;socks5://10.64.0.1:1080&lt;/code&gt;, however this IP is only accessible from your Android phone. To share it with your other devices, first install &lt;a href="https://termux.dev/"&gt;Termux&lt;/a&gt;, then download the correct &lt;a href="https://gost.run/en/"&gt;gost&lt;/a&gt; binary according to your phone&amp;rsquo;s CPU architecture. Then you can instruct gost to forward all the packets it gets on port 8090 for example, to the socks5 provided by Mullvad. Done!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://github.com/go-gost/gost/releases/download/v3.1.0/gost_3.1.0_linux_arm64.tar.gz &lt;span style="color:#75715e"&gt;# change the version and architecture accordingly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar xfv *.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./gost -L :8090 -F socks5://10.64.0.1:1080 &lt;span style="color:#75715e"&gt;# If you&amp;#39;re in a hostile environment, use -L socks5://user:password@:8090 instead to have a socks5 proxy with authentication.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now if inside your Mullvad app settings, &amp;ldquo;Local network sharing&amp;rdquo; is turned on, then you can easily connect to your phone&amp;rsquo;s IP from other devices and use the socks5/http/https proxy provided on its port 8090.
You might think that since &lt;a href="https://mullvad.net/en/help/socks5-proxy"&gt;all servers in Mullvad offer socks5 proxy&lt;/a&gt;, you can access them all, but sadly this is not possbile because folks at Mullvad have decided that as soon as you turn on local network sharing, your connection to other servers should be lost.&lt;/p&gt;
&lt;p&gt;You can use this socks5 proxy using &lt;a href="https://addons.mozilla.org/en-US/android/addon/foxyproxy-standard/"&gt;FoxyProxy&lt;/a&gt; on Firefox on both Android (yes! you can install extensions on Firefox Android) and GNU\Linux/Windows/MacOS.&lt;/p&gt;</description></item><item><title>You Can Resolve Domains via curl Using DoH</title><link>https://hossein.me/posts/en/doh-and-odoh-using-curl/</link><pubDate>Tue, 29 Jul 2025 18:37:04 +0330</pubDate><guid>https://hossein.me/posts/en/doh-and-odoh-using-curl/</guid><description>&lt;p&gt;
Did you know you can use curl to get DNS information? Here&amp;#39;s how:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl -X GET &amp;#34;https://cloudflare-dns.com/dns-query?name=example.com&amp;amp;type=A&amp;#34; -H &amp;#34;Accept: application/dns-json&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&amp;#34;Status&amp;#34;:0,&amp;#34;TC&amp;#34;:false,&amp;#34;RD&amp;#34;:true,&amp;#34;RA&amp;#34;:true,&amp;#34;AD&amp;#34;:true,&amp;#34;CD&amp;#34;:false,&amp;#34;Question&amp;#34;:[{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1}],&amp;#34;Answer&amp;#34;:[{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:276,&amp;#34;data&amp;#34;:&amp;#34;23.192.228.84&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:276,&amp;#34;data&amp;#34;:&amp;#34;23.215.0.136&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:276,&amp;#34;data&amp;#34;:&amp;#34;23.192.228.80&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:276,&amp;#34;data&amp;#34;:&amp;#34;23.215.0.138&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:276,&amp;#34;data&amp;#34;:&amp;#34;96.7.128.175&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:276,&amp;#34;data&amp;#34;:&amp;#34;96.7.128.198&amp;#34;}]}%&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
It works on Cloudflare&amp;#39;s &lt;a href="https://research.cloudflare.com/projects/network-privacy/odns/"&gt;ODOH&lt;/a&gt; server too!&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl -X GET &amp;#34;https://odoh.cloudflare-dns.com/dns-query?name=example.com&amp;amp;type=A&amp;#34; -H &amp;#34;Accept: application/dns-json&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&amp;#34;Status&amp;#34;:0,&amp;#34;TC&amp;#34;:false,&amp;#34;RD&amp;#34;:true,&amp;#34;RA&amp;#34;:true,&amp;#34;AD&amp;#34;:false,&amp;#34;CD&amp;#34;:false,&amp;#34;Question&amp;#34;:[{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1}],&amp;#34;Answer&amp;#34;:[{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:35,&amp;#34;data&amp;#34;:&amp;#34;23.192.228.84&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:35,&amp;#34;data&amp;#34;:&amp;#34;23.215.0.138&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:35,&amp;#34;data&amp;#34;:&amp;#34;23.215.0.136&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:35,&amp;#34;data&amp;#34;:&amp;#34;96.7.128.198&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:35,&amp;#34;data&amp;#34;:&amp;#34;96.7.128.175&amp;#34;},{&amp;#34;name&amp;#34;:&amp;#34;example.com&amp;#34;,&amp;#34;type&amp;#34;:1,&amp;#34;TTL&amp;#34;:35,&amp;#34;data&amp;#34;:&amp;#34;23.192.228.80&amp;#34;}]}%&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
If you can&amp;#39;t bootstrap a DoH server, you can always use &lt;a href="https://9.9.9.9/dns-query"&gt;https://9.9.9.9/dns-query&lt;/a&gt; instead (though not in this format) or &lt;a href="https://1.1.1.1/dns-query."&gt;https://1.1.1.1/dns-query.&lt;/a&gt; If you already know the IP of your target, you can use curl&amp;#39;s `–resolve` option too. curl has a `–doh-url` as well which can be used if you want curl to use DoH itself.&lt;/p&gt;
&lt;p&gt;
Note that although this method works for Cloudlare DoH servers, it is not part of any RFC so you can&amp;#39;t really rely on them and should refer to the &lt;a href="https://datatracker.ietf.org/doc/html/rfc8484"&gt;original RFC&lt;/a&gt; instead if you want to send your request to other servers.&lt;/p&gt;</description></item><item><title>So You Want to Learn Quicksort: Step-by-Step Guide to Basic, Lomuto &amp; Hoare Partitioning.</title><link>https://hossein.me/posts/en/so-you-want-to-learn-quicksort/</link><pubDate>Tue, 29 Jul 2025 11:54:15 +0330</pubDate><guid>https://hossein.me/posts/en/so-you-want-to-learn-quicksort/</guid><description>&lt;p&gt;I don&amp;rsquo;t have a Bachelor&amp;rsquo;s degree in computer science so I haven&amp;rsquo;t had any formal algorithm or data structure training. However, I am trying to remedy that by reading books and solving algorithmic questions on online platforms. One question in Hackerrank needed a sort implementation, which I couldn&amp;rsquo;t do without the help of AI, so I decided to learn about sort algorithms. I searched and found that quicksort has widespread usage, so I decided to learn it. However it was just too hard for me to grasp what was going on, so like a good programmer I decided to divide the problem into smaller parts and solve those :P.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The quicksort algorithm asks: what if we had an algorithm that takes a number (called the pivot) and divides our array into two parts, the ones smaller than the pivot and the ones larger than it? If an algorithm does this, we now have two arrays of numbers that we know don&amp;rsquo;t need to be compared. We could do the very same to those two arrays, then we keep doing this with the subarrays that are getting smaller and smaller in size, et voila! The resulting array is sorted. This is the essence of the quicksort algorithm.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The algorithm that partitions our arrays into subarrays that are all bigger or smaller than a certain number is called a partitioning algorithm. Most educational materials on quicksort conflate Lomuto&amp;rsquo;s and Hoare&amp;rsquo;s partitioning algorithms with the quicksort algorithm itself, so we could easily lose sight of the big picture. I have written a C quicksort program that is inefficient, yet easy to understand.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s learn about the silliest partitioning algorithm possible; then we can easily learn quicksort, even when it uses the right partitioning algorithms.&lt;/p&gt;
&lt;h2 id="basic-partitioning"&gt;Basic Partitioning&lt;/h2&gt;
&lt;p&gt;In the following code, we&amp;rsquo;ll partition an array of numbers into those bigger than the pivot and those smaller than the pivot in the silliest way: we go through all the numbers in the array one by one and put each number in one of the three temporary arrays we make — one temporary array for numbers bigger than the pivot, one for those smaller than the pivot, and one for those equal to it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define MAX_INTS 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printArray&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; place){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt;place;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d,&amp;#34;&lt;/span&gt;,arr[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;puts&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Partitions everything around the last array element (_high_ is the pivot) for elements **low** to high (not zero to high), returns the last array&amp;#39;s (pivot&amp;#39;s) new placement in the partitioned array.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;basicPartition&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; low, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//nE/L/H == number of equals/lows/highs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//idx is defined at a function scope here and used later to place the elements in their correct position
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; idx&lt;span style="color:#f92672"&gt;=&lt;/span&gt;low,nE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,nL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,nH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; pivot&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arr[high];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; Ls[MAX_INTS]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{},Hs[MAX_INTS]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{},Ps[MAX_INTS]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Element enumeration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Here we place the numbers into temporary high, low, or equal arrays. 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;low;i&lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt;high;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(arr[i]&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;pivot){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Hs[nH]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arr[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nH&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (arr[i]&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;pivot){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ls[nL]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arr[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nL&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (arr[i] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; pivot){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ps[nE]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arr[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nE&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Place from temp to arr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;nL;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;,idx&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr[idx]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Ls[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;nE;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;,idx&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr[idx]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Ps[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;nH;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;,idx&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr[idx]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Hs[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// return the new position of the pivot 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; low&lt;span style="color:#f92672"&gt;+&lt;/span&gt;nL&lt;span style="color:#f92672"&gt;+&lt;/span&gt;nE&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; low, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(low&lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt;high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; piv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;basicPartition&lt;/span&gt;(arr, low, high);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, low, piv&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, piv&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, high);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;899&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;93&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;789&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;95&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;56&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;180&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;43&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;93&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(arr)&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* printArray(arr,n-1); */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* int res = basicPartition(arr, 0, n-1); */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; res &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, n&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printArray&lt;/span&gt;(arr,n&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; EXIT_SUCCESS;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If I were to draw a picture it would look like this:
&lt;img src="https://hossein.me/images/quicksort-basic_partitioning.svg" alt="img"&gt;&lt;/p&gt;
&lt;p&gt;The problem with this implementation is that it uses O(n) in its partitioning. How can we improve that? Maybe instead of keeping everything in a temporary array of equal size, we could do in-place replacement? That&amp;rsquo;s what the Lomuto&amp;rsquo;s partitioning algorithm does. Let&amp;rsquo;s learn that.&lt;/p&gt;
&lt;h2 id="lomutos-partitioning-algorithm"&gt;Lomuto&amp;rsquo;s Partitioning Algorithm&lt;/h2&gt;
&lt;p&gt;So far we made a simple partitioning algorithm, but it left much to be desired in its memory usage. If we want to use less memory, how about we swap the elements instead of keeping them in temporary arrays? That&amp;rsquo;s what Lomuto&amp;rsquo;s algorithm does.
Imagine two little soldiers that we hire for sorting. The first one is named &lt;em&gt;i&lt;/em&gt;, and the second one is named &lt;em&gt;j&lt;/em&gt;.
Our little guy &lt;em&gt;i&lt;/em&gt;&amp;rsquo;s job is to protect the weak. He creates a firm boundary and all the elements smaller than the pivot line up before him.
Our adventurous fella &lt;em&gt;j&lt;/em&gt;&amp;rsquo;s job is to foray into the unknown, find those weaker than or equal to the pivot, and tell them they can find refuge if they line up before &lt;em&gt;i&lt;/em&gt;.
So here is how the algorithm works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the last element of the array is chosen as our pivot&lt;/li&gt;
&lt;li&gt;&lt;em&gt;i&lt;/em&gt; stands at &lt;code&gt;low-1&lt;/code&gt;, behind where the array even begins.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;j&lt;/em&gt; stands at &lt;code&gt;low&lt;/code&gt;, where the array begins.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;j&lt;/em&gt; marches forward, on its way forward, it finds an element that is lower than or equal to the pivot, once it does, it stops to let &lt;em&gt;i&lt;/em&gt; know.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;j&lt;/em&gt; and &lt;em&gt;i&lt;/em&gt; cooperate, i moves one step forward to mark the new boundary, the element at the new boundary is swapped with the weak/equal element.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;j&lt;/em&gt; keeps doing this and marching on until it reaches &lt;code&gt;arr[high]&lt;/code&gt; which is our pivot.&lt;/li&gt;
&lt;li&gt;When &lt;em&gt;j&lt;/em&gt; is at one step behind &lt;code&gt;arr[high]&lt;/code&gt;, we already know that &lt;code&gt;arr[high]&lt;/code&gt; is going to be equal to the pivot since the last element is the pivot itself, so we swap &lt;code&gt;arr[i+1]&lt;/code&gt; with &lt;code&gt;arr[high]&lt;/code&gt; manually without doing a condition check.&lt;/li&gt;
&lt;li&gt;At the end of the process, we return &lt;em&gt;i&lt;/em&gt;+1, which is where our boundary (i.e. our pivot&amp;rsquo;s position in array) is after this one final swap.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Intuition: In Lomuto&amp;rsquo;s algorithm we use &lt;em&gt;i&lt;/em&gt; as a boundary, and everything before &lt;em&gt;i&lt;/em&gt; is smaller than or equal to the pivot. So at each step if &lt;code&gt;arr[j]&lt;/code&gt; is smaller than the pivot we increase our boundary and move the smaller numbers inside our boundary. Now, since everything before our pivot is smaller than or equal to it and everything after that is bigger than it, our pivot is in fact in its sorted position by the definition of sort.&lt;/p&gt;
&lt;p&gt;How does this relate to quicksort? Using Lomuto&amp;rsquo;s algorithm, you have an algorithm that efficiently partitions an array, such that one number of your array (the pivot) is already in its sorted position, and you have two separate arrays before and after the pivot, in a way that they don&amp;rsquo;t need to be compared with each other since we already know some of them are always bigger than the others. Isn&amp;rsquo;t that great? If we now ignore the pivot which is now in its sorted position and keep partitioning for arrays that come before and after it, we&amp;rsquo;ll have a fully sorted array.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my implementation of quicksort using Lomuto&amp;rsquo;s partitioning algorithm.
Try not to repeat the mistakes I made during writing this code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I used &lt;code&gt;i=-1&lt;/code&gt; instead of &lt;code&gt;i=low-1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;I swapped &lt;code&gt;arr[high]&lt;/code&gt; and &lt;code&gt;arr[i]&lt;/code&gt; instead of &lt;code&gt;arr[high]&lt;/code&gt; and &lt;code&gt;arr[i+1]&lt;/code&gt; at the last step. The boundary is at &lt;em&gt;i&lt;/em&gt;+1, since we&amp;rsquo;re not doing that &lt;code&gt;i++&lt;/code&gt; which is inside our loop. Everything up to &lt;code&gt;i+1&lt;/code&gt; is lower than or equal to the pivot which is always at &lt;code&gt;arr[i+1]&lt;/code&gt; at the end of the algorithm.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define MAX_INTS 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printArray&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; place){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt;place;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d,&amp;#34;&lt;/span&gt;,arr[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;puts&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arrSwapInt&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; temp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr[b];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr[b] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr[a];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr[a] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lomutoPartition&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; low, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;low&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; piv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arr[high];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; j&lt;span style="color:#f92672"&gt;=&lt;/span&gt;low;j&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;high;j&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(arr[j]&lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt;piv){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;arrSwapInt&lt;/span&gt;(arr,i,j);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;arrSwapInt&lt;/span&gt;(arr,high,i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; low, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(low&lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt;high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; piv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;lomutoPartition&lt;/span&gt;(arr, low, high);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, low, piv&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, piv&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, high);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;899&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;93&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;789&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;95&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;56&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;180&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;43&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;93&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(arr)&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; res &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, n&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printArray&lt;/span&gt;(arr,n&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; EXIT_SUCCESS;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hoares-partitioning-algorithm"&gt;Hoare&amp;rsquo;s Partitioning Algorithm&lt;/h2&gt;
&lt;p&gt;Now let&amp;rsquo;s learn Hoare&amp;rsquo;s partitioning algorithm.&lt;/p&gt;
&lt;p&gt;In Lomuto&amp;rsquo;s our soldiers &lt;em&gt;i&lt;/em&gt; and &lt;em&gt;j&lt;/em&gt; had different jobs, now they have the same job description. The only difference between &lt;em&gt;i&lt;/em&gt; and &lt;em&gt;j&lt;/em&gt; is that &lt;em&gt;i&lt;/em&gt; starts one step behind the beginning of the array and &lt;em&gt;j&lt;/em&gt; starts from one step after the end of the array. They take rounds to march on and stop where they find elements that shouldn&amp;rsquo;t be where they are. That is, first &lt;em&gt;i&lt;/em&gt; marches towards the end of the array and stops if it sees any element that is bigger than the pivot, and then &lt;em&gt;j&lt;/em&gt; marches towards the beginning of the array and stops if it sees any element that is smaller than the pivot. Once they&amp;rsquo;re both stopped, we can very astutely move two elements to their correct place with one swap and that&amp;rsquo;s what we do. Our soldiers &lt;em&gt;i&lt;/em&gt; and &lt;em&gt;j&lt;/em&gt; both keep moving until they face each other (&lt;code&gt;i==j&lt;/code&gt;) or get past one another (&lt;code&gt;i&amp;gt;j&lt;/code&gt;). That is when they know they&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;In short, in Hoare&amp;rsquo;s algorithm, you move from both sides to the other, stop at the wrong elements from each side, and swap them.
Note that just like the two algorithms above, at the end of the Hoare&amp;rsquo;s algorithm it is guaranteed that all items left of the returned &lt;em&gt;j&lt;/em&gt; are smaller than the pivot, and all items right of the retuned &lt;em&gt;j&lt;/em&gt; are bigger than the pivot. But unlike those two, the pivot itself doesn&amp;rsquo;t end up at the returned &lt;em&gt;j&lt;/em&gt; and it won&amp;rsquo;t be at its sorted position. That is, while Hoare&amp;rsquo;s partitioning algorithm returns the boundary of our partitioned arrays (&lt;em&gt;j&lt;/em&gt;), our pivot is not at &lt;em&gt;j&lt;/em&gt; (even though we can move it with one extra swap since we already know the boundary, we don&amp;rsquo;t do this since at the end of the recursion each element will be in its sorted position and this is unnecessary). So this time in the quicksort algorithm, we don&amp;rsquo;t do quicksort on &lt;code&gt;(low,piv-1)&lt;/code&gt; and &lt;code&gt;(piv+1,high)&lt;/code&gt; which ignores the element at piv, instead we do &lt;code&gt;(low,piv)&lt;/code&gt; &lt;code&gt;(piv+1,high)&lt;/code&gt; which includes the element at piv.&lt;/p&gt;
&lt;p&gt;Try not to repeat the mistakes I made while writing this code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I forgot to put the = in the loop break condition, so my code would get stuck in a loop.&lt;/li&gt;
&lt;li&gt;I forgot to make the pivot equal to &lt;code&gt;arr[low]&lt;/code&gt; and made it equal to &lt;code&gt;arr[0]&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define MAX_INTS 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printArray&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; place){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;i&lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt;place;i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d,&amp;#34;&lt;/span&gt;,arr[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;puts&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arrSwapInt&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; temp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr[b];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr[b] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr[a];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr[a] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Returns piv_index instead of where the pivot is
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// pivot is not in its sorted position
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hoarePartition&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; low, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// low, not zero!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; piv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arr[low];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;low&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,j&lt;span style="color:#f92672"&gt;=&lt;/span&gt;high&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (arr[i]&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;piv);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; j&lt;span style="color:#f92672"&gt;--&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (arr[j]&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;piv);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// if you don&amp;#39;t put the equal, for 11,4,18,13 it will get stuck in a loop since the j that is returned will be 0 instead of 1.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// since the pivot index is the same as the one that was called, it will get stuck in a loop, unless you break when both i and j are equal
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// breaking on j==i makes sense, since if i==j then we are already done comparing boundaries and at the correct pivot index.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(i&lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt;j){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;arrSwapInt&lt;/span&gt;(arr, i, j);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; j;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Counts from zero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[], &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; low, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(low&lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt;high){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; piv_index&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;hoarePartition&lt;/span&gt;(arr, low, high);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Different from Lomuto&amp;#39;s and basic partitioning
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, low, piv_index);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, piv_index&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, high);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr[] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;899&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;93&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;789&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;95&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;56&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;180&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;43&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;93&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* int arr[] = {11,4,18,13}; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(arr)&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* int res = hoarePartition(arr, 0, n-1); */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; res &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;quickSort&lt;/span&gt;(arr, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, n&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;puts&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Sorted array:&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printArray&lt;/span&gt;(arr,n&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; EXIT_SUCCESS;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="extra-tips"&gt;Extra Tips&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pivots:&lt;/strong&gt; In Lomuto&amp;rsquo;s algorithm, the last element (&lt;code&gt;arr[high]&lt;/code&gt;) must be our pivot, because during the quicksort call on &lt;code&gt;(low,piv-1)&lt;/code&gt; and &lt;code&gt;(piv+1,high)&lt;/code&gt; we assume that the pivot is in its sorted position (that is, at the end of the boundary, where we have done our last swap), so we must choose the last element as our pivot. But if we need another array element to be our pivot, we can always swap it with the last element before we&amp;rsquo;re calling the algorithms and make the chosen element the last element. But in Hoare&amp;rsquo;s all we need is an arbitrary number that, ideally, is larger that half of the numbers and smaller than the other half, but we can choose any number really.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best case and worse case:&lt;/strong&gt; Running the quicksort algorithm on an already sorted array will have a time complexity of O(n^2). So we usually choose a random element as our pivot (and if it is Lomuto&amp;rsquo;s, we need to swap it and make it the last element).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stability of the sort algorithms:&lt;/strong&gt; The basic partitioning algorithm is stable. But neither Lomuto&amp;rsquo;s nor Hoare&amp;rsquo;s algorithms are stable, meaning that for equal items (to which we have attached extra data) the order could be changed. That is &lt;code&gt;{(1,red),(2,blue),(1,blue)}&lt;/code&gt; could become &lt;code&gt;{(1,blue), (1,red), (2,blue)}&lt;/code&gt;. This would be really bad if we were sorting data in a database with timestamps for example.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Partition Method&lt;/th&gt;
 &lt;th&gt;Pivot Choice&lt;/th&gt;
 &lt;th&gt;Extra Memory&lt;/th&gt;
 &lt;th&gt;Pivot Position After Partition&lt;/th&gt;
 &lt;th&gt;Stability&lt;/th&gt;
 &lt;th&gt;Average Time&lt;/th&gt;
 &lt;th&gt;Worst-Case Time&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Basic (temp arrays)&lt;/td&gt;
 &lt;td&gt;Doesn&amp;rsquo;t matter&lt;/td&gt;
 &lt;td&gt;O(n)&lt;/td&gt;
 &lt;td&gt;Pivot(s) end up in the middle of the concatenated lows-equals-highs block&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;O(n log n)&lt;/td&gt;
 &lt;td&gt;O(n²)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Lomuto&lt;/td&gt;
 &lt;td&gt;Must be the last element&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;td&gt;Pivot placed at its final sorted index (i+1)&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;O(n log n)&lt;/td&gt;
 &lt;td&gt;O(n²)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hoare&lt;/td&gt;
 &lt;td&gt;Doesn&amp;rsquo;t matter but usually the first element&lt;/td&gt;
 &lt;td&gt;O(1)&lt;/td&gt;
 &lt;td&gt;Pivot not guaranteed in final position; partitions around boundary j&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;O(n log n)&lt;/td&gt;
 &lt;td&gt;O(n²)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Did you see what we did for sorting? There is much to be learned from what we did here. We used &lt;strong&gt;Divide and Conquer&lt;/strong&gt; to solve our problem. At each section we only had an algorithm that could do a single sort (a partitioning algorithm can put at most one element in its sorted position) but we used this algorithm - which can&amp;rsquo;t be seen as a sorting algorithm - 1. multiple times and 2. on smaller and smaller subsets of our problem, so at the end sorting happened efficiently. Any time you&amp;rsquo;re thinking about a problem that can&amp;rsquo;t be solved efficiently, maybe you could think about single items and then use D&amp;amp;C to solve the problem.&lt;/p&gt;
&lt;h1 id="todo"&gt;TODO&lt;/h1&gt;
&lt;p&gt;I asked AI what I should learn next and here are its opinions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; You never mention the importance of pivot choice on expected running time or practical performance (cache behavior, branch prediction, etc.). Real-world quicksort typically uses “median-of-three” or introspective quicksort (Introsort) that switches to heapsort if recursion gets too deep.&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Neither Lomuto’s nor Hoare’s implementations do tail recursion elimination. In the worst case (unbalanced splits), your recursion depth is O(n) and you risk a stack overflow. Best practice is to recurse on the smaller subarray first, then iterate on the larger one.&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Discuss three-way partitioning for many-duplicate inputs.
And I think I should:&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Add pictures of our valiant soldiers &lt;em&gt;i&lt;/em&gt; and &lt;em&gt;j&lt;/em&gt; performing their duties in Lomuoto&amp;rsquo;s and Hoare&amp;rsquo;s algorithms.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>