<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Quick Notes on Hossein Naghdbishi</title><link>https://hossein.me/quicknotes/</link><description>Recent content in Quick Notes 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/quicknotes/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/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>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>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>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>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>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>مقایسهٔ مدل‌های زبانی بزرگ در ترجمه</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>How to connect to a bluetooth device using cli in GNU/Linux</title><link>https://hossein.me/quicknotes/bluetoothctl-cli/</link><pubDate>Sat, 26 Jul 2025 01:02:24 +0330</pubDate><guid>https://hossein.me/quicknotes/bluetoothctl-cli/</guid><description>&lt;p&gt;Use bluetoothctl!&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;bluetoothctl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [bluetooth]# power on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [bluetooth]# agent on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [bluetooth]# default-agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [bluetooth]# scan on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# … wait until you see 11:22:33:44:55:66 …&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [bluetooth]# pair 11:22:33:44:55:66&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [bluetooth]# trust 11:22:33:44:55:66&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# [bluetooth]# connect 11:22:33:44:55:66&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you have a problem with your device:&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;sudo systemctl stop bluetooth &lt;span style="color:#75715e"&gt;# assuming you have systemctl, otherwise use your daemon manager&amp;#39;s equivalen command.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm -rf /var/lib/bluetooth/AA:BB:CC:DD:EE:FF/11:22:33:44:55:66 &lt;span style="color:#75715e"&gt;# only if you have a serious problem with the device&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl start bluetooth
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>وصله‌زدن به فایل‌های باینری و دور زدن «بوت امن»‌ با چت‌جی‌پی‌تی</title><link>https://hossein.me/quicknotes/bios-patching-with-chatgpt/</link><pubDate>Sun, 08 Jun 2025 22:58:09 +0330</pubDate><guid>https://hossein.me/quicknotes/bios-patching-with-chatgpt/</guid><description>&lt;p&gt;از هوش مصنوعی انتظار خیلی چیزها رو داشتم ولی این یکی رو نه.&lt;/p&gt;
&lt;p&gt;یک شخصی یک تبلت پاناسونیک با معماری پردازندهٔ x86 (یعنی معماری پردازندهٔ مشابه اکثر کامپیوترهای امروزی) داشته و تونسته روش به‌جای اندروید،‌ یک توزیع لینوکسی بریزه. تا اینجا خیلی چیز عجیبی نیست. تغییر سیستم عامل گوشی‌ها و تبلت‌ها کار آنچنان سختی هم محسوب نمیشه خصوصا اون‌هایی که معماری x86 دارن. جایی که عجیب و هیجان انگیزه اینه که شرکت پاناسونیک برای اینکه کسی نتونه سیستم عامل تبلت رو تغییر بده، از مکانیسم امنیتی Secure Boot استفاده می‌کرده. یعنی Firmware (سفت‌افزار!) فقط سیستم‌عامل اندروید ساخت خود پاناسونیک رو بوت می‌کرده. حالا یک نفر اومده کل firmware رو به‌صورت سخت‌افزاری کپی کرده، آپلود کرده و داده به ChatGPT و ازش خواسته که فایل باینری!! رو جوری تغییر بده که Secure Boot غیرفعال بشه. چت‌جی‌پی‌تی هم این کار رو کرده و اون شخص تونسته با موفقیت روی تبلت سیستم‌عامل دلخواهش رو بریزه.&lt;/p&gt;
&lt;p&gt;این خبر برای من واقعا عجیب بود چون انتظار اینکه هوش مصنوعی بتونه متن رو به خوبی بفهمه رو همگی داریم ولی فهمیدن و تغییر آنی صفر و یک های یک برنامه‌ی کامپایل‌شده و اجرایی یک مرحله‌ی خیلی خفن دیگه است.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hackaday.com/2025/06/07/chatgpt-patched-a-bios-binary-and-it-worked/"&gt;منبع&lt;/a&gt;&lt;/p&gt;</description></item><item><title>استفاده‌ی ویندوز از ری‌اکت نیتیو</title><link>https://hossein.me/quicknotes/react-native-in-microsoft-windows/</link><pubDate>Thu, 29 May 2025 16:30:37 +0330</pubDate><guid>https://hossein.me/quicknotes/react-native-in-microsoft-windows/</guid><description>&lt;p&gt;ویندوز داره واقعا سیستم‌عامل جالبی می‌شه.&lt;/p&gt;
&lt;p&gt;معمولا هر شرکتی میخواد برنامه‌ای بنویسه، از زبان بومی همون سیستم‌عامل استفاده می‌کنه تا سریع‌تر اجرا بشه.
مثلا:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;تلگرام دسکتاپ با زبان‌ C++ نوشته شده&lt;/li&gt;
&lt;li&gt;تلگرام اندروید با جاوا نوشته شده (و به طرز بانمکی برای افزایش سرعتش مقدار زیادی C هم داره)&lt;/li&gt;
&lt;li&gt;تلگرام iOS با Swift نوشته شده (و C و Objective C هم داره)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;خلاصه هرکسی بهترین عملکرد رو می‌خواد با زبان بومی کد برنامه‌اش رو می‌نویسه.&lt;/p&gt;
&lt;p&gt;در مقابل میشه عملکرد رو فدای سرعت توسعه‌ی برنامه کرد و یک کد رو برای همه‌ی سیستم‌عامل‌ها نوشت. مثلا اگر &lt;a href="https://hiddify.com/app"&gt;فیلترشکن هیدیفای&lt;/a&gt; رو دیده باشید، اون با Flutter ساخته شده و کد تقریبا یکسانی روی ویندوز، لینوکس و اندروید و iOS اجرا می‌شه. منتهی برنامه‌اش به طرز قابل توجهی نسبت به برنامه‌های بومی کندتره.&lt;/p&gt;
&lt;p&gt;کدهایی که با React Native یا Flutter نوشته بشن قابل‌حمل‌ترن و روی سیستم‌عامل‌های مختلف با اندک تغییرات اجرا میشن ولی در مقابل کندترن.&lt;/p&gt;
&lt;p&gt;حالا مایکروسافت تصمیم گرفته با React Native اجزای خود ویندوز رو بنویسه، یعنی خودش از امکانات بومی خودش استفاده نکرده و عملکرد بدتری رو ارائه داده. علت این کار رو هم اعلام کرده که در قسمت مدیریت حساب کاربری مایکروسافت، حال نداشتن جداگانه هم برای سایتشون کد بزنن، هم برای ویندوز. این شده که راه راحت و مزخرف کد زدن با React Native که نیازمند مفسر جاوااسکریپته و کندتره رو انتخاب کردن.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/react-native/rnw-settings-win11"&gt;منبع و اطلاعات بیشتر&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Signed HTTP Exchanges</title><link>https://hossein.me/quicknotes/sxg/</link><pubDate>Sun, 20 Apr 2025 21:14:11 +0330</pubDate><guid>https://hossein.me/quicknotes/sxg/</guid><description>&lt;p&gt;Today I learned about &lt;a href=""&gt;Signed HTTP Exchanges&lt;/a&gt;. It makes caching so much easier. But the question that remains unsolved is: how can we have both caching and autonomous cache servers like Google and reliable information collection from how many times our data has been seen.&lt;/p&gt;</description></item><item><title>Bubble Sort</title><link>https://hossein.me/quicknotes/bubble-sort/</link><pubDate>Sat, 19 Apr 2025 20:13:34 +0330</pubDate><guid>https://hossein.me/quicknotes/bubble-sort/</guid><description>&lt;p&gt;Here&amp;rsquo;s a quick and dirty C code that I wrote for &lt;a href="https://www.hackerrank.com/challenges/mini-max-sum"&gt;Mini-Max Sum&lt;/a&gt; in HackerRank.&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;#define ARR_COUNT_MAX 5
&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;miniMaxSum&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; arr_count, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; arr) {
&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; sorted_array[ARR_COUNT_MAX]&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;bool&lt;/span&gt; needMore&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false;
&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;arr_count;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;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; j&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;j&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;arr_count&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(i&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;){
&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;gt;&lt;/span&gt;arr[j&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; temp&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arr[j];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr[j]&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arr[j&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; arr[j&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;temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; needMore&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true;
&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;if&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;needMore){
&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; needMore&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false;
&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 question always had 5-element arrays.
&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;%ld %ld&amp;#34;&lt;/span&gt;,(&lt;span style="color:#66d9ef"&gt;long&lt;/span&gt;)arr[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#f92672"&gt;+&lt;/span&gt;arr[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]&lt;span style="color:#f92672"&gt;+&lt;/span&gt;arr[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]&lt;span style="color:#f92672"&gt;+&lt;/span&gt;arr[&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;],(&lt;span style="color:#66d9ef"&gt;long&lt;/span&gt;)arr[&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;]&lt;span style="color:#f92672"&gt;+&lt;/span&gt;arr[&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;]&lt;span style="color:#f92672"&gt;+&lt;/span&gt;arr[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]&lt;span style="color:#f92672"&gt;+&lt;/span&gt;arr[&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>