<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Tools - Tag - Gene.Tech</title>
        <link>https://geneliu.itaghome.win/tags/tools/</link>
        <description>Tools - Tag - Gene.Tech</description>
        <generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>gene.liu@live.com (Gene Liu)</managingEditor>
            <webMaster>gene.liu@live.com (Gene Liu)</webMaster><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Sun, 02 Aug 2026 00:00:00 &#43;0000</lastBuildDate><atom:link href="https://geneliu.itaghome.win/tags/tools/" rel="self" type="application/rss+xml" /><item>
    <title>A Toolbox I Actually Reopen</title>
    <link>https://geneliu.itaghome.win/2026-08-02-useful-tools/</link>
    <pubDate>Sun, 02 Aug 2026 00:00:00 &#43;0000</pubDate>
    <author>gene.liu@live.com (Gene Liu)</author>
    <guid>https://geneliu.itaghome.win/2026-08-02-useful-tools/</guid>
    <description><![CDATA[<p>Every few months I dump a folder of saved links into a post like this. Some entries are battle-tested; others are &ldquo;I used this once and it saved a weekend.&rdquo; I dropped <strong>EssayKiller_V2</strong> from my draft list &ndash; it was a fun GPT-2-era experiment, but in 2026 you already have better options on your desk.</p>
<p>Bookmark the page, steal what you need, ignore the rest.</p>
<h2 id="translation--language">Translation &amp; language</h2>
<ul>
<li><a href="https://www.deepl.com/translator" target="_blank" rel="noopener noreffer ">DeepL</a> &ndash; Still the translator I reach for when Google feels too literal and ChatGPT feels too chatty.</li>
<li><a href="https://github.com/zh-lx/pinyin-pro" target="_blank" rel="noopener noreffer ">pinyin-pro</a> &ndash; Pinyin conversion and matching for Chinese text in apps and scripts.</li>
</ul>
<h2 id="homelab--network">Homelab &amp; network</h2>
<ul>
<li><a href="https://dynip.dev/" target="_blank" rel="noopener noreffer ">dynip.dev</a> &ndash; Dynamic DNS that actually updates in about a minute, with RFC 2136 TSIG for routers and a generous free tier. Homelab DNS without the 30-minute stale-record ritual.</li>
<li><a href="https://github.com/jvns/dnspeep" target="_blank" rel="noopener noreffer ">dnspeep</a> &ndash; Spy on DNS queries your machine is making. Julia Evans wrote a <a href="https://jvns.ca/blog/2021/03/31/dnspeep-tool/" target="_blank" rel="noopener noreffer ">nice walkthrough</a> when it launched; the repo is the thing to install.</li>
<li><a href="https://httptoolkit.tech/" target="_blank" rel="noopener noreffer ">HTTP Toolkit</a> &ndash; Intercept, inspect, and mock HTTP(S) traffic without wrestling <code>mitmproxy</code> config every time.</li>
</ul>
<h2 id="terminal--remote-access">Terminal &amp; remote access</h2>
<ul>
<li><a href="https://github.com/ekzhang/sshx" target="_blank" rel="noopener noreffer ">sshx</a> &ndash; Share a live terminal in the browser. Fast, collaborative, surprisingly handy for &ldquo;can you see this error?&rdquo;</li>
<li><a href="https://github.com/cs01/termpair" target="_blank" rel="noopener noreffer ">termpair</a> &ndash; View and control a terminal from a browser with end-to-end encryption.</li>
<li><a href="https://github.com/huashengdun/webssh" target="_blank" rel="noopener noreffer ">webssh</a> &ndash; Web-based SSH client when you cannot install a native client but still need a shell.</li>
</ul>
<h2 id="pdf--documents">PDF &amp; documents</h2>
<ul>
<li><a href="https://github.com/Stirling-Tools/Stirling-PDF" target="_blank" rel="noopener noreffer ">Stirling-PDF</a> &ndash; Self-hosted PDF toolkit: merge, split, compress, OCR, the usual suspects. Run it at home if you do not want files on a random website.</li>
<li><a href="https://pdfreal.com/" target="_blank" rel="noopener noreffer ">PDFReal</a> &ndash; Fast online PDF utilities when you need something quick and do not want to spin up a container.</li>
</ul>
<h2 id="cloud-native--observability">Cloud native &amp; observability</h2>
<ul>
<li><a href="https://github.com/rootsongjc/awesome-cloud-native" target="_blank" rel="noopener noreffer ">awesome-cloud-native</a> &ndash; Rootsongjc&rsquo;s curated list of cloud-native projects. Good starting point when you are lost in the CNCF catalog.</li>
<li><a href="https://github.com/netdata/netdata" target="_blank" rel="noopener noreffer ">Netdata</a> &ndash; Real-time monitoring with minimal setup. Nice on a single node or a small cluster.</li>
</ul>
<h2 id="data--databases">Data &amp; databases</h2>
<ul>
<li><a href="https://dbeaver.io/" target="_blank" rel="noopener noreffer ">DBeaver</a> &ndash; Universal database client. Not pretty at 2 a.m., but it opens everything.</li>
</ul>
<h2 id="shell--scripting">Shell &amp; scripting</h2>
<ul>
<li><a href="https://github.com/dylanaraps/pure-bash-bible" target="_blank" rel="noopener noreffer ">pure-bash-bible</a> &ndash; Bash snippets you will grep more than you expect.</li>
<li><a href="https://github.com/onceupon/Bash-Oneliner" target="_blank" rel="noopener noreffer ">Bash-Oneliner</a> &ndash; Another solid collection of one-liners and small scripts.</li>
<li><a href="https://github.com/koalaman/shellcheck" target="_blank" rel="noopener noreffer ">ShellCheck</a> &ndash; Lint your shell scripts before they lint you.</li>
</ul>
<h2 id="security-crypto-and-regex-pain">Security, crypto, and regex pain</h2>
<ul>
<li><a href="https://gchq.github.io/CyberChef/" target="_blank" rel="noopener noreffer ">CyberChef</a> &ndash; The &ldquo;what encoding is this?&rdquo; Swiss Army knife from GCHQ.</li>
<li><a href="https://regex-vis.com/" target="_blank" rel="noopener noreffer ">regex-vis</a> &ndash; Visualize and debug regexes when your eyes glaze over at <code>^(?=(.*[a-z]))</code>.</li>
</ul>
<h2 id="comments-lightweight">Comments (lightweight)</h2>
<ul>
<li><a href="https://github.com/djyde/cusdis" target="_blank" rel="noopener noreffer ">Cusdis</a> &ndash; Lightweight, privacy-friendly comment widget. The author&rsquo;s free hosted service is gone; self-host or embed on your own site. Still beats loading Disqus on a personal blog.</li>
</ul>
<h2 id="iot--casting">IoT &amp; casting</h2>
<ul>
<li><a href="https://hub.docker.com/r/tfgco/arkadiko/tags" target="_blank" rel="noopener noreffer ">Arkadiko (Docker)</a> &ndash; Docker image related to the Arkadiko IoT/game stack; useful if you are poking at that ecosystem.</li>
<li><a href="https://github.com/skorokithakis/catt/" target="_blank" rel="noopener noreffer ">catt</a> &ndash; Cast audio and video to Chromecast from the command line. <code>catt cast</code> beats opening another GUI.</li>
</ul>
<h2 id="music-scores-and-midi">Music, scores, and MIDI</h2>
<ul>
<li><a href="http://www.kunstderfuge.com/" target="_blank" rel="noopener noreffer ">Kunst der Fuge</a> &ndash; Classical MIDI files and scores. A rabbit hole if you like reading music on a screen.</li>
<li><a href="https://github.com/marcomusy/pianoplayer" target="_blank" rel="noopener noreffer ">pianoplayer</a> &ndash; Play along with a MIDI keyboard; visual feedback on what to press next.</li>
<li><a href="http://www.nlc.cn/pcab/zy/zhgj_zyk/" target="_blank" rel="noopener noreffer ">中华古籍资源库</a> &ndash; National Library of China digitized ancient books and related resources. Serious archive, not a quick click.</li>
</ul>
<h2 id="chinese-classics--text">Chinese classics &amp; text</h2>
<ul>
<li><a href="https://ctext.org/zhs" target="_blank" rel="noopener noreffer ">ctext.org</a> &ndash; Chinese Text Project: classical Chinese texts with search and parallel editions.</li>
<li><a href="https://github.com/jaywcjlove/copybook-generator" target="_blank" rel="noopener noreffer ">copybook-generator</a> &ndash; Generate Chinese copybook practice sheets (字帖).</li>
</ul>
<h2 id="math-code-and-learning">Math, code, and learning</h2>
<ul>
<li><a href="https://github.com/rossant/awesome-math" target="_blank" rel="noopener noreffer ">awesome-math</a> &ndash; Curated math learning resources.</li>
<li><a href="https://github.com/google/blockly" target="_blank" rel="noopener noreffer ">Blockly</a> &ndash; Visual block programming; still useful for teaching and quick prototypes.</li>
<li><a href="https://github.com/zhm-real/PathPlanning" target="_blank" rel="noopener noreffer ">PathPlanning</a> &ndash; Path planning algorithms with visual demos.</li>
</ul>
<h2 id="fitness-handwriting-and-doodles">Fitness, handwriting, and doodles</h2>
<ul>
<li><a href="https://darebee.com/workouts.html" target="_blank" rel="noopener noreffer ">Darebee workouts</a> &ndash; No-equipment workout cards. Print one, do it, move on.</li>
<li><a href="https://www.calligrapher.ai/" target="_blank" rel="noopener noreffer ">Calligrapher.ai</a> &ndash; Generate realistic handwriting from typed text. Fun for labels and mockups.</li>
<li><a href="https://github.com/linjc/smooth-signature" target="_blank" rel="noopener noreffer ">smooth-signature</a> &ndash; Smooth signature pad for web apps.</li>
</ul>
<h2 id="games--go">Games &amp; Go</h2>
<ul>
<li><a href="https://online-go.com/learn-to-play-go/atari-to-side" target="_blank" rel="noopener noreffer ">OGS: Learn to Play Go (Atari to Side)</a> &ndash; Interactive lessons on <a href="https://online-go.com/" target="_blank" rel="noopener noreffer ">online-go.com</a> (OGS). Work through tactics from atari to side connections, then play in the same browser.</li>
</ul>
<h2 id="weather">Weather</h2>
<ul>
<li><a href="https://github.com/Leftium/ultra-weather" target="_blank" rel="noopener noreffer ">ultra-weather</a> &ndash; Actionable, human-readable weather forecasts in a clean UI.</li>
</ul>
<h2 id="reading--ebooks">Reading &amp; ebooks</h2>
<ul>
<li><a href="https://github.com/satorumurmur/bibi" target="_blank" rel="noopener noreffer ">bibi</a> &ndash; EPUB reader you can embed on a website.</li>
<li><a href="https://github.com/noDRM/DeDRM_tools" target="_blank" rel="noopener noreffer ">DeDRM_tools</a> &ndash; Tools for managing DRM on ebooks you already own. Legal territory varies by country; use only on content you have the right to back up.</li>
</ul>
<hr>
<p><em>Last updated: 2026-08-02. Send me a link if something here rotted or if I missed your favorite wrench.</em></p>]]></description>
</item>
<item>
    <title>Install AdGuardHome on Asus Router (AC56U)</title>
    <link>https://geneliu.itaghome.win/2022-2-12-asus-adguard-home/</link>
    <pubDate>Sat, 12 Feb 2022 00:00:00 &#43;0000</pubDate>
    <author>gene.liu@live.com (Gene Liu)</author>
    <guid>https://geneliu.itaghome.win/2022-2-12-asus-adguard-home/</guid>
    <description><![CDATA[<h3 id="download-and-flash-asuswrt-merlin-firmware-v3846">Download and Flash Asuswrt-Merlin Firmware (v384.6)</h3>
<p><a href="https://www.asuswrt-merlin.net/" target="_blank" rel="noopener noreffer ">https://www.asuswrt-merlin.net/</a>
<a href="https://sourceforge.net/projects/asuswrt-merlin/files/RT-AC56U/Release/RT-AC56U_384.6_0.zip/download" target="_blank" rel="noopener noreffer ">https://sourceforge.net/projects/asuswrt-merlin/files/RT-AC56U/Release/RT-AC56U_384.6_0.zip/download</a></p>
<h3 id="prepare-usb-drive">Prepare USB Drive</h3>
<ol>
<li>Login to router via SSH (<code>ssh admin@router_ip</code>)</li>
<li><code>fdisk /dev/sda</code></li>
<li><code>mkfs.ext3 /dev/sda[1,2]</code></li>
</ol>
<h3 id="enable-jffs-custom-scripts-and-configs">Enable JFFS Custom Scripts and Configs</h3>
<p>Administration -&gt; System -&gt; Persistent JFFS2 partition -&gt; Enable JFFS custom scripts and configs (&lsquo;yes&rsquo;)</p>
<h3 id="execute-entware-setup-to-enable-opt-mount-on-usb-drive">Execute Entware-Setup to Enable /opt Mount on USB Drive</h3>
<p>The newly flashed firmware (v384.6) has <code>entware-setup.sh</code> included already.
FYI: <a href="https://github.com/RMerl/asuswrt-merlin/blob/master/release/src/router/others/entware-setup.sh" target="_blank" rel="noopener noreffer ">https://github.com/RMerl/asuswrt-merlin/blob/master/release/src/router/others/entware-setup.sh</a></p>
<h3 id="update-post-mount-script">Update Post-Mount Script</h3>
<p><code>/opt/etc/init.d/rc.unslung start</code> is the line added; not sure if it&rsquo;s necessary. :)</p>]]></description>
</item>
<item>
    <title>vsftpd Access NFS Shared Directory</title>
    <link>https://geneliu.itaghome.win/2022-2-8-vsftpd/</link>
    <pubDate>Tue, 08 Feb 2022 00:00:00 &#43;0000</pubDate>
    <author>gene.liu@live.com (Gene Liu)</author>
    <guid>https://geneliu.itaghome.win/2022-2-8-vsftpd/</guid>
    <description><![CDATA[<h3 id="issue">Issue</h3>
<p>When putting files into an NFS shared directory, I get an &ldquo;Access failed: 553 Could not create file.&rdquo; error.</p>
<h3 id="solution">Solution</h3>
<ol>
<li><code>setsebool -P ftpd_full_access 1</code></li>
<li>Make sure the mounted directory has the correct ownership.</li>
</ol>]]></description>
</item>
<item>
    <title>Add a GitLab CI Runner</title>
    <link>https://geneliu.itaghome.win/2022-1-20-gitlab-ci/</link>
    <pubDate>Thu, 20 Jan 2022 00:00:00 &#43;0000</pubDate>
    <author>gene.liu@live.com (Gene Liu)</author>
    <guid>https://geneliu.itaghome.win/2022-1-20-gitlab-ci/</guid>
    <description><![CDATA[<h3 id="setup-a-standard-rhelalmalinux-85-vm">Setup a Standard RHEL/AlmaLinux 8.5 VM</h3>
<ol>
<li>
<p>Docker proxy settings:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /etc/systemd/system/docker.service.d/http-proxy.conf 
</span></span><span class="line"><span class="cl"><span class="o">[</span>Service<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Environment</span><span class="o">=</span><span class="s2">&#34;HTTP_PROXY=http://proxy.lbs.alcatel-lucent.com:8000&#34;</span> <span class="s2">&#34;HTTPS_PROXY=http://proxy.lbs.alcatel-lucent.com:8000&#34;</span> <span class="s2">&#34;NO_PROXY=orbw-artifactory.ca.alcatel-lucent.com&#34;</span></span></span></code></pre></div></div>
</li>
<li>
<p>Insecure (private) registry:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-json">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="err">cat</span> <span class="err">/etc/docker/daemon.json</span> 
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;insecure-registries&#34;</span> <span class="p">:</span> <span class="p">[</span> <span class="s2">&#34;orbw-artifactory.ca.alcatel-lucent.com:8081&#34;</span> <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
</li>
</ol>
<h3 id="install-gitlab-runner">Install GitLab Runner</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run -d --name gitlab-runner --restart always -v /home/cloud-user/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock orbw-artifactory.ca.alcatel-lucent.com:8081/nokia-nsp-docker-virtual/gitlab/gitlab-runner:latest</span></span></code></pre></div></div>
<h3 id="gitlab-runner-register">GitLab Runner Register</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run --rm -it -v /home/cloud-user/config:/etc/gitlab-runner orbw-artifactory.ca.alcatel-lucent.com:8081/nokia-nsp-docker-virtual/gitlab/gitlab-runner:latest register</span></span></code></pre></div></div>
<p>Example config:</p>]]></description>
</item>
<item>
    <title>Use wget to Download a List of Files</title>
    <link>https://geneliu.itaghome.win/2022-1-19-wget/</link>
    <pubDate>Wed, 19 Jan 2022 00:00:00 &#43;0000</pubDate>
    <author>gene.liu@live.com (Gene Liu)</author>
    <guid>https://geneliu.itaghome.win/2022-1-19-wget/</guid>
    <description><![CDATA[<p>Use <code>wget</code> to download a list of files:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">wget -x -P /data/temp/files --no-host-directories -i /data/temp/file.txt</span></span></code></pre></div></div>]]></description>
</item>
<item>
    <title>Example of Reset/Cleanup Debian/Ubuntu Packages</title>
    <link>https://geneliu.itaghome.win/2021-1-27-remove-deb/</link>
    <pubDate>Wed, 27 Jan 2021 00:00:00 &#43;0000</pubDate>
    <author>gene.liu@live.com (Gene Liu)</author>
    <guid>https://geneliu.itaghome.win/2021-1-27-remove-deb/</guid>
    <description><![CDATA[<h3 id="installation-via-deb-package">Installation via .deb Package</h3>
<p>Add the Rancher Desktop repository and install Rancher Desktop with:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/Release.key <span class="p">|</span> sudo apt-key add -
</span></span><span class="line"><span class="cl">sudo add-apt-repository <span class="s1">&#39;deb https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./&#39;</span>
</span></span><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt install rancher-desktop</span></span></code></pre></div></div>
<h3 id="uninstalling-deb-package">Uninstalling .deb Package</h3>
<p>You can remove the package, repository, and key with:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt remove --autoremove rancher-desktop
</span></span><span class="line"><span class="cl">sudo add-apt-repository -r <span class="s1">&#39;deb https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./&#39;</span>
</span></span><span class="line"><span class="cl">sudo apt-key del &lt;keyid&gt;</span></span></code></pre></div></div>
<p>Where <code>keyid</code> is the line above the one containing <code>isv:Rancher:stable</code> when you run <code>apt-key list</code>. So if I have the following block for the Rancher Desktop Key:</p>]]></description>
</item>
</channel>
</rss>
